1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
<?php
/**
* Simple Tree Navigation Plugin
* @author Yves Fischer <yvesf-git@xapek.org>
*/
if(!defined('DOKU_INC')) die();
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once DOKU_PLUGIN.'action.php';
function search_namespaces1(&$data,$base,$file,$type,$lvl,$opts){
$opts['listdirs'] = true;
$opts['depth'] = 1;
return search_universal($data,$base,$file,$type,$lvl,$opts);
}
class NamespaceNode {
public $name;
public $level;
public function __construct($name, $level) {
$this->name = $name;
$this->level = $level;
}
public function getPages() {
global $conf;
$data = array();
search($data,$conf['datadir'], 'search_list', array(), str_replace(':','/', $this->name));
return $data;
}
public function getChildren() {
global $conf;
$data = array();
$childs = array();
search($data,$conf['datadir'], 'search_namespaces1', array(), str_replace(':', '/', $this->name));
foreach ($data as $ns) {
$childs[] = new NamespaceNode($ns['id'], $this->level+1);
}
return $childs;
}
}
class action_plugin_treenav extends DokuWiki_Action_Plugin {
function register(&$controller) {
$controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this,
'_before_page');
$controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this,
'_after_page');
}
function _after_page(&$event, $param) {
echo '</div>' . DOKU_LF;
}
function _before_page(&$event, $param) {
global $ID;
$root = new NamespaceNode('',0);
$renderer =& p_get_renderer('xhtml');
$renderer->listu_open();
$this->_print($root, $renderer);
$renderer->listu_close();
echo '<div class="treenav">' . DOKU_LF . $renderer->doc . DOKU_LF . '</div>';
echo '<div class="page__inner">' . DOKU_LF;
}
function _print($node, &$renderer) {
global $ID;
foreach ($node->getChildren() as $child) {
foreach ($child->getPages() as $page) {
if (noNS($page['id']) === 'start') {
$renderer->listitem_open();
$renderer->cdata('>');
$this->_renderPagelink($page['id'], $renderer);
if (strpos(getNS($ID), $child->name) === 0) {
// Recursive Call with Sub-Namespace that contains
// current Page ($ID)
$renderer->listu_open();
$this->_print($child, $renderer);
$renderer->listu_close();
}
$renderer->listitem_close();
}
}
}
foreach ($node->getPages() as $page) {
if (noNS($page['id']) == 'start' && getNS($page['id']) != '')
continue;
$renderer->listitem_open();
$this->_renderPagelink($page['id'], $renderer);
$renderer->listitem_close();
}
}
function _renderPagelink($id, &$renderer) {
$id = ':' . cleanID($id);
$options = p_get_metadata($id, 'treenav', true);
if ($options['icon']) {
$iconID = $options['icon'];
resolve_mediaid(getNS($id), $iconID, $exists);
if ($exists) {
$renderer->doc .= $renderer->_media($iconID, NULL, NULL, 16, 16);
}
}
if ($options['title']) {
$title = $options['title'];
} else {
$title = p_get_first_heading($id);
}
$renderer->internallink($id, $title);
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
/* Local Variables: */
/* tab-width: 4 */
/* indent-tabs-mode: nil */
/* c-basic-offset: 4 */
/* End: */
|