2 // $Id: rename.inc.php,v 1.1 2002/12/05 05:02:27 panda Exp $
4 Last-Update:2002-10-29 rev.5
10 http:.../pukiwiki.php?plugin=rename(&refer=¥Ú¡¼¥¸Ì¾)
18 define('RENAME_LOGPAGE','RenameLog');
20 function plugin_rename_init() {
21 $messages = array('_rename_messages'=>array(
22 'err' => '<p>¥¨¥é¡¼:%s</p>',
23 'err_nomatch' => '¥Þ¥Ã¥Á¤¹¤ë¥Ú¡¼¥¸¤¬¤¢¤ê¤Þ¤»¤ó¡£',
24 'err_notvalid' => '¥ê¥Í¡¼¥à¸å¤Î¥Ú¡¼¥¸Ì¾¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£',
25 'err_adminpass' => '´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£',
26 'err_notpage' => '%s¤Ï¥Ú¡¼¥¸Ì¾¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£',
27 'err_norename' => '%s¤ò¥ê¥Í¡¼¥à¤¹¤ë¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£',
28 'err_already' => '¥Ú¡¼¥¸¤¬¤¹¤Ç¤Ë¸ºß¤·¤Þ¤¹¡£:%s',
29 'err_already_below' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤¬¤¹¤Ç¤Ë¸ºß¤·¤Þ¤¹¡£',
30 'msg_title' => '¥Ú¡¼¥¸Ì¾¤ÎÊѹ¹',
31 'msg_page' => 'Êѹ¹¸µ¥Ú¡¼¥¸¤ò»ØÄê',
32 'msg_regex' => 'Àµµ¬É½¸½¤ÇÃÖ´¹',
33 'msg_related' => '´ØÏ¢¥Ú¡¼¥¸',
34 'msg_do_related' => '´ØÏ¢¥Ú¡¼¥¸¤â¥ê¥Í¡¼¥à¤¹¤ë',
35 'msg_rename' => '%s¤Î̾Á°¤òÊѹ¹¤·¤Þ¤¹¡£',
36 'msg_oldname' => '¸½ºß¤Î̾Á°',
37 'msg_newname' => '¿·¤·¤¤Ì¾Á°',
38 'msg_adminpass' => '´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É',
40 'msg_exist_none' => '¤½¤Î¥Ú¡¼¥¸¤ò½èÍý¤·¤Ê¤¤',
41 'msg_exist_overwrite' => '¤½¤Î¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤¤¹¤ë',
42 'msg_confirm' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤ò¥ê¥Í¡¼¥à¤·¤Þ¤¹¡£',
43 'msg_result' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤¤·¤Þ¤·¤¿¡£',
44 'btn_submit' => '¼Â¹Ô',
47 set_plugin_messages($messages);
50 function plugin_rename_action() {
51 global $vars,$adminpass,$whatsnew,$WikiName,$BracketName;
52 global $_rename_messages;
55 foreach (array('refer','page','src','dst','method','related') as $var) {
56 $s_vars[$var] = htmlspecialchars($vars[$var]);
61 if ($vars['method'] == 'regex') {
62 if ($vars['src'] == '') { return rename_phase1($s_vars); }
63 $pages = get_existpages();
64 $arr0 = preg_grep('/'.str_replace(array('(',')'),'',$vars['src']).'/',$pages);
65 if (!is_array($arr0) or count($arr0) == 0) { return rename_phase1($s_vars,'nomatch'); }
66 $arr1 = preg_replace("/{$vars['src']}/",$vars['dst'],$arr0);
67 $arr2 = preg_grep("/^(($WikiName)|($BracketName))$/",$arr1);
68 if (count($arr2) != count($arr1)) { return rename_phase1($s_vars,'notvalid'); }
69 return rename_regex($s_vars,$arr0,$arr1);
70 } else { // $vars['method'] = 'page'
71 if ($vars['refer'] == '') { return rename_phase1($s_vars); }
72 if (!is_page($vars['refer'])) { return rename_phase1($s_vars,'notpage',$s_vars['refer']); }
73 if ($vars['refer'] == $whatsnew) { return rename_phase1($s_vars,'norename',$s_vars['refer']); }
74 if ($vars['page'] == '' or $vars['page'] == $vars['refer']) { return rename_phase2($s_vars); }
75 if (!preg_match("/^(($WikiName)|($BracketName))$/",$vars['page'])) { return rename_phase2($s_vars,'notvalid'); }
76 return rename_refer($s_vars);
79 // ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òºî¤ë
80 function rename_err($err,$page='') {
81 global $_rename_messages;
82 if ($err == '') { return ''; }
83 $body = $_rename_messages["err_$err"];
84 if (is_array($page)) {
86 foreach ($page as $_page) { $tmp .= "<br />$_page"; }
89 if ($page != '') { $body = sprintf($body,$page); }
90 $msg = sprintf($_rename_messages['err'],$body);
93 // From->To¥á¥Ã¥»¡¼¥¸¤òºî¤ë
94 function rename_arrow($from,$to) {
95 global $_rename_messages;
96 return "$from{$_rename_messages['msg_arrow']}$to";
98 //Âè°ìÃʳ¬:¥Ú¡¼¥¸Ì¾¤Þ¤¿¤ÏÀµµ¬É½¸½¤ÎÆþÎÏ
99 function &rename_phase1(&$s_vars,$err='',$page='') {
100 global $script,$vars,$_rename_messages;
101 $msg = rename_err($err,$page);
103 if ($vars['method'] == 'regex') { $radio_regex =' checked'; }
104 else { $radio_page = ' checked'; }
105 $select_refer = rename_getselecttag($vars['refer']);
107 $ret['msg'] = $_rename_messages['msg_title'];
108 $ret['body'] = <<<EOD
110 <form action="$script" method="post">
112 <input type="hidden" name="plugin" value="rename" />
113 <input type="radio" name="method" value="page"$radio_page />
114 {$_rename_messages['msg_page']}:$select_refer<br />
115 <input type="radio" name="method" value="regex"$radio_regex />
116 {$_rename_messages['msg_regex']}:<br />
118 <input type="text" name="src" size="80" value="{$s_vars['src']}" /><br />
120 <input type="text" name="dst" size="80" value="{$s_vars['dst']}" /><br />
121 <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
127 //ÂèÆóÃʳ¬:¿·¤·¤¤Ì¾Á°¤ÎÆþÎÏ
128 function &rename_phase2(&$s_vars,$err='') {
129 global $script,$vars,$_rename_messages;
130 $msg = rename_err($err);
132 $related = rename_getrelated($vars['refer']);
134 if (count($related) > 0) {
135 $rename_related = $_rename_messages['msg_do_related'].
136 '<input type=checkbox name="related" value="1" checked /><br />';
138 if ($s_vars['page'] == '') { $s_vars['page'] = $s_vars['refer']; }
139 $msg_rename = sprintf($_rename_messages['msg_rename'],make_link($vars['refer']));
141 $ret['msg'] = $_rename_messages['msg_title'];
142 $ret['body'] = <<<EOD
144 <form action="$script" method="post">
146 <input type="hidden" name="plugin" value="rename" />
147 <input type="hidden" name="refer" value="{$s_vars['refer']}" />
149 {$_rename_messages['msg_newname']}:<input type="text" name="page" size="80" value="{$s_vars['page']}" /><br />
151 <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
156 if (count($related) > 0) {
157 $ret['body'].= "<hr /><p>{$_rename_messages['msg_related']}</p><ul>";
158 foreach ($related as $name) { $ret['body'].= '<li>'.make_link($name).'</li>'; }
159 $ret['body'].= '</ul>';
163 //¥Ú¡¼¥¸Ì¾¤È´ØÏ¢¤¹¤ë¥Ú¡¼¥¸¤òÎóµó¤·¡¢phase3¤Ø
164 function &rename_refer(&$s_vars) {
167 $pages[encode($vars['refer'])] = encode($vars['page']);
168 if ($vars['related']) {
169 $from = strip_bracket($vars['refer']);
170 $to = strip_bracket($vars['page']);
171 $related = rename_getrelated($vars['refer']);
172 foreach ($related as $page) {
173 $pages[encode($page)] = encode(str_replace($from,$to,$page));
176 return rename_phase3($s_vars,$pages);
178 //Àµµ¬É½¸½¤Ç¥Ú¡¼¥¸¤òÃÖ´¹
179 function &rename_regex(&$s_vars,&$arr_from,&$arr_to) {
183 foreach ($arr_to as $page) {
184 if (is_page($page)) { $exists[] = $page; }
186 if (count($exists) > 0) { return rename_phase1($s_vars,'already',$exists); }
189 foreach ($arr_from as $refer) {
190 $pages[encode($refer)] = encode(array_shift($arr_to));
192 return rename_phase3($s_vars,$pages);
194 function &rename_phase3(&$s_vars,&$pages) {
195 global $script,$vars,$_rename_messages,$adminpass;
197 $files = rename_get_files($pages);
200 foreach ($files as $_page=>$arr) {
201 foreach ($arr as $old=>$new) {
202 if (is_readable($new)) { $exists[$_page][$old] = $new; }
206 if ($vars['pass'] != '') {
207 if (md5($vars['pass']) == $adminpass)
208 return rename_proceed($s_vars,$pages,$files,$exists);
210 $msg = rename_err('adminpass');
213 if ($s_vars['method'] == "regex") {
214 $msg .= $_rename_messages['msg_regex']."<br />";
215 $input .= "<input type=\"hidden\" name=\"method\" value=\"regex\" />";
216 $input .= "<input type=\"hidden\" name=\"src\" value=\"{$s_vars['src']}\" />";
217 $input .= "<input type=\"hidden\" name=\"dst\" value=\"{$s_vars['dst']}\" />";
219 $msg .= $_rename_messages['msg_page']."<br />";
220 $input .= "<input type=\"hidden\" name=\"method\" value=\"page\" />";
221 $input .= "<input type=\"hidden\" name=\"refer\" value=\"{$s_vars['refer']}\" />";
222 $input .= "<input type=\"hidden\" name=\"page\" value=\"{$s_vars['page']}\" />";
223 $input .= "<input type=\"hidden\" name=\"related\" value=\"{$s_vars['related']}\" />";
226 if (count($exists) > 0) {
227 $msg .= $_rename_messages['err_already_below']."<ul>";
228 foreach ($exists as $page=>$arr) {
229 $msg .= "<li>".rename_arrow(make_link(decode($page)),decode($pages[$page]))."<ul>\n";
230 foreach ($arr as $ofile=>$nfile) { $msg .= "<li>".rename_arrow($ofile,$nfile)."</li>\n"; }
231 $msg .= "</ul></li>\n";
233 $msg .= "</ul><hr />";
235 $input .= '<input type="radio" name="exist" value="0" checked />'.$_rename_messages['msg_exist_none'].'<br />';
236 $input .= '<input type="radio" name="exist" value="1" />'.$_rename_messages['msg_exist_overwrite'].'<br />';
238 $ret['msg'] = $_rename_messages['msg_title'];
239 $ret['body'] .= <<<EOD
241 <form action="$script" method="post">
243 <input type="hidden" name="plugin" value="rename" />
245 {$_rename_messages['msg_adminpass']}
246 <input type="password" name="pass" value="" />
247 <input type="submit" value="{$_rename_messages['btn_submit']}" />
250 <p>{$_rename_messages['msg_confirm']}</p>
254 $ret['body'] .= "<ul>\n";
255 foreach ($pages as $old=>$new) {
256 $ret['body'] .= "<li>".rename_arrow(make_link(decode($old)),decode($new))."</li>\n";
258 $ret['body'] .= "</ul>\n";
262 function &rename_get_files(&$pages) {
264 $dirs = array(BACKUP_DIR,DIFF_DIR,DATA_DIR);
265 if (exist_plugin_convert('attach')) { $dirs[] = UPLOAD_DIR; }
266 if (exist_plugin_convert('counter')) { $dirs[] = COUNTER_DIR; }
269 foreach ($dirs as $path) {
270 if (!$dir = opendir($path)) { continue; }
271 while ($file = readdir($dir)) {
272 if ($file == '.' or $file == '..') { continue; }
273 foreach ($pages as $from=>$to) {
274 $pattern = '/^'.str_replace('/','\/',$from).'([._].+)$/';
275 if (!preg_match($pattern,$file,$matches)) { continue; }
276 $newfile = $to.$matches[1];
277 $files[$from][$path.$file] = $path.$newfile;
284 function rename_proceed(&$s_vars,&$pages,&$files,&$exists) {
285 global $script,$vars,$_rename_messages,$now;
288 foreach ($exists as $key=>$arr) { unset($files[$key]); }
291 foreach ($files as $page=>$arr) {
292 foreach ($arr as $old=>$new) {
293 if ($exists[$page][$old]) { unlink($new); }
299 if (is_page(RENAME_LOGPAGE)) {
301 $data = get_source(RENAME_LOGPAGE);
302 $old = join("",$data);
303 if (substr($old,-1) != "\n") { $data[] = "\n"; }
306 $data[] = '*'.$now."\n";
307 if ($vars['method'] == 'regex') {
308 $data[] = '-'.$_rename_messages['msg_regex']."\n";
309 $data[] = '--From:'.$s_vars['src']."\n";
310 $data[] = '--To:'.$s_vars['dst']."\n";
312 $data[] = '-'.$_rename_messages['msg_page']."\n";
313 $data[] = '--From:'.$s_vars['refer']."\n";
314 $data[] = '--To:'.$s_vars['page']."\n";
316 if (count($exists) > 0) {
317 $data[] = "\n".$_rename_messages['msg_result']."\n";
318 foreach ($exists as $page=>$arr) {
319 $data[] = '-'.rename_arrow(decode($page),decode($pages[$page]))."\n";
320 foreach ($arr as $ofile=>$nfile) { $data[] = '--'.rename_arrow($ofile,$nfile)."\n"; }
324 foreach ($pages as $old=>$new)
325 $data[] = '-'.rename_arrow(decode($old),decode($new))."\n";
326 $new = join('',$data);
328 if (is_page(RENAME_LOGPAGE)) {
329 // º¹Ê¬¥Õ¥¡¥¤¥ë¤ÎºîÀ®
330 file_write(DIFF_DIR,RENAME_LOGPAGE,do_diff($old,$new));
332 // ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎºîÀ®
334 $oldtime = filemtime(get_filename(encode(RENAME_LOGPAGE)));
335 make_backup(encode(RENAME_LOGPAGE).'.txt', $old, $oldtime);
339 // ¥Õ¥¡¥¤¥ë¤Î½ñ¤¹þ¤ß
340 file_write(DATA_DIR, RENAME_LOGPAGE, $new);
342 put_lastmodified(); //ºÇ½ª¹¹¿·¥Ú¡¼¥¸¤òºî¤êľ¤¹
345 $page = rawurlencode(($vars['page'] == '') ? RENAME_LOGPAGE : $vars['page']);
346 header("Location: $script?$page");
350 function &rename_getrelated($page) {
352 $pages = get_existpages();
353 $pattern = '/[\[\/]'.str_replace('/','\/',strip_bracket($page)).'[\]\/]/';
354 foreach ($pages as $name) {
355 if ($name == $page) { continue; }
356 if (preg_match($pattern,$name)) { $related[] = $name; }
360 function &rename_getselecttag($page) {
364 foreach (get_existpages() as $_page) {
365 if ($_page == $whatsnew) { continue; }
366 $selected = ($_page == $page) ? ' selected' : '';
367 $pages[$_page] = "<option value=\"$_page\"$selected>$_page</option>";
370 $list = join("\n ",$pages);
372 <select name="refer">
373 <option value=""></option>