<?php
-/////////////////////////////////////////////////
// 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
//
-// $Id: map.inc.php,v 1.7 2003/02/28 14:41:16 panda Exp $
-//
+// Site map plugin
+
/*
-¥×¥é¥°¥¤¥ó map
+ * プラグイン map: サイトマップ(のようなもの)を表示
+ * Usage : http://.../pukiwiki.php?plugin=map
+ * パラメータ
+ * &refer=ページ名
+ * 起点となるページを指定
+ * &reverse=true
+ * あるページがどこからリンクされているかを一覧。
+*/
-¥µ¥¤¥È¥Þ¥Ã¥×(¤Î¤è¤¦¤Ê¤â¤Î)¤òɽ¼¨
+// Show $non_list files
+define('PLUGIN_MAP_SHOW_HIDDEN', 0); // 0, 1
-Usage : http://.../pukiwiki.php?plugin=map
+function plugin_map_action()
+{
+ global $vars, $whatsnew, $defaultpage, $non_list;
-¥Ñ¥é¥á¡¼¥¿
+ $reverse = isset($vars['reverse']);
+ $refer = isset($vars['refer']) ? $vars['refer'] : '';
+ if ($refer == '' || ! is_page($refer))
+ $vars['refer'] = $refer = $defaultpage;
-&refer=¥Ú¡¼¥¸Ì¾
- µ¯ÅÀ¤È¤Ê¤ë¥Ú¡¼¥¸¤ò»ØÄê
+ $retval['msg'] = $reverse ? 'Relation map (link from)' : 'Relation map, from $1';
+ $retval['body'] = '';
-¤³¤Î¥Ð¡¼¥¸¥ç¥ó¤Ç¤Ïcmd=reload¤ò»ØÄꤷ¤Æ¤âÆ°ºî¤ÏÊѤï¤ê¤Þ¤»¤ó¡£
-%%&cmd=reload%%
-%% ¥¥ã¥Ã¥·¥å¤òÇË´þ¤·¡¢¥Ú¡¼¥¸¤ò²òÀϤ·¤Ê¤ª¤¹%%
+ // 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['body'] .= '<p>' . "\n" . 'Total: ' . count($pages) .
+ ' page(s) on this site.' . "\n" . '</p>' . "\n";
+ }
-&reverse=true
- ¤¢¤ë¥Ú¡¼¥¸¤¬¤É¤³¤«¤é¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¤«¤ò°ìÍ÷¡£
+ // Generate a tree
+ $nodes = array();
+ foreach ($pages as $page)
+ $nodes[$page] = new MapNode($page, $reverse);
-&url=true
- ¥Ï¥¤¥Ñ¡¼¥ê¥ó¥¯(http:/ftp:/mail:)¤òɽ¼¨¤¹¤ë¡£
-*/
+ // Node not found: Because of filtererd by $non_list
+ if (! isset($nodes[$refer])) $vars['refer'] = $refer = $defaultpage;
-function plugin_map_action()
-{
- global $vars,$defaultpage,$whatsnew;
- global $Pages,$Anchor,$Level,$Dirty,$retval;
-
- //reverse=true?
- $reverse = array_key_exists('reverse',$vars);
-
- //´ð½à¤È¤Ê¤ë¥Ú¡¼¥¸Ì¾¤ò·èÄê
- $refer = array_key_exists('refer',$vars) ? $vars['refer'] : '';
-
- //$retval['msg']¤Î$1¤òÃÖ´¹¤µ¤»¤ë¤¿¤á¤Ë$vars['refer']¤ò½ñ¤´¹¤¨¤Æ¤¤¤ë¡£
- if ($refer == '') {
- $vars['refer'] = $refer = $defaultpage;
- }
-
- //Ìá¤êÃͤò½é´ü²½
if ($reverse) {
- $retval['msg'] = 'Relation map (link from)';
- }
- else {
- $retval['msg'] = 'Relation map, from $1';
- }
- $retval['body'] = '';
-
- //¥Ú¡¼¥¸¤òÎóµó
- $pages = get_existpages();
-
- //RecentChanges¤Ï½ü¤¯¡£
- $n = array_search($whatsnew,$pages);
- if ($n !== FALSE) {
- unset($pages[$n]);
- }
-
- //¸½Â¸¤¹¤ë¥Ú¡¼¥¸¤Î¿ô
- $count = count($pages);
-
- if ($count == 0) {
- $retval['body'] = 'no pages.';
- return $retval;
- }
-
- //¥Ú¡¼¥¸¿ô
- $retval['body'] .= "<p>\ntotal: $count page(s) on this site.\n</p>\n";
-
- //¥ª¥Ö¥¸¥§¥¯¥È¤ÎÇÛÎó¤òºî¤ë
- $obj = new InlineConverter(array('page','auto'));
- $pages = $obj->get_objects('[['.join(']] [[',$pages).']]',$refer);
-
- //¥Ú¡¼¥¸¤Î°À¤ò¼èÆÀ
- $anchor = 0;
- $_pages = array();
- foreach (array_keys($pages) as $key) {
- $_obj =& $pages[$key];
- $_obj->_exist = TRUE;
- $_obj->_ctime = get_filetime($_obj->name);
- $_obj->_anchor = ++$anchor;
- $_obj->_link = $_obj->toString($refer);
- $_obj->_level = 0;
- $_obj->_special = htmlspecialchars($_obj->name);
- $_obj->_links = array('url'=>array(),'pagename'=>array(),'InterWikiName'=>array());
-
- $_pages[$_obj->name] =& $pages[$key];
- }
- $pages = $_pages; unset($_pages);
-
- //¥Ú¡¼¥¸Æâ¤Î¥ê¥ó¥¯¤òÎóµó
- foreach (array_keys($pages) as $page) {
- $data = $obj->get_objects(join('',preg_grep('/^[^\s#]/',get_source($page))),$page);
- $pages[$page]->_count = count($data);
- foreach ($data as $link) {
- if ($link->type == 'pagename') {
- if (array_key_exists($link->name,$pages)) {
- $pages[$page]->_links['pagename'][$link->name] =& $pages[$link->name];
- }
- else {
- $link->_exist = FALSE;
- $link->_link = $link->toString();
- $pages[$page]->_links['pagename'][$link->name] = $link;
- }
- }
- else {
- $link->is_image = FALSE; //¤ª¤¤
- $link->_link = $link->toString();
- $pages[$page]->_links[$link->type][$link->name] = $link;
+ $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 {
+ $alone[] = $page;
}
}
- }
- //ʤÙÂؤ¨
-// uksort($Pages,'myWikiNameComp');
-
- if ($reverse) { //µÕÊý¸þ
- //Îóµó
- foreach (array_keys($pages) as $page) {
- foreach ($pages[$page]->_links['pagename'] as $from) {
- if ($page != $from->name) {
- $pages[$from->name]->_from[] = $page;
- }
- }
- }
-
- foreach (array_keys($pages) as $page) {
- usort($pages[$page]->_from);
+ $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";
}
-
- $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
- $retval['body'] .= "<hr />\n<p>not related from $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";
+ } 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)
+
+class MapNode
{
- $body = '';
-
- foreach (array_keys($pages) as $page) {
- if ((!$pages[$page]->_exist) or (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";
+ 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>';
+ }
+
+ function hide(& $pages)
+ {
+ if (! PLUGIN_MAP_SHOW_HIDDEN)
+ $pages = array_diff($pages, preg_grep($this->hide_pattern, $pages));
+ return $pages;
+ }
+
+ function ref()
+ {
+ $refs = array();
+ $file = $this->cache . '.ref';
+ if (file_exists($file)) {
+ foreach (file($file) as $line) {
+ $ref = explode("\t", $line);
+ $refs[] = $ref[0];
}
- $body .= ' </ul>';
+ $this->hide($refs);
+ sort($refs, SORT_STRING);
}
- $body .= "</li>\n";
+ return $refs;
}
- return ($body == '') ? '' : "<ul>\n$body</ul>\n";
-}
-//¥Ä¥ê¡¼¤òÀ¸À®¤·¡¢°õ»ú¤¹¤ë
-function showNode(&$pages,$page,$level = 0)
-{
- global $script,$vars;
- $body = '';
-
- $show_url = array_key_exists('url',$vars);
-
- 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;
+ 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;
}
- $pages[$page]->_level = -1; //ɽ¼¨ºÑ¤ß
- $body .= ' <li>';
-
- if ($pages[$page]->_count > 0) {
- $refer= '&refer='.rawurlencode($pages[$page]->name);
- $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$refer$url\" title=\"change refer\"><sup>+</sup></a>\n";
+
+ 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);
}
-
- $body .= $pages[$page]->_link."\n";
-
- //¥ê¥ì¡¼¥·¥ç¥ó¤ÎÎóµó
- if ($pages[$page]->_count > 0) {
- $_rel = showWikiNodes($pages,$page,$level);
- if ($show_url) {
- $_rel .= showHyperLinks($pages[$page]).showInterWikiName($pages[$page]);
+
+ 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";
}
- if ($_rel != '') {
- $body .= "<ul>\n$_rel</ul>\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";
}
- }
-
- return $body."</li>\n";
-}
-//WikiName,BracketName¤Î½ÐÎÏ
-function showWikiNodes(&$pages,$page,$level)
-{
- $body = '';
- $_level = $level + 1;
-
- foreach ($pages[$page]->_links['pagename'] as $_obj)
- if (array_key_exists($_obj->name,$pages) and $pages[$_obj->name]->_level == 0)
- $pages[$_obj->name]->_level = $_level; //ɽ¼¨¤òͽÌó
-
- foreach ($pages[$page]->_links['pagename'] as $_obj) {
- if ($_obj->_exist)
- $body .= showNode($pages,$_obj->name,$_level);
- else
- $body .= " <li>{$_obj->_link}</li>";
- }
- return $body;
-}
-//HyperLink¤ò½ÐÎÏ
-function showHyperLinks(&$obj)
-{
- $body = '';
-
- foreach ($obj->_links['url'] as $_obj)
- $body .= " <li>{$_obj->_link}</li>\n";
-
- return $body;
-}
-//InterWikiName¤ò½ÐÎÏ
-function showInterWikiName(&$obj)
-{
- $body = '';
-
- foreach ($obj->_links['InterWikiName'] as $_obj)
- $body .= " <li>{$_obj->_link}</li>\n";
-
- return $body;
-}
+ $retval .= $indent . '</li>' . "\n";
-function myWikiNameComp($a,$b)
-{
- global $Pages;
-
- return strnatcasecmp($Pages[$a]['Char'],$Pages[$b]['Char']);
+ return $retval;
+ }
}
-?>