<?php
function rdf_help($path, $arg) {
switch ($path) {
case 'admin/help#rdf':
$output = '';
$output .= '<h3>' . t('About') . '</h3>';
$output .= '<p>' . t('The RDF module enriches your content with metadata to let other applications (e.g., search engines, aggregators, and so on) better understand its relationships and attributes. This semantically enriched, machine-readable output for Drupal sites uses the <a href="@rdfa">RDFa specification</a> which allows RDF data to be embedded in HTML markup. Other modules can define mappings of their data to RDF terms, and the RDF module makes this RDF data available to the theme. The core Drupal modules define RDF mappings for their data model, and the core Drupal themes output this RDF metadata information along with the human-readable visual information. For more information, see the online handbook entry for <a href="@rdf">RDF module</a>.', array(
'@rdfa' => 'http://www.w3.org/TR/xhtml-rdfa-primer/',
'@rdf' => 'http://drupal.org/documentation/modules/rdf',
)) . '</p>';
return $output;
}
}
define('RDF_DEFAULT_BUNDLE', '');
function rdf_rdf_namespaces() {
return array(
'content' => 'http://purl.org/rss/1.0/modules/content/',
'dc' => 'http://purl.org/dc/terms/',
'foaf' => 'http://xmlns.com/foaf/0.1/',
'og' => 'http://ogp.me/ns#',
'rdfs' => 'http://www.w3.org/2000/01/rdf-schema#',
'sioc' => 'http://rdfs.org/sioc/ns#',
'sioct' => 'http://rdfs.org/sioc/types#',
'skos' => 'http://www.w3.org/2004/02/skos/core#',
'xsd' => 'http://www.w3.org/2001/XMLSchema#',
);
}
function rdf_get_namespaces() {
$rdf_namespaces = module_invoke_all('rdf_namespaces');
foreach ($rdf_namespaces as $prefix => $uri) {
if (is_array($uri)) {
if (count(array_unique($uri)) == 1) {
$rdf_namespaces[$prefix] = $uri[0];
}
else {
unset($rdf_namespaces[$prefix]);
}
}
}
return $rdf_namespaces;
}
function rdf_mapping_load($type, $bundle = RDF_DEFAULT_BUNDLE) {
$entity_info = entity_get_info($type);
if (!empty($entity_info['bundles'][$bundle]['rdf_mapping'])) {
return $entity_info['bundles'][$bundle]['rdf_mapping'];
}
else {
return _rdf_get_default_mapping($type);
}
}
function _rdf_get_default_mapping($type) {
$default_mappings =& drupal_static(__FUNCTION__);
if (!isset($default_mappings)) {
$modules = module_implements('rdf_mapping');
foreach ($modules as $module) {
$mappings = module_invoke($module, 'rdf_mapping');
foreach ($mappings as $mapping) {
if ($mapping['bundle'] === RDF_DEFAULT_BUNDLE) {
$default_mappings[$mapping['type']] = $mapping['mapping'];
}
}
}
}
return isset($default_mappings[$type]) ? $default_mappings[$type] : array();
}
function _rdf_mapping_load($type, $bundle) {
$mappings = _rdf_mapping_load_multiple($type, array(
$bundle,
));
return $mappings ? reset($mappings) : array();
}
function _rdf_mapping_load_multiple($type, array $bundles) {
$mappings = db_select('rdf_mapping')
->fields(NULL, array(
'bundle',
'mapping',
))
->condition('type', $type)
->condition('bundle', $bundles)
->execute()
->fetchAllKeyed();
foreach ($mappings as $bundle => $mapping) {
$mappings[$bundle] = unserialize($mapping);
}
return $mappings;
}
function rdf_mapping_save($mapping) {
$mapping['mapping'] += _rdf_get_default_mapping($mapping['type']);
$status = db_merge('rdf_mapping')
->key(array(
'type' => $mapping['type'],
'bundle' => $mapping['bundle'],
))
->fields(array(
'mapping' => serialize($mapping['mapping']),
))
->execute();
entity_info_cache_clear();
return $status;
}
function rdf_mapping_delete($type, $bundle) {
$num_rows = db_delete('rdf_mapping')
->condition('type', $type)
->condition('bundle', $bundle)
->execute();
return (bool) ($num_rows > 0);
}
function rdf_rdfa_attributes($mapping, $data = NULL) {
$type = isset($mapping['type']) ? $mapping['type'] : 'property';
switch ($type) {
case 'rel':
case 'rev':
$attributes[$type] = $mapping['predicates'];
break;
case 'property':
$attributes['property'] = $mapping['predicates'];
if (isset($data) && isset($mapping['callback']) && function_exists($mapping['callback'])) {
$callback = $mapping['callback'];
$attributes['content'] = $callback($data);
}
if (isset($mapping['datatype'])) {
$attributes['datatype'] = $mapping['datatype'];
}
break;
}
return $attributes;
}
function rdf_modules_installed($modules) {
foreach ($modules as $module) {
$function = $module . '_rdf_mapping';
if (function_exists($function)) {
foreach ($function() as $mapping) {
if ($mapping['bundle'] !== RDF_DEFAULT_BUNDLE) {
rdf_mapping_save($mapping);
}
}
}
}
}
function rdf_modules_uninstalled($modules) {
}
function rdf_entity_info_alter(&$entity_info) {
foreach ($entity_info as $entity_type => $entity_type_info) {
if (!empty($entity_type_info['bundles'])) {
$bundles = array_keys($entity_type_info['bundles']);
$mappings = _rdf_mapping_load_multiple($entity_type, $bundles);
foreach ($bundles as $bundle) {
if (isset($mappings[$bundle])) {
$entity_info[$entity_type]['bundles'][$bundle]['rdf_mapping'] = $mappings[$bundle];
}
else {
$entity_info[$entity_type]['bundles'][$bundle]['rdf_mapping'] = _rdf_get_default_mapping($entity_type);
}
}
}
}
}
function rdf_entity_load($entities, $type) {
foreach ($entities as $entity) {
list($id, $vid, $bundle) = entity_extract_ids($type, $entity);
$entity->rdf_mapping = rdf_mapping_load($type, $bundle);
}
}
function rdf_comment_load($comments) {
foreach ($comments as $comment) {
$comment->rdf_data['date'] = rdf_rdfa_attributes($comment->rdf_mapping['created'], $comment->created);
$comment->rdf_data['nid_uri'] = url('node/' . $comment->nid);
if ($comment->pid) {
$comment->rdf_data['pid_uri'] = url('comment/' . $comment->pid, array(
'fragment' => 'comment-' . $comment->pid,
));
}
}
}
function rdf_theme() {
return array(
'rdf_template_variable_wrapper' => array(
'variables' => array(
'content' => NULL,
'attributes' => array(),
'context' => array(),
'inline' => TRUE,
),
),
'rdf_metadata' => array(
'variables' => array(
'metadata' => array(),
),
),
);
}
function rdf_process(&$variables, $hook) {
if (!empty($variables['rdf_template_variable_attributes_array'])) {
foreach ($variables['rdf_template_variable_attributes_array'] as $variable_name => $attributes) {
$context = array(
'hook' => $hook,
'variable_name' => $variable_name,
'variables' => $variables,
);
$variables[$variable_name] = theme('rdf_template_variable_wrapper', array(
'content' => $variables[$variable_name],
'attributes' => $attributes,
'context' => $context,
));
}
}
if (!empty($variables['rdf_metadata_attributes_array'])) {
if (!isset($variables['content']['#prefix'])) {
$variables['content']['#prefix'] = '';
}
$variables['content']['#prefix'] = theme('rdf_metadata', array(
'metadata' => $variables['rdf_metadata_attributes_array'],
)) . $variables['content']['#prefix'];
}
}
function rdf_preprocess_node(&$variables) {
$variables['attributes_array']['about'] = empty($variables['node_url']) ? NULL : $variables['node_url'];
$variables['attributes_array']['typeof'] = empty($variables['node']->rdf_mapping['rdftype']) ? NULL : $variables['node']->rdf_mapping['rdftype'];
if (!empty($variables['node']->rdf_mapping['title']['predicates'])) {
$variables['title_suffix']['rdf_meta_title'] = array(
'#theme' => 'rdf_metadata',
'#metadata' => array(
array(
'property' => $variables['node']->rdf_mapping['title']['predicates'],
'content' => $variables['node']->title,
),
),
);
}
if (!empty($variables['rdf_mapping']['created'])) {
$date_attributes_array = rdf_rdfa_attributes($variables['rdf_mapping']['created'], $variables['created']);
$variables['rdf_template_variable_attributes_array']['date'] = $date_attributes_array;
if ($variables['submitted']) {
$variables['rdf_template_variable_attributes_array']['submitted'] = $date_attributes_array;
}
}
if (!empty($variables['rdf_mapping']['uid'])) {
$variables['rdf_template_variable_attributes_array']['name']['rel'] = $variables['rdf_mapping']['uid']['predicates'];
if ($variables['submitted']) {
$variables['rdf_template_variable_attributes_array']['submitted']['rel'] = $variables['rdf_mapping']['uid']['predicates'];
}
}
if (isset($variables['node']->comment_count) && !empty($variables['node']->rdf_mapping['comment_count']['predicates']) && user_access('access comments')) {
$variables['title_suffix']['rdf_meta_comment_count'] = array(
'#theme' => 'rdf_metadata',
'#metadata' => array(
array(
'property' => $variables['node']->rdf_mapping['comment_count']['predicates'],
'content' => $variables['node']->comment_count,
'datatype' => $variables['node']->rdf_mapping['comment_count']['datatype'],
),
),
);
}
}
function rdf_preprocess_field(&$variables) {
$element = $variables['element'];
$mapping = rdf_mapping_load($element['#entity_type'], $element['#bundle']);
$field_name = $element['#field_name'];
if (!empty($mapping) && !empty($mapping[$field_name])) {
foreach ($element['#items'] as $delta => $item) {
$variables['item_attributes_array'][$delta] = rdf_rdfa_attributes($mapping[$field_name], $item);
if (isset($item['uri'])) {
if (!empty($element[$delta]['#image_style'])) {
$variables['item_attributes_array'][$delta]['resource'] = image_style_url($element[$delta]['#image_style'], $item['uri']);
}
else {
$variables['item_attributes_array'][$delta]['resource'] = file_create_url($item['uri']);
}
}
}
}
}
function rdf_preprocess_user_profile(&$variables) {
$account = $variables['elements']['#account'];
$uri = entity_uri('user', $account);
if (!empty($account->rdf_mapping['rdftype'])) {
$variables['attributes_array']['typeof'] = $account->rdf_mapping['rdftype'];
$variables['attributes_array']['about'] = url($uri['path'], $uri['options']);
}
$account_holder_meta = array(
'#tag' => 'meta',
'#attributes' => array(
'about' => url($uri['path'], array_merge($uri['options'], array(
'fragment' => 'me',
))),
'typeof' => array(
'foaf:Person',
),
'rel' => array(
'foaf:account',
),
'resource' => url($uri['path'], $uri['options']),
),
);
$username_meta = array(
'#tag' => 'meta',
'#attributes' => array(
'about' => url($uri['path'], $uri['options']),
'property' => $account->rdf_mapping['name']['predicates'],
'content' => $account->name,
),
);
drupal_add_html_head($account_holder_meta, 'rdf_user_account_holder');
drupal_add_html_head($username_meta, 'rdf_user_username');
}
function rdf_preprocess_username(&$variables) {
if (empty($variables['attributes_array']['xml:lang'])) {
$variables['attributes_array']['xml:lang'] = '';
}
$rdf_mapping = rdf_mapping_load('user', 'user');
if ($variables['uid'] > 0) {
$variables['attributes_array']['about'] = url('user/' . $variables['uid']);
}
$attributes = array();
if (!empty($rdf_mapping['rdftype'])) {
$attributes['typeof'] = $rdf_mapping['rdftype'];
}
if (!empty($rdf_mapping['name'])) {
$attributes['property'] = $rdf_mapping['name']['predicates'];
$attributes['datatype'] = '';
}
if (!empty($variables['homepage']) && !empty($rdf_mapping['homepage'])) {
$attributes['rel'] = $rdf_mapping['homepage']['predicates'];
}
$variables['attributes_array'] = array_merge_recursive($variables['attributes_array'], $attributes);
}
function rdf_preprocess_comment(&$variables) {
$comment = $variables['comment'];
if (!empty($comment->rdf_mapping['rdftype'])) {
$uri = entity_uri('comment', $comment);
$variables['attributes_array']['about'] = url($uri['path'], $uri['options']);
$variables['attributes_array']['typeof'] = $comment->rdf_mapping['rdftype'];
}
if (!empty($comment->rdf_mapping['created'])) {
$date_attributes_array = $comment->rdf_data['date'];
$variables['rdf_template_variable_attributes_array']['created'] = $date_attributes_array;
$variables['rdf_template_variable_attributes_array']['submitted'] = $date_attributes_array;
}
if (!empty($comment->rdf_mapping['uid'])) {
$variables['rdf_template_variable_attributes_array']['author']['rel'] = $comment->rdf_mapping['uid']['predicates'];
$variables['rdf_template_variable_attributes_array']['submitted']['rel'] = $comment->rdf_mapping['uid']['predicates'];
}
if (!empty($comment->rdf_mapping['title'])) {
$variables['title_attributes_array']['property'] = $comment->rdf_mapping['title']['predicates'];
$variables['title_attributes_array']['datatype'] = '';
}
if (!empty($comment->rdf_mapping['pid'])) {
$parent_node_attributes['rel'] = $comment->rdf_mapping['pid']['predicates'];
$parent_node_attributes['resource'] = $comment->rdf_data['nid_uri'];
$variables['rdf_metadata_attributes_array'][] = $parent_node_attributes;
if ($comment->pid != 0) {
$parent_comment_attributes['rel'] = $comment->rdf_mapping['pid']['predicates'];
$parent_comment_attributes['resource'] = $comment->rdf_data['pid_uri'];
$variables['rdf_metadata_attributes_array'][] = $parent_comment_attributes;
}
}
}
function rdf_preprocess_taxonomy_term(&$variables) {
$term = $variables['term'];
$term_label_meta = array(
'#tag' => 'meta',
'#attributes' => array(
'about' => url('taxonomy/term/' . $term->tid),
'typeof' => $term->rdf_mapping['rdftype'],
'property' => $term->rdf_mapping['name']['predicates'],
'content' => $term->name,
),
);
drupal_add_html_head($term_label_meta, 'rdf_term_label');
}
function rdf_field_attach_view_alter(&$output, $context) {
foreach (element_children($output) as $field_name) {
$element =& $output[$field_name];
if ($element['#field_type'] == 'taxonomy_term_reference' && $element['#formatter'] == 'taxonomy_term_reference_link') {
foreach ($element['#items'] as $delta => $item) {
if (isset($item['taxonomy_term'])) {
$term = $item['taxonomy_term'];
if (!empty($term->rdf_mapping['rdftype'])) {
$element[$delta]['#options']['attributes']['typeof'] = $term->rdf_mapping['rdftype'];
}
if (!empty($term->rdf_mapping['name']['predicates'])) {
$element[$delta]['#options']['attributes']['property'] = $term->rdf_mapping['name']['predicates'];
$element[$delta]['#options']['attributes']['datatype'] = '';
}
}
}
}
}
}
function rdf_preprocess_image(&$variables) {
$variables['attributes']['typeof'] = array(
'foaf:Image',
);
}
function theme_rdf_template_variable_wrapper($variables) {
$output = $variables['content'];
if (!empty($output) && !empty($variables['attributes'])) {
$attributes = drupal_attributes($variables['attributes']);
$output = $variables['inline'] ? "<span{$attributes}>{$output}</span>" : "<div{$attributes}>{$output}</div>";
}
return $output;
}
function theme_rdf_metadata($variables) {
$output = '';
foreach ($variables['metadata'] as $attributes) {
$attributes['class'][] = 'rdf-meta';
$attributes['class'][] = 'element-hidden';
$output .= '<span' . drupal_attributes($attributes) . '></span>';
}
return $output;
}