*/ 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 '' . 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 '
' . DOKU_LF . $renderer->doc . DOKU_LF . '
'; echo '
' . 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']) { $mediaid = resolve_mediaid(getNS($id), $options['icon'], $exists); if ($exists) { $renderer->_media($mediaid, NULL, NULL, 32, 32); } } if ($options['title']) { $title = $options['title']; } else { $title = p_get_first_heading($id); } $renderer->internallink($id, $title); } }