2 // PukiWiki - Yet another WikiWikiWeb clone.
3 // $Id: bugtrack.inc.php,v 1.27 2011/01/25 15:01:01 henoheno Exp $
5 // 2002-2005, 2007 PukiWiki Developers Team
6 // 2002 Y.MASUI GPL2 http://masui.net/pukiwiki/ masui@masui.net
8 // PukiWiki BugTrack plugin
11 // 2002-2005 PukiWiki Developers Team
12 // 2002 Y.MASUI GPL2 http://masui.net/pukiwiki/ masui@masui.net
15 define('PLUGIN_BUGTRACK_NUMBER_FORMAT', '%d'); // Like 'page/1'
16 //define('PLUGIN_BUGTRACK_NUMBER_FORMAT', '%03d'); // Like 'page/001'
18 function plugin_bugtrack_init()
20 global $_plugin_bugtrack;
23 if (isset($init)) return; // Already init
24 if (isset($_plugin_bugtrack)) die('Global $_plugin_bugtrack had been init. Why?');
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',
34 'summary' => '¥µ¥Þ¥ê',
35 'nosummary'=> '¤³¤³¤Ë¥µ¥Þ¥ê¤òµÆþ¤·¤Æ²¼¤µ¤¤',
36 'priority' => 'Í¥Àè½ç°Ì',
39 'noname' => '̵̾¤·¤µ¤ó',
41 'body' => '¥á¥Ã¥»¡¼¥¸',
42 'category' => '¥«¥Æ¥´¥ê¡¼',
43 'pagename' => '¥Ú¡¼¥¸Ì¾',
44 'pagename_comment' => '¶õÍó¤Î¤Þ¤Þ¤À¤È¼«Æ°Åª¤Ë¥Ú¡¼¥¸Ì¾¤¬¿¶¤é¤ì¤Þ¤¹¡£',
45 'version_comment' => '¶õÍó¤Ç¤â¹½¤¤¤Þ¤»¤ó',
46 'version' => '¥Ð¡¼¥¸¥ç¥ó',
51 // #bugtrack: Show bugtrack form
52 function plugin_bugtrack_convert()
56 if (PKWK_READONLY) return ''; // Show nothing
58 $base = $vars['page'];
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;
66 return plugin_bugtrack_print_form($base, $category);
69 function plugin_bugtrack_print_form($base, $category)
71 global $_plugin_bugtrack;
76 $select_priority = "\n";
77 $count = count($_plugin_bugtrack['priority_list']);
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";
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";
93 if (empty($category)) {
94 $encoded_category = '<input name="category" id="_p_bugtrack_category_' . $id .
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";
103 $encoded_category .= '</select>';
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']);
120 <form action="$script" method="post">
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>
127 <th><label for="_p_bugtrack_category_$id">$s_category</label></th>
128 <td>$encoded_category</td>
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>
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>
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>
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>
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>
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>
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" />
172 function plugin_bugtrack_action()
176 if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
177 if ($post['mode'] != 'submit') return FALSE;
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']);
184 header('Location: ' . get_script_uri() . '?' . rawurlencode($page));
188 function plugin_bugtrack_write($base, $pagename, $summary, $name, $priority, $state, $category, $version, $body)
192 $base = strip_bracket($base);
193 $pagename = strip_bracket($pagename);
195 $postdata = plugin_bugtrack_template($base, $summary, $name, $priority,
196 $state, $category, $version, $body);
199 $page = $base . '/' . sprintf(PLUGIN_BUGTRACK_NUMBER_FORMAT, $id);
200 while (is_page($page)) {
203 $page = $base . '/' . sprintf(PLUGIN_BUGTRACK_NUMBER_FORMAT, $jump);
205 $page = $base . '/' . sprintf(PLUGIN_BUGTRACK_NUMBER_FORMAT, $id);
206 while (is_page($page))
207 $page = $base . '/' . sprintf(PLUGIN_BUGTRACK_NUMBER_FORMAT, ++$id);
209 if ($pagename == '') {
210 page_write($page, $postdata);
212 $pagename = get_fullname($pagename, $base);
213 if (is_page($pagename) || ! is_pagename($pagename)) {
214 $pagename = $page; // Set default
216 page_write($page, 'move to [[' . $pagename . ']]');
218 page_write($pagename, $postdata);
224 // Generate new page contents
225 function plugin_bugtrack_template($base, $summary, $name, $priority, $state, $category, $version, $body)
227 global $_plugin_bugtrack, $WikiName;
229 if (! preg_match("/^$WikiName$$/",$base)) $base = '[[' . $base . ']]';
230 if ($name != '' && ! preg_match("/^$WikiName$$/",$name)) $name = '[[' . $name . ']]';
232 if ($name == '') $name = $_plugin_bugtrack['noname'];
233 if ($summary == '') $summary = $_plugin_bugtrack['nosummary'];
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
246 ** ${_plugin_bugtrack['body']}
254 // ----------------------------------------
255 // BugTrack-List plugin
257 // #bugtrack_list plugin itself
258 function plugin_bugtrack_list_convert()
260 global $script, $vars, $_plugin_bugtrack;
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;
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));
276 $count_list = count($_plugin_bugtrack['state_list']);
279 for ($i = 0; $i <= $count_list + 1; ++$i) $table[$i] = array();
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);
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]);
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>
301 $table[$state_no][$no] = $row;
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";
311 for ($i = 0; $i <= $count_list; ++$i) {
312 ksort($table[$i], SORT_NUMERIC);
313 $table_html .= join("\n", $table[$i]);
316 return '<table border="1" width="100%">' . "\n" .
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)
324 global $WikiName, $InterWikiName, $BracketName, $_plugin_bugtrack;
327 $no = preg_match('/\/([0-9]+)$/', $page, $matches) ? $matches[1] : 0;
329 $source = get_source($page);
331 // Check 'moved' page _just once_
332 $regex = "/move\s*to\s*($WikiName|$InterWikiName|\[\[$BracketName\]\])/";
334 if ($recurse && preg_match($regex, $source[0], $match))
335 return plugin_bugtrack_list_pageinfo(strip_bracket($match[1]), $no, FALSE);
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]));
344 $$item = trim($matches[1]);
347 $$item = ''; // Data not found
351 if (preg_match("/\*([^\n]*)/", $body, $matches)) {
352 $summary = $matches[1];
353 make_heading($summary);
356 return array($page, $no, $summary, $name, $priority, $state, $category);