From fe9ec250a6558c8352a35b6537cdc30d6c9f5477 Mon Sep 17 00:00:00 2001
From: Chris Smith <chris.eureka@jalakai.co.uk>
Date: Wed, 19 Nov 2008 15:07:58 +0100
Subject: [PATCH] FS#630: allow $conf['useheading'] to individually apply to
 content links and/or navigation links

$conf['useheading'] values are now:
- 0            : off, use page name in link text
- 'content'    : use first heading text for links in wiki page content
- 'navigation' : use first heading text for links in non-page content, e.g. breadcrumps, backlinks, search results, etc.
- 1            : use first heading text in all links
(for backwards compatibility, any other values are mapped to 0 or 1 by empty() function.)

$conf['useheading'] value should now be checked using the useHeading($linktype) function,
where linktype can be "content" or "navigation"

darcs-hash:20081119140758-f07c6-6e26456d50dcecc949fada31b0d4e72877fde1cc.gz
---
 inc/common.php                                |  4 +--
 inc/confutils.php                             | 31 +++++++++++++++++++
 inc/html.php                                  |  8 ++---
 inc/parser/metadata.php                       |  2 +-
 inc/parser/xhtml.php                          | 10 +++---
 inc/parserutils.php                           |  3 +-
 inc/template.php                              |  8 ++---
 lib/plugins/config/lang/en/lang.php           |  7 +++++
 .../config/settings/config.metadata.php       |  2 +-
 9 files changed, 56 insertions(+), 19 deletions(-)

diff --git a/inc/common.php b/inc/common.php
index faee93623..9f6920378 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -288,7 +288,7 @@ function breadcrumbs(){
 
   // page names
   $name = noNSorNS($ID);
-  if ($conf['useheading']) {
+  if (useHeading('navigation')) {
     // get page title
     $title = p_get_first_heading($ID,true);
     if ($title) {
@@ -1006,7 +1006,7 @@ function saveWikiText($id,$text,$summary,$minor=false){
   io_saveFile($conf['cachedir'].'/purgefile',time());
 
   // if useheading is enabled, purge the cache of all linking pages
-  if($conf['useheading']){
+  if(useHeading('content')){
     require_once(DOKU_INC.'inc/fulltext.php');
     $pages = ft_backlinks($id);
     foreach ($pages as $page) {
diff --git a/inc/confutils.php b/inc/confutils.php
index d735b8b82..a7799b9d4 100644
--- a/inc/confutils.php
+++ b/inc/confutils.php
@@ -205,5 +205,36 @@ function actionOK($action){
   return !in_array($action,$disabled);
 }
 
+/**
+ * check if headings should be used as link text for the specified link type
+ *
+ * @author Chris Smith <chris@jalakai.co.uk> 
+ *
+ * @param   string  $linktype   'content'|'navigation', content applies to links in wiki text
+ *                                                      navigation applies to all other links
+ * @returns boolean             true if headings should be used for $linktype, false otherwise
+ */
+function useHeading($linktype) {
+  static $useHeading = null;
+
+  if (is_null($useHeading)) {
+    global $conf;
+
+    if (!empty($conf['useheading'])) {
+      switch ($conf['useheading']) {
+        case 'content'    : $useHeading['content'] = true; break;
+        case 'navigation' : $useHeading['navigation'] = true; break;
+        default:
+          $useHeading['content'] = true;
+          $useHeading['navigation'] = true;
+      }
+    } else {
+      $useHeading = array();
+    }
+  }
+
+  return (!empty($useHeading[$linktype]));
+}
+
 
 //Setup VIM: ex: et ts=2 enc=utf-8 :
diff --git a/inc/html.php b/inc/html.php
index 8390a7b09..636c93a13 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -23,7 +23,7 @@ function html_wikilink($id,$name=NULL,$search=''){
     $xhtml_renderer = new Doku_Renderer_xhtml();
   }
 
-  return $xhtml_renderer->internallink($id,$name,$search,true);
+  return $xhtml_renderer->internallink($id,$name,$search,true,'navigation');
 }
 
 /**
@@ -353,7 +353,7 @@ function html_search(){
     $num = 1;
     foreach($data as $id => $cnt){
       print '<div class="search_result">';
-      print html_wikilink(':'.$id,$conf['useheading']?NULL:$id,$regex);
+      print html_wikilink(':'.$id,useHeading('navigation')?NULL:$id,$regex);
       print ': <span class="search_cnt">'.$cnt.' '.$lang['hits'].'</span><br />';
       if($num < 15){ // create snippets for the first number of matches only #FIXME add to conf ?
         print '<div class="search_snippet">'.ft_snippet($id,$regex).'</div>';
@@ -628,7 +628,7 @@ function html_recent($first=0){
     )));
     $form->addElement(form_makeCloseTag('a'));
 
-    $form->addElement(html_wikilink(':'.$recent['id'],$conf['useheading']?NULL:$recent['id']));
+    $form->addElement(html_wikilink(':'.$recent['id'],useHeading('navigation')?NULL:$recent['id']));
 
     $form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
     $form->addElement(' &ndash; '.htmlspecialchars($recent['sum']));
@@ -839,7 +839,7 @@ function html_backlinks(){
       print '<ul class="idx">';
       foreach($data as $blink){
         print '<li><div class="li">';
-        print html_wikilink(':'.$blink,$conf['useheading']?NULL:$blink);
+        print html_wikilink(':'.$blink,useHeading('navigation')?NULL:$blink);
         print '</div></li>';
       }
       print '</ul>';
diff --git a/inc/parser/metadata.php b/inc/parser/metadata.php
index 640306f87..5994a4dd1 100644
--- a/inc/parser/metadata.php
+++ b/inc/parser/metadata.php
@@ -427,7 +427,7 @@ class Doku_Renderer_metadata extends Doku_Renderer {
 
     $isImage = false;
     if (is_null($title)){
-      if ($conf['useheading'] && $id){
+      if (useHeading('content') && $id){
         $heading = p_get_first_heading($id,false);
         if ($heading) return $heading;
       }
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index 96afd1593..4fb6cb548 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -472,12 +472,12 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
     /**
      * Render an internal Wiki Link
      *
-     * $search and $returnonly are not for the renderer but are used
+     * $search,$returnonly & $linktype are not for the renderer but are used
      * elsewhere - no need to implement them in other renderers
      *
      * @author Andreas Gohr <andi@splitbrain.org>
      */
-    function internallink($id, $name = NULL, $search=NULL,$returnonly=false) {
+    function internallink($id, $name = NULL, $search=NULL,$returnonly=false,$linktype='content') {
         global $conf;
         global $ID;
         // default name is based on $id as given
@@ -485,7 +485,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
 
         // now first resolve and clean up the $id
         resolve_pageid(getNS($ID),$id,$exists);
-        $name = $this->_getLinkTitle($name, $default, $isImage, $id);
+        $name = $this->_getLinkTitle($name, $default, $isImage, $id, $linktype);
         if ( !$isImage ) {
             if ( $exists ) {
                 $class='wikilink1';
@@ -1026,12 +1026,12 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
      *
      * @author Harry Fuecks <hfuecks@gmail.com>
      */
-    function _getLinkTitle($title, $default, & $isImage, $id=NULL) {
+    function _getLinkTitle($title, $default, & $isImage, $id=NULL, $linktype='content') {
         global $conf;
 
         $isImage = false;
         if ( is_null($title) || trim($title)=='') {
-            if ($conf['useheading'] && $id) {
+            if (useHeading($linktype) && $id) {
                 $heading = p_get_first_heading($id,true);
                 if ($heading) {
                     return $this->_xmlEntities($heading);
diff --git a/inc/parserutils.php b/inc/parserutils.php
index 95d9647ff..ce4e8e995 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -618,8 +618,7 @@ function & p_get_renderer($mode) {
  * @author Andreas Gohr <andi@splitbrain.org>
  */
 function p_get_first_heading($id, $render=true){
-  global $conf;
-  return $conf['useheading'] ? p_get_metadata($id,'title',$render) : null;
+  return p_get_metadata($id,'title',$render);
 }
 
 /**
diff --git a/inc/template.php b/inc/template.php
index f5f2e7760..690f4ff41 100644
--- a/inc/template.php
+++ b/inc/template.php
@@ -860,7 +860,7 @@ function tpl_youarehere($sep=' &raquo; '){
   echo '<span class="bchead">'.$lang['youarehere'].': </span>';
 
   // always print the startpage
-  $title = p_get_first_heading($conf['start']);
+  $title = useHeading('navigation') ? p_get_first_heading($conf['start']) : $conf['start'];
   if(!$title) $title = $conf['start'];
   tpl_link(wl($conf['start']),hsc($title),'title="'.$conf['start'].'"');
 
@@ -875,7 +875,7 @@ function tpl_youarehere($sep=' &raquo; '){
     // output
     echo $sep;
     if($exists){
-      $title = p_get_first_heading($page);
+      $title = useHeading($page) ? p_get_first_heading($page) : $page;
       if(!$title) $title = $parts[$i];
       tpl_link(wl($page),hsc($title),'title="'.$page.'"');
     }else{
@@ -889,7 +889,7 @@ function tpl_youarehere($sep=' &raquo; '){
   if($page == $conf['start']) return;
   echo $sep;
   if(page_exists($page)){
-    $title = p_get_first_heading($page);
+    $title = useHeading($page) ? p_get_first_heading($page) : $page;
     if(!$title) $title = $parts[$i];
     tpl_link(wl($page),hsc($title),'title="'.$page.'"');
   }else{
@@ -989,7 +989,7 @@ function tpl_pagetitle($id=null, $ret=false){
   }
 
   $name = $id;
-  if ($conf['useheading']) {
+  if (useHeading('navigation')) {
     $title = p_get_first_heading($id);
     if ($title) $name = $title;
   }
diff --git a/lib/plugins/config/lang/en/lang.php b/lib/plugins/config/lang/en/lang.php
index 0865d3090..85317251a 100644
--- a/lib/plugins/config/lang/en/lang.php
+++ b/lib/plugins/config/lang/en/lang.php
@@ -221,3 +221,10 @@ $lang['showuseras_o_loginname']  = 'Login name';
 $lang['showuseras_o_username']   = "User's full name";
 $lang['showuseras_o_email']      = "User's e-mail addresss (obfuscated according to mailguard setting)";
 $lang['showuseras_o_email_link'] = "User's e-mail addresss as a mailto: link";
+
+/* useheading options */
+$lang['useheading_o_0'] = 'Never';
+$lang['useheading_o_navigation'] = 'Navigation Only';
+$lang['useheading_o_content'] = 'Wiki Content Only';
+$lang['useheading_o_1'] = 'Always';
+
diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php
index 5bee0fa32..12795d1bb 100644
--- a/lib/plugins/config/settings/config.metadata.php
+++ b/lib/plugins/config/settings/config.metadata.php
@@ -106,7 +106,7 @@ $meta['maxtoclevel'] = array('multichoice','_choices' => array(0,1,2,3,4,5));
 $meta['maxseclevel'] = array('multichoice','_choices' => array(0,1,2,3,4,5)); // 0 for no sec edit buttons
 $meta['camelcase']   = array('onoff');
 $meta['deaccent']    = array('multichoice','_choices' => array(0,1,2));
-$meta['useheading']  = array('onoff');
+$meta['useheading']  = array('multichoice','_choices' => array(0,'navigation','content',1));
 $meta['refcheck']    = array('onoff');
 $meta['refshow']     = array('numeric');
 
-- 
GitLab