OSDN Git Service

3f3d31175691c0d733ee39218b39d94bbdd9a9b2
[pukiwiki/pukiwiki.git] / plugin / tracker.inc.php
1 <?php
2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
4 //
5 // $Id: tracker.inc.php,v 1.11 2003/09/27 15:28:12 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         $hiddens = '';
47         
48         foreach (array_keys($fields) as $name)
49         {
50                 $replace = $fields[$name]->get_tag();
51                 if (is_a($fields[$name],'Tracker_field_hidden'))
52                 {
53                         $hiddens .= $replace;
54                         $replace = '';
55                 }
56                 $retval = str_replace("[$name]",$replace,$retval);
57         }
58         return <<<EOD
59 <form enctype="multipart/form-data" action="$script" method="post">
60 $retval
61 $hiddens
62 </form>
63 EOD;
64 }
65 function plugin_tracker_action()
66 {
67         global $script,$post,$vars,$now;
68         
69         $config_name = array_key_exists('_config',$post) ? $post['_config'] : '';
70         
71         $config = new Config('plugin/tracker/'.$config_name);
72         if (!$config->read())
73         {
74                 return "<p>config file '".htmlspecialchars($config_name)."' not found.</p>";
75         }
76         $config->config_name = $config_name;
77         $source = $config->page.'/page';
78         
79         $refer = array_key_exists('_refer',$post) ? $post['_refer'] : '';
80         
81         if (!is_pagename($refer))
82         {
83                 return array(
84                         'msg'=>'cannot write',
85                         'body'=>'page name ('.htmlspecialchars($refer).') is not valid.'
86                 );
87         }
88         if (!is_page($source))
89         {
90                 return array(
91                         'msg'=>'cannot write',
92                         'body'=>'page template ('.htmlspecialchars($source).') is not exist.'
93                 );
94         }
95         // ¥Ú¡¼¥¸Ì¾¤ò·èÄê
96         $base = $post['_refer'];
97         $num = 0;
98         $name = (array_key_exists('_name',$post)) ? $post['_name'] : '';
99         if (array_key_exists('_page',$post))
100         {
101                 $page = $real = $post['_page'];
102         }
103         else
104         {
105                 $real = is_pagename($name) ? $name : ++$num;
106                 $page = get_fullname('./'.$real,$base);
107         }
108         if (!is_pagename($page))
109         {
110                 $page = $base;
111         }
112         
113         while (is_page($page))
114         {
115                 $real = ++$num;
116                 $page = "$base/$real";
117         }
118         // ¥Ú¡¼¥¸¥Ç¡¼¥¿¤òÀ¸À®
119         $postdata = plugin_tracker_get_source($source);
120         
121         // µ¬Äê¤Î¥Ç¡¼¥¿
122         $_post = array_merge($post,$_FILES);
123         $_post['_date'] = $now;
124         $_post['_page'] = $page;
125         $_post['_name'] = $name;
126         $_post['_real'] = $real;
127         // $_post['_refer'] = $_post['refer'];
128         
129         $fields = plugin_tracker_get_fields($page,$config);
130         
131         foreach (array_keys($fields) as $key)
132         {
133                 if (!array_key_exists($key,$_post))
134                 {
135                         continue;
136                 }
137                 $value = $fields[$key]->format_value($_post[$key]);
138                 foreach (array_keys($postdata) as $num)
139                 {
140                         if (trim($postdata[$num]) == '')
141                         {
142                                 continue;
143                         }
144                         $postdata[$num] = str_replace(
145                                 "[$key]",
146                                 ($postdata[$num]{0} == '|' or $postdata[$num]{0} == ':') ?
147                                         str_replace('|','&#x7c;',$value) : $value,
148                                 $postdata[$num]
149                         );
150                 }
151         }
152         
153         // ½ñ¤­¹þ¤ß
154         page_write($page,join('',$postdata));
155         
156         $r_page = rawurlencode($page);
157         
158         header("Location: $script?$r_page");
159         exit;
160 }
161 function plugin_tracker_inline()
162 {
163         global $vars;
164         
165         $args = func_get_args();
166         if (count($args) < 3)
167         {
168                 return FALSE;
169         }
170         $body = array_pop($args);
171         list($config_name,$field) = $args;
172         
173         $config = new Config('plugin/tracker/'.$config_name);
174         
175         if (!$config->read())
176         {
177                 return "config file '".htmlspecialchars($config_name)."' not found.";
178         }
179         
180         $config->config_name = $config_name;
181         
182         $fields = plugin_tracker_get_fields($vars['page'],$config);
183         $fields[$field]->default_value = $body;
184         return $fields[$field]->get_tag();
185 }       
186 // ¥Õ¥£¡¼¥ë¥É¥ª¥Ö¥¸¥§¥¯¥È¤ò¹½ÃÛ¤¹¤ë
187 function plugin_tracker_get_fields($page,&$config)
188 {
189         global $now,$_tracker_messages;
190         
191         $fields = array();
192         // Í½Ìó¸ì
193         foreach (array(
194                 '_date'=>'text',    // Åê¹ÆÆü»þ
195                 '_update'=>'date',  // ºÇ½ª¹¹¿·
196                 '_past'=>'past',    // ·Ð²á(passage)
197                 '_page'=>'page',    // ¥Ú¡¼¥¸Ì¾
198                 '_name'=>'text',    // »ØÄꤵ¤ì¤¿¥Ú¡¼¥¸Ì¾
199                 '_real'=>'real',    // ¼ÂºÝ¤Î¥Ú¡¼¥¸Ì¾
200                 '_refer'=>'page',   // »²¾È¸µ(¥Õ¥©¡¼¥à¤Î¤¢¤ë¥Ú¡¼¥¸)
201                 '_submit'=>'submit' // Äɲåܥ¿¥ó
202                 ) as $field=>$class)
203         {
204                 $class = 'Tracker_field_'.$class;
205                 $fields[$field] = &new $class(array($field,$_tracker_messages["btn$field"],'','20',''),$page,$config);
206         }
207         
208         foreach ($config->get('fields') as $field)
209         {
210                 // 0=>¹àÌÜ̾ 1=>¸«½Ð¤· 2=>·Á¼° 3=>¥ª¥×¥·¥ç¥ó 4=>¥Ç¥Õ¥©¥ë¥ÈÃÍ
211                 $class = 'Tracker_field_'.$field[2];
212                 if (!class_exists($class))
213                 { // ¥Ç¥Õ¥©¥ë¥È
214                         $class = 'Tracker_field_text';
215                         $field[2] = 'text';
216                         $field[3] = '20';
217                 }
218                 $fields[$field[0]] = &new $class($field,$page,$config);
219         }
220         return $fields;
221 }
222 // ¥Õ¥£¡¼¥ë¥É¥¯¥é¥¹
223 class Tracker_field
224 {
225         var $name;
226         var $title;
227         var $values;
228         var $default_value;
229         var $page;
230         var $config;
231         var $data;
232         var $sort_type = SORT_REGULAR;
233         
234         function Tracker_field($field,$page,&$config)
235         {
236                 global $post;
237                 
238                 $this->name = $field[0];
239                 $this->title = $field[1];
240                 $this->values = explode(',',$field[3]);
241                 $this->default_value = $field[4];
242                 $this->page = $page;
243                 $this->config = &$config;
244                 $this->data = array_key_exists($this->name,$post) ? $post[$this->name] : '';
245         }
246         function get_tag()
247         {
248         }
249         function get_style($str)
250         {
251                 return '%s';
252         }
253         function format_value($value)
254         {
255                 return $value;
256         }
257         function format_cell($str)
258         {
259                 return $str;
260         }
261         function get_value($value)
262         {
263                 return $value;
264         }
265 }
266 class Tracker_field_text extends Tracker_field
267 {
268         var $sort_type = SORT_STRING;
269         
270         function get_tag()
271         {
272                 $s_name = htmlspecialchars($this->name);
273                 $s_size = htmlspecialchars($this->values[0]);
274                 $s_value = htmlspecialchars($this->default_value);
275                 return "<input type=\"text\" name=\"$s_name\" size=\"$s_size\" value=\"$s_value\" />";
276         }
277 }
278 class Tracker_field_page extends Tracker_field_text
279 {
280         var $sort_type = SORT_STRING;
281         
282         function format_value($value)
283         {
284                 global $WikiName;
285                 
286                 $value = strip_bracket($value);
287                 if (is_pagename($value))
288                 {
289                         $value = "[[$value]]";
290                 }
291                 return parent::format_value($value);
292         }
293 }
294 class Tracker_field_real extends Tracker_field_text
295 {
296         var $sort_type = SORT_REGULAR;
297 }
298 class Tracker_field_title extends Tracker_field_text
299 {
300         var $sort_type = SORT_STRING;
301         
302         function format_cell($str)
303         {
304                 make_heading($str);
305                 return $str;
306         }
307 }
308 class Tracker_field_textarea extends Tracker_field
309 {
310         var $sort_type = SORT_STRING;
311         
312         function get_tag()
313         {
314                 $s_name = htmlspecialchars($this->name);
315                 $s_cols = htmlspecialchars($this->values[0]);
316                 $s_rows = htmlspecialchars($this->values[1]);
317                 $s_value = htmlspecialchars($this->default_value);
318                 return "<textarea name=\"$s_name\" cols=\"$s_cols\" rows=\"$s_rows\">$s_value</textarea>";
319         }
320         function format_cell($str)
321         {
322                 $str = preg_replace('/[\r\n]+/','',$str);
323                 if (!empty($this->values[2]) and strlen($str) > ($this->values[2] + 3))
324                 {
325                         $str = mb_substr($str,0,$this->values[2]).'...';
326                 }
327                 return $str;
328         }
329 }
330 class Tracker_field_format extends Tracker_field
331 {
332         var $sort_type = SORT_STRING;
333         
334         var $styles = array();
335         var $formats = array();
336         
337         function Tracker_field_format($field,$page,&$config)
338         {
339                 parent::Tracker_field($field,$page,$config);
340                 
341                 foreach ($this->config->get($this->name) as $option)
342                 {
343                         list($key,$style,$format) = array_pad(array_map(create_function('$a','return trim($a);'),$option),3,'');
344                         if ($style != '')
345                         {
346                                 $this->styles[$key] = $style;
347                         }
348                         if ($format != '')
349                         {
350                                 $this->formats[$key] = $format;
351                         } 
352                 }
353         }
354         function get_tag()
355         {
356                 $s_name = htmlspecialchars($this->name);
357                 $s_size = htmlspecialchars($this->values[0]);
358                 return "<input type=\"text\" name=\"$s_name\" size=\"$s_size\" />";
359         }
360         function get_key($str)
361         {
362                 return ($str == '') ? 'IS NULL' : 'IS NOT NULL';
363         }
364         function format_value($str)
365         {
366                 if (is_array($str))
367                 {
368                         return join(', ',array_map(array($this,'format_value'),$str));
369                 }
370                 $key = $this->get_key($str);
371                 return array_key_exists($key,$this->formats) ? str_replace('%s',$str,$this->formats[$key]) : $str;
372         }
373         function get_style($str)
374         {
375                 $key = $this->get_key($str);
376                 return array_key_exists($key,$this->styles) ? $this->styles[$key] : '%s';
377         }
378 }
379 class Tracker_field_file extends Tracker_field_format
380 {
381         var $sort_type = SORT_STRING;
382         
383         function get_tag()
384         {
385                 $s_name = htmlspecialchars($this->name);
386                 $s_size = htmlspecialchars($this->values[0]);
387                 return "<input type=\"file\" name=\"$s_name\" size=\"$s_size\" />";
388         }
389         function format_value($str)
390         {
391                 if (array_key_exists($this->name,$_FILES))
392                 {
393                         require_once(PLUGIN_DIR.'attach.inc.php');
394                         $result = attach_upload($_FILES[$this->name],$this->page);
395                         if ($result['result']) // ¥¢¥Ã¥×¥í¡¼¥ÉÀ®¸ù
396                         {
397                                 return parent::format_value($this->page.'/'.$_FILES[$this->name]['name']);
398                         }
399                 }
400                 // ¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤«¡¢¥¢¥Ã¥×¥í¡¼¥É¤Ë¼ºÇÔ
401                 return parent::format_value('');
402         }
403 }
404 class Tracker_field_radio extends Tracker_field_format
405 {
406         var $sort_type = SORT_NUMERIC;
407         
408         function get_tag()
409         {
410                 $s_name = htmlspecialchars($this->name);
411                 $retval = '';
412                 foreach ($this->config->get($this->name) as $option)
413                 {
414                         $s_option = htmlspecialchars($option[0]);
415                         $checked = trim($option[0]) == trim($this->default_value) ? ' checked="checked"' : '';
416                         $retval .= "<input type=\"radio\" name=\"$s_name\" value=\"$s_option\"$checked />$s_option\n";
417                 }
418                 
419                 return $retval;
420         }
421         function get_key($str)
422         {
423                 return $str;
424         }
425         function get_value($value)
426         {
427                 static $options = array();
428                 if (!array_key_exists($this->name,$options))
429                 {
430                         $options[$this->name] = array_flip(array_map(create_function('$arr','return $arr[0];'),$this->config->get($this->name)));
431                 }
432                 return array_key_exists($value,$options[$this->name]) ? $options[$this->name][$value] : $value;
433         }
434 }
435 class Tracker_field_select extends Tracker_field_radio
436 {
437         var $sort_type = SORT_NUMERIC;
438         
439         function get_tag($empty=FALSE)
440         {
441                 $s_name = htmlspecialchars($this->name);
442                 $s_size = (array_key_exists(0,$this->values) and is_numeric($this->values[0])) ?
443                         ' size="'.htmlspecialchars($this->values[0]).'"' : '';
444                 $s_multiple = (array_key_exists(1,$this->values) and strtolower($this->values[1]) == 'multiple') ?
445                         ' multiple="multiple"' : '';
446                 $retval = "<select name=\"{$s_name}[]\"$s_size$s_multiple>\n";
447                 if ($empty)
448                 {
449                         $retval .= " <option value=\"\"></option>\n";
450                 }
451                 $defaults = array_flip(preg_split('/\s*,\s*/',$this->default_value,-1,PREG_SPLIT_NO_EMPTY));
452                 foreach ($this->config->get($this->name) as $option)
453                 {
454                         $s_option = htmlspecialchars($option[0]);
455                         $selected = array_key_exists(trim($option[0]),$defaults) ? ' selected="selected"' : '';
456                         $retval .= " <option value=\"$s_option\"$selected>$s_option</option>\n";
457                 }
458                 $retval .= "</select>";
459                 
460                 return $retval;
461         }
462 }
463 class Tracker_field_checkbox extends Tracker_field_radio
464 {
465         var $sort_type = SORT_NUMERIC;
466         
467         function get_tag($empty=FALSE)
468         {
469                 $s_name = htmlspecialchars($this->name);
470                 $defaults = array_flip(preg_split('/\s*,\s*/',$this->default_value,-1,PREG_SPLIT_NO_EMPTY));
471                 $retval = '';
472                 foreach ($this->config->get($this->name) as $option)
473                 {
474                         $s_option = htmlspecialchars($option[0]);
475                         $checked = array_key_exists(trim($option[0]),$defaults) ?
476                                 ' checked="checked"' : '';
477                         $retval .= "<input type=\"checkbox\" name=\"{$s_name}[]\" value=\"$s_option\"$checked />$s_option\n";
478                 }
479                 
480                 return $retval;
481         }
482 }
483 class Tracker_field_hidden extends Tracker_field_radio
484 {
485         var $sort_type = SORT_NUMERIC;
486         
487         function get_tag($empty=FALSE)
488         {
489                 $s_name = htmlspecialchars($this->name);
490                 $s_default = htmlspecialchars($this->default_value);
491                 $retval = "<input type=\"hidden\" name=\"$s_name\" value=\"$s_default\" />\n";
492                 
493                 return $retval;
494         }
495 }
496 class Tracker_field_submit extends Tracker_field
497 {
498         function get_tag()
499         {
500                 $s_title = htmlspecialchars($this->title);
501                 $s_page = htmlspecialchars($this->page);
502                 $s_config = htmlspecialchars($this->config->config_name);
503                 
504                 return <<<EOD
505 <input type="submit" value="$s_title" />
506 <input type="hidden" name="plugin" value="tracker" />
507 <input type="hidden" name="_refer" value="$s_page" />
508 <input type="hidden" name="_config" value="$s_config" />
509 EOD;
510         }
511 }
512 class Tracker_field_date extends Tracker_field
513 {
514         var $sort_type = SORT_NUMERIC;
515         
516         function format_cell($timestamp)
517         {
518                 return format_date($timestamp);
519         }
520 }
521 class Tracker_field_past extends Tracker_field
522 {
523         var $sort_type = SORT_NUMERIC;
524         
525         function format_cell($timestamp)
526         {
527                 return get_passage($timestamp,FALSE);
528         }
529         function get_value($value)
530         {
531                 return UTIME - $value;
532         }
533 }
534 ///////////////////////////////////////////////////////////////////////////
535 // °ìÍ÷ɽ¼¨
536 function plugin_tracker_list_convert()
537 {
538         global $vars;
539         
540         $config = 'default';
541         $page = $vars['page'];
542         $field = '_page';
543         $order = '';
544         $limit = NULL;
545         if (func_num_args())
546         {
547                 $args = func_get_args();
548                 switch (count($args))
549                 {
550                         case 4:
551                                 $limit = is_numeric($args[3]) ? $args[3] : $limit;
552                         case 3:
553                                 $order = $args[2];
554                         case 2:
555                                 $page = is_pagename($args[1]) ? $args[1] : $page;
556                         case 1:
557                                 $config = ($args[0] != '') ? $args[0] : $config;
558                 }
559         }
560         return plugin_tracker_getlist($page,$config,$field,$order,$limit);
561 }
562 function plugin_tracker_list_action()
563 {
564         global $script,$vars,$_tracker_messages;
565         
566         $page = $vars['refer'];
567         $s_page = make_pagelink($page);
568         $config = $vars['config'];
569         $order = array_key_exists('order',$vars) ? $vars['order'] : '_real:SORT_DESC';
570                 
571         return array(
572                 'msg' => $_tracker_messages['msg_list'],
573                 'body'=> str_replace('$1',$s_page,$_tracker_messages['msg_back']).
574                         plugin_tracker_getlist($page,$config,$field,$order)
575         );
576 }
577 function plugin_tracker_getlist($page,$config_name,$field=NULL,$order='',$limit=NULL)
578 {
579         $config = new Config('plugin/tracker/'.$config_name);
580         
581         if (!$config->read())
582         {
583                 return "<p>config file '".htmlspecialchars($config_name)."' is not exist.";
584         }
585         $config->config_name = $config_name;
586         $list = &new Tracker_list($page,$config);
587         $list->sort($order);
588         return $list->toString($limit);
589 }
590
591 // °ìÍ÷¥¯¥é¥¹
592 class Tracker_list
593 {
594         var $page;
595         var $config;
596         var $fields;
597         var $pattern;
598         var $pattern_fields;
599         var $rows;
600         var $order;
601         
602         function Tracker_list($page,&$config)
603         {
604                 $this->page = $page;
605                 $this->config = &$config;
606                 $this->fields = plugin_tracker_get_fields($page,$config);
607                 
608                 $pattern = join('',plugin_tracker_get_source($config->page.'/page'));
609                 // ¥Ö¥í¥Ã¥¯¥×¥é¥°¥¤¥ó¤ò¥Õ¥£¡¼¥ë¥É¤ËÃÖ´¹
610                 // #comment¤Ê¤É¤ÇÁ°¸å¤Ëʸ»úÎó¤ÎÁý¸º¤¬¤¢¤Ã¤¿¾ì¹ç¤Ë¡¢[_block_xxx]¤ËµÛ¤¤¹þ¤Þ¤»¤ë¤è¤¦¤Ë¤¹¤ë
611                 $pattern = preg_replace('/^\#([^\(\s]+)(?:\((.*)\))?\s*$/m','[_block_$1]',$pattern);
612                 
613                 // ¥Ñ¥¿¡¼¥ó¤òÀ¸À®
614                 $this->pattern = '';
615                 $this->pattern_fields = array();
616                 $pattern = preg_split('/\\\\\[(\w+)\\\\\]/',preg_quote($pattern,'/'),-1,PREG_SPLIT_DELIM_CAPTURE);
617                 while (count($pattern))
618                 {
619                         $this->pattern .= preg_replace('/\s+/','\\s*','(?>\\s*'.trim(array_shift($pattern)).'\\s*)');
620                         if (count($pattern))
621                         {
622                                 $field = array_shift($pattern);
623                                 $this->pattern_fields[] = $field;
624                                 $this->pattern .= '(.*)';
625                         }
626                 }
627                 // ¥Ú¡¼¥¸¤ÎÎóµó¤È¼è¤ê¹þ¤ß
628                 $this->rows = array();
629                 $pattern = "$page/";
630                 $pattern_len = strlen($pattern);
631                 foreach (get_existpages() as $_page)
632                 {
633                         if (strpos($_page,$pattern) === 0
634                                 and strpos($name = substr($_page,$pattern_len),'/') === FALSE)
635                         {
636                                 $this->add($_page,$name);
637                         }
638                 }
639         }
640         function add($page,$name)
641         {
642                 global $WikiName,$BracketName;
643                 
644                 // Ìµ¸Â¥ë¡¼¥×ËÉ»ß
645                 if (array_key_exists($name,$this->rows))
646                 {
647                         return;
648                 }
649                 
650                 $source = plugin_tracker_get_source($page);
651                 if (preg_match("/move\s*to\s*($WikiName|\[\[$BracketName\]\])/",$source[0],$matches))
652                 {
653                         return $this->add(strip_bracket($matches[1]),$name);
654                 }
655                 $source = join('',preg_replace('/^(\*{1,3}.*)\[#[A-Za-z][\w-]+\](.*)$/','$1$2',$source));
656                 
657                 // ¥Ç¥Õ¥©¥ë¥ÈÃÍ
658                 $this->rows[$name] = array(
659                         '_page'  => "[[$page]]",
660                         '_refer' => $this->page,
661                         '_real'  => $name,
662                         '_update'=> get_filetime($page),
663                         '_past'  => get_filetime($page)
664                 );
665                 if (preg_match("/{$this->pattern}/s",$source,$matches))
666                 {
667                         array_shift($matches);
668                         foreach ($this->pattern_fields as $key=>$field)
669                         {
670                                 $this->rows[$name][$field] = trim($matches[$key]);
671                         }
672                 }
673         }
674         function sort($order)
675         {
676                 if ($order == '')
677                 {
678                         return;
679                 }
680                 $names = array_flip(array_keys($this->fields));
681                 $this->order = array();
682                 foreach (explode(';',$order) as $item)
683                 {
684                         list($key,$dir) = explode(':',$item);
685                         if (!array_key_exists($key,$names))
686                         {
687                                 continue;
688                         }
689                         switch (strtoupper($dir))
690                         {
691                                 case 'SORT_ASC':
692                                 case 'ASC':
693                                 case SORT_ASC:
694                                         $dir = SORT_ASC;
695                                         break;
696                                 case 'SORT_DESC':
697                                 case 'DESC':
698                                 case SORT_DESC:
699                                         $dir = SORT_DESC;
700                                         break;
701                                 default:
702                                         continue;
703                         }
704                         $this->order[$key] = $dir;
705                 }
706                 $keys = array();
707                 $eval_arg = 'return array_multisort(';
708                 foreach ($this->order as $field=>$order)
709                 {
710                         if (!array_key_exists($field,$names)) { continue; }
711                         $eval_arg .= '$keys['."'$field'],".
712                                 $this->fields[$field]->sort_type.','.
713                                 $order.',';
714                         foreach ($this->rows as $row)
715                         {
716                                 $keys[$field][] = $this->fields[$field]->get_value($row[$field]);
717                         }
718                 }
719                 $eval_arg .= '$this->rows);';
720                 eval($eval_arg);
721         }
722         function replace_item($arr)
723         {
724                 $params = explode(',',$arr[1]);
725                 $name = array_shift($params);
726                 if ($name == '')
727                 {
728                         $str = '';
729                 }
730                 else if (array_key_exists($name,$this->items))
731                 {
732                         $str = $this->items[$name];
733                         if (array_key_exists($name,$this->fields))
734                         {
735                                 $str = $this->fields[$name]->format_cell($str);
736                         }
737                 }
738                 else
739                 {
740                         return $this->pipe ? str_replace('|','&#x7c;',$arr[0]) : $arr[0];
741                 }
742                 $style = count($params) ? $params[0] : $name;
743                 if (array_key_exists($style,$this->items)
744                         and array_key_exists($style,$this->fields))
745                 {
746                         $str = sprintf($this->fields[$style]->get_style($this->items[$style]),$str);
747                 }
748                 return $this->pipe ? str_replace('|','&#x7c;',$str) : $str;
749         }
750         function replace_title($arr)
751         {
752                 global $script;
753                 
754                 $field = $sort = $arr[1];
755                 if ($sort == '_name' or $sort == '_page')
756                 {
757                         $sort = '_real';
758                 }
759                 if (!array_key_exists($field,$this->fields))
760                 {
761                         return $arr[0];
762                 }
763                 $dir = SORT_ASC;
764                 $arrow = '';
765                 $order = $this->order;
766                 
767                 if (array_key_exists($sort,$order))
768                 {
769                         $b_end = ($sort == array_shift(array_keys($order)));
770                         $b_order = ($order[$sort] == SORT_ASC);
771                         $dir = ($b_end xor $b_order) ? SORT_ASC : SORT_DESC;
772                         $arrow = $b_end ? ($b_order ? '&uarr;' : '&darr;') : '';
773                         unset($order[$sort]);
774                 }
775                 $title = $this->fields[$field]->title;
776                 $r_page = rawurlencode($this->page);
777                 $r_config = rawurlencode($this->config->config_name);
778                 $_order = array("$sort:$dir");
779                 foreach ($order as $key=>$value)
780                 {
781                         $_order[] = "$key:$value";
782                 }
783                 $r_order = rawurlencode(join(';',$_order));
784                 
785                 return "[[$title$arrow>$script?plugin=tracker_list&refer=$r_page&config=$r_config&order=$r_order]]";
786         }
787         function toString($limit=NULL)
788         {
789                 global $_tracker_messages;
790                 
791                 $source = '';
792                 $body = array();
793                 
794                 if ($limit !== NULL and count($this->rows) > $limit)
795                 {
796                         $source = str_replace(
797                                 array('$1','$2'),
798                                 array(count($this->rows),$limit),
799                                 $_tracker_messages['msg_limit'])."\n";
800                         $this->rows = array_splice($this->rows,0,$limit);
801                 }
802                 if (count($this->rows) == 0)
803                 {
804                         return '';
805                 }
806                 foreach (plugin_tracker_get_source($this->config->page.'/list') as $line)
807                 {
808                         if (preg_match('/^\|(.+)\|[hHfFcC]$/',$line))
809                         {
810                                 $source .= preg_replace_callback('/\[([^\[\]]+)\]/',array(&$this,'replace_title'),$line);
811                         }
812                         else
813                         {
814                                 $body[] = $line;
815                         }
816                 }
817                 foreach ($this->rows as $key=>$row)
818                 {
819                         $this->items = $row;
820                         foreach ($body as $line)
821                         {
822                                 if (trim($line) == '')
823                                 {
824                                         $source .= $line;
825                                         continue;
826                                 }
827                                 $this->pipe = ($line{0} == '|' or $line{0} == ':');
828                                 $source .= preg_replace_callback('/\[([^\[\]]+)\]/',array(&$this,'replace_item'),$line);
829                         }
830                 }
831                 return convert_html($source);
832         }
833 }
834 function plugin_tracker_get_source($page)
835 {
836         $source = get_source($page);
837         // ¸«½Ð¤·¤Î¸ÇÍ­IDÉô¤òºï½ü
838         $source = preg_replace('/^(\*{1,3}.*)\[#[A-Za-z][\w-]+\](.*)$/m','$1$2',$source);
839         // #freeze¤òºï½ü
840         return preg_replace('/^#freeze\s*$/m','',$source);
841 }
842 ?>