OSDN Git Service

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