2 // PukiWiki - Yet another WikiWikiWeb clone.
3 // $Id: map.inc.php,v 1.14 2005/01/10 09:17:11 henoheno Exp $
8 * ¥×¥é¥°¥¤¥ó map: ¥µ¥¤¥È¥Þ¥Ã¥×(¤Î¤è¤¦¤Ê¤â¤Î)¤òɽ¼¨
9 * Usage : http://.../pukiwiki.php?plugin=map
12 * µ¯ÅÀ¤È¤Ê¤ë¥Ú¡¼¥¸¤ò»ØÄê
14 * ¤¢¤ë¥Ú¡¼¥¸¤¬¤É¤³¤«¤é¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¤«¤ò°ìÍ÷¡£
17 // Show $non_list files
18 define('PLUGIN_MAP_SHOW_HIDDEN', 0); // 0, 1
20 function plugin_map_action()
22 global $vars, $whatsnew, $defaultpage, $non_list;
24 $reverse = isset($vars['reverse']);
25 $refer = isset($vars['refer']) ? $vars['refer'] : '';
26 if ($refer == '' || ! is_page($refer))
27 $vars['refer'] = $refer = $defaultpage;
29 $retval['msg'] = $reverse ? 'Relation map (link from)' : 'Relation map, from $1';
33 $pages = array_values(array_diff(get_existpages(), array($whatsnew)));
34 if (! PLUGIN_MAP_SHOW_HIDDEN)
35 $pages = array_diff($pages, preg_grep('/' . $non_list . '/', $pages));
37 $retval['body'] = 'No pages.';
40 $retval['body'] .= '<p>' . "\n" . 'Total: ' . count($pages) .
41 ' page(s) on this site.' . "\n" . '</p>' . "\n";
46 foreach ($pages as $page)
47 $nodes[$page] = & new MapNode($page, $reverse);
49 // Node not found: Because of filtererd by $non_list
50 if (! isset($nodes[$refer])) $vars['refer'] = $refer = $defaultpage;
53 $keys = array_keys($nodes);
56 $retval['body'] .= '<ul>' . "\n";
57 foreach ($keys as $page) {
58 if (! empty($nodes[$page]->rels)) {
59 $retval['body'] .= $nodes[$page]->toString($nodes, 1, $nodes[$page]->parent_id);
64 $retval['body'] .= '</ul>' . "\n";
65 if (! empty($alone)) {
66 $retval['body'] .= '<hr />' . "\n" .
67 '<p>No link from anywhere in this site.</p>' . "\n";
68 $retval['body'] .= '<ul>' . "\n";
69 foreach ($alone as $page)
70 $retval['body'] .= $nodes[$page]->toString($nodes, 1, $nodes[$page]->parent_id);
71 $retval['body'] .= '</ul>' . "\n";
74 $nodes[$refer]->chain($nodes);
75 $retval['body'] .= '<ul>' . "\n" . $nodes[$refer]->toString($nodes) . '</ul>' . "\n";
76 $retval['body'] .= '<hr />' . "\n" .
77 '<p>Not related from ' . htmlspecialchars($refer) . '</p>' . "\n";
78 $keys = array_keys($nodes);
80 $retval['body'] .= '<ul>' . "\n";
81 foreach ($keys as $page) {
82 if (! $nodes[$page]->done) {
83 $nodes[$page]->chain($nodes);
84 $retval['body'] .= $nodes[$page]->toString($nodes, 1, $nodes[$page]->parent_id);
87 $retval['body'] .= '</ul>' . "\n";
105 function MapNode($page, $reverse = FALSE)
107 global $script, $non_list;
112 $this->is_page = is_page($page);
113 $this->cache = CACHE_DIR . encode($page);
114 $this->done = ! $this->is_page;
115 $this->link = make_pagelink($page);
117 $this->hide_pattern = '/' . $non_list . '/';
119 $this->rels = $reverse ? $this->ref() : $this->rel();
120 $mark = $reverse ? '' : '<sup>+</sup>';
121 $this->mark = '<a id="rel_' . $this->id . '" href="' . $script .
122 '?plugin=map&refer=' . rawurlencode($this->page) . '">' .
126 function hide(& $pages)
128 if (! PLUGIN_MAP_SHOW_HIDDEN)
129 $pages = array_diff($pages, preg_grep($this->hide_pattern, $pages));
136 $file = $this->cache . '.ref';
137 if (file_exists($file)) {
138 foreach (file($file) as $line) {
139 $ref = explode("\t", $line);
151 $file = $this->cache . '.rel';
152 if (file_exists($file)) {
154 $rels = explode("\t", trim($data[0]));
161 function chain(& $nodes)
163 if ($this->done) return;
166 if ($this->parent_id == 0) $this->parent_id = -1;
168 foreach ($this->rels as $page) {
169 if (! isset($nodes[$page])) $nodes[$page] = & new MapNode($page);
170 if ($nodes[$page]->parent_id == 0)
171 $nodes[$page]->parent_id = $this->id;
173 foreach ($this->rels as $page)
174 $nodes[$page]->chain($nodes);
177 function toString(& $nodes, $level = 1, $parent_id = -1)
179 $indent = str_repeat(' ', $level);
181 if (! $this->is_page) {
182 return $indent . '<li>' . $this->link . '</li>' . "\n";
183 } else if ($this->parent_id != $parent_id) {
184 return $indent . '<li>' . $this->link .
185 '<a href="#rel_' . $this->id . '">...</a></li>' . "\n";
187 $retval = $indent . '<li>' . $this->mark . $this->link . "\n";
188 if (! empty($this->rels)) {
191 foreach ($this->rels as $page)
192 if (isset($nodes[$page]) && $this->parent_id != $nodes[$page]->id)
193 $childs[] = $nodes[$page]->toString($nodes, $level, $this->id);
195 if (! empty($childs))
196 $retval .= $indent . ' <ul>' . "\n" .
197 join('', $childs) . $indent . ' </ul>' . "\n";
199 $retval .= $indent . '</li>' . "\n";