<?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" => " ",
- "home" => " ",
- "home1" => " ",
- "prev" => " ",
- "prev1" => " ",
- "next" => " ",
- "next1" => " ",
- );
-
- $pos = strrpos($current, "/");
+ $pos = strrpos($current, '/');
+ $up = '';
if ($pos > 0) {
- $_navi_pages[up] = make_link("[[Up>".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>$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>$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>",$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;