annotate sites/all/modules/rdfx/rdfx.module @ 9:830c812b520f

added smtp module
author root <root@paio.local>
date Mon, 28 Oct 2013 15:34:27 +0000
parents ce11bbd8f642
children
rev   line source
danielebarchiesi@4 1 <?php
danielebarchiesi@4 2
danielebarchiesi@4 3 /**
danielebarchiesi@4 4 * @file
danielebarchiesi@4 5 * Extends the RDF API of Drupal core to support more RDF seralizations formats
danielebarchiesi@4 6 * other RDF capabilities.
danielebarchiesi@4 7 */
danielebarchiesi@4 8
danielebarchiesi@4 9 /**
danielebarchiesi@4 10 * Path to the ARC2 PHP library.
danielebarchiesi@4 11 */
danielebarchiesi@4 12 if (module_exists('libraries')) {
danielebarchiesi@4 13 define('RDF_ARC2_PATH', libraries_get_path('ARC2') . '/arc');
danielebarchiesi@4 14 }
danielebarchiesi@4 15 else {
danielebarchiesi@4 16 define('RDF_ARC2_PATH', drupal_get_path('module', 'rdfx') . '/vendor/arc');
danielebarchiesi@4 17 }
danielebarchiesi@4 18
danielebarchiesi@4 19 /**
danielebarchiesi@4 20 * Implements hook_init().
danielebarchiesi@4 21 */
danielebarchiesi@4 22 function rdfx_init() {
danielebarchiesi@4 23 // Attempts to load the ARC2 library, if available.
danielebarchiesi@4 24 if (!class_exists('ARC2') && file_exists(RDF_ARC2_PATH . '/ARC2.php')) {
danielebarchiesi@4 25 @include_once RDF_ARC2_PATH . '/ARC2.php';
danielebarchiesi@4 26 }
danielebarchiesi@4 27 module_load_include('inc', 'rdfx', 'rdfx.terms');
danielebarchiesi@4 28 module_load_include('inc', 'rdfx', 'rdfx.import');
danielebarchiesi@4 29 module_load_include('inc', 'rdfx', 'rdfx.query');
danielebarchiesi@4 30 }
danielebarchiesi@4 31
danielebarchiesi@4 32 /*
danielebarchiesi@4 33 * Implements hook_permission().
danielebarchiesi@4 34 */
danielebarchiesi@4 35 function rdfx_permission() {
danielebarchiesi@4 36 return array(
danielebarchiesi@4 37 'administer rdf' => array(
danielebarchiesi@4 38 'title' => t('Administer RDF'),
danielebarchiesi@4 39 'description' => t('Configure and setup RDFx module.'),
danielebarchiesi@4 40 ),
danielebarchiesi@4 41 );
danielebarchiesi@4 42 }
danielebarchiesi@4 43
danielebarchiesi@4 44 /**
danielebarchiesi@4 45 * Implements hook_menu().
danielebarchiesi@4 46 */
danielebarchiesi@4 47 function rdfx_menu() {
danielebarchiesi@4 48 // @todo use access RDF data permission instead of access content.
danielebarchiesi@4 49 // $items['ns'] = array(
danielebarchiesi@4 50 // 'title' => 'Site vocabulary',
danielebarchiesi@4 51 // 'description' => 'RDF description of the site schema.',
danielebarchiesi@4 52 // 'page callback' => 'drupal_get_form',
danielebarchiesi@4 53 // 'access arguments' => array('access content'),
danielebarchiesi@4 54 // 'file' => 'rdfx.pages.inc',
danielebarchiesi@4 55 // );
danielebarchiesi@4 56 // Add config options to the Services block on the config page. RDF is not
danielebarchiesi@4 57 // technically a service, but neither is RSS. RDF and RSS are very closely
danielebarchiesi@4 58 // aligned.
danielebarchiesi@4 59 $config_base = array(
danielebarchiesi@4 60 'access arguments' => array('administer rdf'),
danielebarchiesi@4 61 'file' => 'rdfx.admin.inc',
danielebarchiesi@4 62 );
danielebarchiesi@4 63 $items['admin/config/services/rdf'] = array(
danielebarchiesi@4 64 'title' => 'RDF publishing settings',
danielebarchiesi@4 65 'description' => 'Configure how site content gets published in RDF.',
danielebarchiesi@4 66 'page callback' => 'rdfx_mapping_overview',
danielebarchiesi@4 67 ) + $config_base;
danielebarchiesi@4 68 $items['admin/config/services/rdf/mappings'] = array(
danielebarchiesi@4 69 'title' => 'RDF Mappings',
danielebarchiesi@4 70 'description' => 'Configure how site content gets published in RDF.',
danielebarchiesi@4 71 'page callback' => 'rdfx_mapping_overview',
danielebarchiesi@4 72 'type' => MENU_DEFAULT_LOCAL_TASK,
danielebarchiesi@4 73 ) + $config_base;
danielebarchiesi@4 74 $items['admin/config/services/rdf/namespaces'] = array(
danielebarchiesi@4 75 'title' => 'RDF namespaces',
danielebarchiesi@4 76 'description' => 'See all namespaces and their prefixes.',
danielebarchiesi@4 77 'page callback' => 'rdfx_admin_namespaces',
danielebarchiesi@4 78 'type' => MENU_LOCAL_TASK,
danielebarchiesi@4 79 ) + $config_base;
danielebarchiesi@4 80 return $items;
danielebarchiesi@4 81 }
danielebarchiesi@4 82
danielebarchiesi@4 83 /**
danielebarchiesi@4 84 * Implements hook_help().
danielebarchiesi@4 85 */
danielebarchiesi@4 86 function rdfx_help($path, $arg) {
danielebarchiesi@4 87 switch($path) {
danielebarchiesi@4 88 case 'admin/config/services/rdf/namespaces';
danielebarchiesi@4 89 return '<p>' . t('Manage the namespaces and associated prefixes used by the site. Prefixes allow URIs to be shortened in the form of <a href="http://en.wikipedia.org/wiki/CURIE">CURIEs</a> (Compact URIs). For example, the CURIE %curie represents the URI %uri.', array('%curie' => 'dc:title', '%uri' => 'http://purl.org/dc/terms/title')) . '</p>';
danielebarchiesi@4 90 case 'admin/config/services/rdf/mappings':
danielebarchiesi@4 91 if (module_exists('rdfui')) {
danielebarchiesi@4 92 $message = t('Manage RDF mappings for entity types and field bundles used throughout the site. Some mappings are not editable through the UI. See the core RDF mapping API !documentation to find out how to modify these mappings.', array('!documentation' => l('documentation', 'http://drupal.org/developing/api/rdf')));
danielebarchiesi@4 93 }
danielebarchiesi@4 94 else {
danielebarchiesi@4 95 $message = t('View RDF mappings for entity types and field bundles used throughout the site. Enabling the RDF UI module (bundled with RDFx) will allow you to configure many of these mappings.');
danielebarchiesi@4 96 }
danielebarchiesi@4 97 return '<p>' . $message . '</p>';
danielebarchiesi@4 98 }
danielebarchiesi@4 99 }
danielebarchiesi@4 100
danielebarchiesi@4 101 /**
danielebarchiesi@4 102 * Implements hook_theme().
danielebarchiesi@4 103 */
danielebarchiesi@4 104 function rdfx_theme() {
danielebarchiesi@4 105 return array(
danielebarchiesi@4 106 'rdfx_mapping_admin_overview' => array(
danielebarchiesi@4 107 'variables' => array('bundle' => array(), 'rdftype' => array(), 'real_fields' => array(), 'fake_fields' => array()),
danielebarchiesi@4 108 ),
danielebarchiesi@4 109 'rdfx_mapping_admin_overview_row' => array(
danielebarchiesi@4 110 'variables' => array('field' => array()),
danielebarchiesi@4 111 ),
danielebarchiesi@4 112 );
danielebarchiesi@4 113 }
danielebarchiesi@4 114
danielebarchiesi@4 115 function rdfx_get_rdf_model($type, $data) {
danielebarchiesi@4 116 // Loads entity and its metadata.
danielebarchiesi@4 117 $wrapper = entity_metadata_wrapper($type, $data);
danielebarchiesi@4 118 $entity = $wrapper->value();
danielebarchiesi@4 119
danielebarchiesi@4 120 $entity_uri = rdfx_resource_uri($type, $wrapper->getIdentifier());
danielebarchiesi@4 121 // Instantiates node resource as ARC2 class and set base and namespaces.
danielebarchiesi@4 122 $res = ARC2::getResource();
danielebarchiesi@4 123 $res->setUri($entity_uri);
danielebarchiesi@4 124 $res->base = url('', array('absolute' => TRUE));
danielebarchiesi@4 125 $res->ns = rdf_get_namespaces();
danielebarchiesi@4 126
danielebarchiesi@4 127 // Initializes ARC2 index.
danielebarchiesi@4 128 $index = array();
danielebarchiesi@4 129
danielebarchiesi@4 130 // Adds the RDF types of the resource if a mapping exists.
danielebarchiesi@4 131 if (!empty($entity->rdf_mapping['rdftype'])) {
danielebarchiesi@4 132 $index[$entity_uri]['rdf:type'] = $entity->rdf_mapping['rdftype'];
danielebarchiesi@4 133 }
danielebarchiesi@4 134
danielebarchiesi@4 135 foreach ($wrapper as $name => $property) {
danielebarchiesi@4 136 if ($property->access('view')) {
danielebarchiesi@4 137 try {
danielebarchiesi@4 138 if ($property instanceof EntityDrupalWrapper || $property instanceof EntityValueWrapper) {
danielebarchiesi@4 139 rdfx_add_statement($index, $entity_uri, $property, $wrapper, $name);
danielebarchiesi@4 140 }
danielebarchiesi@4 141 elseif ($property instanceof EntityListWrapper) {
danielebarchiesi@4 142 // Iterates through the list and add each of them as statement.
danielebarchiesi@4 143 $li_filtered = rdfx_property_access_filter($property);
danielebarchiesi@4 144 foreach ($li_filtered as $li_name => $li_property) {
danielebarchiesi@4 145 if ($li_property instanceof EntityDrupalWrapper || $li_property instanceof EntityValueWrapper) {
danielebarchiesi@4 146 rdfx_add_statement($index, $entity_uri, $li_property, $wrapper, $name);
danielebarchiesi@4 147 }
danielebarchiesi@4 148 }
danielebarchiesi@4 149 }
danielebarchiesi@4 150 elseif ($property instanceof EntityStructureWrapper) {
danielebarchiesi@4 151 // Entity Structure Wrapper exposes structural elements, such as
danielebarchiesi@4 152 // text format for fields. We are not interested in this, and adding
danielebarchiesi@4 153 // the additional information about values means you have to handle
danielebarchiesi@4 154 // values as blank nodes.
danielebarchiesi@4 155 $li_filtered = rdfx_property_access_filter($property);
danielebarchiesi@4 156 foreach ($li_filtered as $li_name => $li_property) {
danielebarchiesi@4 157 if ($li_property instanceof EntityDrupalWrapper || $li_property instanceof EntityValueWrapper) {
danielebarchiesi@4 158 // This assumes that all literals have a 'value' array element
danielebarchiesi@4 159 // and that all resources have a 'uri' array element.
danielebarchiesi@4 160 if ($li_name == 'value' || $li_name == 'uri'){
danielebarchiesi@4 161 rdfx_add_statement($index, $entity_uri, $li_property, $wrapper, $name);
danielebarchiesi@4 162 }
danielebarchiesi@4 163 }
danielebarchiesi@4 164 }
danielebarchiesi@4 165 }
danielebarchiesi@4 166 }
danielebarchiesi@4 167 catch (EntityMetadataWrapperException $e) {
danielebarchiesi@4 168 // Property not supported. Fail silently.
danielebarchiesi@4 169 }
danielebarchiesi@4 170 }
danielebarchiesi@4 171 }
danielebarchiesi@4 172
danielebarchiesi@4 173 // Expand all CURIEs and attach the index to the ARC2 resource.
danielebarchiesi@4 174 $res->index = $res->expandPNames($index);
danielebarchiesi@4 175 return $res;
danielebarchiesi@4 176 }
danielebarchiesi@4 177
danielebarchiesi@4 178 function rdfx_property_access_filter($wrapper) {
danielebarchiesi@4 179 $filtered = array();
danielebarchiesi@4 180 foreach ($wrapper as $name => $property) {
danielebarchiesi@4 181 if ($property->access('view')) {
danielebarchiesi@4 182 $filtered[$name] = $property;
danielebarchiesi@4 183 }
danielebarchiesi@4 184 }
danielebarchiesi@4 185 return $filtered;
danielebarchiesi@4 186 }
danielebarchiesi@4 187
danielebarchiesi@4 188 /**
danielebarchiesi@4 189 * Gets the predicates relating the property to the entity.
danielebarchiesi@4 190 */
danielebarchiesi@4 191 function rdfx_get_predicates(EntityMetadataWrapper $wrapper, $name) {
danielebarchiesi@4 192 $element = array();
danielebarchiesi@4 193 if ($wrapper instanceof EntityDrupalWrapper) {
danielebarchiesi@4 194 $entity = $wrapper->value();
danielebarchiesi@4 195 if (!empty($entity->rdf_mapping[$name])) {
danielebarchiesi@4 196 // Just make use of the first predicate for now.
danielebarchiesi@4 197 // @lin this support all predicates defined in the mapping.
danielebarchiesi@4 198 $predicates = $entity->rdf_mapping[$name]['predicates'];
danielebarchiesi@4 199 $element = $predicates;
danielebarchiesi@4 200 }
danielebarchiesi@4 201 }
danielebarchiesi@4 202 // For elements which don't have a mapping, expose them using a local
danielebarchiesi@4 203 // namespace. @todo site vocabulary.
danielebarchiesi@4 204 // This functionality is disabled by default as a lot of this data is
danielebarchiesi@4 205 // irrelevant for outsiders and might contains some data the site owner might
danielebarchiesi@4 206 // not want to expose.
danielebarchiesi@4 207 // @todo provide admin setting to enable this functionality.
danielebarchiesi@4 208 if (!isset($element) && variable_get('rdfx_include_unset_mappings', FALSE)) {
danielebarchiesi@4 209 $predicate = 'site:' . (is_numeric($name) ? 'item' : $name);
danielebarchiesi@4 210 $element = array($predicate);
danielebarchiesi@4 211 }
danielebarchiesi@4 212 return $element;
danielebarchiesi@4 213 }
danielebarchiesi@4 214
danielebarchiesi@4 215 /**
danielebarchiesi@4 216 * Adds an RDF statement between the entity and the property. These statements
danielebarchiesi@4 217 * can have either resource or literal objects.
danielebarchiesi@4 218 */
danielebarchiesi@4 219 function rdfx_add_statement(&$index, $uri, $property, EntityMetadataWrapper $wrapper, $name) {
danielebarchiesi@4 220 if ($property instanceof EntityDrupalWrapper) {
danielebarchiesi@4 221 // For referenced entities only add the resource's URI
danielebarchiesi@4 222 rdfx_add_resource($index, $uri, $property, $wrapper, $name);
danielebarchiesi@4 223 }
danielebarchiesi@4 224 elseif ($property instanceof EntityValueWrapper) {
danielebarchiesi@4 225 rdfx_add_literal($index, $uri, $property, $wrapper, $name);
danielebarchiesi@4 226 }
danielebarchiesi@4 227 }
danielebarchiesi@4 228
danielebarchiesi@4 229 /**
danielebarchiesi@4 230 * Adds a resource object.
danielebarchiesi@4 231 */
danielebarchiesi@4 232 function rdfx_add_resource(&$index, $uri, $property, EntityMetadataWrapper $wrapper, $name) {
danielebarchiesi@4 233 if ($id = $property->getIdentifier()) {
danielebarchiesi@4 234 $predicates = rdfx_get_predicates($wrapper, $name);
danielebarchiesi@4 235 $object_uri = rdfx_resource_uri($property->type(), $id);
danielebarchiesi@4 236 foreach ($predicates as $predicate) {
danielebarchiesi@4 237 $index[$uri][$predicate][] = $object_uri;
danielebarchiesi@4 238 }
danielebarchiesi@4 239 }
danielebarchiesi@4 240 }
danielebarchiesi@4 241
danielebarchiesi@4 242 /**
danielebarchiesi@4 243 * Adds a literal object.
danielebarchiesi@4 244 */
danielebarchiesi@4 245 function rdfx_add_literal(&$index, $uri, $property, EntityMetadataWrapper $wrapper, $name) {
danielebarchiesi@4 246 $predicates = rdfx_get_predicates($wrapper, $name);
danielebarchiesi@4 247 $object_value = $property->value();
danielebarchiesi@4 248
danielebarchiesi@4 249 // Extracts datatype and callback from the RDF mapping.
danielebarchiesi@4 250 $datatype = '';
danielebarchiesi@4 251 if ($wrapper instanceof EntityDrupalWrapper) {
danielebarchiesi@4 252 $entity = $wrapper->value();
danielebarchiesi@4 253 if (!empty($entity->rdf_mapping[$name]['datatype'])) {
danielebarchiesi@4 254 $datatype = $entity->rdf_mapping[$name]['datatype'];
danielebarchiesi@4 255 }
danielebarchiesi@4 256 if (!empty($entity->rdf_mapping[$name]['callback']) && function_exists($entity->rdf_mapping[$name]['callback'])) {
danielebarchiesi@4 257 $object_value = $entity->rdf_mapping[$name]['callback']($object_value);
danielebarchiesi@4 258 }
danielebarchiesi@4 259 }
danielebarchiesi@4 260
danielebarchiesi@4 261 foreach ($predicates as $predicate) {
danielebarchiesi@4 262 $index[$uri][$predicate][] = array(
danielebarchiesi@4 263 'value' => $object_value,
danielebarchiesi@4 264 'type' => 'literal',
danielebarchiesi@4 265 'datatype' => $datatype,
danielebarchiesi@4 266 );
danielebarchiesi@4 267 }
danielebarchiesi@4 268 }
danielebarchiesi@4 269
danielebarchiesi@4 270 /**
danielebarchiesi@4 271 * Returns the URI used for the given resource.
danielebarchiesi@4 272 */
danielebarchiesi@4 273 function rdfx_resource_uri($resource, $id) {
danielebarchiesi@4 274 return url($resource . '/' . $id, array('absolute' => TRUE));
danielebarchiesi@4 275 }
danielebarchiesi@4 276
danielebarchiesi@4 277 /**
danielebarchiesi@4 278 * Lists the RDF serializations format which will be integrated with RestWS.
danielebarchiesi@4 279 *
danielebarchiesi@4 280 * Does not implement hook_restws_format_info() because we need to override the
danielebarchiesi@4 281 * RDF serialization format to use our own ARC2 based serializer.
danielebarchiesi@4 282 */
danielebarchiesi@4 283 function _rdfx_serialization_formats() {
danielebarchiesi@4 284 $result['rdf'] = array(
danielebarchiesi@4 285 'label' => t('RDF/XML'),
danielebarchiesi@4 286 'class' => 'RDFxRestWSFormatRDFXML',
danielebarchiesi@4 287 'mime type' => 'application/rdf+xml',
danielebarchiesi@4 288 );
danielebarchiesi@4 289 $result['ttl'] = array(
danielebarchiesi@4 290 'label' => t('Turtle'),
danielebarchiesi@4 291 'class' => 'RDFxRestWSFormatTurtle',
danielebarchiesi@4 292 'mime type' => 'application/x-turtle',
danielebarchiesi@4 293 );
danielebarchiesi@4 294 $result['nt'] = array(
danielebarchiesi@4 295 'label' => t('NTriples'),
danielebarchiesi@4 296 'class' => 'RDFxRestWSFormatNTriples',
danielebarchiesi@4 297 'mime type' => 'text/plain',
danielebarchiesi@4 298 );
danielebarchiesi@4 299 $result['rdfjson'] = array(
danielebarchiesi@4 300 'label' => t('RDFJSON'),
danielebarchiesi@4 301 'class' => 'RDFxRestWSFormatRDFJSON',
danielebarchiesi@4 302 'mime type' => 'application/json',
danielebarchiesi@4 303 );
danielebarchiesi@4 304 return $result;
danielebarchiesi@4 305 }
danielebarchiesi@4 306
danielebarchiesi@4 307 /**
danielebarchiesi@4 308 * Implements hook_restws_format_info_alter().
danielebarchiesi@4 309 */
danielebarchiesi@4 310 function rdfx_restws_format_info_alter(&$info) {
danielebarchiesi@4 311 $info = _rdfx_serialization_formats() + $info;
danielebarchiesi@4 312 }
danielebarchiesi@4 313
danielebarchiesi@4 314 /**
danielebarchiesi@4 315 * Implements hook_requirements().
danielebarchiesi@4 316 */
danielebarchiesi@4 317 function rdfx_requirements($phase) {
danielebarchiesi@4 318 $requirements = array();
danielebarchiesi@4 319
danielebarchiesi@4 320 if ($phase == 'runtime') {
danielebarchiesi@4 321 if (class_exists('ARC2')) {
danielebarchiesi@4 322 $value = t('Installed (version @version)', array('@version' => ARC2::getVersion()));
danielebarchiesi@4 323 $severity = REQUIREMENT_OK;
danielebarchiesi@4 324 $description = '';
danielebarchiesi@4 325 }
danielebarchiesi@4 326 else {
danielebarchiesi@4 327 $value = t('Not installed');;
danielebarchiesi@4 328 $severity = REQUIREMENT_ERROR;
danielebarchiesi@4 329 $path = module_exists('libraries') ? libraries_get_path('ARC2') . '/arc/ARC2.php' : drupal_get_path('module', 'rdfx') . '/vendor/arc/ARC2.php';
danielebarchiesi@4 330 $description = t('The RDFx module requires the ARC2 library to function properly. The simplest way to install ARC2 is by using the Drush command "drush rdf-download". Alternatively, you can !download the latest package, unzip it, and move/rename the folder so that the path to ARC2.php is %path', array('!download' => l('download', 'http://github.com/semsol/arc2/tarball/master'), '%path' => $path));
danielebarchiesi@4 331 }
danielebarchiesi@4 332 $requirements['rdfx_arc'] = array(
danielebarchiesi@4 333 'title' => t('RDFx ARC2 Library'),
danielebarchiesi@4 334 'value' => $value,
danielebarchiesi@4 335 'severity' => $severity,
danielebarchiesi@4 336 'description' => $description,
danielebarchiesi@4 337 );
danielebarchiesi@4 338
danielebarchiesi@4 339 // If there were any conflicting namespaces...
danielebarchiesi@4 340 if (rdfx_get_conflicting_namespaces()) {
danielebarchiesi@4 341 // Add a requirement warning and break.
danielebarchiesi@4 342 $requirements['rdfx_ns_conflict'] = array(
danielebarchiesi@4 343 'title' => t('RDFx Namespace Conflict'),
danielebarchiesi@4 344 'severity' => REQUIREMENT_ERROR,
danielebarchiesi@4 345 'value' => '',
danielebarchiesi@4 346 'description' => t('One or more namespaces has conflicts. See this page for more information:') . ' ' . l(t('RDF publishing settings'), 'admin/config/services/rdf/namespaces')
danielebarchiesi@4 347 );
danielebarchiesi@4 348 }
danielebarchiesi@4 349 }
danielebarchiesi@4 350 return $requirements;
danielebarchiesi@4 351 }
danielebarchiesi@4 352
danielebarchiesi@4 353
danielebarchiesi@4 354 /**
danielebarchiesi@4 355 * Gets conflicting namespaces.
danielebarchiesi@4 356 * Returns an array of (prefix => array(uri1, uri2, ...)) items.
danielebarchiesi@4 357 */
danielebarchiesi@4 358 function rdfx_get_conflicting_namespaces() {
danielebarchiesi@4 359 $conflicting_namespaces = array();
danielebarchiesi@4 360
danielebarchiesi@4 361 $rdf_namespaces = module_invoke_all('rdf_namespaces');
danielebarchiesi@4 362
danielebarchiesi@4 363 foreach ($rdf_namespaces as $prefix => $uris) {
danielebarchiesi@4 364 if (is_array($uris)) {
danielebarchiesi@4 365 $consolidated_uris = array_unique($uris);
danielebarchiesi@4 366
danielebarchiesi@4 367 // A prefix has conflicting namespaces if it has multiple associated URIs.
danielebarchiesi@4 368 if (count($consolidated_uris) > 1) {
danielebarchiesi@4 369 $conflicting_namespaces[$prefix] = $consolidated_uris;
danielebarchiesi@4 370 }
danielebarchiesi@4 371 }
danielebarchiesi@4 372 }
danielebarchiesi@4 373 return $conflicting_namespaces;
danielebarchiesi@4 374 }
danielebarchiesi@4 375
danielebarchiesi@4 376 /**
danielebarchiesi@4 377 * Implementation of hook_features_api().
danielebarchiesi@4 378 */
danielebarchiesi@4 379 function rdfx_features_api() {
danielebarchiesi@4 380 return array(
danielebarchiesi@4 381 'rdf_mappings' => array(
danielebarchiesi@4 382 'name' => t('RDF mappings'),
danielebarchiesi@4 383 'default_hook' => 'rdf_default_mappings',
danielebarchiesi@4 384 'file' => drupal_get_path('module', 'rdfx') .'/rdfx.features.inc',
danielebarchiesi@4 385 ),
danielebarchiesi@4 386 );
danielebarchiesi@4 387 }