diff --git a/inc/actions.php b/inc/actions.php index 8da6c47cc85d2a73226835249a4dfcf7d4142ce5..62b39efc2246dbc3f3fddeb12df676364d32c3b9 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 e509dfde37cd1542443935d9b89780d5f2e96cbc..7a140ef8c41e2d022c9410f44605f3901a9c7674 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 4fb6cb548e381421c8b1a532d50d5b7623411040..fda1ef36e113dd47bbc430f2bbef54d4448a68d9 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; } /**