<?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>
</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;
}