OSDN Git Service

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