OSDN Git Service

BugTrack2/369 Support PHP7 - Remove '& new Class' notation
[pukiwiki/pukiwiki.git] / plugin / map.inc.php
index 3e6cf92..39e83b1 100644 (file)
 <?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&amp;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= '&amp;refer='.rawurlencode($pages[$page]->name);
-               $url = array_key_exists('url',$vars) ? '&amp;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;
+       }
 }
 
-?>