From 4ceab83fd024405dfa43e10241bb9a9f7fee5bf5 Mon Sep 17 00:00:00 2001
From: Andreas Gohr <andi@splitbrain.org>
Date: Mon, 1 Dec 2008 22:55:39 +0100
Subject: [PATCH] Better creation of section IDs FS#1536

This patch enhances the creation of section IDs for number only headlines. It
also moves section ID creation to a function in pageutils.php removing some
duplicate functionality in inc/action.php

darcs-hash:20081201215539-7ad00-48f3c153a2c126d9fb06aa90e4f1b857f76ebec7.gz
---
 inc/actions.php      |  6 +-----
 inc/pageutils.php    | 46 ++++++++++++++++++++++++++++++++++++--------
 inc/parser/xhtml.php | 16 +++------------
 3 files changed, 42 insertions(+), 26 deletions(-)

diff --git a/inc/actions.php b/inc/actions.php
index 8da6c47cc..62b39efc2 100644
--- a/inc/actions.php
+++ b/inc/actions.php
@@ -340,11 +340,7 @@ function act_redirect($id,$preact){
 
   //get section name when coming from section edit
   if($PRE && preg_match('/^\s*==+([^=\n]+)/',$TEXT,$match)){
-    #FIXME duplicates code from xhtml renderer
-    $title = $match[0];
-    $title = str_replace(':','',cleanID($title));
-    $title = ltrim($title,'0123456789._-');
-    if(empty($title)) $title='section';
+    $title = sectionID($match[0]);
   }
 
   $opts = array(
diff --git a/inc/pageutils.php b/inc/pageutils.php
index e509dfde3..7a140ef8c 100644
--- a/inc/pageutils.php
+++ b/inc/pageutils.php
@@ -162,19 +162,19 @@ function noNS($id) {
 }
 
 /**
-* Returns the current namespace
-*
-* @author Nathan Fritz <fritzn@crown.edu>
-*/
+ * Returns the current namespace
+ *
+ * @author Nathan Fritz <fritzn@crown.edu>
+ */
 function curNS($id) {
     return noNS(getNS($id));
 }
 
 /**
-* Returns the ID without the namespace or current namespace for 'start' pages
-*
-* @author Nathan Fritz <fritzn@crown.edu>
-*/
+ * Returns the ID without the namespace or current namespace for 'start' pages
+ *
+ * @author Nathan Fritz <fritzn@crown.edu>
+ */
 function noNSorNS($id) {
     global $conf;
 
@@ -188,6 +188,36 @@ function noNSorNS($id) {
     return $p;
 }
 
+/**
+ * Creates a XHTML valid linkid from a given headline title
+ *
+ * @param string  $title   The headline title
+ * @param array   $check   List of existing IDs
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function sectionID($title,&$check=null) {
+    $title = str_replace(':','',cleanID($title));
+    $new = ltrim($title,'0123456789._-');
+    if(empty($new)){
+        $title = 'section'.preg_replace('/[^0-9]+/','',$title); //keep numbers from headline
+    }else{
+        $title = $new;
+    }
+
+    if(!is_null($check) && is_array($check)){
+        // make sure tiles are unique
+        $num = '';
+        while(in_array($title.$num,$check)){
+            ($num) ? $num++ : $num = 1;
+        }
+        $title = $title.$num;
+        $check[] = $title;
+    }
+
+    return $title;
+}
+
+
 /**
  *  Wiki page existence check
  *
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index 4fb6cb548..fda1ef36e 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -1004,21 +1004,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
      * @author Andreas Gohr <andi@splitbrain.org>
      */
     function _headerToLink($title,$create=false) {
-        $title = str_replace(':','',cleanID($title));
-        $title = ltrim($title,'0123456789._-');
-        if(empty($title)) $title='section';
-
         if($create){
-            // make sure tiles are unique
-            $num = '';
-            while(in_array($title.$num,$this->headers)){
-                ($num) ? $num++ : $num = 1;
-            }
-            $title = $title.$num;
-            $this->headers[] = $title;
+            return sectionID($title,$this->headers);
+        }else{
+            return sectionID($title);
         }
-
-        return $title;
     }
 
     /**
-- 
GitLab