OSDN Git Service

BugTrack/791: Fix typo 0,91 => 0.91
[pukiwiki/pukiwiki.git] / plugin / map.inc.php
1 <?php
2 // PukiWiki - Yet another WikiWikiWeb clone.
3 // $Id: map.inc.php,v 1.14 2005/01/10 09:17:11 henoheno Exp $
4 //
5 // Site map plugin
6
7 /*
8  * ¥×¥é¥°¥¤¥ó map: ¥µ¥¤¥È¥Þ¥Ã¥×(¤Î¤è¤¦¤Ê¤â¤Î)¤òɽ¼¨
9  * Usage : http://.../pukiwiki.php?plugin=map
10  * ¥Ñ¥é¥á¡¼¥¿
11  *   &refer=¥Ú¡¼¥¸Ì¾
12  *     µ¯ÅÀ¤È¤Ê¤ë¥Ú¡¼¥¸¤ò»ØÄê
13  *   &reverse=true
14  *     ¤¢¤ë¥Ú¡¼¥¸¤¬¤É¤³¤«¤é¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¤«¤ò°ìÍ÷¡£
15 */
16
17 // Show $non_list files
18 define('PLUGIN_MAP_SHOW_HIDDEN', 0); // 0, 1
19
20 function plugin_map_action()
21 {
22         global $vars, $whatsnew, $defaultpage, $non_list;
23
24         $reverse = isset($vars['reverse']);
25         $refer   = isset($vars['refer']) ? $vars['refer'] : '';
26         if ($refer == '' || ! is_page($refer))
27                 $vars['refer'] = $refer = $defaultpage;
28
29         $retval['msg']  = $reverse ? 'Relation map (link from)' : 'Relation map, from $1';
30         $retval['body'] = '';
31
32         // Get pages
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));
36         if (empty($pages)) {
37                 $retval['body'] = 'No pages.';
38                 return $retval;
39         } else {
40                 $retval['body'] .= '<p>' . "\n" .  'Total: ' . count($pages) .
41                         ' page(s) on this site.' . "\n" . '</p>' . "\n";
42         }
43
44         // Generate a tree
45         $nodes = array();
46         foreach ($pages as $page)
47                 $nodes[$page] = & new MapNode($page, $reverse);
48
49         // Node not found: Because of filtererd by $non_list
50         if (! isset($nodes[$refer])) $vars['refer'] = $refer = $defaultpage;
51
52         if ($reverse) {
53                 $keys = array_keys($nodes);
54                 sort($keys);
55                 $alone = array();
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);
60                         } else {
61                                 $alone[] = $page;
62                         }
63                 }
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";
72                 }
73         } else {
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);
79                 sort($keys);
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);
85                         }
86                 }
87                 $retval['body'] .= '</ul>' . "\n";
88         }
89
90         // ½ªÎ»
91         return $retval;
92 }
93
94 class MapNode
95 {
96         var $page;
97         var $is_page;
98         var $link;
99         var $id;
100         var $rels;
101         var $parent_id = 0;
102         var $done;
103         var $hide_pattern;
104
105         function MapNode($page, $reverse = FALSE)
106         {
107                 global $script, $non_list;
108
109                 static $id = 0;
110
111                 $this->page    = $page;
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);
116                 $this->id      = ++$id;
117                 $this->hide_pattern = '/' . $non_list . '/';
118
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&amp;refer=' . rawurlencode($this->page) . '">' .
123                         $mark . '</a>';
124         }
125
126         function hide(& $pages)
127         {
128                 if (! PLUGIN_MAP_SHOW_HIDDEN)
129                         $pages = array_diff($pages, preg_grep($this->hide_pattern, $pages));
130                 return $pages;
131         }
132
133         function ref()
134         {
135                 $refs = array();
136                 $file = $this->cache . '.ref';
137                 if (file_exists($file)) {
138                         foreach (file($file) as $line) {
139                                 $ref = explode("\t", $line);
140                                 $refs[] = $ref[0];
141                         }
142                         $this->hide($refs);
143                         sort($refs);
144                 }
145                 return $refs;
146         }
147
148         function rel()
149         {
150                 $rels = array();
151                 $file = $this->cache . '.rel';
152                 if (file_exists($file)) {
153                         $data = file($file);
154                         $rels = explode("\t", trim($data[0]));
155                         $this->hide($rels);
156                         sort($rels);
157                 }
158                 return $rels;
159         }
160
161         function chain(& $nodes)
162         {
163                 if ($this->done) return;
164
165                 $this->done = TRUE;
166                 if ($this->parent_id == 0) $this->parent_id = -1;
167
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;
172                 }
173                 foreach ($this->rels as $page)
174                         $nodes[$page]->chain($nodes);
175         }
176
177         function toString(& $nodes, $level = 1, $parent_id = -1)
178         {
179                 $indent = str_repeat(' ', $level);
180
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";
186                 }
187                 $retval = $indent . '<li>' . $this->mark . $this->link . "\n";
188                 if (! empty($this->rels)) {
189                         $childs = array();
190                         $level += 2;
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);
194
195                         if (! empty($childs))
196                                 $retval .= $indent . ' <ul>' . "\n" .
197                                         join('', $childs) . $indent . ' </ul>' . "\n";
198                 }
199                 $retval .= $indent . '</li>' . "\n";
200
201                 return $retval;
202         }
203 }
204 ?>