* #navi([contents-page-name][,reverse]) * * Parameter: * contents-page-name - Page name of home of the navigation (default:itself) * reverse - Show contents revese * * 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 Next * -------------------------------- * * The second call - Show a navigation bar like a DocBook footer * * -------------------------------- * Prev Home Next * Up * * 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. // Insert tags into XHTML define('PLUGIN_NAVI_LINK_TAGS', FALSE); // FALSE, TRUE // ---- function plugin_navi_convert() { global $vars, $script, $head_tags; global $_navi_prev, $_navi_next, $_navi_up, $_navi_home; static $navi = array(); $current = $vars['page']; $reverse = FALSE; if (func_num_args()) { list($home, $reverse) = array_pad(func_get_args(), 2, ''); // 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: ' . htmlsc($home) . '
'; } else if (! $is_home && ! preg_match('/^' . preg_quote($home, '/') . '/', $current)) { return '#navi(' . htmlsc($home) . '): Not a child page like: ' . htmlsc($home . '/' . basename($current)) . '
'; } $reverse = (strtolower($reverse) == 'reverse'); } else { $home = $vars['page']; $is_home = TRUE; // $home == $current } $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'=>'', ); $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; // Sentinel :) $pages = array_unique($pages); natcasesort($pages); if ($reverse) $pages = array_reverse($pages); $pages = array_values($pages); $prev = $home; $next = ''; foreach ($pages as $index=>$page) { if ($page === $current) { $next_key = $index + 1; if (array_key_exists($next_key, $pages)) { $next = $pages[$next_key]; } break; } $prev = $page; } $pos = strrpos($current, '/'); $up = ''; if ($pos > 0) { $up = substr($current, 0, $pos); $navi[$home]['up'] = make_pagelink($up, $_navi_up); } 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_next); } $navi[$home]['home'] = make_pagelink($home); $navi[$home]['home1'] = make_pagelink($home, $_navi_home); // Generate 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 = htmlsc($_page); $r_page = pagename_urlencode($_page); $head_tags[] = ' '; } } } } $ret = ''; if ($is_home) { // Show contents $count = count($pages); if ($count == 0) { return '#navi(contents-page-name): You already view the result
'; } else if ($count == 1) { // Sentinel only: Show usage and warning $home = htmlsc($home); $ret .= '#navi(' . $home . '): No child page like: ' . $home . '/Foo'; } else { $ret .= '
    '; foreach ($pages as $page) if ($page !== $home) $ret .= '
  • ' . make_pagelink($page) . '
  • '; $ret .= '
'; } } else if (! $footer) { // Header $ret = <<
EOD; } else { // Footer $ret = << EOD; } return $ret; }