summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnika Henke <anika@selfthinker.org>2009-05-05 00:25:44 +0200
committerAnika Henke <anika@selfthinker.org>2009-05-05 00:25:44 +0200
commit91459163e4ff1c28a910340507960898f4d8e126 (patch)
tree9baa676a5121b84c13f03e738259ec3999f94422
parent2139f10a3767196a61404cfad3af5b6af3c04992 (diff)
downloadrpg-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.php1
-rw-r--r--inc/lang/de/lang.php1
-rw-r--r--inc/lang/en/lang.php1
-rw-r--r--inc/parser/xhtml.php92
-rw-r--r--lib/plugins/config/lang/de/lang.php4
-rw-r--r--lib/plugins/config/lang/en/lang.php6
-rw-r--r--lib/plugins/config/settings/config.metadata.php1
-rw-r--r--lib/tpl/default/design.css31
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;
+}