aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/inc/Ui/Index.php
blob: 22132c92c27f3c97f695426050721fe3272bf297 (plain) (blame)
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
125
126
127
128
129
130
<?php

namespace dokuwiki\Ui;

/**
 * DokuWiki Index Interface
 *
 * @package dokuwiki\Ui
 */
class Index extends Ui
{
    protected $ns;

    /**
     * Index Ui constructor
     *
     * @param string $ns namespace
     */
    public function __construct($ns = '')
    {
        $this->ns = $ns;
    }


    /**
     * Display page index
     *
     * @return void
     * @author   Andreas Gohr <andi@splitbrain.org>
     *
     */
    public function show()
    {
        // print intro
        echo p_locale_xhtml('index');

        echo $this->sitemap();
    }

    /**
     * Build html of sitemap, unordered list of pages under the namespace
     *
     * @return string
     */
    public function sitemap()
    {
        global $conf;
        global $ID;

        $ns = cleanID($this->ns);
        if (empty($ns)) {
            $ns = getNS($ID);
            if ($ns === false) $ns = '';
        }
        $ns = utf8_encodeFN(str_replace(':', '/', $ns));
        $data = [];
        search($data, $conf['datadir'], 'search_index', ['ns' => $ns]);

        return '<div id="index__tree" class="index__tree">'
            . html_buildlist($data, 'idx', [$this, 'formatListItem'], [$this, 'tagListItem'])
            . '</div>';
    }

    /**
     * Index item formatter
     *
     * User function for html_buildlist()
     *
     * @param array $item
     * @return string
     * @author Andreas Gohr <andi@splitbrain.org>
     *
     */
    public function formatListItem($item)    // RENAMED from html_list_index()
    {
        global $ID, $conf;

        // prevent searchbots needlessly following links
        $nofollow = ($ID != $conf['start'] || $conf['sitemap']) ? 'rel="nofollow"' : '';

        $html = '';
        $base = ':' . $item['id'];
        $base = substr($base, strrpos($base, ':') + 1);
        if ($item['type'] == 'd') {
            // FS#2766, no need for search bots to follow namespace links in the index
            $link = wl($ID, 'idx=' . rawurlencode($item['id']));
            $html .= '<a href="' . $link . '" title="' . $item['id'] . '" class="idx_dir"' . $nofollow . '><strong>';
            $html .= $base;
            $html .= '</strong></a>';
        } else {
            // default is noNSorNS($id), but we want noNS($id) when useheading is off FS#2605
            $html .= html_wikilink(':' . $item['id'], useHeading('navigation') ? null : noNS($item['id']));
        }
        return $html;
    }

    /**
     * Index List item
     *
     * This user function is used in html_buildlist to build the
     * <li> tags for namespaces when displaying the page index
     * it gives different classes to opened or closed "folders"
     *
     * @param array $item
     * @return string html
     * @author Andreas Gohr <andi@splitbrain.org>
     *
     */
    public function tagListItem($item)    // RENAMED from html_li_index()
    {
        global $INFO;
        global $ACT;

        $class = '';
        $id = '';

        if ($item['type'] == 'f') {
            // scroll to the current item
            if (isset($INFO) && $item['id'] == $INFO['id'] && $ACT == 'index') {
                $id = ' id="scroll__here"';
                $class = ' bounce';
            }
            return '<li class="level' . $item['level'] . $class . '" ' . $id . '>';
        } elseif ($item['open']) {
            return '<li class="open">';
        } else {
            return '<li class="closed">';
        }
    }
}