OSDN Git Service

InterWikiName: Correct Google.jp => Google, Yahoo.jp => Yahoo
[pukiwiki/pukiwiki.git] / plugin / navi.inc.php
index b28a6da..d79532b 100644 (file)
 <?php
-// $Id: navi.inc.php,v 1.3 2002/12/05 05:02:27 panda Exp $
-/*
-Last-Update:2002-10-15 rev.2
-
-*¥×¥é¥°¥¤¥ó navi
-
-http://home.arino.jp/index.php?%5B%5Bnavi.inc.php%5D%5D
+// PukiWiki - Yet another WikiWikiWeb clone.
+// $Id: navi.inc.php,v 1.20 2004/12/30 13:26:43 henoheno Exp $
+//
+// Navi plugin: Show DocBook-like navigation bar and contents
 
-DobBookÉ÷¤Î¥Ê¥Ó¥²¡¼¥·¥ç¥ó¥Ð¡¼¤òɽ¼¨¤¹¤ë
-
-*Usage
- #navi(page)
-
-*¥Ñ¥é¥á¡¼¥¿
--page~
- HOME¤È¤Ê¤ë¥Ú¡¼¥¸¡£¾Êά¤¹¤ë¤È¼«¥Ú¡¼¥¸¤òHOME¤È¤¹¤ë¡£
+/*
+ * 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)'
+ */
 
-*Æ°ºî
+// Exclusive regex pattern of child pages
+define('PLUGIN_NAVI_EXCLUSIVE_REGEX', '');
+//define('PLUGIN_NAVI_EXCLUSIVE_REGEX', '#/_#'); // Ignore 'foobar/_memo' etc.
 
-1¥Ú¡¼¥¸¤Ç2²ó¸Æ¤Ð¤ì¤ë¤³¤È¤ò¹Íθ¤·¤Æ¡¢´ØÏ¢ÊÑ¿ô¤Ï¥°¥í¡¼¥Ð¥ë¤Ë»ý¤Ä¡£
+// Insert <link rel=... /> tags into XHTML <head></head>
+define('PLUGIN_NAVI_LINK_TAGS', FALSE);        // FALSE, TRUE
 
--1²óÌܤλ²¾È(HOME)~
- ¥Ú¡¼¥¸°ìÍ÷¤òls.inc.phpÉ÷¤Ëɽ¼¨¤¹¤ë
--1²óÌܤλ²¾È(HOME°Ê³°)
- header : ¥Ø¥Ã¥ÀÉ÷
-  prev       next
- -----------------
--2²óÌܤλ²¾È
- footer : ¥Õ¥Ã¥¿É÷
- ------------------
-  prev  home  next
-  title  up  title
+// ----
 
-*/
-function plugin_navi_convert() {
-       global $vars, $script;
-       global $_navi_pages;
+function plugin_navi_convert()
+{
+       global $vars, $script, $head_tags;
+       global $_navi_prev, $_navi_next, $_navi_up, $_navi_home;
+       static $navi = array();
 
-       $home = $vars[page];
+       $current = $vars['page'];
        if (func_num_args()) {
-               $args = func_get_args();
-               $home = $args[0];
+               list($home) = func_get_args();
+               // 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 == $vars[page]);
-       $current = strip_bracket($vars[page]);
 
-       $pattern = encode('[['.strip_bracket($home).'/');
-       $length = strlen($pattern);
+       $pages  = array();
+       $footer = isset($navi[$home]); // The first time: FALSE, the second: TRUE
+       if (! $footer) {
+               $navi[$home] = array(
+                       'up'   =>'',
+                       'prev' =>'',
+                       'prev1'=>'',
+                       'next' =>'',
+                       'next1'=>'',
+                       'home' =>'',
+                       'home1'=>'',
+               );
 
-       $footer = is_array($_navi_pages);
-       if (!$footer) {
-               if ($dir = @opendir(DATA_DIR)) {
-                       while ($name = readdir($dir)) {
-                               if ($name == ".." || $name == ".") { continue; }
-                               if (strpos($name, $pattern) === 0) {
-                                       $pages[] = strip_bracket(decode(trim(preg_replace("/\.txt$/"," ",$name))));
-                               }
-                       }
-                       closedir($dir);
+               $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));
                }
-               // Ì¤ºîÀ®»þ¤Î¤¿¤á¤ÎÈÖʼ(¥×¥ì¥Ó¥å¡¼¤È¤«)
-               if (array_search($current,$pages) === false) { $pages[] = $current; }
+               $pages[] = $current; // Sentinel :)
+               $pages   = array_unique($pages);
                natcasesort($pages);
                $prev = $home;
                foreach ($pages as $page) {
-                       if ($page == $current) { break; }
+                       if ($page == $current) break;
                        $prev = $page;
                }
                $next = current($pages);
 
-               $_navi_pages = array(
-                       "up" => "&nbsp;",
-                       "home" => "&nbsp;",
-                       "home1" => "&nbsp;",
-                       "prev" => "&nbsp;",
-                       "prev1" => "&nbsp;",
-                       "next" => "&nbsp;",
-                       "next1" => "&nbsp;",
-               );
-
-               $pos = strrpos($current, "/");
+               $pos = strrpos($current, '/');
+               $up = '';
                if ($pos > 0) {
-                       $_navi_pages[up] = make_link("[[Up&gt;".substr($current, 0, $pos)."]]");
+                       $up = substr($current, 0, $pos);
+                       $navi[$home]['up']    = make_pagelink($up, $_navi_up);
                }
-               if (!$is_home) {
-                       if ($prev != $home) {
-                               $_navi_pages[prev] = make_link("[[$prev]]");
-                       } else {
-                               $_navi_pages[prev] = make_link("$prev");
-                       }
-                       $_navi_pages[prev1] = make_link("[[Prev&gt;$prev]]");
+               if (! $is_home) {
+                       $navi[$home]['prev']  = make_pagelink($prev);
+                       $navi[$home]['prev1'] = make_pagelink($prev, $_navi_prev);
                }
-               if ($next != "") {
-                       $_navi_pages[next] = make_link("[[$next]]");
-                       $_navi_pages[next1] = make_link("[[Next&gt;$next]]");
+               if ($next != '') {
+                       $navi[$home]['next']  = make_pagelink($next);
+                       $navi[$home]['next1'] = make_pagelink($next, $_navi_next);
                }
-               if (!$is_home) {
-                       $_navi_pages[home] = make_link($home);
-                       $_navi_pages[home1] = make_link(preg_replace("/^(\[\[)?/","$1Home&gt;",$home));
+               $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 . '" />';
+                               }
+                       }
                }
        }
 
-       $ret = "";
-       if ($footer) { //¥Õ¥Ã¥¿
+       $ret = '';
+
+       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>';
+               }
+
+       } else if (! $footer) {
+               // Header
                $ret = <<<EOD
-<div class=".navi_footer">
-<hr width="100%">
-<table width="100%" border="0" cellpadding="0" cellspacing="0">
-<tr><td width="33%" align="left" valign="top">$_navi_pages[prev1]</td>
-<td width="34%" align="center" valign="top">$_navi_pages[home1]</td>
-<td width="33%" align="right" valign="top">$_navi_pages[next1]</td></tr>
-<tr><td width="33%" align="left" valign="top">$_navi_pages[prev]</td>
-<td width="34%" align="center" valign="top">$_navi_pages[up]</td>
-<td width="33%" align="right" valign="top">$_navi_pages[next]</td></tr>
-</table>
-</div>
+<ul class="navi">
+ <li class="navi_left">{$navi[$home]['prev1']}</li>
+ <li class="navi_right">{$navi[$home]['next1']}</li>
+ <li class="navi_none">{$navi[$home]['home']}</li>
+</ul>
+<hr class="full_hr" />
 EOD;
-       } else if ($is_home) { //Ìܼ¡
-               $ret .= "<ul>";
-               foreach ($pages as $page) {
-                       if (strip_bracket($page) == strip_bracket($home)) { continue; }
-                       $ret .= "<li>".make_link("[[$page]]")."</li>";
-               }
-               $ret .= "</ul>";
+
        } else {
+               // Footer
                $ret = <<<EOD
-<div class=".navi_header">
-<table width="100%" border="0" cellpadding="0" cellspacing="0">
-<tr><td width="33%" align="left" valign="top">$_navi_pages[prev1]</td>
-<td width="34%" align="center" valign="top">$_navi_pages[home]</td>
-<td width="33%" align="right" valign="top">$_navi_pages[next1]</td></tr>
-</table>
-<hr width="100%">
-</div>
+<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;