diff options
author | Anika Henke <anika@selfthinker.org> | 2009-05-05 00:25:44 +0200 |
---|---|---|
committer | Anika Henke <anika@selfthinker.org> | 2009-05-05 00:25:44 +0200 |
commit | 91459163e4ff1c28a910340507960898f4d8e126 (patch) | |
tree | 9baa676a5121b84c13f03e738259ec3999f94422 | |
parent | 2139f10a3767196a61404cfad3af5b6af3c04992 (diff) | |
download | rpg-91459163e4ff1c28a910340507960898f4d8e126.tar.gz rpg-91459163e4ff1c28a910340507960898f4d8e126.tar.bz2 |
Purple Numbers (granular hierarchical IDs) - set $conf['purplenumbers'] and adjust your CSS
darcs-hash:20090504222544-f7d6d-fd9e4c771c5aef32dc2927a1da4dfa4fc4f8b4f1.gz
-rw-r--r-- | conf/dokuwiki.php | 1 | ||||
-rw-r--r-- | inc/lang/de/lang.php | 1 | ||||
-rw-r--r-- | inc/lang/en/lang.php | 1 | ||||
-rw-r--r-- | inc/parser/xhtml.php | 92 | ||||
-rw-r--r-- | lib/plugins/config/lang/de/lang.php | 4 | ||||
-rw-r--r-- | lib/plugins/config/lang/en/lang.php | 6 | ||||
-rw-r--r-- | lib/plugins/config/settings/config.metadata.php | 1 | ||||
-rw-r--r-- | lib/tpl/default/design.css | 31 |
8 files changed, 127 insertions, 10 deletions
diff --git a/conf/dokuwiki.php b/conf/dokuwiki.php index 7f9ef2e9c..efbf2948d 100644 --- a/conf/dokuwiki.php +++ b/conf/dokuwiki.php @@ -32,6 +32,7 @@ $conf['recent'] = 20; //how many entries to show in recent $conf['breadcrumbs'] = 10; //how many recent visited pages to show $conf['youarehere'] = 0; //show "You are here" navigation? 0|1 $conf['typography'] = 1; //smartquote conversion 0=off, 1=doublequotes, 2=all quotes +$conf['purplenumbers']= 0; //show purple numbers? 0=off, 1=create IDs unique per page, 2=create IDs unique per site $conf['htmlok'] = 0; //may raw HTML be embedded? This may break layout and XHTML validity 0|1 $conf['phpok'] = 0; //may PHP code be embedded? Never do this on the internet! 0|1 $conf['dformat'] = '%Y/%m/%d %H:%M'; //dateformat accepted by PHPs strftime() function diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php index 0341ef160..903b2b9ae 100644 --- a/inc/lang/de/lang.php +++ b/inc/lang/de/lang.php @@ -70,6 +70,7 @@ $lang['badlogin'] = 'Nutzername oder Passwort sind falsch.'; $lang['minoredit'] = 'kleine Änderung'; $lang['draftdate'] = 'Entwurf gespeichert am'; $lang['nosecedit'] = 'Diese Seite wurde in der Zwischenzeit geändert, Sektionsinfo ist veraltet, lade stattdessen volle Seite.'; +$lang['sectionlink'] = 'Link zu diesem Abschnitt'; $lang['regmissing'] = 'Alle Felder müssen ausgefüllt werden'; $lang['reguexists'] = 'Der Nutzername existiert leider schon.'; $lang['regsuccess'] = 'Der neue Nutzer wurde angelegt und das Passwort per Email versandt.'; diff --git a/inc/lang/en/lang.php b/inc/lang/en/lang.php index d62579fb1..76e4b7a85 100644 --- a/inc/lang/en/lang.php +++ b/inc/lang/en/lang.php @@ -65,6 +65,7 @@ $lang['badlogin'] = 'Sorry, username or password was wrong.'; $lang['minoredit'] = 'Minor Changes'; $lang['draftdate'] = 'Draft autosaved on'; // full dformat date will be added $lang['nosecedit'] = 'The page was changed in the meantime, section info was out of date loaded full page instead.'; +$lang['sectionlink']= 'link to this section'; $lang['regmissing'] = 'Sorry, you must fill in all fields.'; $lang['reguexists'] = 'Sorry, a user with this login already exists.'; diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php index 3ef51a7b3..841e92f08 100644 --- a/inc/parser/xhtml.php +++ b/inc/parser/xhtml.php @@ -32,7 +32,9 @@ class Doku_Renderer_xhtml extends Doku_Renderer { var $headers = array(); var $footnotes = array(); - var $lastsec = 0; + var $pnid = 0; + var $lastlevel = 0; + var $node = array(0,0,0,0,0); var $store = ''; var $_counter = array(); // used as global counter, introduced for table classes @@ -92,6 +94,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer { // make sure there are no empty paragraphs $this->doc = preg_replace('#<p>\s*</p>#','',$this->doc); + if ($conf['purplenumbers']) $this->doc = preg_replace('#<p[^>]*>\s*<!--PN-->.*?(?:</p>)#','',$this->doc); } function toc_additem($id, $text, $level) { @@ -104,6 +107,8 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } function header($text, $level, $pos) { + global $conf; + global $lang; if(!$text) return; //skip empty headlines $hid = $this->_headerToLink($text,true); @@ -111,10 +116,22 @@ class Doku_Renderer_xhtml extends Doku_Renderer { //only add items within configured levels $this->toc_additem($hid, $text, $level); + // adjust $node to reflect hierarchy of levels + $this->node[$level-1]++; + if ($level < $this->lastlevel) { + for ($i = 0; $i < $this->lastlevel-$level; $i++) { + $this->node[$this->lastlevel-$i-1] = 0; + } + } + $this->pnid = 0; + $this->lastlevel = $level; + // write the header $this->doc .= DOKU_LF.'<h'.$level.'><a name="'.$hid.'" id="'.$hid.'">'; $this->doc .= $this->_xmlEntities($text); - $this->doc .= "</a></h$level>".DOKU_LF; + $this->doc .= "</a>"; + if ($conf['purplenumbers']) $this->doc .= " <a href='#$hid' class='pn' title='".$lang['sectionlink']."'>§</a>"; + $this->doc .= "</h$level>".DOKU_LF; } /** @@ -146,11 +163,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } function p_open() { - $this->doc .= DOKU_LF.'<p>'.DOKU_LF; + $this->doc .= DOKU_LF.'<p'.$this->_getPurpleNumberID().'>'.DOKU_LF; } function p_close() { - $this->doc .= DOKU_LF.'</p>'.DOKU_LF; + $this->doc .= DOKU_LF.$this->_getPurpleNumberLink().'</p>'.DOKU_LF; } function linebreak() { @@ -283,7 +300,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } function listitem_open($level) { - $this->doc .= '<li class="level'.$level.'">'; + $this->doc .= '<li class="level'.$level.'"'.$this->_getPurpleNumberID().'>'; } function listitem_close() { @@ -295,7 +312,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } function listcontent_close() { - $this->doc .= '</div>'.DOKU_LF; + $this->doc .= $this->_getPurpleNumberLink().'</div>'.DOKU_LF; } function unformatted($text) { @@ -348,11 +365,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer { } function preformatted($text) { - $this->doc .= '<pre class="code">' . $this->_xmlEntities($text) . '</pre>'. DOKU_LF; + $this->doc .= '<pre class="code"'.$this->_getPurpleNumberID().'>' . trim($this->_xmlEntities($text)) . $this->_getPurpleNumberLink(). '</pre>'. DOKU_LF; } function file($text) { - $this->doc .= '<pre class="file">' . $this->_xmlEntities($text). '</pre>'. DOKU_LF; + $this->doc .= '<pre class="file"'.$this->_getPurpleNumberID().'>' . trim($this->_xmlEntities($text)). $this->_getPurpleNumberLink(). '</pre>'. DOKU_LF; } function quote_open() { @@ -812,11 +829,11 @@ class Doku_Renderer_xhtml extends Doku_Renderer { function table_open($maxcols = NULL, $numrows = NULL){ // initialize the row counter used for classes $this->_counter['row_counter'] = 0; - $this->doc .= '<table class="inline">'.DOKU_LF; + $this->doc .= '<table class="inline"'.$this->_getPurpleNumberID().'>'.DOKU_LF; } function table_close(){ - $this->doc .= '</table>'.DOKU_LF; + $this->doc .= '</table>'.$this->_getPurpleNumberLink(1).DOKU_LF; } function tablerow_open(){ @@ -1084,6 +1101,61 @@ class Doku_Renderer_xhtml extends Doku_Renderer { return $link; } + + /** + * Builds unique Hierarchical ID: + * If $conf['purplenumbers'] is 2, it is unique per site, + * otherwise it is unique per page. + * + * @author Anika Henke <anika@selfthinker.org> + */ + function _getHID($noprefix=0) { + global $conf; + if ($noprefix) { + $prefix = ''; + } else if ($conf['purplenumbers']==2) { + global $ID; + $prefix = $ID.'.'; + } else { + $prefix = 'HID'; + } + return $prefix.rtrim(join('.',$this->node),'.0').rtrim(':'.$this->pnid,':0'); + } + + /** + * Equips each designated element with a Purple Number (Hierarchical ID). + * + * @author Anika Henke <anika@selfthinker.org> + */ + function _getPurpleNumberID() { + global $conf; + $this->pnid++; + if ($conf['purplenumbers']) { + return ' id="'.$this->_getHID().'"'; + } + return ''; + } + + /** + * Creates a link to the current Purple Number (Hierarchical ID). + * If the link cannot be inside its corresponding element (e.g. tables), + * $outside is set and p.pnlink is added around the link. + * + * @author Anika Henke <anika@selfthinker.org> + */ + function _getPurpleNumberLink($outside=0) { + global $conf; + if ($conf['purplenumbers']) { + global $lang; + $pnlink = '<a href="#'.$this->_getHID().'" class="pn" title="'.$lang['sectionlink'].'">¶</a>'; + if ($outside) { + return '<p class="pnlink">'.$pnlink.'</p>'; + } + return ' <!--PN-->'.$pnlink; + } + return ''; + } + } //Setup VIM: ex: et ts=4 enc=utf-8 : diff --git a/lib/plugins/config/lang/de/lang.php b/lib/plugins/config/lang/de/lang.php index 75dd03864..bedcf7b7c 100644 --- a/lib/plugins/config/lang/de/lang.php +++ b/lib/plugins/config/lang/de/lang.php @@ -54,6 +54,7 @@ $lang['recent'] = 'Anzahl der Einträge in der Änderungsliste'; $lang['breadcrumbs'] = 'Anzahl der Einträge im "Krümelpfad"'; $lang['youarehere'] = 'Hierarchische Pfadnavigation verwenden'; $lang['typography'] = 'Typographische Ersetzungen'; +$lang['purplenumbers'] = 'Zeige "Purple Numbers"'; $lang['htmlok'] = 'HTML erlauben'; $lang['phpok'] = 'PHP erlauben'; $lang['dformat'] = 'Datumsformat (Siehe PHP <a href="http://www.php.net/strftime">strftime</a> Funktion)'; @@ -147,6 +148,9 @@ $lang['license_o_'] = 'Keine gewählt'; $lang['typography_o_0'] = 'keine'; $lang['typography_o_1'] = 'ohne einfache Anführungszeichen'; $lang['typography_o_2'] = 'mit einfachen Anführungszeichen (funktioniert nicht immer)'; +$lang['purplenumbers_o_0'] = 'aus'; +$lang['purplenumbers_o_1'] = 'erzeuge IDs, die pro Seite eindeutig sind'; +$lang['purplenumbers_o_2'] = 'erzeuge IDs, die im gesamten Wiki eindeutig sind'; $lang['userewrite_o_0'] = 'keines'; $lang['userewrite_o_1'] = '.htaccess'; $lang['userewrite_o_2'] = 'DokuWiki'; diff --git a/lib/plugins/config/lang/en/lang.php b/lib/plugins/config/lang/en/lang.php index 9988ada62..f74393703 100644 --- a/lib/plugins/config/lang/en/lang.php +++ b/lib/plugins/config/lang/en/lang.php @@ -67,6 +67,7 @@ $lang['recent'] = 'Recent changes'; $lang['breadcrumbs'] = 'Number of breadcrumbs'; $lang['youarehere'] = 'Hierarchical breadcrumbs'; $lang['typography'] = 'Do typographical replacements'; +$lang['purplenumbers']= 'Show Purple Numbers'; $lang['htmlok'] = 'Allow embedded HTML'; $lang['phpok'] = 'Allow embedded PHP'; $lang['dformat'] = 'Date format (see PHP\'s <a href="http://www.php.net/strftime">strftime</a> function)'; @@ -176,6 +177,11 @@ $lang['typography_o_0'] = 'none'; $lang['typography_o_1'] = 'excluding single quotes'; $lang['typography_o_2'] = 'including single quotes (might not always work)'; +/* purplenumbers options */ +$lang['purplenumbers_o_0'] = 'off'; +$lang['purplenumbers_o_1'] = 'create IDs unique per page'; +$lang['purplenumbers_o_2'] = 'create IDs completely unique per site'; + /* userewrite options */ $lang['userewrite_o_0'] = 'none'; $lang['userewrite_o_1'] = '.htaccess'; diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php index 6c979574e..b506a8b91 100644 --- a/lib/plugins/config/settings/config.metadata.php +++ b/lib/plugins/config/settings/config.metadata.php @@ -102,6 +102,7 @@ $meta['breadcrumbs'] = array('numeric'); $meta['youarehere'] = array('onoff'); $meta['fullpath'] = array('onoff'); $meta['typography'] = array('multichoice','_choices' => array(0,1,2)); +$meta['purplenumbers']= array('multichoice','_choices' => array(0,1,2)); $meta['dformat'] = array('string'); $meta['signature'] = array('string'); $meta['showuseras'] = array('multichoice','_choices' => array('loginname','username','email','email_link')); diff --git a/lib/tpl/default/design.css b/lib/tpl/default/design.css index 0d84d94ab..1e946207e 100644 --- a/lib/tpl/default/design.css +++ b/lib/tpl/default/design.css @@ -799,3 +799,34 @@ div.dokuwiki div.imagemeta img.thumb { float:left; margin-right: 0.1em; } + +/* --------------- Purple Numbers ----------------- */ + +/* show only on hover */ +.dokuwiki a.pn { + visibility: hidden; + color: __text_other__ !important; +} +.dokuwiki h1:hover a.pn, +.dokuwiki h2:hover a.pn, +.dokuwiki h3:hover a.pn, +.dokuwiki h4:hover a.pn, +.dokuwiki h5:hover a.pn, +.dokuwiki p:hover a.pn, +.dokuwiki li:hover a.pn, +.dokuwiki pre:hover a.pn, +.dokuwiki table.inline:hover + .pnlink a.pn { + visibility: visible !important; +} +/* nested lists */ +.dokuwiki li:hover li a.pn { + visibility: hidden !important; +} +.dokuwiki li li:hover a.pn { + visibility: visible !important; +} + +/* if PN needs to be outside of its section */ +.dokuwiki .pnlink { + margin: -1.0em 0 0 0; +} |