OSDN Git Service

-fileフィールドを追加
[pukiwiki/pukiwiki.git] / plugin / tracker.inc.php
1 <?php
2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
4 //
5 // $Id: tracker.inc.php,v 1.5 2003/07/28 05:49:15 arino Exp $
6 //
7
8 function plugin_tracker_convert()
9 {
10         global $script,$vars;
11         
12         $page = $vars['page'];
13         
14         $config_name = 'default';
15         $options = array();
16         if (func_num_args())
17         {
18                 $args = func_get_args();
19                 switch (count($args))
20                 {
21                         case 3:
22                                 $options = array_splice($args,2);
23                         case 2:
24                                 $_page = get_fullname($args[1],$page);
25                                 if (is_pagename($_page))
26                                 {
27                                         $page = $_page;
28                                 }
29                         case 1:
30                                 $config_name = $args[0];
31                 }
32         }
33         
34         $config = new Config('plugin/tracker/'.$config_name);
35         
36         if (!$config->read())
37         {
38                 return "<p>config file '".htmlspecialchars($config_name)."' not found.</p>";
39         }
40         
41         $config->config_name = $config_name;
42         
43         $fields = plugin_tracker_get_fields($page,$config);
44         
45         $retval = convert_html(plugin_tracker_get_source($config->page.'/form'));
46         
47         foreach (array_keys($fields) as $name)
48         {
49                 $retval = str_replace("[$name]",$fields[$name]->get_tag(),$retval);
50         }
51         return <<<EOD
52 <form enctype="multipart/form-data" action="$script" method="post">
53 $retval
54 </form>
55 EOD;
56 }
57 function plugin_tracker_action()
58 {
59         global $script,$post,$vars,$now;
60         
61         $config_name = array_key_exists('_config',$post) ? $post['_config'] : '';
62         
63         $config = new Config('plugin/tracker/'.$config_name);
64         if (!$config->read())
65         {
66                 return "<p>config file '".htmlspecialchars($config_name)."' not found.</p>";
67         }
68         $config->config_name = $config_name;
69         $source = $config->page.'/page';
70         
71         $refer = array_key_exists('_refer',$post) ? $post['_refer'] : '';
72         
73         if (!is_pagename($refer))
74         {
75                 return array(
76                         'msg'=>'cannot write',
77                         'body'=>'page name ('.htmlspecialchars($refer).') is not valid.'
78                 );
79         }
80         if (!is_page($source))
81         {
82                 return array(
83                         'msg'=>'cannot write',
84                         'body'=>'page template ('.htmlspecialchars($source).') is not exist.'
85                 );
86         }
87         // ¥Ú¡¼¥¸Ì¾¤ò·èÄê
88         $base = $post['_refer'];
89         $num = 0;
90         $name = (array_key_exists('_name',$post)) ? $post['_name'] : '';
91         if (array_key_exists('_page',$post))
92         {
93                 $page = $real = $post['_page'];
94         }
95         else
96         {
97                 $real = is_pagename($name) ? $name : ++$num;
98                 $page = get_fullname('./'.$real,$base);
99         }
100         if (!is_pagename($page))
101         {
102                 $page = $base;
103         }
104         
105         while (is_page($page))
106         {
107                 $real = ++$num;
108                 $page = "$base/$real";
109         }
110         // ¥Ú¡¼¥¸¥Ç¡¼¥¿¤òÀ¸À®
111         $postdata = join('',plugin_tracker_get_source($source));
112         
113         // µ¬Äê¤Î¥Ç¡¼¥¿
114         $_post = array_merge($post,$_FILES);
115         $_post['_date'] = $now;
116         $_post['_page'] = $page;
117         $_post['_name'] = $name;
118         $_post['_real'] = $real;
119         // $_post['_refer'] = $_post['refer'];
120         
121         $fields = plugin_tracker_get_fields($page,$config);
122         
123         foreach (array_keys($fields) as $key)
124         {
125                 if (array_key_exists($key,$_post))
126                 {
127                         $postdata = str_replace("[$key]",
128                                 $fields[$key]->format_value($_post[$key]),$postdata);
129                 }
130         }
131         
132         // ½ñ¤­¹þ¤ß
133         page_write($page,$postdata);
134         
135         $r_page = rawurlencode($page);
136         
137         header("Location: $script?$r_page");
138         exit;
139 }
140 // ¥Õ¥£¡¼¥ë¥É¥ª¥Ö¥¸¥§¥¯¥È¤ò¹½ÃÛ¤¹¤ë
141 function plugin_tracker_get_fields($page,&$config)
142 {
143         global $now,$_tracker_messages;
144         
145         $fields = array();
146         // µ¬Äê¤Î¥ª¥Ö¥¸¥§¥¯¥È
147         $fields['_date']   = &new Tracker_field_text(  array('_date',  $_tracker_messages['btn_date'],  '','20',''),$page,$config);
148         $fields['_update'] = &new Tracker_field_text(  array('_update',$_tracker_messages['btn_update'],'','20',''),$page,$config);
149         $fields['_past']   = &new Tracker_field_text(  array('_past',  $_tracker_messages['btn_past'],  '','20',''),$page,$config);
150         $fields['_page']   = &new Tracker_field_page(  array('_page',  $_tracker_messages['btn_page'],  '','20',''),$page,$config);
151         $fields['_name']   = &new Tracker_field_text(  array('_name',  $_tracker_messages['btn_name'],  '','20',''),$page,$config);
152         $fields['_real']   = &new Tracker_field_text(  array('_real',  $_tracker_messages['btn_real'],  '','20',''),$page,$config);
153         $fields['_refer']  = &new Tracker_field_page(  array('_refer', $_tracker_messages['btn_refer'], '','20',''),$page,$config);
154         $fields['_submit'] = &new Tracker_field_submit(array('_submit',$_tracker_messages['btn_submit'],'','',  ''),$page,$config);
155         
156         foreach ($config->get('fields') as $field)
157         {
158                 // 0=>¹àÌÜ̾ 1=>¸«½Ð¤· 2=>·Á¼° 3=>¥ª¥×¥·¥ç¥ó 4=>¥Ç¥Õ¥©¥ë¥ÈÃÍ
159                 $class = 'Tracker_field_'.$field[2];
160                 if (!class_exists($class))
161                 { // ¥Ç¥Õ¥©¥ë¥È
162                         $class = 'Tracker_field_text';
163                         $field[2] = 'text';
164                         $field[3] = '20';
165                 }
166                 $fields[$field[0]] = &new $class($field,$page,$config);
167         }
168         return $fields;
169 }
170 // ¥Õ¥£¡¼¥ë¥É¥¯¥é¥¹
171 class Tracker_field
172 {
173         var $name;
174         var $title;
175         var $values;
176         var $default_value;
177         var $page;
178         var $config;
179         var $data;
180         
181         function Tracker_field($field,$page,&$config)
182         {
183                 global $post;
184                 
185                 $this->name = $field[0];
186                 $this->title = $field[1];
187                 $this->values = explode(',',$field[3]);
188                 $this->default_value = $field[4];
189                 $this->page = $page;
190                 $this->config = &$config;
191                 $this->data = array_key_exists($this->name,$post) ? $post[$this->name] : '';
192         }
193         function get_tag()
194         {
195         }
196         function get_style($str)
197         {
198                 return '%s';
199         }
200         function format_value($value)
201         {
202                 return str_replace('|','&#x7c;',$value);
203         }
204         function format_cell($str)
205         {
206                 return $str;
207         }
208         function compare($str1,$str2)
209         {
210                 return strnatcasecmp($str1,$str2);
211         }
212 }
213 class Tracker_field_text extends Tracker_field
214 {
215         function get_tag()
216         {
217                 $s_name = htmlspecialchars($this->name);
218                 $s_size = htmlspecialchars($this->values[0]);
219                 $s_value = htmlspecialchars($this->default_value);
220                 return "<input type=\"text\" name=\"$s_name\" size=\"$s_size\" value=\"$s_value\" />";
221         }
222 }
223 class Tracker_field_page extends Tracker_field_text
224 {
225         function format_value($value)
226         {
227                 global $WikiName;
228                 
229                 $value = strip_bracket($value);
230                 if (is_pagename($value))
231                 {
232                         $value = "[[$value]]";
233                 }
234                 return parent::format_value($value);
235         }
236 }
237 class Tracker_field_title extends Tracker_field_text
238 {
239         function format_cell($str)
240         {
241                 make_heading($str);
242                 return $str;
243         }
244 }
245 class Tracker_field_file extends Tracker_field_format
246 {
247         function get_tag()
248         {
249                 $s_name = htmlspecialchars($this->name);
250                 $s_size = htmlspecialchars($this->values[0]);
251                 return "<input type=\"file\" name=\"$s_name\" size=\"$s_size\" />";
252         }
253         function format_value($str)
254         {
255                 if (array_key_exists($this->name,$_FILES))
256                 {
257                         require_once(PLUGIN_DIR.'attach.inc.php');
258                         $result = attach_upload($_FILES[$this->name],$this->page);
259                         if ($result['result']) // ¥¢¥Ã¥×¥í¡¼¥ÉÀ®¸ù
260                         {
261                                 return parent::format_value($this->page.'/'.$_FILES[$this->name]['name']);
262                         }
263                 }
264                 // ¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤«¡¢¥¢¥Ã¥×¥í¡¼¥É¤Ë¼ºÇÔ
265                 return parent::format_value('');
266         }
267 }
268 class Tracker_field_textarea extends Tracker_field
269 {
270         function get_tag()
271         {
272                 $s_name = htmlspecialchars($this->name);
273                 $s_cols = htmlspecialchars($this->values[0]);
274                 $s_rows = htmlspecialchars($this->values[1]);
275                 $s_value = htmlspecialchars($this->default_value);
276                 return "<textarea name=\"$s_name\" cols=\"$s_cols\" rows=\"$s_rows\">$s_value</textarea>";
277         }
278         function format_cell($str)
279         {
280                 $str = preg_replace('/[\r\n]+/','',$str);
281                 if (!empty($this->values[2]) and strlen($str) > ($this->values[2] + 3))
282                 {
283                         $str = mb_substr($str,0,$this->values[2]).'...';
284                 }
285                 return $str;
286         }
287 }
288 class Tracker_field_format extends Tracker_field
289 {
290         var $styles = array();
291         var $formats = array();
292         
293         function Tracker_field_format($field,$page,&$config)
294         {
295                 parent::Tracker_field($field,$page,$config);
296                 
297                 foreach ($this->config->get($this->name) as $option)
298                 {
299                         list($key,$style,$format) = array_map(create_function('$a','return trim($a);'),$option);
300                         if ($style != '')
301                         {
302                                 $this->styles[$key] = $style;
303                         }
304                         if ($format != '')
305                         {
306                                 $this->formats[$key] = $format;
307                         } 
308                 }
309         }
310         function get_tag()
311         {
312                 $s_name = htmlspecialchars($this->name);
313                 $s_size = htmlspecialchars($this->values[0]);
314                 return "<input type=\"text\" name=\"$s_name\" size=\"$s_size\" />";
315         }
316         function get_key($str)
317         {
318                 return ($str == '') ? 'IS NULL' : 'IS NOT NULL';
319         }
320         function format_value($str)
321         {
322                 if (is_array($str))
323                 {
324                         return join(', ',array_map(array($this,'format_value'),$str));
325                 }
326                 $key = $this->get_key($str);
327                 return array_key_exists($key,$this->formats) ? sprintf($this->formats[$key],$str) : $str;
328         }
329         function get_style($str)
330         {
331                 $key = $this->get_key($str);
332                 return array_key_exists($key,$this->styles) ? $this->styles[$key] : '';
333         }
334 }
335 class Tracker_field_radio extends Tracker_field_format
336 {
337         function get_tag()
338         {
339                 $s_name = htmlspecialchars($this->name);
340                 $retval = '';
341                 foreach ($this->config->get($this->name) as $option)
342                 {
343                         $s_option = htmlspecialchars($option[0]);
344                         $checked = trim($option[0]) == trim($this->default_value) ? ' checked="checked"' : '';
345                         $retval .= "<input type=\"radio\" name=\"$s_name\" value=\"$s_option\"$checked />$s_option\n";
346                 }
347                 
348                 return $retval;
349         }
350         function get_key($str)
351         {
352                 return $str;
353         }
354         function compare($str1,$str2)
355         {
356                 static $options;
357                 
358                 if (!isset($options))
359                 {
360                         $options = array_flip(array_map(create_function('$arr','return $arr[0];'),$this->config->get($this->name)));
361                 }
362                 $n1 = array_key_exists($str1,$options) ? $options[$str1] : $str1;
363                 $n2 = array_key_exists($str2,$options) ? $options[$str2] : $str2;
364                 return ($n1 == $n2) ? 0 : ($n1 > $n2 ? -1 : 1);
365         }
366 }
367 class Tracker_field_select extends Tracker_field_radio
368 {
369         function get_tag($empty=FALSE)
370         {
371                 $s_name = htmlspecialchars($this->name);
372                 $s_size = (array_key_exists(0,$this->values) and is_numeric($this->values[0])) ?
373                         ' size="'.htmlspecialchars($this->values[0]).'"' : '';
374                 $s_multiple = (array_key_exists(1,$this->values) and strtolower($this->values[1]) == 'multiple') ?
375                         ' multiple="multiple"' : '';
376                 $retval = "<select name=\"{$s_name}[]\"$s_size$s_multiple>\n";
377                 if ($empty)
378                 {
379                         $retval .= " <option value=\"\"></option>\n";
380                 }
381                 $defaults = array_flip(preg_split('/\s*,\s*/',$this->default_value,-1,PREG_SPLIT_NO_EMPTY));
382                 foreach ($this->config->get($this->name) as $option)
383                 {
384                         $s_option = htmlspecialchars($option[0]);
385                         $selected = array_key_exists(trim($option[0]),$defaults) ? ' selected="selected"' : '';
386                         $retval .= " <option value=\"$s_option\"$selected>$s_option</option>\n";
387                 }
388                 $retval .= "</select>";
389                 
390                 return $retval;
391         }
392 }
393 class Tracker_field_checkbox extends Tracker_field_radio
394 {
395         function get_tag($empty=FALSE)
396         {
397                 $s_name = htmlspecialchars($this->name);
398                 $defaults = array_flip(preg_split('/\s*,\s*/',$this->default_value,-1,PREG_SPLIT_NO_EMPTY));
399                 $retval = '';
400                 foreach ($this->config->get($this->name) as $option)
401                 {
402                         $s_option = htmlspecialchars($option[0]);
403                         $checked = array_key_exists(trim($option[0]),$defaults) ?
404                                 ' checked="checked"' : '';
405                         $retval .= "<input type=\"checkbox\" name=\"{$s_name}[]\" value=\"$s_option\"$checked />$s_option\n";
406                 }
407                 
408                 return $retval;
409         }
410 }
411 class Tracker_field_hidden extends Tracker_field_radio
412 {
413         function get_tag($empty=FALSE)
414         {
415                 $s_name = htmlspecialchars($this->name);
416                 $s_default = htmlspecialchars($this->default_value);
417                 $retval = "<input type=\"hidden\" name=\"$s_name\" value=\"$s_default\" />\n";
418                 
419                 return $retval;
420         }
421 }
422 class Tracker_field_submit extends Tracker_field
423 {
424         function get_tag()
425         {
426                 $s_title = htmlspecialchars($this->title);
427                 $s_page = htmlspecialchars($this->page);
428                 $s_config = htmlspecialchars($this->config->config_name);
429                 
430                 return <<<EOD
431 <input type="submit" value="$s_title" />
432 <input type="hidden" name="plugin" value="tracker" />
433 <input type="hidden" name="_refer" value="$s_page" />
434 <input type="hidden" name="_config" value="$s_config" />
435 EOD;
436         }
437 }
438 ///////////////////////////////////////////////////////////////////////////
439 // °ìÍ÷ɽ¼¨
440 function plugin_tracker_list_convert()
441 {
442         global $vars;
443         
444         $config = 'default';
445         $page = $vars['page'];
446         $field = '_page';
447         $order = -1;
448         $limit = NULL;
449         if (func_num_args())
450         {
451                 $args = func_get_args();
452                 switch (count($args))
453                 {
454                         case 5:
455                                 $limit = is_numeric($args[4]) ? $args[4] : $limit;
456                         case 4:
457                                 $order = (strpos('ascending',strtolower($args[3])) === 0) ? 1 : -1;
458                         case 3:
459                                 $field = ($args[2] != '') ? $args[2] : $field;
460                         case 2:
461                                 $page = is_pagename($args[1]) ? $args[1] : $page;
462                         case 1:
463                                 $config = ($args[0] != '') ? $args[0] : $config;
464                 }
465         }
466         return plugin_tracker_getlist($page,$config,$field,$order,$limit);
467 }
468 function plugin_tracker_list_action()
469 {
470         global $script,$vars,$_tracker_messages;
471         
472         $page = $vars['refer'];
473         $s_page = make_pagelink($page);
474         $config = $vars['config'];
475         $field = array_key_exists('field',$vars) ? $vars['field'] : '_page';
476         $order = (array_key_exists('order',$vars) and is_numeric($vars['order'])) ?
477                 $vars['order'] : -1;
478                 
479         return array(
480                 'msg' => $_tracker_messages['msg_list'],
481                 'body'=> str_replace('$1',$s_page,$_tracker_messages['msg_back']).
482                         plugin_tracker_getlist($page,$config,$field,$order)
483         );
484 }
485 function plugin_tracker_getlist($page,$config_name,$field=NULL,$order=1,$limit=NULL)
486 {
487         $config = new Config('plugin/tracker/'.$config_name);
488         
489         if (!$config->read())
490         {
491                 return "<p>config file '".htmlspecialchars($config_name)."' is not exist.";
492         }
493         $config->config_name = $config_name;
494         $list = &new Tracker_list($page,$config);
495         $list->sort($field,$order);
496         return $list->toString($limit);
497 }
498
499 // °ìÍ÷¥¯¥é¥¹
500 class Tracker_list
501 {
502         var $page;
503         var $config;
504         var $fields;
505         var $pattern;
506         var $pattern_fields;
507         var $rows;
508         var $sort_field = '_page';
509         var $sort_order = -1;
510         var $sort_obj = NULL;
511         
512         function Tracker_list($page,&$config)
513         {
514                 $this->page = $page;
515                 $this->config = &$config;
516                 $this->fields = plugin_tracker_get_fields($page,$config);
517                 
518                 $pattern = join('',plugin_tracker_get_source($config->page.'/page'));
519                 // ¥Ö¥í¥Ã¥¯¥×¥é¥°¥¤¥ó¤ò¥Õ¥£¡¼¥ë¥É¤ËÃÖ´¹
520                 // #comment¤Ê¤É¤ÇÁ°¸å¤Ëʸ»úÎó¤ÎÁý¸º¤¬¤¢¤Ã¤¿¾ì¹ç¤Ë¡¢[_block_xxx]¤ËµÛ¤¤¹þ¤Þ¤»¤ë¤è¤¦¤Ë¤¹¤ë
521                 $pattern = preg_replace('/^\#([^\(\s]+)(?:\((.*)\))?\s*$/m','[_block_$1]',$pattern);
522                 
523                 // ¥Ñ¥¿¡¼¥ó¤òÀ¸À®
524                 $this->pattern = '';
525                 $this->pattern_fields = array();
526                 $pattern = preg_split('/\\\\\[(\w+)\\\\\]/',preg_quote($pattern,'/'),-1,PREG_SPLIT_DELIM_CAPTURE);
527                 while (count($pattern))
528                 {
529                         $this->pattern .= preg_replace('/\s+/','\\s*','(?>\\s*'.trim(array_shift($pattern)).'\\s*)');
530                         if (count($pattern))
531                         {
532                                 $field = array_shift($pattern);
533                                 $this->pattern_fields[] = $field;
534                                 $this->pattern .= '(.*)';
535                         }
536                 }
537                 // ¥Ú¡¼¥¸¤ÎÎóµó¤È¼è¤ê¹þ¤ß
538                 $this->rows = array();
539                 $pattern = "$page/";
540                 $pattern_len = strlen($pattern);
541                 foreach (get_existpages() as $_page)
542                 {
543                         if (strpos($_page,$pattern) === 0)
544                                 //and is_numeric($num = substr($_page,$pattern_len)))
545                         {
546                                 $name = substr($_page,$pattern_len);
547                                 $this->add($_page,$name);
548                         }
549                 }
550         }
551         function add($page,$name)
552         {
553                 global $WikiName,$BracketName;
554                 
555                 // Ìµ¸Â¥ë¡¼¥×ËÉ»ß
556                 if (array_key_exists($name,$this->rows))
557                 {
558                         return;
559                 }
560                 
561                 $source = plugin_tracker_get_source($page);
562                 if (preg_match("/move\s*to\s*($WikiName|\[\[$BracketName\]\])/",$source[0],$matches))
563                 {
564                         return $this->add(strip_bracket($matches[1]),$name);
565                 }
566                 $source = join('',preg_replace('/^(\*{1,3}.*)\[#[A-Za-z][\w-]+\](.*)$/','$1$2',$source));
567                 
568                 // ¥Ç¥Õ¥©¥ë¥ÈÃÍ
569                 $this->rows[$name] = array(
570                         '_page'  => "[[$page]]",
571                         '_refer' => $this->page,
572                         '_real'  => $name,
573                         '_update'=> format_date(get_filetime($page)),
574                         '_past'  => get_passage(get_filetime($page),FALSE)
575                 );
576                 if (preg_match("/{$this->pattern}/s",$source,$matches))
577                 {
578                         array_shift($matches);
579                         foreach ($this->pattern_fields as $key=>$field)
580                         {
581                                 $this->rows[$name][$field] = trim($matches[$key]);
582                         }
583                 }
584         }
585         function sort($field=NULL,$order=1)
586         {
587                 $this->sort_order = $order;
588                 if ($field == '_page')
589                 {
590                         ($order == -1) ? krsort($this->rows) : ksort($this->rows);
591                         return;
592                 }
593                 $fields = array_flip(array_keys($this->fields));
594                 
595                 if (!array_key_exists($field,$fields))
596                 {
597                         return;
598                 }
599                 $this->sort_field = $field;
600                 $this->sort_obj = &$this->fields[$field];
601                 usort($this->rows,array(&$this,'compare'));
602         }
603         function compare($arr1,$arr2)
604         {
605                 return $this->sort_order * $this->sort_obj->compare(
606                         $arr1[$this->sort_field],$arr2[$this->sort_field]
607                 );
608         }
609         function replace_item($arr)
610         {
611                 $params = explode(',',$arr[1]);
612                 $name = array_shift($params);
613                 if ($name == '')
614                 {
615                         $str = '';
616                 }
617                 else if (array_key_exists($name,$this->items))
618                 {
619                         $str = $this->items[$name];
620                         if (array_key_exists($name,$this->fields))
621                         {
622                                 $str = $this->fields[$name]->format_cell($str);
623                         }
624                 }
625                 else
626                 {
627                         return $arr[0];
628                 }
629                 $style = count($params) ? $params[0] : $name;
630                 if (array_key_exists($style,$this->items)
631                         and array_key_exists($style,$this->fields))
632                 {
633                         $str = sprintf($this->fields[$style]->get_style($this->items[$style]),$str);
634                 }
635                 return $str;
636         }
637         function replace_title($arr)
638         {
639                 global $script;
640                 
641                 if (!array_key_exists($arr[1],$this->fields))
642                 {
643                         return $arr[0];
644                 }
645                 
646                 $order = 1;
647                 $arrow = '';
648                 if ($arr[1] == $this->sort_field)
649                 {
650                         $order = -$this->sort_order;
651                         $arrow = ($order == -1) ? '&darr;':'&uarr;';
652                 }
653                 
654                 $title = $this->fields[$arr[1]]->title;
655                 $r_page = rawurlencode($this->page);
656                 $r_config = rawurlencode($this->config->config_name);
657                 $r_field = rawurlencode($arr[1]);
658                 
659                 return "[[$title$arrow>$script?plugin=tracker_list&refer=$r_page&config=$r_config&field=$r_field&order=$order]]";
660         }
661         function toString($limit=NULL)
662         {
663                 global $_tracker_messages;
664                 
665                 $list = $body = '';
666                 if ($limit !== NULL and count($this->rows) > $limit)
667                 {
668                         $list .= str_replace(
669                                 array('$1','$2'),
670                                 array(count($this->rows),$limit),
671                                 $_tracker_messages['msg_limit'])."\n";
672                         $this->rows = array_splice($this->rows,0,$limit);
673                 }
674                 if (count($this->rows) == 0)
675                 {
676                         return '';
677                 }
678                 foreach (plugin_tracker_get_source($this->config->page.'/list') as $line)
679                 {
680                         if (preg_match('/^\|(.+)\|[hHfFcC]$/',$line))
681                         {
682                                 $list .= $line;
683                         }
684                         else
685                         {
686                                 $body .= $line;
687                         }
688                 }
689                 $list = preg_replace_callback('/\[([^\[\]]+)\]/',array(&$this,'replace_title'),$list);
690                 foreach ($this->rows as $key=>$row)
691                 {
692                         $this->items = $row;
693                         $list .= preg_replace_callback('/\[([^\[\]]+)\]/',array(&$this,'replace_item'),$body);
694                 }
695                 return convert_html($list);
696         }
697 }
698 function plugin_tracker_get_source($page)
699 {
700         $source = get_source($page);
701         // ¸«½Ð¤·¤Î¸ÇÍ­IDÉô¤òºï½ü
702         $source = preg_replace('/^(\*{1,3}.*)\[#[A-Za-z][\w-]+\](.*)$/m','$1$2',$source);
703         // #freeze¤òºï½ü
704         return preg_replace('/^#freeze\s*$/m','',$source);
705 }
706 ?>