2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
5 // $Id: rename.inc.php,v 1.10 2004/03/18 09:32:05 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;
28 $method = rename_getvar('method');
29 if ($method == 'regex')
31 $src = rename_getvar('src');
32 $dst = rename_getvar('dst');
35 return rename_phase1();
37 $src_pattern = '/'.preg_quote($src,'/').'/';
38 $arr0 = preg_grep($src_pattern,get_existpages());
39 if (!is_array($arr0) or count($arr0) == 0)
41 return rename_phase1('nomatch');
43 $arr1 = preg_replace($src_pattern,$dst,$arr0);
44 $arr2 = preg_grep("/^$BracketName$/",$arr1);
45 if (count($arr2) != count($arr1))
47 return rename_phase1('notvalid');
49 return rename_regex($arr0,$arr1);
51 else // $method == 'page'
53 $page = rename_getvar('page');
54 $refer = rename_getvar('refer');
57 return rename_phase1();
61 return rename_phase1('notpage',$refer);
63 if ($refer == $whatsnew)
65 return rename_phase1('norename',$refer);
67 if ($page == '' or $page == $refer)
69 return rename_phase2();
71 if (!preg_match("/^$BracketName$/",$page))
73 return rename_phase2('notvalid');
75 return rename_refer();
79 function rename_getvar($key)
83 return array_key_exists($key,$vars) ? $vars[$key] : '';
85 // ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òºî¤ë
86 function rename_err($err,$page='')
88 global $_rename_messages;
94 $body = $_rename_messages["err_$err"];
98 foreach ($page as $_page)
100 $tmp .= "<br />$_page";
106 $body = sprintf($body,htmlspecialchars($page));
108 $msg = sprintf($_rename_messages['err'],$body);
111 //Âè°ìÃʳ¬:¥Ú¡¼¥¸Ì¾¤Þ¤¿¤ÏÀµµ¬É½¸½¤ÎÆþÎÏ
112 function rename_phase1($err='',$page='')
114 global $script,$_rename_messages;
116 $msg = rename_err($err,$page);
117 $refer = rename_getvar('refer');
118 $method = rename_getvar('method');
120 $radio_regex = $radio_page = '';
121 if ($method == 'regex')
123 $radio_regex =' checked';
127 $radio_page = ' checked';
129 $select_refer = rename_getselecttag($refer);
131 $s_src = htmlspecialchars(rename_getvar('src'));
132 $s_dst = htmlspecialchars(rename_getvar('dst'));
134 $ret['msg'] = $_rename_messages['msg_title'];
135 $ret['body'] = <<<EOD
137 <form action="$script" method="post">
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 />
145 <input type="text" name="src" size="80" value="$s_src" /><br />
147 <input type="text" name="dst" size="80" value="$s_dst" /><br />
148 <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
154 //ÂèÆóÃʳ¬:¿·¤·¤¤Ì¾Á°¤ÎÆþÎÏ
155 function rename_phase2($err='')
157 global $script,$_rename_messages;
159 $msg = rename_err($err);
160 $page = rename_getvar('page');
161 $refer = rename_getvar('refer');
167 $related = rename_getrelated($refer);
169 if (count($related) > 0)
171 $msg_related = $_rename_messages['msg_do_related'].
172 '<input type="checkbox" name="related" value="1" checked="checked" /><br />';
174 $msg_rename = sprintf($_rename_messages['msg_rename'],make_pagelink($refer));
176 $s_page = htmlspecialchars($page);
177 $s_refer = htmlspecialchars($refer);
179 $ret['msg'] = $_rename_messages['msg_title'];
180 $ret['body'] = <<<EOD
182 <form action="$script" method="post">
184 <input type="hidden" name="plugin" value="rename" />
185 <input type="hidden" name="refer" value="$s_refer" />
187 {$_rename_messages['msg_newname']}:<input type="text" name="page" size="80" value="$s_page" /><br />
189 <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
193 if (count($related) > 0)
195 $ret['body'].= "<hr /><p>{$_rename_messages['msg_related']}</p><ul>";
197 foreach ($related as $name)
199 $ret['body'].= '<li>'.make_pagelink($name).'</li>';
201 $ret['body'].= '</ul>';
205 //¥Ú¡¼¥¸Ì¾¤È´ØÏ¢¤¹¤ë¥Ú¡¼¥¸¤òÎóµó¤·¡¢phase3¤Ø
206 function rename_refer()
208 $page = rename_getvar('page');
209 $refer = rename_getvar('refer');
211 $pages[encode($refer)] = encode($page);
212 if (rename_getvar('related') != '')
214 $from = strip_bracket($refer);
215 $to = strip_bracket($page);
216 foreach (rename_getrelated($refer) as $_page)
218 $pages[encode($_page)] = encode(str_replace($from,$to,$_page));
221 return rename_phase3($pages);
223 //Àµµ¬É½¸½¤Ç¥Ú¡¼¥¸¤òÃÖ´¹
224 function rename_regex($arr_from,$arr_to)
227 foreach ($arr_to as $page)
234 if (count($exists) > 0)
236 return rename_phase1('already',$exists);
240 foreach ($arr_from as $refer)
242 $pages[encode($refer)] = encode(array_shift($arr_to));
244 return rename_phase3($pages);
246 function rename_phase3($pages)
248 global $script,$adminpass,$_rename_messages;
251 $files = rename_get_files($pages);
254 foreach ($files as $_page=>$arr)
256 foreach ($arr as $old=>$new)
258 if (file_exists($new))
260 $exists[$_page][$old] = $new;
264 $pass = rename_getvar('pass');
265 if (md5($pass) == $adminpass)
267 return rename_proceed($pages,$files,$exists);
269 else if ($pass != '')
271 $msg = rename_err('adminpass');
273 $method = rename_getvar('method');
274 if ($method == 'regex')
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\" />";
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\" />";
295 if (count($exists) > 0)
297 $msg .= $_rename_messages['err_already_below']."<ul>";
298 foreach ($exists as $page=>$arr)
301 $msg .= make_pagelink(decode($page));
302 $msg .= $_rename_messages['msg_arrow'];
303 $msg .= htmlspecialchars(decode($pages[$page]));
307 foreach ($arr as $ofile=>$nfile)
309 $msg .= '<li>'.$ofile.$_rename_messages['msg_arrow'].$nfile."</li>\n";
315 $msg .= "</ul><hr />\n";
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 />';
320 $ret['msg'] = $_rename_messages['msg_title'];
321 $ret['body'] = <<<EOD
323 <form action="$script" method="post">
325 <input type="hidden" name="plugin" value="rename" />
327 {$_rename_messages['msg_adminpass']}
328 <input type="password" name="pass" value="" />
329 <input type="submit" value="{$_rename_messages['btn_submit']}" />
332 <p>{$_rename_messages['msg_confirm']}</p>
336 $ret['body'] .= "<ul>\n";
337 foreach ($pages as $old=>$new)
339 $ret['body'] .= "<li>".
340 make_pagelink(decode($old)).
341 $_rename_messages['msg_arrow'].
342 htmlspecialchars(decode($new)).
345 $ret['body'] .= "</ul>\n";
348 function rename_get_files($pages)
351 $dirs = array(BACKUP_DIR,DIFF_DIR,DATA_DIR);
352 if (exist_plugin_convert('attach'))
354 $dirs[] = UPLOAD_DIR;
356 if (exist_plugin_convert('counter'))
358 $dirs[] = COUNTER_DIR;
362 foreach ($dirs as $path)
364 if (!$dir = opendir($path))
368 while ($file = readdir($dir))
370 if ($file == '.' or $file == '..')
374 foreach ($pages as $from=>$to)
376 $pattern = '/^'.str_replace('/','\/',$from).'([._].+)$/';
377 if (!preg_match($pattern,$file,$matches))
381 $newfile = $to.$matches[1];
382 $files[$from][$path.$file] = $path.$newfile;
388 function rename_proceed($pages,$files,$exists)
390 global $script,$now,$_rename_messages;
392 if (rename_getvar('exist') == '')
394 foreach ($exists as $key=>$arr)
401 foreach ($files as $page=>$arr)
403 foreach ($arr as $old=>$new)
405 if ($exists[$page][$old])
411 // link¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·¤¹¤ë BugTrack/327 arino
417 $postdata = get_source(RENAME_LOGPAGE);
418 $postdata[] = '*'.$now."\n";
419 if (rename_getvar('method') == 'regex')
421 $postdata[] = '-'.$_rename_messages['msg_regex']."\n";
422 $postdata[] = '--From:[['.rename_getvar('src')."]]\n";
423 $postdata[] = '--To:[['.rename_getvar('dst')."]]\n";
427 $postdata[] = '-'.$_rename_messages['msg_page']."\n";
428 $postdata[] = '--From:[['.rename_getvar('refer')."]]\n";
429 $postdata[] = '--To:[['.rename_getvar('page')."]]\n";
431 if (count($exists) > 0)
433 $postdata[] = "\n".$_rename_messages['msg_result']."\n";
434 foreach ($exists as $page=>$arr)
436 $postdata[] = '-'.decode($page).
437 $_rename_messages['msg_arrow'].decode($pages[$page])."\n";
438 foreach ($arr as $ofile=>$nfile)
440 $postdata[] = '--'.$ofile.
441 $_rename_messages['msg_arrow'].$nfile."\n";
444 $postdata[] = "----\n";
446 foreach ($pages as $old=>$new)
448 $postdata[] = '-'.decode($old).
449 $_rename_messages['msg_arrow'].decode($new)."\n";
452 // ¹¹¿·¤Î¾×ÆͤϥÁ¥§¥Ã¥¯¤·¤Ê¤¤¡£
454 // ¥Õ¥¡¥¤¥ë¤Î½ñ¤¹þ¤ß
455 page_write(RENAME_LOGPAGE, join('',$postdata));
458 $page = rename_getvar('page');
461 $page = RENAME_LOGPAGE;
463 header("Location: $script?".rawurlencode($page));
466 function rename_getrelated($page)
469 $pages = get_existpages();
470 $pattern = '/(?:^|\/)'.preg_quote(strip_bracket($page),'/').'(?:\/|$)/';
471 foreach ($pages as $name)
477 if (preg_match($pattern,$name))
484 function rename_getselecttag($page)
489 foreach (get_existpages() as $_page)
491 if ($_page == $whatsnew)
495 $selected = ($_page == $page) ? ' selected' : '';
496 $s_page = htmlspecialchars($_page);
497 $pages[$_page] = "<option value=\"$s_page\"$selected>$s_page</option>";
500 $list = join("\n ",$pages);
502 <select name="refer">
503 <option value=""></option>