OSDN Git Service

<br> -> <br />
[pukiwiki/pukiwiki.git] / plugin / rename.inc.php
1 <?php
2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
4 //
5 // $Id: rename.inc.php,v 1.6 2003/06/05 05:03:11 arino Exp $
6 //
7
8 /*
9  * ¥×¥é¥°¥¤¥ó rename
10  * ¥Ú¡¼¥¸¤Î̾Á°¤òÊѤ¨¤ë
11  * 
12  * Usage
13  *  http:.../pukiwiki.php?plugin=rename(&refer=¥Ú¡¼¥¸Ì¾)
14  *
15  * ¥Ñ¥é¥á¡¼¥¿
16  * &refer=¥Ú¡¼¥¸Ì¾
17  * ¥Ú¡¼¥¸¤ò»ØÄê
18  *
19  */
20
21 define('RENAME_LOGPAGE',':RenameLog');
22
23 function plugin_rename_init()
24 {
25         $messages = array(
26                 '_rename_messages'=>array(
27                         'err' => '<p>¥¨¥é¡¼:%s</p>',
28                         'err_nomatch' => '¥Þ¥Ã¥Á¤¹¤ë¥Ú¡¼¥¸¤¬¤¢¤ê¤Þ¤»¤ó¡£',
29                         'err_notvalid' => '¥ê¥Í¡¼¥à¸å¤Î¥Ú¡¼¥¸Ì¾¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£',
30                         'err_adminpass' => '´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£',
31                         'err_notpage' => '%s¤Ï¥Ú¡¼¥¸Ì¾¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£',
32                         'err_norename' => '%s¤ò¥ê¥Í¡¼¥à¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£',
33                         'err_already' => '¥Ú¡¼¥¸¤¬¤¹¤Ç¤Ë¸ºß¤·¤Þ¤¹¡£:%s',
34                         'err_already_below' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤¬¤¹¤Ç¤Ë¸ºß¤·¤Þ¤¹¡£',
35                         'msg_title' => '¥Ú¡¼¥¸Ì¾¤ÎÊѹ¹',
36                         'msg_page' => 'Êѹ¹¸µ¥Ú¡¼¥¸¤ò»ØÄê',
37                         'msg_regex' => 'Àµµ¬É½¸½¤ÇÃÖ´¹',
38                         'msg_related' => '´ØÏ¢¥Ú¡¼¥¸',
39                         'msg_do_related' => '´ØÏ¢¥Ú¡¼¥¸¤â¥ê¥Í¡¼¥à¤¹¤ë',
40                         'msg_rename' => '%s¤Î̾Á°¤òÊѹ¹¤·¤Þ¤¹¡£',
41                         'msg_oldname' => '¸½ºß¤Î̾Á°',
42                         'msg_newname' => '¿·¤·¤¤Ì¾Á°',
43                         'msg_adminpass' => '´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É',
44                         'msg_arrow' => '¢ª',
45                         'msg_exist_none' => '¤½¤Î¥Ú¡¼¥¸¤ò½èÍý¤·¤Ê¤¤',
46                         'msg_exist_overwrite' => '¤½¤Î¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤­¤¹¤ë',
47                         'msg_confirm' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤ò¥ê¥Í¡¼¥à¤·¤Þ¤¹¡£',
48                         'msg_result' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤­¤·¤Þ¤·¤¿¡£',
49                         'btn_submit' => '¼Â¹Ô',
50                         'btn_next' => '¼¡¤Ø'
51                 )
52         );
53         set_plugin_messages($messages);
54 }
55 function plugin_rename_action()
56 {
57         global $adminpass,$whatsnew,$WikiName,$BracketName;
58         global $_rename_messages;
59         
60         set_time_limit(60);
61         
62         $method = rename_getvar('method');
63         if ($method == 'regex')
64         {
65                 $src = rename_getvar('src');
66                 $dst = rename_getvar('dst');
67                 if ($src == '')
68                 {
69                         return rename_phase1();
70                 }
71                 $src_pattern = '/'.preg_quote($src,'/').'/';
72                 $arr0 = preg_grep($src_pattern,get_existpages());
73                 if (!is_array($arr0) or count($arr0) == 0)
74                 {
75                         return rename_phase1('nomatch');
76                 }
77                 $arr1 = preg_replace($src_pattern,$dst,$arr0);
78                 $arr2 = preg_grep("/^$BracketName$/",$arr1);
79                 if (count($arr2) != count($arr1))
80                 {
81                         return rename_phase1('notvalid');
82                 }
83                 return rename_regex($arr0,$arr1);
84         }
85         else // $method == 'page'
86         {
87                 $page = rename_getvar('page');
88                 $refer = rename_getvar('refer');
89                 if ($refer == '')
90                 {
91                         return rename_phase1($s_vars);
92                 }
93                 if (!is_page($refer))
94                 {
95                         return rename_phase1('notpage',$refer);
96                 }
97                 if ($refer == $whatsnew)
98                 {
99                         return rename_phase1('norename',$refer);
100                 }
101                 if ($page == '' or $page == $refer)
102                 {
103                         return rename_phase2();
104                 }
105                 if (!preg_match("/^$BracketName$/",$page))
106                 {
107                         return rename_phase2('notvalid');
108                 }
109                 return rename_refer();
110         }
111 }
112 // ÊÑ¿ô¤ò¼èÆÀ¤¹¤ë
113 function rename_getvar($key)
114 {
115         global $vars;
116         
117         return array_key_exists($key,$vars) ? $vars[$key] : '';
118 }
119 // ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òºî¤ë
120 function rename_err($err,$page='')
121 {
122         global $_rename_messages;
123         
124         if ($err == '')
125         {
126                 return '';
127         }
128         $body = $_rename_messages["err_$err"];
129         if (is_array($page))
130         {
131                 $tmp = '';
132                 foreach ($page as $_page)
133                 {
134                         $tmp .= "<br />$_page";
135                 }
136                 $page = $tmp;
137         }
138         if ($page != '')
139         {
140                 $body = sprintf($body,$page);
141         }
142         $msg = sprintf($_rename_messages['err'],$body);
143         return $msg;
144 }
145 //Âè°ìÃʳ¬:¥Ú¡¼¥¸Ì¾¤Þ¤¿¤ÏÀµµ¬É½¸½¤ÎÆþÎÏ
146 function rename_phase1($err='',$page='')
147 {
148         global $script,$_rename_messages;
149         
150         $msg = rename_err($err,$page);
151         $refer = rename_getvar('refer');
152         $method = rename_getvar('method');
153
154         $radio_regex = $radio_page = '';
155         if ($method == 'regex')
156         {
157                 $radio_regex =' checked'; 
158         }
159         else
160         {
161                 $radio_page = ' checked'; 
162         }
163         $select_refer = rename_getselecttag($refer);
164         
165         $s_src = htmlspecialchars(rename_getvar('src'));
166         $s_dst = htmlspecialchars(rename_getvar('dst'));
167         
168         $ret['msg'] = $_rename_messages['msg_title'];
169         $ret['body'] = <<<EOD
170 $msg
171 <form action="$script" method="post">
172  <div>
173   <input type="hidden" name="plugin" value="rename" />
174   <input type="radio" name="method" value="page"$radio_page />
175   {$_rename_messages['msg_page']}:$select_refer<br />
176   <input type="radio" name="method" value="regex"$radio_regex />
177   {$_rename_messages['msg_regex']}:<br />
178   From:<br />
179   <input type="text" name="src" size="80" value="$s_src" /><br />
180   To:<br />
181   <input type="text" name="dst" size="80" value="$s_dst" /><br />
182   <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
183  </div>
184 </form>
185 EOD;
186         return $ret;
187 }
188 //ÂèÆóÃʳ¬:¿·¤·¤¤Ì¾Á°¤ÎÆþÎÏ
189 function rename_phase2($err='')
190 {
191         global $script,$_rename_messages;
192         
193         $msg = rename_err($err);
194         $page = rename_getvar('page');
195         $refer = rename_getvar('refer');
196         if ($page == '')
197         {
198                 $page = $refer;
199         }
200         
201         $related = rename_getrelated($refer);
202         $msg_related = '';
203         if (count($related) > 0)
204         {
205                 $msg_related = $_rename_messages['msg_do_related'].
206                         '<input type="checkbox" name="related" value="1" checked="checked" /><br />';
207         }
208         $msg_rename = sprintf($_rename_messages['msg_rename'],make_pagelink($refer));
209         
210         $s_page = htmlspecialchars($page);
211         $s_refer = htmlspecialchars($refer);
212         
213         $ret['msg'] = $_rename_messages['msg_title'];
214         $ret['body'] = <<<EOD
215 $msg
216 <form action="$script" method="post">
217  <div>
218   <input type="hidden" name="plugin" value="rename" />
219   <input type="hidden" name="refer" value="$s_refer" />
220   $msg_rename<br />
221   {$_rename_messages['msg_newname']}:<input type="text" name="page" size="80" value="$s_page" /><br />
222   $rename_related
223   <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
224  </div>
225 </form>
226 EOD;
227         if (count($related) > 0)
228         {
229                 $ret['body'].= "<hr /><p>{$_rename_messages['msg_related']}</p><ul>";
230                 sort($related);
231                 foreach ($related as $name)
232                 {
233                         $ret['body'].= '<li>'.make_pagelink($name).'</li>'; 
234                 }
235                 $ret['body'].= '</ul>';
236         }
237         return $ret;
238 }
239 //¥Ú¡¼¥¸Ì¾¤È´ØÏ¢¤¹¤ë¥Ú¡¼¥¸¤òÎóµó¤·¡¢phase3¤Ø
240 function rename_refer()
241 {
242         $page = rename_getvar('page');
243         $refer = rename_getvar('refer');
244         
245         $pages[encode($refer)] = encode($page);
246         if (rename_getvar('related') != '')
247         {
248                 $from = strip_bracket($refer);
249                 $to =   strip_bracket($page);
250                 foreach (rename_getrelated($refer) as $_page)
251                 {
252                         $pages[encode($_page)] = encode(str_replace($from,$to,$_page));
253                 }
254         }
255         return rename_phase3($pages);
256 }
257 //Àµµ¬É½¸½¤Ç¥Ú¡¼¥¸¤òÃÖ´¹
258 function rename_regex($arr_from,$arr_to)
259 {
260         $exists = array();
261         foreach ($arr_to as $page)
262         {
263                 if (is_page($page))
264                 {
265                         $exists[] = $page;
266                 }
267         }
268         if (count($exists) > 0)
269         {
270                 return rename_phase1('already',$exists);
271         }
272         
273         $pages = array();
274         foreach ($arr_from as $refer)
275         {
276                 $pages[encode($refer)] = encode(array_shift($arr_to));
277         }
278         return rename_phase3($pages);
279 }
280 function rename_phase3($pages)
281 {
282         global $script,$adminpass,$_rename_messages;
283         
284         $msg = $input = '';
285         $files = rename_get_files($pages);
286         
287         $exists = array();
288         foreach ($files as $_page=>$arr)
289         {
290                 foreach ($arr as $old=>$new)
291                 {
292                         if (file_exists($new))
293                         {
294                                 $exists[$_page][$old] = $new;
295                         }
296                 }
297         }
298         $pass = rename_getvar('pass');
299         if (md5($pass) == $adminpass)
300         {
301                 return rename_proceed($pages,$files,$exists);
302         }
303         else if ($pass != '')
304         {
305                 $msg = rename_err('adminpass');
306         }
307         $method = rename_getvar('method');
308         if ($method == 'regex')
309         {
310                 $s_src = htmlspecialchars(rename_getvar('src'));
311                 $s_dst = htmlspecialchars(rename_getvar('dst'));
312                 $msg .= $_rename_messages['msg_regex']."<br />";
313                 $input .= "<input type=\"hidden\" name=\"method\" value=\"regex\" />";
314                 $input .= "<input type=\"hidden\" name=\"src\" value=\"$s_src\" />";
315                 $input .= "<input type=\"hidden\" name=\"dst\" value=\"$s_dst\" />";
316         }
317         else
318         {
319                 $s_refer = htmlspecialchars(rename_getvar('refer'));
320                 $s_page = htmlspecialchars(rename_getvar('page'));
321                 $s_related = htmlspecialchars(rename_getvar('related'));
322                 $msg .= $_rename_messages['msg_page']."<br />";
323                 $input .= "<input type=\"hidden\" name=\"method\" value=\"page\" />";
324                 $input .= "<input type=\"hidden\" name=\"refer\" value=\"$s_refer\" />";
325                 $input .= "<input type=\"hidden\" name=\"page\" value=\"$s_page\" />";
326                 $input .= "<input type=\"hidden\" name=\"related\" value=\"$s_related\" />";
327         }
328         
329         if (count($exists) > 0)
330         {
331                 $msg .= $_rename_messages['err_already_below']."<ul>";
332                 foreach ($exists as $page=>$arr)
333                 {
334                         $msg .= '<li>';
335                         $msg .= make_pagelink(decode($page));
336                         $msg .= $_rename_messages['msg_arrow'];
337                         $msg .= htmlspecialchars(decode($pages[$page]));
338                         if (count($arr) > 0)
339                         {
340                                 $msg .= "<ul>\n";
341                                 foreach ($arr as $ofile=>$nfile)
342                                 {
343                                         $msg .= '<li>'.$ofile.$_rename_messages['msg_arrow'].$nfile."</li>\n";
344                                 }
345                                 $msg .= '</ul>';
346                         }
347                         $msg .= "</li>\n";
348                 }
349                 $msg .= "</ul><hr />\n";
350         
351                 $input .= '<input type="radio" name="exist" value="0" checked />'.$_rename_messages['msg_exist_none'].'<br />';
352                 $input .= '<input type="radio" name="exist" value="1" />'.$_rename_messages['msg_exist_overwrite'].'<br />';
353         }
354         $ret['msg'] = $_rename_messages['msg_title'];
355         $ret['body'] = <<<EOD
356 <p>$msg</p>
357 <form action="$script" method="post">
358  <div>
359   <input type="hidden" name="plugin" value="rename" />
360   $input
361   {$_rename_messages['msg_adminpass']}
362   <input type="password" name="pass" value="" />
363   <input type="submit" value="{$_rename_messages['btn_submit']}" />
364  </div>
365 </form>
366 <p>{$_rename_messages['msg_confirm']}</p>
367 EOD;
368         
369         ksort($pages);
370         $ret['body'] .= "<ul>\n";
371         foreach ($pages as $old=>$new)
372         {
373                 $ret['body'] .= "<li>".
374                         make_pagelink(decode($old)).
375                         $_rename_messages['msg_arrow'].
376                         htmlspecialchars(decode($new)).
377                         "</li>\n";
378         }
379         $ret['body'] .= "</ul>\n";
380         return $ret;
381 }
382 function rename_get_files($pages)
383 {
384         $files = array();
385         $dirs = array(BACKUP_DIR,DIFF_DIR,DATA_DIR);
386         if (exist_plugin_convert('attach'))
387         {
388                 $dirs[] = UPLOAD_DIR; 
389         }
390         if (exist_plugin_convert('counter'))
391         {
392                 $dirs[] = COUNTER_DIR;
393         }
394         // and more ...
395         
396         foreach ($dirs as $path)
397         {
398                 if (!$dir = opendir($path))
399                 {
400                         continue;
401                 }
402                 while ($file = readdir($dir))
403                 {
404                         if ($file == '.' or $file == '..')
405                         {
406                                 continue; 
407                         }
408                         foreach ($pages as $from=>$to)
409                         {
410                                 $pattern = '/^'.str_replace('/','\/',$from).'([._].+)$/';
411                                 if (!preg_match($pattern,$file,$matches))
412                                 {
413                                         continue; 
414                                 }
415                                 $newfile = $to.$matches[1];
416                                 $files[$from][$path.$file] = $path.$newfile;
417                         }
418                 }
419         }
420         return $files;
421 }
422 function rename_proceed($pages,$files,$exists)
423 {
424         global $script,$now,$_rename_messages;
425         
426         if (rename_getvar('exist') == '')
427         {
428                 foreach ($exists as $key=>$arr)
429                 {
430                         unset($files[$key]); 
431                 }
432         }
433         
434         set_time_limit(0);
435         foreach ($files as $page=>$arr)
436         {
437                 foreach ($arr as $old=>$new)
438                 {
439                         if ($exists[$page][$old])
440                         {
441                                 unlink($new); 
442                         }
443                         rename($old,$new);
444                         
445                         // link¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·¤¹¤ë BugTrack/327 arino
446                         links_update($old);
447                         links_update($new);
448                 }
449         }
450         
451         $postdata = get_source(RENAME_LOGPAGE);
452         $postdata[] = '*'.$now."\n";
453         if (rename_getvar('method') == 'regex')
454         {
455                 $postdata[] = '-'.$_rename_messages['msg_regex']."\n";
456                 $postdata[] = '--From:[['.rename_getvar('src')."]]\n";
457                 $postdata[] = '--To:[['.rename_getvar('dst')."]]\n";
458         }
459         else
460         {
461                 $postdata[] = '-'.$_rename_messages['msg_page']."\n";
462                 $postdata[] = '--From:[['.rename_getvar('refer')."]]\n";
463                 $postdata[] = '--To:[['.rename_getvar('page')."]]\n";
464         }
465         if (count($exists) > 0)
466         {
467                 $postdata[] = "\n".$_rename_messages['msg_result']."\n";
468                 foreach ($exists as $page=>$arr)
469                 {
470                         $postdata[] = '-'.decode($page).
471                                 $_rename_messages['msg_arrow'].decode($pages[$page])."\n";
472                         foreach ($arr as $ofile=>$nfile)
473                         {
474                                 $postdata[] = '--'.$ofile.
475                                         $_rename_messages['msg_arrow'].$nfile."\n";
476                         }
477                 }
478                 $postdata[] = "----\n";
479         }
480         foreach ($pages as $old=>$new)
481         {
482                 $postdata[] = '-'.decode($old).
483                         $_rename_messages['msg_arrow'].decode($new)."\n";
484         }
485         
486         // ¹¹¿·¤Î¾×ÆͤϥÁ¥§¥Ã¥¯¤·¤Ê¤¤¡£
487         
488         // ¥Õ¥¡¥¤¥ë¤Î½ñ¤­¹þ¤ß
489         page_write(RENAME_LOGPAGE, join('',$postdata));
490         
491         //¥ê¥À¥¤¥ì¥¯¥È
492         $page = rename_getvar('page');
493         if ($page == '')
494         {
495                 $page = RENAME_LOGPAGE;
496         }
497         header("Location: $script?".rawurlencode($page));
498         die();
499 }
500 function rename_getrelated($page)
501 {
502         $related = array();
503         $pages = get_existpages();
504         $pattern = '/(?:^|\/)'.preg_quote(strip_bracket($page),'/').'(?:\/|$)/';
505         foreach ($pages as $name)
506         {
507                 if ($name == $page)
508                 {
509                         continue; 
510                 }
511                 if (preg_match($pattern,$name))
512                 {
513                         $related[] = $name;
514                 }
515         }
516         return $related;
517 }
518 function rename_getselecttag($page)
519 {
520         global $whatsnew;
521         
522         $pages =array();
523         foreach (get_existpages() as $_page)
524         {
525                 if ($_page == $whatsnew)
526                 {
527                         continue; 
528                 }
529                 $selected = ($_page == $page) ? ' selected' : '';
530                 $s_page = htmlspecialchars($_page);
531                 $pages[$_page] = "<option value=\"$s_page\"$selected>$s_page</option>";
532         }
533         ksort($pages);
534         $list = join("\n ",$pages);
535         return <<<EOD
536 <select name="refer">
537  <option value=""></option>
538  $list
539 </select>
540 EOD;
541         return $ret;
542 }
543 ?>