OSDN Git Service

BugTrack2/369 Support PHP7 - Remove '& new Class' notation
[pukiwiki/pukiwiki.git] / plugin / map.inc.php
index f4c0736..39e83b1 100644 (file)
 <?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&amp;refer=' . rawurlencode($this->page) . '">' .
+                       $mark . '</a>';
        }
-       $pages[$page]->_level = -1; //ɽ¼¨ºÑ¤ß
-       $body .= ' <li>';
 
-       if ($pages[$page]->_count > 0) {
-               $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$url&amp;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;
+       }
 }
 
-?>