From beeca1e796aa3b6fe19e71bcd890a7fa4f935677 Mon Sep 17 00:00:00 2001
From: GoZ <goz@226961.no-reply.drupal.org>
Date: Tue, 6 Sep 2011 17:04:04 +0200
Subject: [PATCH] Add microdata to custom_breadcrumbs

---
 custom_breadcrumbs.admin.inc |   12 ++++++++
 custom_breadcrumbs.install   |    1 +
 custom_breadcrumbs.module    |   61 +++++++++++++++++++++++++++++++++++------
 3 files changed, 65 insertions(+), 9 deletions(-)

diff --git a/custom_breadcrumbs.admin.inc b/custom_breadcrumbs.admin.inc
index 9d043be..23238e5 100644
--- a/custom_breadcrumbs.admin.inc
+++ b/custom_breadcrumbs.admin.inc
@@ -142,3 +142,15 @@ function custom_breadcrumbs_form_delete($form, &$form_state) {
   _custom_breadcrumbs_delete_breadcrumb($form_state['values']['bid']);
   $form_state['redirect'] = 'admin/build/custom_breadcrumbs';
 }
+
+function custom_breadcrumbs_settings_form(){
+  $form = array();
+
+  $form['breadcrumb_microdata'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Generate microdata'),
+    '#default_value' => variable_get('custom_breadcrumbs_microdata', 0),
+  );
+
+  return system_settings_form($form);
+}
diff --git a/custom_breadcrumbs.install b/custom_breadcrumbs.install
index 659b572..29881b2 100644
--- a/custom_breadcrumbs.install
+++ b/custom_breadcrumbs.install
@@ -125,4 +125,5 @@ function custom_breadcrumbs_update_6101() {
 
 function custom_breadcrumbs_uninstall() {
   drupal_uninstall_schema('custom_breadcrumbs');
+  variable_del('custom_breadcrumbs_microdata');
 }
diff --git a/custom_breadcrumbs.module b/custom_breadcrumbs.module
index d03b364..1e935f2 100644
--- a/custom_breadcrumbs.module
+++ b/custom_breadcrumbs.module
@@ -20,6 +20,14 @@ function custom_breadcrumbs_menu() {
     'file' => 'custom_breadcrumbs.admin.inc',
   );
 
+  $items['admin/settings/custom_breadcrumbs'] = array(
+    'title' => 'Custom breadcrumbs',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('custom_breadcrumbs_settings_form'),
+    'access arguments' => array('administer custom breadcrumbs'),
+    'file'	=> "custom_breadcrumbs.admin.inc",
+  );
+
   $items['admin/build/custom_breadcrumbs/add'] = array(
     'title' => 'Add custom breadcrumb',
     'type' => MENU_CALLBACK,
@@ -51,7 +59,11 @@ function custom_breadcrumbs_perm() {
  * Implementation of hook_theme().
  */
 function custom_breadcrumbs_theme() {
-  return array('custom_breadcrumbs_help_identifiers' => array('arguments' => array()));
+  return array(
+    'custom_breadcrumbs_help_identifiers' => array('arguments' => array()),
+    'custom_breadcrumbs_microdata_itemscope' => array('arguments' => array('content' => NULL)),
+    'custom_breadcrumbs_microdata_title' => array('arguments' => array('content' => NULL)),
+  );
 }
 
 function custom_breadcrumbs_nodeapi($node, $op, $teaser, $page) {
@@ -63,7 +75,8 @@ function custom_breadcrumbs_nodeapi($node, $op, $teaser, $page) {
       $titles = module_exists('token') ? token_replace($titles, 'node', $node) : $titles;
       $paths = module_exists('token') ? token_replace($paths, 'node', $node) : $paths;
 
-      $trail = array(l(t('Home'), '<front>'));
+      $trail = array(_custom_breadcrumbs_create_crumb(t('Home'), '<front>'));
+
       for ($i = 0; $i < count($titles); $i++) {
         $title = trim($titles[$i]);
         if (($title != '') && ($title != '<none>')) {
@@ -145,23 +158,35 @@ function _custom_breadcrumbs_delete_breadcrumb($bid) {
  *   The desired URI and/or special identifier
  */
 function _custom_breadcrumbs_create_crumb($title, $original_path) {
-  // Decode title to properly handle special characters.
-  $title = decode_entities($title);
+  $options = array();
+
   // Collapse double slashes to one.
   $original_path = preg_replace('/\/+/', '/', $original_path);
   // Removing leading and trailing slashes.
   $original_path = preg_replace('/^\/|\/+$/', '', $original_path);
   list($identifier, $path) = explode("|", $original_path, 2);
-  if (isset($path) && $path !== '') {
-    switch (trim($identifier)) {
+
+  if(variable_get('custom_breadcrumbs_microdata', 0)){
+    if($identifier != '<none>'){
+      $title = theme('custom_breadcrumbs_microdata_title', $title);
+    }
+
+    $options = array('html'=>TRUE,
+                     'attributes' => array(
+                       'itemprop' => 'url',
+                     ));
+  }
+
+  if ($path) {
+    switch ($identifier) {
       case '<pathauto>':
         if (module_exists('pathauto')) {
           module_load_include('inc', 'pathauto', 'pathauto');
-          $crumb = l($title, pathauto_cleanstring($path, FALSE));
+          $crumb = l($title, pathauto_cleanstring($path, FALSE), $options);
         }
         break;
       default:
-        $crumb = l($title, $original_path);
+        $crumb = l($title, $original_path, $options);
     }
   }
   else {
@@ -171,10 +196,14 @@ function _custom_breadcrumbs_create_crumb($title, $original_path) {
         $crumb = check_plain($title);
         break;
       default:
-        $crumb = l($title, $original_path);
+        $crumb = l($title, $original_path, $options);
     }
   }
 
+  if($identifier != '<none>'){
+    $crumb = theme('custom_breadcrumbs_microdata_itemscope', $crumb);
+  }
+
   return $crumb;
 }
 
@@ -201,3 +230,17 @@ function theme_custom_breadcrumbs_help_identifiers() {
 
   return theme('table', $headers, $rows, array('class' => 'description'));
 }
+
+/**
+ * Return container tag for microdata
+ */
+function theme_custom_breadcrumbs_microdata_itemscope($value){
+  return '<div itemscope itemtype="http://data-vocabulary.org/Breadcrumb" class="itemscope">'.$value.'</div>';
+}
+
+/**
+ * Return container title tag for microdata
+ */
+function theme_custom_breadcrumbs_microdata_title($value){
+  return '<span itemprop="title">'.$value.'</span>';
+}
-- 
1.7.3.3

