OSDN Git Service

InterWikiName: Correct Google.jp => Google, Yahoo.jp => Yahoo
[pukiwiki/pukiwiki.git] / plugin / navi.inc.php
index ab8d8b0..d79532b 100644 (file)
 <?php
-/////////////////////////////////////////////////
 // PukiWiki - Yet another WikiWikiWeb clone.
+// $Id: navi.inc.php,v 1.20 2004/12/30 13:26:43 henoheno Exp $
 //
-// $Id: navi.inc.php,v 1.13 2003/05/01 08:49:55 arino Exp $
-//
+// Navi plugin: Show DocBook-like navigation bar and contents
 
 /*
+ * Usage:
+ *   #navi(contents-page-name)   <for ALL child pages>
+ *   #navi([contents-page-name]) <for contents page>
+ *
+ * Parameter:
+ *   contents-page-name - Page name of home of the navigation (default:itself)
+ *
+ * Behaviour at contents page:
+ *   Always show child-page list like 'ls' plugin
+ *
+ * Behaviour at child pages:
+ *
+ *   The first plugin call - Show a navigation bar like a DocBook header
+ *
+ *     Prev  <contents-page-name>  Next
+ *     --------------------------------
+ *
+ *   The second call - Show a navigation bar like a DocBook footer
+ *
+ *     --------------------------------
+ *     Prev          Home          Next
+ *     <pagename>     Up     <pagename>
+ *
+ * Page-construction example:
+ *   foobar    - Contents page, includes '#navi' or '#navi(foobar)'
+ *   foobar/1  - One of child pages, includes one or two '#navi(foobar)'
+ *   foobar/2  - One of child pages, includes one or two '#navi(foobar)'
+ */
 
-*¥×¥é¥°¥¤¥ó navi
-DobBookÉ÷¤Î¥Ê¥Ó¥²¡¼¥·¥ç¥ó¥Ð¡¼¤òɽ¼¨¤¹¤ë
-
-*Usage
- #navi(page)
-
-*¥Ñ¥é¥á¡¼¥¿
--page~
- HOME¤È¤Ê¤ë¥Ú¡¼¥¸¡£¾Êά¤¹¤ë¤È¼«¥Ú¡¼¥¸¤òHOME¤È¤¹¤ë¡£
-
-*Æ°ºî
-
--1²óÌܤλ²¾È(HOME)~
- ¥Ú¡¼¥¸°ìÍ÷¤òls.inc.phpÉ÷¤Ëɽ¼¨¤¹¤ë
--1²óÌܤλ²¾È(HOME°Ê³°)
- header : ¥Ø¥Ã¥ÀÉ÷
-  prev       next
- -----------------
--2²óÌܤλ²¾È
- footer : ¥Õ¥Ã¥¿É÷
- ------------------
-  prev  home  next
-  title  up  title
+// Exclusive regex pattern of child pages
+define('PLUGIN_NAVI_EXCLUSIVE_REGEX', '');
+//define('PLUGIN_NAVI_EXCLUSIVE_REGEX', '#/_#'); // Ignore 'foobar/_memo' etc.
 
-*/
+// Insert <link rel=... /> tags into XHTML <head></head>
+define('PLUGIN_NAVI_LINK_TAGS', FALSE);        // FALSE, TRUE
 
-// ½ü³°¤¹¤ë¥Ú¡¼¥¸ (Àµµ¬É½¸½¤Ç)
-define('NAVI_EXCLUDE_PATTERN','');
-#define('NAVI_EXCLUDE_PATTERN','/\/_/');
+// ----
 
-// <link>¥¿¥°¤ò½ÐÎϤ¹¤ë (TRUE|FALSE)
-define('NAVI_LINK_TAGS',FALSE);
-
-function plugin_navi_init()
-{
-       $messages = array(
-               '_navi_messages'=>array(
-                       'msg_prev'=>'Prev',
-                       'msg_next'=>'Next',
-                       'msg_up'  =>'Up',
-                       'msg_home'  =>'Home'
-               )
-       );
-       set_plugin_messages($messages);
-}
 function plugin_navi_convert()
 {
        global $vars, $script, $head_tags;
-       global $_navi_messages;
+       global $_navi_prev, $_navi_next, $_navi_up, $_navi_home;
        static $navi = array();
-       
-       $home = $current = $vars['page'];
-       if (func_num_args())
-       {
+
+       $current = $vars['page'];
+       if (func_num_args()) {
                list($home) = func_get_args();
-               $home = strip_bracket($home);
+               // strip_bracket() is not necessary but compatible
+               $home    = get_fullname(strip_bracket($home), $current);
+               $is_home = ($home == $current);
+               if (! is_page($home)) {
+                       return '#navi(contents-page-name): No such page: ' .
+                               htmlspecialchars($home) . '<br/>';
+               } else if (! $is_home &&
+                   ! preg_match('|^' . preg_quote($home, '|') . '|', $current)) {
+                       return '#navi(' . htmlspecialchars($home) .
+                               '): Not a child page like: ' .
+                               htmlspecialchars($home . '/' . basename($current)) .
+                               '<br/>';
+               }
+       } else {
+               $home    = $vars['page'];
+               $is_home = TRUE; // $home == $current
        }
-       $is_home = ($home == $current);
-       
-       // ½é²óFALSE,2²óÌܰʹßTRUE
-       $footer = array_key_exists($home,$navi);
-       if (!$footer)
-       {
+
+       $pages  = array();
+       $footer = isset($navi[$home]); // The first time: FALSE, the second: TRUE
+       if (! $footer) {
                $navi[$home] = array(
-                       'up'=>'',
-                       'prev'=>'',
+                       'up'   =>'',
+                       'prev' =>'',
                        'prev1'=>'',
-                       'next'=>'',
+                       'next' =>'',
                        'next1'=>'',
-                       'home'=>'',
+                       'home' =>'',
                        'home1'=>'',
                );
-               
-               $pages = preg_grep('/^'.preg_quote($home,'/').'($|\/)/',get_existpages());
-               // preg_grep(,,PREG_GREP_INVERT)¤¬»È¤¨¤ì¤Ð¡Ä
-               if (NAVI_EXCLUDE_PATTERN != '')
-               {
-                       $pages = array_diff($pages,preg_grep(NAVI_EXCLUDE_PATTERN,$page));
+
+               $pages = preg_grep('/^' . preg_quote($home, '/') .
+                       '($|\/)/', get_existpages());
+               if (PLUGIN_NAVI_EXCLUSIVE_REGEX != '') {
+                       // If old PHP could use preg_grep(,,PREG_GREP_INVERT)...
+                       $pages = array_diff($pages,
+                               preg_grep(PLUGIN_NAVI_EXCLUSIVE_REGEX, $pages));
                }
-               $pages[] = $current; // ÈÖʼ :)
-               $pages = array_unique($pages);
+               $pages[] = $current; // Sentinel :)
+               $pages   = array_unique($pages);
                natcasesort($pages);
                $prev = $home;
-               foreach ($pages as $page)
-               {
-                       if ($page == $current)
-                       {
-                               break;
-                       }
+               foreach ($pages as $page) {
+                       if ($page == $current) break;
                        $prev = $page;
                }
                $next = current($pages);
-               
+
                $pos = strrpos($current, '/');
                $up = '';
-               if ($pos > 0)
-               {
+               if ($pos > 0) {
                        $up = substr($current, 0, $pos);
-                       $navi[$home]['up'] = make_pagelink($up,$_navi_messages['msg_up']);
+                       $navi[$home]['up']    = make_pagelink($up, $_navi_up);
                }
-               if (!$is_home)
-               {
-                       $navi[$home]['prev'] = make_pagelink($prev);
-                       $navi[$home]['prev1'] = make_pagelink($prev,$_navi_messages['msg_prev']);
+               if (! $is_home) {
+                       $navi[$home]['prev']  = make_pagelink($prev);
+                       $navi[$home]['prev1'] = make_pagelink($prev, $_navi_prev);
                }
-               if ($next != '')
-               {
-                       $navi[$home]['next'] = make_pagelink($next);
-                       $navi[$home]['next1'] = make_pagelink($next,$_navi_messages['msg_next']);
+               if ($next != '') {
+                       $navi[$home]['next']  = make_pagelink($next);
+                       $navi[$home]['next1'] = make_pagelink($next, $_navi_next);
                }
-               $navi[$home]['home'] = make_pagelink($home);
-               $navi[$home]['home1'] = make_pagelink($home,$_navi_messages['msg_home']);
-               
-               // <link>¥¿¥°¤òÀ¸À®¤¹¤ë : start next prev(previous) parent(up)
-               // Ì¤Âбþ : contents(toc) search first(begin) last(end)
-               if (NAVI_LINK_TAGS)
-               {
-                       foreach (array('start'=>$home,'next'=>$next,'prev'=>$prev,'up'=>$up) as $rel=>$_page)
-                       {
-                               if ($_page != '')
-                               {
+               $navi[$home]['home']  = make_pagelink($home);
+               $navi[$home]['home1'] = make_pagelink($home, $_navi_home);
+
+               // Generate <link> tag: start next prev(previous) parent(up)
+               // Not implemented: contents(toc) search first(begin) last(end)
+               if (PLUGIN_NAVI_LINK_TAGS) {
+                       foreach (array('start'=>$home, 'next'=>$next,
+                           'prev'=>$prev, 'up'=>$up) as $rel=>$_page) {
+                               if ($_page != '') {
                                        $s_page = htmlspecialchars($_page);
                                        $r_page = rawurlencode($_page);
-                                       $head_tags[] = " <link rel=\"$rel\" href=\"$script?$r_page\" title=\"$s_page\" />";
+                                       $head_tags[] = ' <link rel="' .
+                                               $rel . '" href="' . $script .
+                                               '?' . $r_page . '" title="' .
+                                               $s_page . '" />';
                                }
                        }
                }
        }
 
        $ret = '';
-       if ($footer) // ¥Õ¥Ã¥¿
-       {
-               $ret = <<<EOD
-<hr class="full_hr" />
-<ul class="navi">
- <li class="navi_left">{$navi[$home]['prev1']}<br />{$navi[$home]['prev']}</li>
- <li class="navi_right">{$navi[$home]['next1']}<br />{$navi[$home]['next']}</li>
- <li class="navi_none">{$navi[$home]['home1']}<br />{$navi[$home]['up']}</li>
-</ul>
-EOD;
-       }
-       else if ($is_home) // Ìܼ¡
-       {
-               $ret .= '<ul>';
-               foreach ($pages as $page)
-               {
-                       if ($page != $home)
-                       {
-                               $ret .= ' <li>'.make_pagelink($page).'</li>';
-                       }
+
+       if ($is_home) {
+               // Contents
+               $count = count($pages);
+               if ($count == 0) {
+                       return '#navi(contents-page-name): You already view the result<br/>';
+               } else if ($count == 1) {
+                       // Sentinel only: Show usage and warning
+                       $home = htmlspecialchars($home);
+                       $ret .= '#navi(' . $home . '): No child page like: ' .
+                               $home . '/Foo';
+               } else {
+                       $ret .= '<ul>';
+                       foreach ($pages as $page)
+                               if ($page != $home)
+                                       $ret .= ' <li>' . make_pagelink($page) . '</li>';
+                       $ret .= '</ul>';
                }
-               $ret .= '</ul>';
-       }
-       else // ¥Ø¥Ã¥À
-       {
+
+       } else if (! $footer) {
+               // Header
                $ret = <<<EOD
 <ul class="navi">
  <li class="navi_left">{$navi[$home]['prev1']}</li>
@@ -170,6 +164,17 @@ EOD;
 </ul>
 <hr class="full_hr" />
 EOD;
+
+       } else {
+               // Footer
+               $ret = <<<EOD
+<hr class="full_hr" />
+<ul class="navi">
+ <li class="navi_left">{$navi[$home]['prev1']}<br />{$navi[$home]['prev']}</li>
+ <li class="navi_right">{$navi[$home]['next1']}<br />{$navi[$home]['next']}</li>
+ <li class="navi_none">{$navi[$home]['home1']}<br />{$navi[$home]['up']}</li>
+</ul>
+EOD;
        }
        return $ret;
 }