summaryrefslogtreecommitdiff
path: root/action.php
blob: d896aa73249c126711062a70805688debb50e670 (plain)
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:                   */