OSDN Git Service

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