OSDN Git Service

BugTrack2/372 Add auth group - set of multi users on page permission
[pukiwiki/pukiwiki.git] / plugin / ls2.inc.php
1 <?php
2 // PukiWiki - Yet another WikiWikiWeb clone.
3 // $Id: ls2.inc.php,v 1.30 2011/01/25 15:01:01 henoheno Exp $
4 // Copyright (C)
5 //   2002-2004, 2006-2007 PukiWiki Developers 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
9 //
10 // List plugin 2
11
12 /*
13  * 配下のページや、その見出し(*,**,***)の一覧を表示する
14  * Usage
15  *  #ls2(pattern[,title|include|link|reverse|compact, ...],heading title)
16  *
17  * pattern  : 省略するときもカンマが必要
18  * 'title'  : 見出しの一覧を表示する
19  * 'include': インクルードしているページの見出しを再帰的に列挙する
20  * 'link   ': actionプラグインを呼び出すリンクを表示
21  * 'reverse': ページの並び順を反転し、降順にする
22  * 'compact': 見出しレベルを調整する
23  *     PLUGIN_LS2_LIST_COMPACTがTRUEの時は無効(変化しない)
24  * heading title: 見出しのタイトルを指定する (linkを指定した時のみ)
25  */
26
27 // 見出しアンカーの書式
28 define('PLUGIN_LS2_ANCHOR_PREFIX', '#content_1_');
29
30 // 見出しアンカーの開始番号
31 define('PLUGIN_LS2_ANCHOR_ORIGIN', 0);
32
33 // 見出しレベルを調整する(デフォルト値)
34 define('PLUGIN_LS2_LIST_COMPACT', FALSE);
35
36 function plugin_ls2_action()
37 {
38         global $vars, $_ls2_msg_title;
39
40         $params = array();
41         $keys   = array('title', 'include', 'reverse');
42         foreach ($keys as $key)
43                 $params[$key] = isset($vars[$key]);
44
45         $prefix = isset($vars['prefix']) ? $vars['prefix'] : '';
46         $body = plugin_ls2_show_lists($prefix, $params);
47
48         return array('body'=>$body,
49                 'msg'=>str_replace('$1', htmlsc($prefix), $_ls2_msg_title));
50 }
51
52 function plugin_ls2_convert()
53 {
54         global $script, $vars, $_ls2_msg_title;
55
56         $params = array(
57                 'link'    => FALSE,
58                 'title'   => FALSE,
59                 'include' => FALSE,
60                 'reverse' => FALSE,
61                 'compact' => PLUGIN_LS2_LIST_COMPACT,
62                 '_args'   => array(),
63                 '_done'   => FALSE
64         );
65
66         $args = array();
67         $prefix = '';
68         if (func_num_args()) {
69                 $args   = func_get_args();
70                 $prefix = array_shift($args);
71         }
72         if ($prefix == '') $prefix = strip_bracket($vars['page']) . '/';
73
74         foreach ($args as $arg)
75                 plugin_ls2_check_arg($arg, $params);
76
77         $title = (! empty($params['_args'])) ? join(',', $params['_args']) :   // Manual
78                 str_replace('$1', htmlsc($prefix), $_ls2_msg_title); // Auto
79
80         if (! $params['link'])
81                 return plugin_ls2_show_lists($prefix, $params);
82
83         $tmp = array();
84         $tmp[] = 'plugin=ls2&amp;prefix=' . rawurlencode($prefix);
85         if (isset($params['title']))   $tmp[] = 'title=1';
86         if (isset($params['include'])) $tmp[] = 'include=1';
87
88         return '<p><a href="' . $script . '?' . join('&amp;', $tmp) . '">' .
89                 $title . '</a></p>' . "\n";
90 }
91
92 function plugin_ls2_show_lists($prefix, & $params)
93 {
94         global $_ls2_err_nopages;
95
96         $pages = array();
97         if ($prefix != '') {
98                 foreach (get_existpages() as $_page)
99                         if (strpos($_page, $prefix) === 0)
100                                 $pages[] = $_page;
101         } else {
102                 $pages = get_existpages();
103         }
104
105         natcasesort($pages);
106         if ($params['reverse']) $pages = array_reverse($pages);
107
108         foreach ($pages as $page) $params['page_ ' . $page] = 0;
109
110         if (empty($pages)) {
111                 return str_replace('$1', htmlsc($prefix), $_ls2_err_nopages);
112         } else {
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']);
117         }
118 }
119
120 function plugin_ls2_get_headings($page, & $params, $level, $include = FALSE)
121 {
122         global $script;
123         static $_ls2_anchor = 0;
124
125         // ページが未表示のとき
126         $is_done = (isset($params["page_$page"]) && $params["page_$page"] > 0);
127         if (! $is_done) $params["page_$page"] = ++$_ls2_anchor;
128
129         $r_page = rawurlencode($page);
130         $s_page = htmlsc($page);
131         $title  = $s_page . ' ' . get_pg_passage($page, FALSE);
132         $href   = $script . '?cmd=read&amp;page=' . $r_page;
133
134         plugin_ls2_list_push($params, $level);
135         $ret = $include ? '<li>include ' : '<li>';
136
137         if ($params['title'] && $is_done) {
138                 $ret .= '<a href="' . $href . '" title="' . $title . '">' . $s_page . '</a> ';
139                 $ret .= '<a href="#list_' . $params["page_$page"] . '"><sup>&uarr;</sup></a>';
140                 array_push($params['result'], $ret);
141                 return;
142         }
143
144         $ret .= '<a id="list_' . $params["page_$page"] . '" href="' . $href .
145                 '" title="' . $title . '">' . $s_page . '</a>';
146         array_push($params['result'], $ret);
147
148         $anchor = PLUGIN_LS2_ANCHOR_ORIGIN;
149         $matches = array();
150         foreach (get_source($page) as $line) {
151                 if ($params['title'] && preg_match('/^(\*{1,3})/', $line, $matches)) {
152                         $id    = make_heading($line);
153                         $level = strlen($matches[1]);
154                         $id    = PLUGIN_LS2_ANCHOR_PREFIX . $anchor++;
155                         plugin_ls2_list_push($params, $level + strlen($level));
156                         array_push($params['result'],
157                                 '<li><a href="' . $href . $id . '">' . $line . '</a>');
158                 } else if ($params['include'] &&
159                         preg_match('/^#include\((.+)\)/', $line, $matches) &&
160                         is_page($matches[1]))
161                 {
162                         plugin_ls2_get_headings($matches[1], $params, $level + 1, TRUE);
163                 }
164         }
165 }
166
167 //リスト構造を構築する
168 function plugin_ls2_list_push(& $params, $level)
169 {
170         global $_ul_left_margin, $_ul_margin, $_list_pad_str;
171
172         $result = & $params['result'];
173         $saved  = & $params['saved'];
174         $cont   = TRUE;
175         $open   = '<ul%s>';
176         $close  = '</li></ul>';
177
178         while (count($saved) > $level || (! empty($saved) && $saved[0] != $close))
179                 array_push($result, array_shift($saved));
180
181         $margin = $level - count($saved);
182
183         // count($saved)を増やす
184         while (count($saved) < ($level - 1)) array_unshift($saved, '');
185
186         if (count($saved) < $level) {
187                 $cont = FALSE;
188                 array_unshift($saved, $close);
189
190                 $left = ($level == $margin) ? $_ul_left_margin : 0;
191                 if ($params['compact']) {
192                         $left  += $_ul_margin;   // マージンを固定
193                         $level -= ($margin - 1); // レベルを修正
194                 } else {
195                         $left += $margin * $_ul_margin;
196                 }
197                 $str = sprintf($_list_pad_str, $level, $left, $left);
198                 array_push($result, sprintf($open, $str));
199         }
200
201         if ($cont) array_push($result, '</li>');
202 }
203
204 // オプションを解析する
205 function plugin_ls2_check_arg($value, & $params)
206 {
207         if ($value == '') {
208                 $params['_done'] = TRUE;
209                 return;
210         }
211
212         if (! $params['_done']) {
213                 foreach (array_keys($params) as $param) {
214                         if (strtolower($value)  == $param &&
215                             preg_match('/^[a-z]/', $param)) {
216                                 $params[$param] = TRUE;
217                                 return;
218                         }
219                 }
220                 $params['_done'] = TRUE;
221         }
222
223         $params['_args'][] = htmlsc($value); // Link title
224 }
225 ?>