2 // PukiWiki - Yet another WikiWikiWeb clone.
5 // 2002-2017 PukiWiki Development Team
6 // 2002 panda http://home.arino.jp/?ls2.inc.php
7 // 2002 Y.MASUI GPL2 http://masui.net/pukiwiki/ masui@masui.net (ls.inc.php)
8 // License: GPL version 2
13 * 配下のページや、その見出し(*,**,***)の一覧を表示する
15 * #ls2(pattern[,title|include|link|reverse|compact, ...],heading title)
17 * pattern : 省略するときもカンマが必要
18 * 'title' : 見出しの一覧を表示する
19 * 'include': インクルードしているページの見出しを再帰的に列挙する
20 * 'link ': actionプラグインを呼び出すリンクを表示
21 * 'reverse': ページの並び順を反転し、降順にする
22 * 'compact': 見出しレベルを調整する
23 * PLUGIN_LS2_LIST_COMPACTがTRUEの時は無効(変化しない)
24 * heading title: 見出しのタイトルを指定する (linkを指定した時のみ)
28 define('PLUGIN_LS2_ANCHOR_PREFIX', '#content_1_');
31 define('PLUGIN_LS2_ANCHOR_ORIGIN', 0);
33 // 見出しレベルを調整する(デフォルト値)
34 define('PLUGIN_LS2_LIST_COMPACT', FALSE);
36 function plugin_ls2_action()
38 global $vars, $_ls2_msg_title;
41 $keys = array('title', 'include', 'reverse');
42 foreach ($keys as $key)
43 $params[$key] = isset($vars[$key]);
45 $prefix = isset($vars['prefix']) ? $vars['prefix'] : '';
46 $body = plugin_ls2_show_lists($prefix, $params);
48 return array('body'=>$body,
49 'msg'=>str_replace('$1', htmlsc($prefix), $_ls2_msg_title));
52 function plugin_ls2_convert()
54 global $vars, $_ls2_msg_title;
61 'compact' => PLUGIN_LS2_LIST_COMPACT,
68 if (func_num_args()) {
69 $args = func_get_args();
70 $prefix = array_shift($args);
72 if ($prefix == '') $prefix = strip_bracket($vars['page']) . '/';
74 foreach ($args as $arg)
75 plugin_ls2_check_arg($arg, $params);
77 $title = (! empty($params['_args'])) ? join(',', $params['_args']) : // Manual
78 str_replace('$1', htmlsc($prefix), $_ls2_msg_title); // Auto
80 if (! $params['link'])
81 return plugin_ls2_show_lists($prefix, $params);
84 $tmp[] = 'plugin=ls2&prefix=' . rawurlencode($prefix);
85 if (isset($params['title'])) $tmp[] = 'title=1';
86 if (isset($params['include'])) $tmp[] = 'include=1';
88 return '<p><a href="' . get_base_uri() . '?' . join('&', $tmp) . '">' .
89 $title . '</a></p>' . "\n";
92 function plugin_ls2_show_lists($prefix, & $params)
94 global $_ls2_err_nopages;
98 foreach (get_existpages() as $_page)
99 if (strpos($_page, $prefix) === 0)
102 $pages = get_existpages();
106 if ($params['reverse']) $pages = array_reverse($pages);
108 foreach ($pages as $page) $params['page_ ' . $page] = 0;
111 return str_replace('$1', htmlsc($prefix), $_ls2_err_nopages);
113 $params['result'] = $params['saved'] = array();
114 foreach ($pages as $page)
115 plugin_ls2_get_headings($page, $params, 1);
116 return join("\n", $params['result']) . join("\n", $params['saved']);
120 function plugin_ls2_get_headings($page, & $params, $level, $include = FALSE,
121 &$read_pages = array())
123 static $_ls2_anchor = 0;
126 $is_done = isset($read_pages[$page]);
127 if (! $is_done) $params["page_$page"] = ++$_ls2_anchor;
129 $s_page = htmlsc($page);
130 $title = $s_page . ' ' . get_pg_passage($page, FALSE);
131 $href = get_page_uri($page);
133 plugin_ls2_list_push($params, $level);
134 $ret = $include ? '<li>include ' : '<li>';
137 $ret .= '<a href="' . $href . '" title="' . $title . '">' . $s_page . '</a> ';
138 $ret .= '<a href="#list_' . $params["page_$page"] . '"><sup>↑</sup></a>';
139 array_push($params['result'], $ret);
143 $ret .= '<a id="list_' . $params["page_$page"] . '" href="' . $href .
144 '" title="' . $title . '">' . $s_page . '</a>';
145 array_push($params['result'], $ret);
147 $anchor = PLUGIN_LS2_ANCHOR_ORIGIN;
149 $is_title = $params['title'];
150 $is_include = $params['include'];
151 if (!$is_title && !$is_include) {
154 foreach (get_source($page) as $line) {
155 if ($is_title && preg_match('/^(\*{1,3})/', $line, $matches)) {
156 $id = make_heading($line);
157 $heading_level = strlen($matches[1]);
158 $id = PLUGIN_LS2_ANCHOR_PREFIX . $anchor++;
159 plugin_ls2_list_push($params, $level + $heading_level);
160 array_push($params['result'],
161 '<li><a href="' . $href . $id . '">' . $line . '</a>');
162 } else if ($is_include &&
163 preg_match('/^#include\((.+)\)/', $line, $matches)) {
164 $include_args = $matches[1];
165 $page2 = $include_args;
167 if (preg_match('#^(("([^"]+)")|([^",]+))#', $include_args, $m2)) {
174 $sub_page = get_fullname($page2, $page);
175 if (is_page($sub_page)) {
176 $read_pages[$page] = 1;
177 if (!isset($read_pages[$sub_page])) {
178 plugin_ls2_get_headings($sub_page, $params,
179 $level + 1, TRUE, $read_pages);
187 function plugin_ls2_list_push(& $params, $level)
189 $result = & $params['result'];
190 $saved = & $params['saved'];
193 $close = '</li></ul>';
195 while (count($saved) > $level || (! empty($saved) && $saved[0] != $close))
196 array_push($result, array_shift($saved));
198 $margin = $level - count($saved);
201 while (count($saved) < ($level - 1)) array_unshift($saved, '');
203 if (count($saved) < $level) {
205 array_unshift($saved, $close);
208 if ($params['compact']) {
209 $left = 1; // マージンを固定
210 $level -= ($margin - 1); // レベルを修正
214 $str = sprintf(pkwk_list_attrs_template(), $level, $left);
215 array_push($result, sprintf($open, $str));
218 if ($cont) array_push($result, '</li>');
222 function plugin_ls2_check_arg($value, & $params)
225 $params['_done'] = TRUE;
229 if (! $params['_done']) {
230 foreach (array_keys($params) as $param) {
231 if (strtolower($value) == $param &&
232 preg_match('/^[a-z]/', $param)) {
233 $params[$param] = TRUE;
237 $params['_done'] = TRUE;
240 $params['_args'][] = htmlsc($value); // Link title