2 // PukiWiki - Yet another WikiWikiWeb clone.
4 // Copyright 2002-2017 PukiWiki Development Team
5 // License: GPL v2 or (at your option) any later version
10 * プラグイン map: サイトマップ(のようなもの)を表示
11 * Usage : http://.../pukiwiki.php?plugin=map
16 * あるページがどこからリンクされているかを一覧。
19 // Show $non_list files
20 define('PLUGIN_MAP_SHOW_HIDDEN', 0); // 0, 1
22 function plugin_map_action()
24 global $vars, $whatsnew, $defaultpage, $non_list;
26 $reverse = isset($vars['reverse']);
27 $refer = isset($vars['refer']) ? $vars['refer'] : '';
28 if ($refer == '' || ! is_page($refer))
29 $vars['refer'] = $refer = $defaultpage;
31 $retval['msg'] = $reverse ? 'Relation map (link from)' : 'Relation map, from $1';
35 $pages = array_values(array_diff(get_existpages(), array($whatsnew)));
36 if (! PLUGIN_MAP_SHOW_HIDDEN)
37 $pages = array_diff($pages, preg_grep('/' . $non_list . '/', $pages));
39 $retval['body'] = 'No pages.';
42 $retval['body'] .= '<p>' . "\n" . 'Total: ' . count($pages) .
43 ' page(s) on this site.' . "\n" . '</p>' . "\n";
48 foreach ($pages as $page)
49 $nodes[$page] = new MapNode($page, $reverse);
51 // Node not found: Because of filtererd by $non_list
52 if (! isset($nodes[$refer])) $vars['refer'] = $refer = $defaultpage;
55 $keys = array_keys($nodes);
56 sort($keys, SORT_STRING);
58 $retval['body'] .= '<ul>' . "\n";
59 foreach ($keys as $page) {
60 if (! empty($nodes[$page]->rels)) {
61 $retval['body'] .= $nodes[$page]->toString($nodes, 1, $nodes[$page]->parent_id);
66 $retval['body'] .= '</ul>' . "\n";
67 if (! empty($alone)) {
68 $retval['body'] .= '<hr />' . "\n" .
69 '<p>No link from anywhere in this site.</p>' . "\n";
70 $retval['body'] .= '<ul>' . "\n";
71 foreach ($alone as $page)
72 $retval['body'] .= $nodes[$page]->toString($nodes, 1, $nodes[$page]->parent_id);
73 $retval['body'] .= '</ul>' . "\n";
76 $nodes[$refer]->chain($nodes);
77 $retval['body'] .= '<ul>' . "\n" . $nodes[$refer]->toString($nodes) . '</ul>' . "\n";
78 $retval['body'] .= '<hr />' . "\n" .
79 '<p>Not related from ' . htmlsc($refer) . '</p>' . "\n";
80 $keys = array_keys($nodes);
81 sort($keys, SORT_STRING);
82 $retval['body'] .= '<ul>' . "\n";
83 foreach ($keys as $page) {
84 if (! $nodes[$page]->done) {
85 $nodes[$page]->chain($nodes);
86 $retval['body'] .= $nodes[$page]->toString($nodes, 1, $nodes[$page]->parent_id);
89 $retval['body'] .= '</ul>' . "\n";
107 function MapNode($page, $reverse = FALSE)
109 $this->__construct($page, $reverse);
111 function __construct($page, $reverse = FALSE)
118 $this->is_page = is_page($page);
119 $this->cache = CACHE_DIR . encode($page);
120 $this->done = ! $this->is_page;
121 $this->link = make_pagelink($page);
123 $this->hide_pattern = '/' . $non_list . '/';
125 $this->rels = $reverse ? $this->ref() : $this->rel();
126 $mark = $reverse ? '' : '<sup>+</sup>';
127 $this->mark = '<a id="rel_' . $this->id . '" href="' . get_base_uri() .
128 '?plugin=map&refer=' . rawurlencode($this->page) . '">' .
132 function hide(& $pages)
134 if (! PLUGIN_MAP_SHOW_HIDDEN)
135 $pages = array_diff($pages, preg_grep($this->hide_pattern, $pages));
142 $file = $this->cache . '.ref';
143 if (file_exists($file)) {
144 foreach (file($file) as $line) {
145 $ref = explode("\t", $line);
149 sort($refs, SORT_STRING);
157 $file = $this->cache . '.rel';
158 if (file_exists($file)) {
160 $rels = explode("\t", trim($data[0]));
162 sort($rels, SORT_STRING);
167 function chain(& $nodes)
169 if ($this->done) return;
172 if ($this->parent_id == 0) $this->parent_id = -1;
174 foreach ($this->rels as $page) {
175 if (! isset($nodes[$page])) $nodes[$page] = new MapNode($page);
176 if ($nodes[$page]->parent_id == 0)
177 $nodes[$page]->parent_id = $this->id;
179 foreach ($this->rels as $page)
180 $nodes[$page]->chain($nodes);
183 function toString(& $nodes, $level = 1, $parent_id = -1)
185 $indent = str_repeat(' ', $level);
187 if (! $this->is_page) {
188 return $indent . '<li>' . $this->link . '</li>' . "\n";
189 } else if ($this->parent_id != $parent_id) {
190 return $indent . '<li>' . $this->link .
191 '<a href="#rel_' . $this->id . '">...</a></li>' . "\n";
193 $retval = $indent . '<li>' . $this->mark . $this->link . "\n";
194 if (! empty($this->rels)) {
197 foreach ($this->rels as $page)
198 if (isset($nodes[$page]) && $this->parent_id != $nodes[$page]->id)
199 $childs[] = $nodes[$page]->toString($nodes, $level, $this->id);
201 if (! empty($childs))
202 $retval .= $indent . ' <ul>' . "\n" .
203 join('', $childs) . $indent . ' </ul>' . "\n";
205 $retval .= $indent . '</li>' . "\n";