*/ if(!defined('DOKU_INC')) die(); if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); require_once DOKU_PLUGIN.'action.php'; /** * search_namespaces1 * * like search_namespaces but with limited depth to 1 */ function treenav_search_namespaces(&$data,$base,$file,$type,$lvl,$opts){ $opts['listdirs'] = true; $opts['depth'] = 1; return search_universal($data,$base,$file,$type,$lvl,$opts); } /** * Helper class to list Pages and Namespaces */ class treenav_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'], 'treenav_search_namespaces', array(), str_replace(':', '/', $this->name)); foreach ($data as $ns) { $childs[] = new treenav_NamespaceNode($ns['id'], $this->level+1); } return $childs; } } /** * DokuWiki Action Plugin. Inserts Tree Navigation in div "page" and wraps * actual page in div "inner__page" */ class action_plugin_treenav extends DokuWiki_Action_Plugin { function register(&$controller) { $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'hook_beforePage'); $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, 'hook_afterPage'); } function hook_beforePage(&$event, $param) { global $ID; $deps = p_get_metadata($id, 'treenav_deps', true); $cache = new cache(cleanID($ID), 'plugin_treenav'); if (count($deps)>0 && $cache->useCache($deps)) { $doc = $cache->retrieveCache(false); } else { $deps = array('files' => array()); $root = new treenav_NamespaceNode('',0); $renderer =& p_get_renderer('xhtml'); $renderer->listu_open(); $this->_print($root, $renderer, $deps); $renderer->listu_close(); $doc = $renderer->doc; $cache->storeCache($doc); p_set_metadata($id, array('treenav_deps' => $deps)); } echo '
' . DOKU_LF . $doc . DOKU_LF . '
'; echo '
' . DOKU_LF; tpl_flush(); } function hook_afterPage(&$event, $param) { echo '
' . DOKU_LF; } function _print($node, &$renderer, &$deps) { global $ID; foreach ($node->getChildren() as $child) { foreach ($child->getPages() as $page) { if (noNS($page['id']) === 'start') { $renderer->listitem_open(); $deps['files'][] = wikiFN($page['id']); // Add page file to dependencies $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, $deps); $renderer->listu_close(); } $renderer->listitem_close(); } } } foreach ($node->getPages() as $page) { if (noNS($page['id']) == 'start' && getNS($page['id']) != '') continue; $renderer->listitem_open(); $deps['files'][] = wikiFN($page['id']); // Add page file to dependencies $this->_renderPagelink($page['id'], $renderer); $renderer->listitem_close(); } } function _renderPagelink($id, &$renderer) { global $conf; $id = ':' . cleanID($id); $options = p_get_metadata($id, 'treenav'); // Icon $iconID = $options['icon']; if ($iconID) { resolve_mediaid(getNS($id), $iconID, $exists); } if ($iconID && $exists) { $link = ml($iconID, array('h'=>16, 'cache'=>NULL)); } else { if (noNS($id) === $conf['start'] && getNS($id) !== '') { $link = DOKU_REL . 'lib/plugins/treenav/images/zoom-in-symbolic.png'; } else { $link = DOKU_REL . 'lib/plugins/treenav/images/go-next-symbolic.png'; } } $renderer->doc .= '' . DOKU_LF; 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: */