1 <?php
2 
3 namespace dokuwiki\Ui;
4 
5 /**
6  * DokuWiki Index Interface
7  *
8  * @package dokuwiki\Ui
9  */
10 class Index extends Ui
11 {
12     protected $ns;
13 
14     /**
15      * Index Ui constructor
16      *
17      * @param string $ns namespace
18      */
19     public function __construct($ns = '')
20     {
21         $this->ns = $ns;
22     }
23 
24 
25     /**
26      * Display page index
27      *
28      * @return void
29      * @author   Andreas Gohr <andi@splitbrain.org>
30      *
31      */
32     public function show()
33     {
34         // print intro
35         echo p_locale_xhtml('index');
36 
37         echo $this->sitemap();
38     }
39 
40     /**
41      * Build html of sitemap, unordered list of pages under the namespace
42      *
43      * @return string
44      */
45     public function sitemap()
46     {
47         global $conf;
48         global $ID;
49 
50         $ns = cleanID($this->ns);
51         if (empty($ns)) {
52             $ns = getNS($ID);
53             if ($ns === false) $ns = '';
54         }
55         $ns = utf8_encodeFN(str_replace(':', '/', $ns));
56         $data = [];
57         search($data, $conf['datadir'], 'search_index', ['ns' => $ns]);
58 
59         return '<div id="index__tree" class="index__tree">'
60             . html_buildlist($data, 'idx', [$this, 'formatListItem'], [$this, 'tagListItem'])
61             . '</div>';
62     }
63 
64     /**
65      * Index item formatter
66      *
67      * User function for html_buildlist()
68      *
69      * @param array $item
70      * @return string
71      * @author Andreas Gohr <andi@splitbrain.org>
72      *
73      */
74     public function formatListItem($item)    // RENAMED from html_list_index()
75     {
76         global $ID, $conf;
77 
78         // prevent searchbots needlessly following links
79         $nofollow = ($ID != $conf['start'] || $conf['sitemap']) ? 'rel="nofollow"' : '';
80 
81         $html = '';
82         $base = ':' . $item['id'];
83         $base = substr($base, strrpos($base, ':') + 1);
84         if ($item['type'] == 'd') {
85             // FS#2766, no need for search bots to follow namespace links in the index
86             $link = wl($ID, 'idx=' . rawurlencode($item['id']));
87             $html .= '<a href="' . $link . '" title="' . $item['id'] . '" class="idx_dir"' . $nofollow . '><strong>';
88             $html .= $base;
89             $html .= '</strong></a>';
90         } else {
91             // default is noNSorNS($id), but we want noNS($id) when useheading is off FS#2605
92             $html .= html_wikilink(':' . $item['id'], useHeading('navigation') ? null : noNS($item['id']));
93         }
94         return $html;
95     }
96 
97     /**
98      * Index List item
99      *
100      * This user function is used in html_buildlist to build the
101      * <li> tags for namespaces when displaying the page index
102      * it gives different classes to opened or closed "folders"
103      *
104      * @param array $item
105      * @return string html
106      * @author Andreas Gohr <andi@splitbrain.org>
107      *
108      */
109     public function tagListItem($item)    // RENAMED from html_li_index()
110     {
111         global $INFO;
112         global $ACT;
113 
114         $class = '';
115         $id = '';
116 
117         if ($item['type'] == 'f') {
118             // scroll to the current item
119             if (isset($INFO) && $item['id'] == $INFO['id'] && $ACT == 'index') {
120                 $id = ' id="scroll__here"';
121                 $class = ' bounce';
122             }
123             return '<li class="level' . $item['level'] . $class . '" ' . $id . '>';
124         } elseif ($item['open']) {
125             return '<li class="open">';
126         } else {
127             return '<li class="closed">';
128         }
129     }
130 }
131