<?php
-/*
-Last-Update:2002-11-29 rev.12
- http://home.arino.jp/?map.inc.php
-
-¥×¥é¥°¥¤¥ó map
-
-¥µ¥¤¥È¥Þ¥Ã¥×(¤Î¤è¤¦¤Ê¤â¤Î)¤òɽ¼¨
-
-Usage : http://.../pukiwiki.php?plugin=map
-
-¥Ñ¥é¥á¡¼¥¿
-
-&refer=¥Ú¡¼¥¸Ì¾
- µ¯ÅÀ¤È¤Ê¤ë¥Ú¡¼¥¸¤ò»ØÄê
+// PukiWiki - Yet another WikiWikiWeb clone.
+// $Id: map.inc.php,v 1.18 2011/01/25 15:01:01 henoheno Exp $
+// Copyright (C) 2002-2005, 2007 PukiWiki Developers Team
+// License: GPL v2 or (at your option) any later version
+//
+// Site map plugin
-¤³¤Î¥Ð¡¼¥¸¥ç¥ó¤Ç¤Ïcmd=reload¤ò»ØÄꤷ¤Æ¤âÆ°ºî¤ÏÊѤï¤ê¤Þ¤»¤ó¡£
-%%&cmd=reload%%
-%% ¥¥ã¥Ã¥·¥å¤òÇË´þ¤·¡¢¥Ú¡¼¥¸¤ò²òÀϤ·¤Ê¤ª¤¹%%
-
-&reverse=true
- ¤¢¤ë¥Ú¡¼¥¸¤¬¤É¤³¤«¤é¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¤«¤ò°ìÍ÷¡£
-
-&url=true
- ¥Ï¥¤¥Ñ¡¼¥ê¥ó¥¯(http:/ftp:/mail:)¤òɽ¼¨¤¹¤ë¡£
+/*
+ * プラグイン map: サイトマップ(のようなもの)を表示
+ * Usage : http://.../pukiwiki.php?plugin=map
+ * パラメータ
+ * &refer=ページ名
+ * 起点となるページを指定
+ * &reverse=true
+ * あるページがどこからリンクされているかを一覧。
*/
-function plugin_map_action() {
- global $script,$vars,$defaultpage,$whatsnew;
- global $Pages,$Anchor,$Level,$Dirty,$retval;
+// Show $non_list files
+define('PLUGIN_MAP_SHOW_HIDDEN', 0); // 0, 1
- //reverse=true?
- $reverse = array_key_exists('reverse',$vars);
+function plugin_map_action()
+{
+ global $vars, $whatsnew, $defaultpage, $non_list;
- //´ð½à¤È¤Ê¤ë¥Ú¡¼¥¸Ì¾¤ò·èÄê
- $refer = array_key_exists('refer',$vars) ? $vars['refer'] : '';
+ $reverse = isset($vars['reverse']);
+ $refer = isset($vars['refer']) ? $vars['refer'] : '';
+ if ($refer == '' || ! is_page($refer))
+ $vars['refer'] = $refer = $defaultpage;
- //$retval['msg']¤Î$1¤òÃÖ´¹¤µ¤»¤ë¤¿¤á¤Ë$vars['refer']¤ò½ñ¤´¹¤¨¤Æ¤¤¤ë¡£
- if ($refer == '') { $vars['refer'] = $refer = $defaultpage; }
+ $retval['msg'] = $reverse ? 'Relation map (link from)' : 'Relation map, from $1';
+ $retval['body'] = '';
- //Ìá¤êÃͤò½é´ü²½
- if ($reverse) {
- $retval['msg'] = 'Relation map (link from)';
+ // Get pages
+ $pages = array_values(array_diff(get_existpages(), array($whatsnew)));
+ if (! PLUGIN_MAP_SHOW_HIDDEN)
+ $pages = array_diff($pages, preg_grep('/' . $non_list . '/', $pages));
+ if (empty($pages)) {
+ $retval['body'] = 'No pages.';
+ return $retval;
} else {
- $retval['msg'] = 'Relation map, from $1';
+ $retval['body'] .= '<p>' . "\n" . 'Total: ' . count($pages) .
+ ' page(s) on this site.' . "\n" . '</p>' . "\n";
}
- $retval['body'] = '';
-
- //¥Ú¡¼¥¸¤òÎóµó
- $pages = get_existpages();
- //RecentChanges¤Ï½ü¤¯¡£
- $n = array_search($whatsnew,$pages);
- if ($n !== FALSE) { unset($pages[$n]); }
+ // Generate a tree
+ $nodes = array();
+ foreach ($pages as $page)
+ $nodes[$page] = new MapNode($page, $reverse);
- //¸½Â¸¤¹¤ë¥Ú¡¼¥¸¤Î¿ô
- $count = count($pages);
-
- if ($count == 0) {
- $retval['body'] = 'no pages.';
- return $retval;
- }
+ // Node not found: Because of filtererd by $non_list
+ if (! isset($nodes[$refer])) $vars['refer'] = $refer = $defaultpage;
- //¥Ú¡¼¥¸¿ô
- $retval['body'] .= "<p>\ntotal: $count page(s) on this site.\n</p>\n";
-
- //get_link¤òÄ̤¹¤³¤È¤Ç¡¢¥ª¥Ö¥¸¥§¥¯¥È¤ÎÇÛÎó¤È¤¹¤ë
- $obj = new link_wrapper($refer);
- $pages = $obj->get_link(join(' ',$pages));
-
- //¥Ú¡¼¥¸¤Î°À¤ò¼èÆÀ
- $anchor = 0;
- $_pages = array();
- foreach (array_keys($pages) as $key) {
- $_obj =& $pages[$key];
- $_obj->_exist = TRUE;
- $_obj->_ctime = filemtime(get_filename(encode($_obj->name)));
- $_obj->_anchor = ++$anchor;
- $_obj->_link = $_obj->toString($refer);
- $_obj->_level = 0;
-
- $_pages[$_obj->name] =& $pages[$key];
- }
- $pages = $_pages; unset($_pages);
-
- //¥Ú¡¼¥¸Æâ¤Î¥ê¥ó¥¯¤òÎóµó
- foreach (array_keys($pages) as $page) {
- $obj->page = $page; // link_wrapper¤Î»È¤¤¤Þ¤ï¤·
- $data = $obj->get_link(join('',preg_grep('/^[^\s#]/',get_source($page))));
- $pages[$page]->_count = count($data);
- foreach ($data as $link) {
- if ($link->type == 'WikiName' or $link->type == 'BracketName') {
- if (array_key_exists($link->name,$pages)) {
- $pages[$page]->_links['WikiName'][$link->name] =& $pages[$link->name];
- } else {
- $link->_exist = FALSE;
- $link->_link = $link->toString();
- $pages[$page]->_links['WikiName'][$link->name] = $link;
- }
+ if ($reverse) {
+ $keys = array_keys($nodes);
+ sort($keys, SORT_STRING);
+ $alone = array();
+ $retval['body'] .= '<ul>' . "\n";
+ foreach ($keys as $page) {
+ if (! empty($nodes[$page]->rels)) {
+ $retval['body'] .= $nodes[$page]->toString($nodes, 1, $nodes[$page]->parent_id);
} else {
- $link->is_image = FALSE; //¤ª¤¤
- $link->_link = $link->toString();
- $pages[$page]->_links[$link->type][$link->name] = $link;
+ $alone[] = $page;
}
}
- }
-
- //ʤÙÂؤ¨
-// uksort($Pages,'myWikiNameComp');
-
- if ($reverse) { //µÕÊý¸þ
- //Îóµó
- foreach (array_keys($pages) as $page)
- foreach ($pages[$page]->_links['WikiName'] as $from)
- if ($page != $from->name) { $pages[$from->name]->_from[] = $page; }
-
- foreach (array_keys($pages) as $page)
- usort($pages[$page]->_from);
-
- $retval['body'] .= showReverse($pages,TRUE);
- $retval['body'] .= "<hr />\n<p>no link from anywhere in this site.</p>\n";
- $retval['body'] .= showReverse($pages,FALSE);
- } else { //½çÊý¸þ
- //À°·Á
- $retval['body'] .= "<ul>\n".showNode($pages,$refer)."</ul>\n";
-
- //not related
- $link_refer = '<a href="$script?'.rawurlencode($refer).'">'.htmlspecialchars(strip_bracket($refer)).'</a>';
- $retval['body'] .= "<hr />\n<p>not related from $link_refer</p>\n";
- foreach (array_keys($pages) as $page) {
- if ($pages[$page]->_exist and $pages[$page]->_level == 0) {
- $retval['body'] .= "<ul>\n" . showNode($pages,$page) . "</ul>\n";
+ $retval['body'] .= '</ul>' . "\n";
+ if (! empty($alone)) {
+ $retval['body'] .= '<hr />' . "\n" .
+ '<p>No link from anywhere in this site.</p>' . "\n";
+ $retval['body'] .= '<ul>' . "\n";
+ foreach ($alone as $page)
+ $retval['body'] .= $nodes[$page]->toString($nodes, 1, $nodes[$page]->parent_id);
+ $retval['body'] .= '</ul>' . "\n";
+ }
+ } else {
+ $nodes[$refer]->chain($nodes);
+ $retval['body'] .= '<ul>' . "\n" . $nodes[$refer]->toString($nodes) . '</ul>' . "\n";
+ $retval['body'] .= '<hr />' . "\n" .
+ '<p>Not related from ' . htmlsc($refer) . '</p>' . "\n";
+ $keys = array_keys($nodes);
+ sort($keys, SORT_STRING);
+ $retval['body'] .= '<ul>' . "\n";
+ foreach ($keys as $page) {
+ if (! $nodes[$page]->done) {
+ $nodes[$page]->chain($nodes);
+ $retval['body'] .= $nodes[$page]->toString($nodes, 1, $nodes[$page]->parent_id);
}
}
+ $retval['body'] .= '</ul>' . "\n";
}
- //½ªÎ»
+ // 終了
return $retval;
}
-function showReverse(&$pages,$not) {
- $body = '';
-
- foreach (array_keys($pages) as $page) {
- if (!$pages[$page]->_exist) { continue; }
- if (count($pages[$page]->_from) xor $not) { continue; }
- $body .= ' <li>'.$pages[$page]->_link;
- if (count($pages[$page]->_from)) {
- if ($not) { $body .= ' is link from'; }
- $body .= "\n <ul>\n";
- foreach ($pages[$page]->_from as $from)
- $body .= " <li>{$pages[$from]->_link}</li>\n";
- $body .= ' </ul>';
- }
- $body .= "</li>\n";
- }
- return ($body == '') ? '' : "<ul>\n$body</ul>\n";
-}
-//¥Ä¥ê¡¼¤òÀ¸À®¤·¡¢°õ»ú¤¹¤ë
-function showNode(&$pages,$page,$level = 0) {
- global $script,$vars;
- $body = '';
-
- if ($pages[$page]->_level != $level) { // ¤Þ¤Àɽ¼¨¤¹¤ëÃʳ¬¤Ç¤Ï¤Ê¤¤
- $body .= ' <li>'.$pages[$page]->_link;
- if ($pages[$page]->_count > 0)
- $body .= ' <a href="#rel'.$pages[$page]->_anchor.'" title="'.$pages[$page]->special.'">...</a>';
- $body .= "</li>\n";
- return $body;
+class MapNode
+{
+ var $page;
+ var $is_page;
+ var $link;
+ var $id;
+ var $rels;
+ var $parent_id = 0;
+ var $done;
+ var $hide_pattern;
+
+ function MapNode($page, $reverse = FALSE)
+ {
+ global $script, $non_list;
+
+ static $id = 0;
+
+ $this->page = $page;
+ $this->is_page = is_page($page);
+ $this->cache = CACHE_DIR . encode($page);
+ $this->done = ! $this->is_page;
+ $this->link = make_pagelink($page);
+ $this->id = ++$id;
+ $this->hide_pattern = '/' . $non_list . '/';
+
+ $this->rels = $reverse ? $this->ref() : $this->rel();
+ $mark = $reverse ? '' : '<sup>+</sup>';
+ $this->mark = '<a id="rel_' . $this->id . '" href="' . $script .
+ '?plugin=map&refer=' . rawurlencode($this->page) . '">' .
+ $mark . '</a>';
}
- $pages[$page]->_level = -1; //ɽ¼¨ºÑ¤ß
- $body .= ' <li>';
- if ($pages[$page]->_count > 0) {
- $url = array_key_exists('url',$vars) ? '&url=true' : '';
- $id = ($pages[$page]->_anchor == 0) ? '' : 'id="rel'.$pages[$page]->_anchor.'"';
- $body .= "<a $id href=\"$script?plugin=map$url&refer={$pages[$page]->rawname}\" title=\"change refer\"><sup>+</sup></a>\n";
+ function hide(& $pages)
+ {
+ if (! PLUGIN_MAP_SHOW_HIDDEN)
+ $pages = array_diff($pages, preg_grep($this->hide_pattern, $pages));
+ return $pages;
}
-
- $body .= $pages[$page]->_link."\n";
+ function ref()
+ {
+ $refs = array();
+ $file = $this->cache . '.ref';
+ if (file_exists($file)) {
+ foreach (file($file) as $line) {
+ $ref = explode("\t", $line);
+ $refs[] = $ref[0];
+ }
+ $this->hide($refs);
+ sort($refs, SORT_STRING);
+ }
+ return $refs;
+ }
- //¥ê¥ì¡¼¥·¥ç¥ó¤ÎÎóµó
- if ($pages[$page]->_count > 0) {
- $_rel = showWikiNodes($pages,$page,$level).showHyperLinks($pages[$page]).showInterWikiName($pages[$page]);
- if ($_rel != '')
- $body .= "<ul>\n$_rel</ul>\n";
+ function rel()
+ {
+ $rels = array();
+ $file = $this->cache . '.rel';
+ if (file_exists($file)) {
+ $data = file($file);
+ $rels = explode("\t", trim($data[0]));
+ $this->hide($rels);
+ sort($rels, SORT_STRING);
+ }
+ return $rels;
}
- return $body."</li>\n";
-}
-//WikiName,BracketName¤Î½ÐÎÏ
-function showWikiNodes(&$pages,$page,$level) {
- if (!array_key_exists('WikiName',$pages[$page]->_links)) { return ''; }
-
- $body = '';
- $_level = $level + 1;
-
- foreach ($pages[$page]->_links['WikiName'] as $_obj)
- if ($pages[$_obj->name]->_level == 0)
- $pages[$_obj->name]->_level = $_level; //ɽ¼¨¤òͽÌó
-
- foreach ($pages[$page]->_links['WikiName'] as $_obj) {
- if ($_obj->_exist)
- $body .= showNode($pages,$_obj->name,$_level);
- else
- $body .= " <li>{$_obj->_link}</li>";
+ function chain(& $nodes)
+ {
+ if ($this->done) return;
+
+ $this->done = TRUE;
+ if ($this->parent_id == 0) $this->parent_id = -1;
+
+ foreach ($this->rels as $page) {
+ if (! isset($nodes[$page])) $nodes[$page] = new MapNode($page);
+ if ($nodes[$page]->parent_id == 0)
+ $nodes[$page]->parent_id = $this->id;
+ }
+ foreach ($this->rels as $page)
+ $nodes[$page]->chain($nodes);
}
- return $body;
-}
-//HyperLink¤ò½ÐÎÏ
-function showHyperLinks(&$obj) {
- global $vars;
-
- if (!array_key_exists('url',$vars) or !array_key_exists('url',$obj->_links)) { return ''; }
-
- $body = '';
-
- foreach ($obj->_links['url'] as $_obj)
- $body .= " <li>{$_obj->_link}</li>\n";
-
- return $body;
-}
-//InterWikiName¤ò½ÐÎÏ
-function showInterWikiName(&$obj) {
- if (!array_key_exists('InterWikiName',$vars)) { return ''; }
-
- $body = '';
-
- foreach ($obj->_links['InterWikiName'] as $_obj)
- $body .= " <li>inter{$_obj->_link}</li>\n";
-
- return $body;
-}
-function myWikiNameComp($a,$b) {
- global $Pages;
- return strnatcasecmp($Pages[$a]['Char'],$Pages[$b]['Char']);
+ function toString(& $nodes, $level = 1, $parent_id = -1)
+ {
+ $indent = str_repeat(' ', $level);
+
+ if (! $this->is_page) {
+ return $indent . '<li>' . $this->link . '</li>' . "\n";
+ } else if ($this->parent_id != $parent_id) {
+ return $indent . '<li>' . $this->link .
+ '<a href="#rel_' . $this->id . '">...</a></li>' . "\n";
+ }
+ $retval = $indent . '<li>' . $this->mark . $this->link . "\n";
+ if (! empty($this->rels)) {
+ $childs = array();
+ $level += 2;
+ foreach ($this->rels as $page)
+ if (isset($nodes[$page]) && $this->parent_id != $nodes[$page]->id)
+ $childs[] = $nodes[$page]->toString($nodes, $level, $this->id);
+
+ if (! empty($childs))
+ $retval .= $indent . ' <ul>' . "\n" .
+ join('', $childs) . $indent . ' </ul>' . "\n";
+ }
+ $retval .= $indent . '</li>' . "\n";
+
+ return $retval;
+ }
}
-?>