<?php
-/////////////////////////////////////////////////
// PukiWiki - Yet another WikiWikiWeb clone.
+// ls2.inc.php
+// Copyright
+// 2002-2017 PukiWiki Development Team
+// 2002 panda http://home.arino.jp/?ls2.inc.php
+// 2002 Y.MASUI GPL2 http://masui.net/pukiwiki/ masui@masui.net (ls.inc.php)
+// License: GPL version 2
//
-// $Id: ls2.inc.php,v 1.12 2003/05/12 10:32:12 arino Exp $
-//
+// List plugin 2
/*
-*¥×¥é¥°¥¤¥ó ls2
-ÇÛ²¼¤Î¥Ú¡¼¥¸¤Î¸«½Ð¤·(*,**,***)¤Î°ìÍ÷¤òɽ¼¨¤¹¤ë
-
-*Usage
- #ls2(¥Ñ¥¿¡¼¥ó[,¥Ñ¥é¥á¡¼¥¿])
-
-*¥Ñ¥é¥á¡¼¥¿
--¥Ñ¥¿¡¼¥ó(ºÇ½é¤Ë»ØÄê)~
-¾Êά¤¹¤ë¤È¤¤â¥«¥ó¥Þ¤¬É¬Í×
--title~
-¸«½Ð¤·¤Î°ìÍ÷¤òɽ¼¨¤¹¤ë
--include~
-¥¤¥ó¥¯¥ë¡¼¥É¤·¤Æ¤¤¤ë¥Ú¡¼¥¸¤Î¸«½Ð¤·¤òºÆµ¢Åª¤ËÎóµó¤¹¤ë
--link~
-action¥×¥é¥°¥¤¥ó¤ò¸Æ¤Ó½Ð¤¹¥ê¥ó¥¯¤òɽ¼¨
--reverse~
-¥Ú¡¼¥¸¤Îʤӽç¤òȿž¤·¡¢¹ß½ç¤Ë¤¹¤ë
--compact~
-¸«½Ð¤·¥ì¥Ù¥ë¤òÄ´À°¤¹¤ë
-LS2_LIST_COMPACT¤¬TRUE¤Î»þ¤Ï̵¸ú(ÊѲ½¤·¤Ê¤¤)
-*/
-
-//¸«½Ð¤·¥¢¥ó¥«¡¼¤Î½ñ¼°
-define('LS2_CONTENT_HEAD','#content_1_');
-
-//¸«½Ð¤·¥¢¥ó¥«¡¼¤Î³«»ÏÈÖ¹æ
-define('LS2_ANCHOR_ORIGIN',0);
-
-//¸«½Ð¤·¥ì¥Ù¥ë¤òÄ´À°¤¹¤ë(¥Ç¥Õ¥©¥ë¥ÈÃÍ)
-define('LS2_LIST_COMPACT',FALSE);
-
-function plugin_ls2_init()
-{
- $messages = array('_ls2_messages'=>array(
- 'err_nopages' => '<p>\'$1\' ¤Ë¤Ï¡¢²¼°ÌÁؤΥڡ¼¥¸¤¬¤¢¤ê¤Þ¤»¤ó¡£</p>',
- 'msg_title' => '\'$1\'¤Ç»Ï¤Þ¤ë¥Ú¡¼¥¸¤Î°ìÍ÷',
- 'msg_go' => '<span class="small">...</span>',
- ));
- set_plugin_messages($messages);
-}
+ * 配下のページや、その見出し(*,**,***)の一覧を表示する
+ * Usage
+ * #ls2(pattern[,title|include|link|reverse|compact, ...],heading title)
+ *
+ * pattern : 省略するときもカンマが必要
+ * 'title' : 見出しの一覧を表示する
+ * 'include': インクルードしているページの見出しを再帰的に列挙する
+ * 'link ': actionプラグインを呼び出すリンクを表示
+ * 'reverse': ページの並び順を反転し、降順にする
+ * 'compact': 見出しレベルを調整する
+ * PLUGIN_LS2_LIST_COMPACTがTRUEの時は無効(変化しない)
+ * heading title: 見出しのタイトルを指定する (linkを指定した時のみ)
+ */
+
+// 見出しアンカーの書式
+define('PLUGIN_LS2_ANCHOR_PREFIX', '#content_1_');
+
+// 見出しアンカーの開始番号
+define('PLUGIN_LS2_ANCHOR_ORIGIN', 0);
+
+// 見出しレベルを調整する(デフォルト値)
+define('PLUGIN_LS2_LIST_COMPACT', FALSE);
+
function plugin_ls2_action()
{
- global $vars;
- global $_ls2_messages;
-
+ global $vars, $_ls2_msg_title;
+
$params = array();
- foreach (array('title','include','reverse') as $key)
- {
- $params[$key] = array_key_exists($key,$vars);
- }
- $prefix = array_key_exists('prefix',$vars) ? $vars['prefix'] : '';
- $body = ls2_show_lists($prefix,$params);
-
- return array(
- 'body'=>$body,
- 'msg'=>str_replace('$1',htmlspecialchars($prefix),$_ls2_messages['msg_title'])
- );
+ $keys = array('title', 'include', 'reverse');
+ foreach ($keys as $key)
+ $params[$key] = isset($vars[$key]);
+
+ $prefix = isset($vars['prefix']) ? $vars['prefix'] : '';
+ $body = plugin_ls2_show_lists($prefix, $params);
+
+ return array('body'=>$body,
+ 'msg'=>str_replace('$1', htmlsc($prefix), $_ls2_msg_title));
}
function plugin_ls2_convert()
{
- global $script,$vars;
- global $_ls2_messages;
-
- $prefix = '';
- if (func_num_args())
- {
- $args = func_get_args();
- $prefix = array_shift($args);
- }
- else
- {
- $args = array();
- }
- if ($prefix == '')
- {
- $prefix = strip_bracket($vars['page']).'/';
- }
+ global $vars, $_ls2_msg_title;
$params = array(
'link' => FALSE,
'title' => FALSE,
'include' => FALSE,
'reverse' => FALSE,
- 'compact' => LS2_LIST_COMPACT,
+ 'compact' => PLUGIN_LS2_LIST_COMPACT,
'_args' => array(),
'_done' => FALSE
);
- array_walk($args, 'ls2_check_arg', &$params);
- $title = (count($params['_args']) > 0) ?
- join(',', $params['_args']) :
- str_replace('$1',htmlspecialchars($prefix),$_ls2_messages['msg_title']);
-
- if ($params['link'])
- {
- $tmp = array();
- $tmp[] = 'plugin=ls2&prefix='.$prefix;
- if (isset($params['title']))
- {
- $tmp[] = 'title=1';
- }
- if (isset($params['include']))
- {
- $tmp[] = 'include=1';
- }
- return '<p><a href="'.$script.'?'.join('&',$tmp).'">'.$title.'</a></p>'."\n";
+
+ $args = array();
+ $prefix = '';
+ if (func_num_args()) {
+ $args = func_get_args();
+ $prefix = array_shift($args);
}
- return ls2_show_lists($prefix,$params);
+ if ($prefix == '') $prefix = strip_bracket($vars['page']) . '/';
+
+ foreach ($args as $arg)
+ plugin_ls2_check_arg($arg, $params);
+
+ $title = (! empty($params['_args'])) ? join(',', $params['_args']) : // Manual
+ str_replace('$1', htmlsc($prefix), $_ls2_msg_title); // Auto
+
+ if (! $params['link'])
+ return plugin_ls2_show_lists($prefix, $params);
+
+ $tmp = array();
+ $tmp[] = 'plugin=ls2&prefix=' . rawurlencode($prefix);
+ if (isset($params['title'])) $tmp[] = 'title=1';
+ if (isset($params['include'])) $tmp[] = 'include=1';
+
+ return '<p><a href="' . get_base_uri() . '?' . join('&', $tmp) . '">' .
+ $title . '</a></p>' . "\n";
}
-function ls2_show_lists($prefix,&$params)
+
+function plugin_ls2_show_lists($prefix, & $params)
{
- global $_ls2_messages;
-
+ global $_ls2_err_nopages;
+
$pages = array();
- foreach (get_existpages() as $_page)
- {
- if (strpos($_page,$prefix) === 0)
- {
- $pages[] = $_page;
- }
+ if ($prefix != '') {
+ foreach (get_existpages() as $_page)
+ if (strpos($_page, $prefix) === 0)
+ $pages[] = $_page;
+ } else {
+ $pages = get_existpages();
}
+
natcasesort($pages);
-
- if ($params['reverse'])
- {
- $pages = array_reverse($pages);
- }
- foreach ($pages as $page)
- {
- $params["page_$page"] = 0;
- }
- if (count($pages) == 0)
- {
- return str_replace('$1',htmlspecialchars($prefix),$_ls2_messages['err_nopages']);
- }
-
- $params['result'] = array();
- $params['saved'] = array();
- foreach ($pages as $page)
- {
- ls2_get_headings($page,$params,1);
+ if ($params['reverse']) $pages = array_reverse($pages);
+
+ foreach ($pages as $page) $params['page_ ' . $page] = 0;
+
+ if (empty($pages)) {
+ return str_replace('$1', htmlsc($prefix), $_ls2_err_nopages);
+ } else {
+ $params['result'] = $params['saved'] = array();
+ foreach ($pages as $page) {
+ $read_pages = array(); // read pages per page
+ plugin_ls2_get_headings($page, $params, 1, false, $read_pages);
+ }
+ return join("\n", $params['result']) . join("\n", $params['saved']);
}
- return join("\n",$params['result']).join("\n",$params['saved']);
}
-function ls2_get_headings($page,&$params,$level,$include = FALSE)
+function plugin_ls2_get_headings($page, & $params, $level, $include = FALSE,
+ &$read_pages)
{
- global $script;
- global $_ls2_messages;
static $_ls2_anchor = 0;
-
- $is_done = (isset($params["page_$page"]) and $params["page_$page"] > 0); //¥Ú¡¼¥¸¤¬É½¼¨ºÑ¤ß¤Î¤È¤True
-
- if (!$is_done)
- {
- $params["page_$page"] = ++$_ls2_anchor;
+
+ if (is_null($read_pages)) {
+ $read_pages = array();
}
-
- $r_page = rawurlencode($page);
- $s_page = htmlspecialchars($page);
- $title = $s_page.' '.get_pg_passage($page,FALSE);
- $href = $script.'?cmd=read&page='.$r_page;
-
- ls2_list_push($params,$level);
+ // ページが未表示のとき
+ $is_done = isset($read_pages[$page]);
+ if (! $is_done) $params["page_$page"] = ++$_ls2_anchor;
+
+ $s_page = htmlsc($page);
+ $attrs = get_page_link_a_attrs($page);
+ $href = get_page_uri($page);
+
+ plugin_ls2_list_push($params, $level);
$ret = $include ? '<li>include ' : '<li>';
- if ($params['title'] and $is_done)
- {
- $ret .= "<a href=\"$href\" title=\"$title\">$s_page</a> ";
- $ret .= "<a href=\"#list_{$params["page_$page"]}\"><sup>↑</sup></a>";
- array_push($params['result'],$ret);
+
+ if ($is_done) {
+ $ret .= '<a href="' . $href . '" class="' .
+ $attrs['class'] . '" data-mtime="' . $attrs['data_mtime'] .
+ '">' . $s_page . '</a> ';
+ $ret .= '<a href="#list_' . $params["page_$page"] . '"><sup>↑</sup></a>';
+ array_push($params['result'], $ret);
return;
}
- else
- {
- $ret .= "<a id=\"list_{$params["page_$page"]}\" href=\"$href\" title=\"$title\">$s_page</a>";
- array_push($params['result'],$ret);
+
+ $ret .= '<a id="list_' . $params["page_$page"] . '" href="' . $href .
+ '" class="' . $attrs['class'] . '" data-mtime="' .
+ $attrs['data_mtime'] . '">' . $s_page . '</a>';
+ array_push($params['result'], $ret);
+
+ $anchor = PLUGIN_LS2_ANCHOR_ORIGIN;
+ $matches = array();
+ $is_title = $params['title'];
+ $is_include = $params['include'];
+ if (!$is_title && !$is_include) {
+ return;
}
-
- $anchor = LS2_ANCHOR_ORIGIN;
- foreach (get_source($page) as $line)
- {
- if ($params['title'] and preg_match('/^(\*+)\s*(.*)$/',$line,$matches))
- {
- $level = strlen($matches[1]);
- $title = $matches[2];
- if (preg_match('/^(.*)\[(#[A-Za-z][\w-]+)\](.*)$/',$title,$matches))
- {
- $title = $matches[1].$matches[3];
+ foreach (get_source($page) as $line) {
+ if ($is_title && preg_match('/^(\*{1,3})/', $line, $matches)) {
+ $id = make_heading($line);
+ $heading_level = strlen($matches[1]);
+ $id = PLUGIN_LS2_ANCHOR_PREFIX . $anchor++;
+ plugin_ls2_list_push($params, $level + $heading_level);
+ array_push($params['result'],
+ '<li><a href="' . $href . $id . '">' . $line . '</a>');
+ } else if ($is_include &&
+ preg_match('/^#include\((.+)\)/', $line, $matches)) {
+ $include_args = $matches[1];
+ $page2 = $include_args;
+ $m2 = null;
+ if (preg_match('#^(("([^"]+)")|([^",]+))#', $include_args, $m2)) {
+ if ($m2[3]) {
+ $page2 = $m2[3];
+ } else if ($m2[4]) {
+ $page2 = $m2[4];
+ }
+ }
+ $sub_page = get_fullname($page2, $page);
+ if (is_page($sub_page)) {
+ $read_pages[$page] = 1;
+ if (!isset($read_pages[$sub_page])) {
+ plugin_ls2_get_headings($sub_page, $params,
+ $level + 1, TRUE, $read_pages);
+ }
}
- $id = LS2_CONTENT_HEAD.$anchor++;
-
- ls2_list_push($params,$level + strlen($level));
- array_push($params['result'], '<li>'.make_heading($title).
- '<a href="'.$href.$id.'">'.$_ls2_messages['msg_go'].'</a>'
- );
- }
- else if ($params['include']
- and preg_match('/^#include\((.+)\)/',$line,$matches) and is_page($matches[1]))
- {
- ls2_get_headings($matches[1],$params,$level + 1,TRUE);
}
}
}
-//¥ê¥¹¥È¹½Â¤¤ò¹½ÃÛ¤¹¤ë
-function ls2_list_push(&$params,$level)
+
+//リスト構造を構築する
+function plugin_ls2_list_push(& $params, $level)
{
- global $_ul_left_margin, $_ul_margin, $_list_pad_str;
-
- $result =& $params['result'];
- $saved =& $params['saved'];
+ $result = & $params['result'];
+ $saved = & $params['saved'];
$cont = TRUE;
- $open = "<ul%s>";
+ $open = '<ul%s>';
$close = '</li></ul>';
-
- while (count($saved) > $level or
- (count($saved) > 0 and $saved[0] != $close))
- {
+
+ while (count($saved) > $level || (! empty($saved) && $saved[0] != $close))
array_push($result, array_shift($saved));
- }
-
+
$margin = $level - count($saved);
-
- while (count($saved) < ($level - 1))
- {
- array_unshift($saved, ''); //count($saved)¤òÁý¤ä¤¹¤¿¤á¤Îdummy
- }
-
- if (count($saved) < $level)
- {
+
+ // count($saved)を増やす
+ while (count($saved) < ($level - 1)) array_unshift($saved, '');
+
+ if (count($saved) < $level) {
$cont = FALSE;
array_unshift($saved, $close);
-
- $left = ($level == $margin) ? $_ul_left_margin : 0;
- if ($params['compact'])
- {
- // ¥Þ¡¼¥¸¥ó¤ò¸ÇÄê
- $left += $_ul_margin;
- // ¥ì¥Ù¥ë¤ò½¤Àµ
- $level -= ($margin - 1);
- }
- else
- {
- $left += $margin * $_ul_margin;
+
+ $left = 0;
+ if ($params['compact']) {
+ $left = 1; // マージンを固定
+ $level -= ($margin - 1); // レベルを修正
+ } else {
+ $left = $margin;
}
- $str = sprintf($_list_pad_str, $level, $left, $left);
+ $str = sprintf(pkwk_list_attrs_template(), $level, $left);
array_push($result, sprintf($open, $str));
}
- if ($cont)
- {
- array_push($result, '</li>');
- }
+
+ if ($cont) array_push($result, '</li>');
}
-//¥ª¥×¥·¥ç¥ó¤ò²òÀϤ¹¤ë
-function ls2_check_arg($val, $key, &$params)
+
+// オプションを解析する
+function plugin_ls2_check_arg($value, & $params)
{
- if ($val == '')
- {
+ if ($value == '') {
$params['_done'] = TRUE;
return;
}
- if (!$params['_done'])
- {
- foreach (array_keys($params) as $key)
- {
- if (strpos($key, strtolower($val)) === 0)
- {
- $params[$key] = TRUE;
+
+ if (! $params['_done']) {
+ foreach (array_keys($params) as $param) {
+ if (strtolower($value) == $param &&
+ preg_match('/^[a-z]/', $param)) {
+ $params[$param] = TRUE;
return;
}
}
$params['_done'] = TRUE;
}
- $params['_args'][] = $val;
+
+ $params['_args'][] = htmlsc($value); // Link title
}
-?>