2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
5 // $Id: rename.inc.php,v 1.8 2003/07/03 05:25:10 arino Exp $
10 * ¥Ú¡¼¥¸¤Î̾Á°¤òÊѤ¨¤ë
13 * http:.../pukiwiki.php?plugin=rename(&refer=¥Ú¡¼¥¸Ì¾)
21 define('RENAME_LOGPAGE',':RenameLog');
23 function plugin_rename_action()
25 global $adminpass,$whatsnew,$WikiName,$BracketName;
26 global $_rename_messages;
30 $method = rename_getvar('method');
31 if ($method == 'regex')
33 $src = rename_getvar('src');
34 $dst = rename_getvar('dst');
37 return rename_phase1();
39 $src_pattern = '/'.preg_quote($src,'/').'/';
40 $arr0 = preg_grep($src_pattern,get_existpages());
41 if (!is_array($arr0) or count($arr0) == 0)
43 return rename_phase1('nomatch');
45 $arr1 = preg_replace($src_pattern,$dst,$arr0);
46 $arr2 = preg_grep("/^$BracketName$/",$arr1);
47 if (count($arr2) != count($arr1))
49 return rename_phase1('notvalid');
51 return rename_regex($arr0,$arr1);
53 else // $method == 'page'
55 $page = rename_getvar('page');
56 $refer = rename_getvar('refer');
59 return rename_phase1($s_vars);
63 return rename_phase1('notpage',$refer);
65 if ($refer == $whatsnew)
67 return rename_phase1('norename',$refer);
69 if ($page == '' or $page == $refer)
71 return rename_phase2();
73 if (!preg_match("/^$BracketName$/",$page))
75 return rename_phase2('notvalid');
77 return rename_refer();
81 function rename_getvar($key)
85 return array_key_exists($key,$vars) ? $vars[$key] : '';
87 // ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òºî¤ë
88 function rename_err($err,$page='')
90 global $_rename_messages;
96 $body = $_rename_messages["err_$err"];
100 foreach ($page as $_page)
102 $tmp .= "<br />$_page";
108 $body = sprintf($body,htmlspecialchars($page));
110 $msg = sprintf($_rename_messages['err'],$body);
113 //Âè°ìÃʳ¬:¥Ú¡¼¥¸Ì¾¤Þ¤¿¤ÏÀµµ¬É½¸½¤ÎÆþÎÏ
114 function rename_phase1($err='',$page='')
116 global $script,$_rename_messages;
118 $msg = rename_err($err,$page);
119 $refer = rename_getvar('refer');
120 $method = rename_getvar('method');
122 $radio_regex = $radio_page = '';
123 if ($method == 'regex')
125 $radio_regex =' checked';
129 $radio_page = ' checked';
131 $select_refer = rename_getselecttag($refer);
133 $s_src = htmlspecialchars(rename_getvar('src'));
134 $s_dst = htmlspecialchars(rename_getvar('dst'));
136 $ret['msg'] = $_rename_messages['msg_title'];
137 $ret['body'] = <<<EOD
139 <form action="$script" method="post">
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 />
147 <input type="text" name="src" size="80" value="$s_src" /><br />
149 <input type="text" name="dst" size="80" value="$s_dst" /><br />
150 <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
156 //ÂèÆóÃʳ¬:¿·¤·¤¤Ì¾Á°¤ÎÆþÎÏ
157 function rename_phase2($err='')
159 global $script,$_rename_messages;
161 $msg = rename_err($err);
162 $page = rename_getvar('page');
163 $refer = rename_getvar('refer');
169 $related = rename_getrelated($refer);
171 if (count($related) > 0)
173 $msg_related = $_rename_messages['msg_do_related'].
174 '<input type="checkbox" name="related" value="1" checked="checked" /><br />';
176 $msg_rename = sprintf($_rename_messages['msg_rename'],make_pagelink($refer));
178 $s_page = htmlspecialchars($page);
179 $s_refer = htmlspecialchars($refer);
181 $ret['msg'] = $_rename_messages['msg_title'];
182 $ret['body'] = <<<EOD
184 <form action="$script" method="post">
186 <input type="hidden" name="plugin" value="rename" />
187 <input type="hidden" name="refer" value="$s_refer" />
189 {$_rename_messages['msg_newname']}:<input type="text" name="page" size="80" value="$s_page" /><br />
191 <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
195 if (count($related) > 0)
197 $ret['body'].= "<hr /><p>{$_rename_messages['msg_related']}</p><ul>";
199 foreach ($related as $name)
201 $ret['body'].= '<li>'.make_pagelink($name).'</li>';
203 $ret['body'].= '</ul>';
207 //¥Ú¡¼¥¸Ì¾¤È´ØÏ¢¤¹¤ë¥Ú¡¼¥¸¤òÎóµó¤·¡¢phase3¤Ø
208 function rename_refer()
210 $page = rename_getvar('page');
211 $refer = rename_getvar('refer');
213 $pages[encode($refer)] = encode($page);
214 if (rename_getvar('related') != '')
216 $from = strip_bracket($refer);
217 $to = strip_bracket($page);
218 foreach (rename_getrelated($refer) as $_page)
220 $pages[encode($_page)] = encode(str_replace($from,$to,$_page));
223 return rename_phase3($pages);
225 //Àµµ¬É½¸½¤Ç¥Ú¡¼¥¸¤òÃÖ´¹
226 function rename_regex($arr_from,$arr_to)
229 foreach ($arr_to as $page)
236 if (count($exists) > 0)
238 return rename_phase1('already',$exists);
242 foreach ($arr_from as $refer)
244 $pages[encode($refer)] = encode(array_shift($arr_to));
246 return rename_phase3($pages);
248 function rename_phase3($pages)
250 global $script,$adminpass,$_rename_messages;
253 $files = rename_get_files($pages);
256 foreach ($files as $_page=>$arr)
258 foreach ($arr as $old=>$new)
260 if (file_exists($new))
262 $exists[$_page][$old] = $new;
266 $pass = rename_getvar('pass');
267 if (md5($pass) == $adminpass)
269 return rename_proceed($pages,$files,$exists);
271 else if ($pass != '')
273 $msg = rename_err('adminpass');
275 $method = rename_getvar('method');
276 if ($method == 'regex')
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\" />";
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\" />";
297 if (count($exists) > 0)
299 $msg .= $_rename_messages['err_already_below']."<ul>";
300 foreach ($exists as $page=>$arr)
303 $msg .= make_pagelink(decode($page));
304 $msg .= $_rename_messages['msg_arrow'];
305 $msg .= htmlspecialchars(decode($pages[$page]));
309 foreach ($arr as $ofile=>$nfile)
311 $msg .= '<li>'.$ofile.$_rename_messages['msg_arrow'].$nfile."</li>\n";
317 $msg .= "</ul><hr />\n";
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 />';
322 $ret['msg'] = $_rename_messages['msg_title'];
323 $ret['body'] = <<<EOD
325 <form action="$script" method="post">
327 <input type="hidden" name="plugin" value="rename" />
329 {$_rename_messages['msg_adminpass']}
330 <input type="password" name="pass" value="" />
331 <input type="submit" value="{$_rename_messages['btn_submit']}" />
334 <p>{$_rename_messages['msg_confirm']}</p>
338 $ret['body'] .= "<ul>\n";
339 foreach ($pages as $old=>$new)
341 $ret['body'] .= "<li>".
342 make_pagelink(decode($old)).
343 $_rename_messages['msg_arrow'].
344 htmlspecialchars(decode($new)).
347 $ret['body'] .= "</ul>\n";
350 function rename_get_files($pages)
353 $dirs = array(BACKUP_DIR,DIFF_DIR,DATA_DIR);
354 if (exist_plugin_convert('attach'))
356 $dirs[] = UPLOAD_DIR;
358 if (exist_plugin_convert('counter'))
360 $dirs[] = COUNTER_DIR;
364 foreach ($dirs as $path)
366 if (!$dir = opendir($path))
370 while ($file = readdir($dir))
372 if ($file == '.' or $file == '..')
376 foreach ($pages as $from=>$to)
378 $pattern = '/^'.str_replace('/','\/',$from).'([._].+)$/';
379 if (!preg_match($pattern,$file,$matches))
383 $newfile = $to.$matches[1];
384 $files[$from][$path.$file] = $path.$newfile;
390 function rename_proceed($pages,$files,$exists)
392 global $script,$now,$_rename_messages;
394 if (rename_getvar('exist') == '')
396 foreach ($exists as $key=>$arr)
403 foreach ($files as $page=>$arr)
405 foreach ($arr as $old=>$new)
407 if ($exists[$page][$old])
413 // link¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·¤¹¤ë BugTrack/327 arino
419 $postdata = get_source(RENAME_LOGPAGE);
420 $postdata[] = '*'.$now."\n";
421 if (rename_getvar('method') == 'regex')
423 $postdata[] = '-'.$_rename_messages['msg_regex']."\n";
424 $postdata[] = '--From:[['.rename_getvar('src')."]]\n";
425 $postdata[] = '--To:[['.rename_getvar('dst')."]]\n";
429 $postdata[] = '-'.$_rename_messages['msg_page']."\n";
430 $postdata[] = '--From:[['.rename_getvar('refer')."]]\n";
431 $postdata[] = '--To:[['.rename_getvar('page')."]]\n";
433 if (count($exists) > 0)
435 $postdata[] = "\n".$_rename_messages['msg_result']."\n";
436 foreach ($exists as $page=>$arr)
438 $postdata[] = '-'.decode($page).
439 $_rename_messages['msg_arrow'].decode($pages[$page])."\n";
440 foreach ($arr as $ofile=>$nfile)
442 $postdata[] = '--'.$ofile.
443 $_rename_messages['msg_arrow'].$nfile."\n";
446 $postdata[] = "----\n";
448 foreach ($pages as $old=>$new)
450 $postdata[] = '-'.decode($old).
451 $_rename_messages['msg_arrow'].decode($new)."\n";
454 // ¹¹¿·¤Î¾×ÆͤϥÁ¥§¥Ã¥¯¤·¤Ê¤¤¡£
456 // ¥Õ¥¡¥¤¥ë¤Î½ñ¤¹þ¤ß
457 page_write(RENAME_LOGPAGE, join('',$postdata));
460 $page = rename_getvar('page');
463 $page = RENAME_LOGPAGE;
465 header("Location: $script?".rawurlencode($page));
468 function rename_getrelated($page)
471 $pages = get_existpages();
472 $pattern = '/(?:^|\/)'.preg_quote(strip_bracket($page),'/').'(?:\/|$)/';
473 foreach ($pages as $name)
479 if (preg_match($pattern,$name))
486 function rename_getselecttag($page)
491 foreach (get_existpages() as $_page)
493 if ($_page == $whatsnew)
497 $selected = ($_page == $page) ? ' selected' : '';
498 $s_page = htmlspecialchars($_page);
499 $pages[$_page] = "<option value=\"$s_page\"$selected>$s_page</option>";
502 $list = join("\n ",$pages);
504 <select name="refer">
505 <option value=""></option>