2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
5 // $Id: rename.inc.php,v 1.6 2003/06/05 05:03:11 arino Exp $
10 * ¥Ú¡¼¥¸¤Î̾Á°¤òÊѤ¨¤ë
13 * http:.../pukiwiki.php?plugin=rename(&refer=¥Ú¡¼¥¸Ì¾)
21 define('RENAME_LOGPAGE',':RenameLog');
23 function plugin_rename_init()
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' => '´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É',
45 'msg_exist_none' => '¤½¤Î¥Ú¡¼¥¸¤ò½èÍý¤·¤Ê¤¤',
46 'msg_exist_overwrite' => '¤½¤Î¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤¤¹¤ë',
47 'msg_confirm' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤ò¥ê¥Í¡¼¥à¤·¤Þ¤¹¡£',
48 'msg_result' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤¤·¤Þ¤·¤¿¡£',
49 'btn_submit' => '¼Â¹Ô',
53 set_plugin_messages($messages);
55 function plugin_rename_action()
57 global $adminpass,$whatsnew,$WikiName,$BracketName;
58 global $_rename_messages;
62 $method = rename_getvar('method');
63 if ($method == 'regex')
65 $src = rename_getvar('src');
66 $dst = rename_getvar('dst');
69 return rename_phase1();
71 $src_pattern = '/'.preg_quote($src,'/').'/';
72 $arr0 = preg_grep($src_pattern,get_existpages());
73 if (!is_array($arr0) or count($arr0) == 0)
75 return rename_phase1('nomatch');
77 $arr1 = preg_replace($src_pattern,$dst,$arr0);
78 $arr2 = preg_grep("/^$BracketName$/",$arr1);
79 if (count($arr2) != count($arr1))
81 return rename_phase1('notvalid');
83 return rename_regex($arr0,$arr1);
85 else // $method == 'page'
87 $page = rename_getvar('page');
88 $refer = rename_getvar('refer');
91 return rename_phase1($s_vars);
95 return rename_phase1('notpage',$refer);
97 if ($refer == $whatsnew)
99 return rename_phase1('norename',$refer);
101 if ($page == '' or $page == $refer)
103 return rename_phase2();
105 if (!preg_match("/^$BracketName$/",$page))
107 return rename_phase2('notvalid');
109 return rename_refer();
113 function rename_getvar($key)
117 return array_key_exists($key,$vars) ? $vars[$key] : '';
119 // ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òºî¤ë
120 function rename_err($err,$page='')
122 global $_rename_messages;
128 $body = $_rename_messages["err_$err"];
132 foreach ($page as $_page)
134 $tmp .= "<br />$_page";
140 $body = sprintf($body,$page);
142 $msg = sprintf($_rename_messages['err'],$body);
145 //Âè°ìÃʳ¬:¥Ú¡¼¥¸Ì¾¤Þ¤¿¤ÏÀµµ¬É½¸½¤ÎÆþÎÏ
146 function rename_phase1($err='',$page='')
148 global $script,$_rename_messages;
150 $msg = rename_err($err,$page);
151 $refer = rename_getvar('refer');
152 $method = rename_getvar('method');
154 $radio_regex = $radio_page = '';
155 if ($method == 'regex')
157 $radio_regex =' checked';
161 $radio_page = ' checked';
163 $select_refer = rename_getselecttag($refer);
165 $s_src = htmlspecialchars(rename_getvar('src'));
166 $s_dst = htmlspecialchars(rename_getvar('dst'));
168 $ret['msg'] = $_rename_messages['msg_title'];
169 $ret['body'] = <<<EOD
171 <form action="$script" method="post">
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 />
179 <input type="text" name="src" size="80" value="$s_src" /><br />
181 <input type="text" name="dst" size="80" value="$s_dst" /><br />
182 <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
188 //ÂèÆóÃʳ¬:¿·¤·¤¤Ì¾Á°¤ÎÆþÎÏ
189 function rename_phase2($err='')
191 global $script,$_rename_messages;
193 $msg = rename_err($err);
194 $page = rename_getvar('page');
195 $refer = rename_getvar('refer');
201 $related = rename_getrelated($refer);
203 if (count($related) > 0)
205 $msg_related = $_rename_messages['msg_do_related'].
206 '<input type="checkbox" name="related" value="1" checked="checked" /><br />';
208 $msg_rename = sprintf($_rename_messages['msg_rename'],make_pagelink($refer));
210 $s_page = htmlspecialchars($page);
211 $s_refer = htmlspecialchars($refer);
213 $ret['msg'] = $_rename_messages['msg_title'];
214 $ret['body'] = <<<EOD
216 <form action="$script" method="post">
218 <input type="hidden" name="plugin" value="rename" />
219 <input type="hidden" name="refer" value="$s_refer" />
221 {$_rename_messages['msg_newname']}:<input type="text" name="page" size="80" value="$s_page" /><br />
223 <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
227 if (count($related) > 0)
229 $ret['body'].= "<hr /><p>{$_rename_messages['msg_related']}</p><ul>";
231 foreach ($related as $name)
233 $ret['body'].= '<li>'.make_pagelink($name).'</li>';
235 $ret['body'].= '</ul>';
239 //¥Ú¡¼¥¸Ì¾¤È´ØÏ¢¤¹¤ë¥Ú¡¼¥¸¤òÎóµó¤·¡¢phase3¤Ø
240 function rename_refer()
242 $page = rename_getvar('page');
243 $refer = rename_getvar('refer');
245 $pages[encode($refer)] = encode($page);
246 if (rename_getvar('related') != '')
248 $from = strip_bracket($refer);
249 $to = strip_bracket($page);
250 foreach (rename_getrelated($refer) as $_page)
252 $pages[encode($_page)] = encode(str_replace($from,$to,$_page));
255 return rename_phase3($pages);
257 //Àµµ¬É½¸½¤Ç¥Ú¡¼¥¸¤òÃÖ´¹
258 function rename_regex($arr_from,$arr_to)
261 foreach ($arr_to as $page)
268 if (count($exists) > 0)
270 return rename_phase1('already',$exists);
274 foreach ($arr_from as $refer)
276 $pages[encode($refer)] = encode(array_shift($arr_to));
278 return rename_phase3($pages);
280 function rename_phase3($pages)
282 global $script,$adminpass,$_rename_messages;
285 $files = rename_get_files($pages);
288 foreach ($files as $_page=>$arr)
290 foreach ($arr as $old=>$new)
292 if (file_exists($new))
294 $exists[$_page][$old] = $new;
298 $pass = rename_getvar('pass');
299 if (md5($pass) == $adminpass)
301 return rename_proceed($pages,$files,$exists);
303 else if ($pass != '')
305 $msg = rename_err('adminpass');
307 $method = rename_getvar('method');
308 if ($method == 'regex')
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\" />";
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\" />";
329 if (count($exists) > 0)
331 $msg .= $_rename_messages['err_already_below']."<ul>";
332 foreach ($exists as $page=>$arr)
335 $msg .= make_pagelink(decode($page));
336 $msg .= $_rename_messages['msg_arrow'];
337 $msg .= htmlspecialchars(decode($pages[$page]));
341 foreach ($arr as $ofile=>$nfile)
343 $msg .= '<li>'.$ofile.$_rename_messages['msg_arrow'].$nfile."</li>\n";
349 $msg .= "</ul><hr />\n";
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 />';
354 $ret['msg'] = $_rename_messages['msg_title'];
355 $ret['body'] = <<<EOD
357 <form action="$script" method="post">
359 <input type="hidden" name="plugin" value="rename" />
361 {$_rename_messages['msg_adminpass']}
362 <input type="password" name="pass" value="" />
363 <input type="submit" value="{$_rename_messages['btn_submit']}" />
366 <p>{$_rename_messages['msg_confirm']}</p>
370 $ret['body'] .= "<ul>\n";
371 foreach ($pages as $old=>$new)
373 $ret['body'] .= "<li>".
374 make_pagelink(decode($old)).
375 $_rename_messages['msg_arrow'].
376 htmlspecialchars(decode($new)).
379 $ret['body'] .= "</ul>\n";
382 function rename_get_files($pages)
385 $dirs = array(BACKUP_DIR,DIFF_DIR,DATA_DIR);
386 if (exist_plugin_convert('attach'))
388 $dirs[] = UPLOAD_DIR;
390 if (exist_plugin_convert('counter'))
392 $dirs[] = COUNTER_DIR;
396 foreach ($dirs as $path)
398 if (!$dir = opendir($path))
402 while ($file = readdir($dir))
404 if ($file == '.' or $file == '..')
408 foreach ($pages as $from=>$to)
410 $pattern = '/^'.str_replace('/','\/',$from).'([._].+)$/';
411 if (!preg_match($pattern,$file,$matches))
415 $newfile = $to.$matches[1];
416 $files[$from][$path.$file] = $path.$newfile;
422 function rename_proceed($pages,$files,$exists)
424 global $script,$now,$_rename_messages;
426 if (rename_getvar('exist') == '')
428 foreach ($exists as $key=>$arr)
435 foreach ($files as $page=>$arr)
437 foreach ($arr as $old=>$new)
439 if ($exists[$page][$old])
445 // link¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·¤¹¤ë BugTrack/327 arino
451 $postdata = get_source(RENAME_LOGPAGE);
452 $postdata[] = '*'.$now."\n";
453 if (rename_getvar('method') == 'regex')
455 $postdata[] = '-'.$_rename_messages['msg_regex']."\n";
456 $postdata[] = '--From:[['.rename_getvar('src')."]]\n";
457 $postdata[] = '--To:[['.rename_getvar('dst')."]]\n";
461 $postdata[] = '-'.$_rename_messages['msg_page']."\n";
462 $postdata[] = '--From:[['.rename_getvar('refer')."]]\n";
463 $postdata[] = '--To:[['.rename_getvar('page')."]]\n";
465 if (count($exists) > 0)
467 $postdata[] = "\n".$_rename_messages['msg_result']."\n";
468 foreach ($exists as $page=>$arr)
470 $postdata[] = '-'.decode($page).
471 $_rename_messages['msg_arrow'].decode($pages[$page])."\n";
472 foreach ($arr as $ofile=>$nfile)
474 $postdata[] = '--'.$ofile.
475 $_rename_messages['msg_arrow'].$nfile."\n";
478 $postdata[] = "----\n";
480 foreach ($pages as $old=>$new)
482 $postdata[] = '-'.decode($old).
483 $_rename_messages['msg_arrow'].decode($new)."\n";
486 // ¹¹¿·¤Î¾×ÆͤϥÁ¥§¥Ã¥¯¤·¤Ê¤¤¡£
488 // ¥Õ¥¡¥¤¥ë¤Î½ñ¤¹þ¤ß
489 page_write(RENAME_LOGPAGE, join('',$postdata));
492 $page = rename_getvar('page');
495 $page = RENAME_LOGPAGE;
497 header("Location: $script?".rawurlencode($page));
500 function rename_getrelated($page)
503 $pages = get_existpages();
504 $pattern = '/(?:^|\/)'.preg_quote(strip_bracket($page),'/').'(?:\/|$)/';
505 foreach ($pages as $name)
511 if (preg_match($pattern,$name))
518 function rename_getselecttag($page)
523 foreach (get_existpages() as $_page)
525 if ($_page == $whatsnew)
529 $selected = ($_page == $page) ? ' selected' : '';
530 $s_page = htmlspecialchars($_page);
531 $pages[$_page] = "<option value=\"$s_page\"$selected>$s_page</option>";
534 $list = join("\n ",$pages);
536 <select name="refer">
537 <option value=""></option>