OSDN Git Service

Overhaul.
[pukiwiki/pukiwiki.git] / plugin / bugtrack.inc.php
1 <?php
2 // $Id: bugtrack.inc.php,v 1.23 2005/04/02 15:09:59 henoheno Exp $
3 //
4 // PukiWiki BugTrack plugin
5 //
6 // Copyright:
7 // 2002-2005 PukiWiki Developers Team
8 // 2002 Y.MASUI GPL2  http://masui.net/pukiwiki/ masui@masui.net
9
10 define('PLUGIN_BUGTRACK_NUMBER_FORMAT', '%d'); // From 'page/1'
11 //define('PLUGIN_BUGTRACK_NUMBER_FORMAT', '%03d'); // From 'page/001'
12
13 function plugin_bugtrack_init()
14 {
15         global $_plugin_bugtrack;
16         static $init;
17
18         if (isset($init)) return; // Already init
19         if (isset($_plugin_bugtrack)) die('Global $_plugin_bugtrack had been init. Why?');
20         $init = TRUE;
21
22         $_plugin_bugtrack = array(
23                 'priority_list'  => array('¶ÛµÞ', '½ÅÍ×', 'ÉáÄÌ', 'Äã'),
24                 'state_list'     => array('Äó°Æ', 'Ãå¼ê', 'CVSÂÔ¤Á', '´°Î»', 'ÊÝα', 'µÑ²¼'),
25                 'state_sort'     => array('Ãå¼ê', 'CVSÂÔ¤Á', 'ÊÝα', '´°Î»', 'Äó°Æ', 'µÑ²¼'),
26                 'state_bgcolor'  => array('#ccccff', '#ffcc99', '#ccddcc', '#ccffcc', '#ffccff', '#cccccc', '#ff3333'),
27                 'header_bgcolor' => '#ffffcc',
28                 'base'     => '¥Ú¡¼¥¸',
29                 'summary'  => '¥µ¥Þ¥ê',
30                 'nosummary'=> '¤³¤³¤Ë¥µ¥Þ¥ê¤òµ­Æþ¤·¤Æ²¼¤µ¤¤',
31                 'priority' => 'Í¥Àè½ç°Ì',
32                 'state'    => '¾õÂÖ',
33                 'name'     => 'Åê¹Æ¼Ô',
34                 'noname'   => '̵̾¤·¤µ¤ó',
35                 'date'     => 'Åê¹ÆÆü',
36                 'body'     => '¥á¥Ã¥»¡¼¥¸',
37                 'category' => '¥«¥Æ¥´¥ê¡¼',
38                 'pagename' => '¥Ú¡¼¥¸Ì¾',
39                 'pagename_comment' => '¶õÍó¤Î¤Þ¤Þ¤À¤È¼«Æ°Åª¤Ë¥Ú¡¼¥¸Ì¾¤¬¿¶¤é¤ì¤Þ¤¹¡£',
40                 'version_comment'  => '¶õÍó¤Ç¤â¹½¤¤¤Þ¤»¤ó',
41                 'version'  => '¥Ð¡¼¥¸¥ç¥ó',
42                 'submit'   => 'ÄɲÃ'
43                 );
44 }
45
46 // Add new issue
47 function plugin_bugtrack_action()
48 {
49         global $post;
50
51         if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
52         if ($post['mode'] != 'submit') return FALSE;
53
54         $page = plugin_bugtrack_write($post['base'], $post['pagename'], $post['summary'],
55                 $post['name'], $post['priority'], $post['state'], $post['category'],
56                 $post['version'], $post['body']);
57
58         pkwk_headers_sent();
59         header('Location: ' . get_script_uri() . '?' . rawurlencode($page));
60         exit;
61 }
62
63 function plugin_bugtrack_print_form($base, $category)
64 {
65         global $_plugin_bugtrack;
66         static $id = 0;
67
68         ++$id;
69
70         $select_priority = "\n";
71         $count = count($_plugin_bugtrack['priority_list']);
72         $selected = '';
73         for ($i = 0; $i < $count; ++$i) {
74                 if ($i == ($count - 1)) $selected = ' selected="selected"'; // The last one
75                 $priority_list = htmlspecialchars($_plugin_bugtrack['priority_list'][$i]);
76                 $select_priority .= '    <option value="' . $priority_list . '"' .
77                         $selected . '>' . $priority_list . '</option>' . "\n";
78         }
79
80         $select_state = "\n";
81         for ($i = 0; $i < count($_plugin_bugtrack['state_list']); ++$i) {
82                 $state_list = htmlspecialchars($_plugin_bugtrack['state_list'][$i]);
83                 $select_state .= '    <option value="' . $state_list . '">' .
84                         $state_list . '</option>' . "\n";
85         }
86
87         if (empty($category)) {
88                 $encoded_category = '<input name="category" id="_p_bugtrack_category_' . $id .
89                         '" type="text" />';
90         } else {
91                 $encoded_category = '<select name="category" id="_p_bugtrack_category_' . $id . '">';
92                 foreach ($category as $_category) {
93                         $s_category = htmlspecialchars($_category);
94                         $encoded_category .= '<option value="' . $s_category . '">' .
95                                 $s_category . '</option>' . "\n";
96                 }
97                 $encoded_category .= '</select>';
98         }
99
100         $script     = get_script_uri();
101         $s_base     = htmlspecialchars($base);
102         $s_name     = htmlspecialchars($_plugin_bugtrack['name']);
103         $s_category = htmlspecialchars($_plugin_bugtrack['category']);
104         $s_priority = htmlspecialchars($_plugin_bugtrack['priority']);
105         $s_state    = htmlspecialchars($_plugin_bugtrack['state']);
106         $s_pname    = htmlspecialchars($_plugin_bugtrack['pagename']);
107         $s_pnamec   = htmlspecialchars($_plugin_bugtrack['pagename_comment']);
108         $s_version  = htmlspecialchars($_plugin_bugtrack['version']);
109         $s_versionc = htmlspecialchars($_plugin_bugtrack['version_comment']);
110         $s_summary  = htmlspecialchars($_plugin_bugtrack['summary']);
111         $s_body     = htmlspecialchars($_plugin_bugtrack['body']);
112         $s_submit   = htmlspecialchars($_plugin_bugtrack['submit']);
113         $body = <<<EOD
114 <form action="$script" method="post">
115  <table border="0">
116   <tr>
117    <th><label for="_p_bugtrack_name_$id">$s_name</label></th>
118    <td><input  id="_p_bugtrack_name_$id" name="name" size="20" type="text" /></td>
119   </tr>
120   <tr>
121    <th><label for="_p_bugtrack_category_$id">$s_category</label></th>
122    <td>$encoded_category</td>
123   </tr>
124   <tr>
125    <th><label for="_p_bugtrack_priority_$id">$s_priority</label></th>
126    <td><select id="_p_bugtrack_priority_$id" name="priority">$select_priority   </select></td>
127   </tr>
128   <tr>
129    <th><label for="_p_bugtrack_state_$id">$s_state</label></th>
130    <td><select id="_p_bugtrack_state_$id" name="state">$select_state   </select></td>
131   </tr>
132   <tr>
133    <th><label for="_p_bugtrack_pagename_$id">$s_pname</label></th>
134    <td><input  id="_p_bugtrack_pagename_$id" name="pagename" size="20" type="text" />
135     <small>$s_pnamec</small></td>
136   </tr>
137   <tr>
138    <th><label for="_p_bugtrack_version_$id">$s_version</label></th>
139    <td><input  id="_p_bugtrack_version_$id" name="version" size="10" type="text" />
140     <small>$s_versionc</small></td>
141   </tr>
142   <tr>
143    <th><label for="_p_bugtrack_summary_$id">$s_summary</label></th>
144    <td><input  id="_p_bugtrack_summary_$id" name="summary" size="60" type="text" /></td>
145   </tr>
146   <tr>
147    <th><label   for="_p_bugtrack_body_$id">$s_body</label></th>
148    <td><textarea id="_p_bugtrack_body_$id" name="body" cols="60" rows="6"></textarea></td>
149   </tr>
150   <tr>
151    <td colspan="2" align="center">
152     <input type="submit" value="$s_submit" />
153     <input type="hidden" name="plugin" value="bugtrack" />
154     <input type="hidden" name="mode"   value="submit" />
155     <input type="hidden" name="base"   value="$s_base" />
156    </td>
157   </tr>
158  </table>
159 </form>
160 EOD;
161
162         return $body;
163 }
164
165 function plugin_bugtrack_template($base, $summary, $name, $priority, $state, $category, $version, $body)
166 {
167         global $_plugin_bugtrack, $WikiName;
168
169         if (! preg_match("/^$WikiName$$/",$base)) $base = '[[' . $base . ']]';
170         if ($name != '' && ! preg_match("/^$WikiName$$/",$name)) $name = '[[' . $name . ']]';
171
172         if ($name    == '') $name    = $_plugin_bugtrack['noname'];
173         if ($summary == '') $summary = $_plugin_bugtrack['nosummary'];
174
175          return <<<EOD
176 * $summary
177
178 - ${_plugin_bugtrack['base'    ]}: $base
179 - ${_plugin_bugtrack['name'    ]}: $name
180 - ${_plugin_bugtrack['priority']}: $priority
181 - ${_plugin_bugtrack['state'   ]}: $state
182 - ${_plugin_bugtrack['category']}: $category
183 - ${_plugin_bugtrack['date'    ]}: now?
184 - ${_plugin_bugtrack['version' ]}: $version
185
186 ** ${_plugin_bugtrack['body']}
187 $body
188 --------
189
190 #comment
191 EOD;
192 }
193
194 function plugin_bugtrack_write($base, $pagename, $summary, $name, $priority, $state, $category, $version, $body)
195 {
196         global $post;
197
198         $base     = strip_bracket($base);
199         $pagename = strip_bracket($pagename);
200
201         $postdata = plugin_bugtrack_template($base, $summary, $name, $priority,
202                 $state, $category, $version, $body);
203
204         $id = $jump = 1;
205         $page = $base . '/' . sprintf(PLUGIN_BUGTRACK_NUMBER_FORMAT, $id);
206         while (is_page($page)) {
207                 $id   = $jump;
208                 $jump += 50;
209                 $page = $base . '/' . sprintf(PLUGIN_BUGTRACK_NUMBER_FORMAT, $jump);
210         }
211         $page = $base . '/' . sprintf(PLUGIN_BUGTRACK_NUMBER_FORMAT, $id);
212         while (is_page($page))
213                 $page = $base . '/' . sprintf(PLUGIN_BUGTRACK_NUMBER_FORMAT, ++$id);
214
215         if ($pagename == '') {
216                 page_write($page, $postdata);
217         } else {
218                 $pagename = get_fullname($pagename, $base);
219                 if (is_page($pagename) || ! is_pagename($pagename)) {
220                         $pagename = $page; // Set default
221                 } else {
222                         page_write($page, 'move to [[' . $pagename . ']]');
223                 }
224                 page_write($pagename, $postdata);
225         }
226
227         return $page;
228 }
229
230 // #bugtrack: Show bugtrack form
231 function plugin_bugtrack_convert()
232 {
233         global $vars;
234
235         if (PKWK_READONLY) return ''; // Show nothing
236
237         $base = $vars['page'];
238         $category = array();
239         if (func_num_args()) {
240                 $category = func_get_args();
241                 $_base    = get_fullname(strip_bracket(array_shift($category)), $base);
242                 if (is_pagename($_base)) $base = $_base;
243         }
244
245         return plugin_bugtrack_print_form($base, $category);
246 }
247
248 // Get data from a page (or a page moved from $page)
249 function plugin_bugtrack_pageinfo($page, $no = NULL, $recurse = TRUE)
250 {
251         global $WikiName, $InterWikiName, $BracketName, $_plugin_bugtrack;
252
253         if ($no === NULL)
254                 $no = preg_match('/\/([0-9]+)$/', $page, $matches) ? $matches[1] : 0;
255
256         $source = get_source($page);
257
258         // Check 'moved' page _just once_
259         $regex  = "/move\s*to\s*($WikiName|$InterWikiName|\[\[$BracketName\]\])/";
260         $match  = array();
261         if ($recurse && preg_match($regex, $source[0], $match))
262                 return plugin_bugtrack_pageinfo(strip_bracket($match[1]), $no, FALSE);
263
264         $body = join("\n", $source);
265         foreach(array('summary', 'name', 'priority', 'state', 'category') as $item) {
266                 $regex = '/-\s*' . preg_quote($_plugin_bugtrack[$item], '/') . '\s*:(.*)/';
267                 if (preg_match($regex, $body, $matches)) {
268                         if ($item == 'name') {
269                                 $$item = htmlspecialchars(strip_bracket(trim($matches[1])));
270                         } else {
271                                 $$item = htmlspecialchars(trim($matches[1]));
272                         }
273                 } else {
274                                 $$item = ''; // Data not found
275                 }
276         }
277
278         if (preg_match("/\*([^\n]*)/", $body, $matches)) {
279                 $summary = $matches[1];
280                 make_heading($summary);
281         }
282
283         return array($page, $no, $summary, $name, $priority, $state, $category);
284 }
285
286 function plugin_bugtrack_list_convert()
287 {
288         global $script, $vars, $_plugin_bugtrack;
289
290         $page = $vars['page'];
291         if (func_num_args()) {
292                 list($_page) = func_get_args();
293                 $_page = get_fullname(strip_bracket($_page), $page);
294                 if (is_pagename($_page)) $page = $_page;
295         }
296
297         $data = array();
298         $pattern = $page . '/';
299         $pattern_len = strlen($pattern);
300         foreach (get_existpages() as $page) {
301                 if (strpos($page, $pattern) === 0 && is_numeric(substr($page, $pattern_len))) {
302                         $line = plugin_bugtrack_pageinfo($page);
303                         array_push($data, $line);
304                 }
305         }
306
307         $count_list = count($_plugin_bugtrack['state_list']);
308
309         $table = array();
310         for ($i = 0; $i <= $count_list + 1; ++$i)
311                 $table[$i] = array();
312
313         foreach ($data as $line) {
314                 list($page, $no, $summary, $name, $priority, $state, $category) = $line;
315                 $page_link = make_pagelink($page);
316
317                 $state_no = array_search($state, $_plugin_bugtrack['state_sort']);
318                 if ($state_no === NULL || $state_no === FALSE) $state_no = $count_list;
319                 $bgcolor = htmlspecialchars($_plugin_bugtrack['state_bgcolor'][$state_no]);
320
321                 $row = <<<EOD
322  <tr>
323   <td style="background-color:$bgcolor">$page_link</td>
324   <td style="background-color:$bgcolor">$state</td>
325   <td style="background-color:$bgcolor">$priority</td>
326   <td style="background-color:$bgcolor">$category</td>
327   <td style="background-color:$bgcolor">$name</td>
328   <td style="background-color:$bgcolor">$summary</td>
329  </tr>
330 EOD;
331                 $table[$state_no][$no] = $row;
332         }
333
334         $bgcolor = htmlspecialchars($_plugin_bugtrack['header_bgcolor']);
335         $table_html = <<<EOD
336  <tr>
337   <th style="background-color:$bgcolor">${_plugin_bugtrack['pagename']}</th>
338   <th style="background-color:$bgcolor">${_plugin_bugtrack['state'   ]}</th>
339   <th style="background-color:$bgcolor">${_plugin_bugtrack['priority']}</th>
340   <th style="background-color:$bgcolor">${_plugin_bugtrack['category']}</th>
341   <th style="background-color:$bgcolor">${_plugin_bugtrack['name'    ]}</th>
342   <th style="background-color:$bgcolor">${_plugin_bugtrack['summary' ]}</th>
343  </tr>
344 EOD;
345         for ($i = 0; $i <= $count_list; ++$i) {
346                 ksort($table[$i], SORT_NUMERIC);
347                 $table_html .= join("\n", $table[$i]);
348         }
349
350         return '<table border="1" width="100%">' . "\n" .
351                 $table_html . "\n" .
352                 '</table>';
353 }
354 ?>