2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
5 // $Id: rename.inc.php,v 1.17 2004/12/02 11:37:53 henoheno Exp $
10 * ¥Ú¡¼¥¸¤Î̾Á°¤òÊѤ¨¤ë
13 * http:.../pukiwiki.php?plugin=rename(&refer=¥Ú¡¼¥¸Ì¾)
21 define('RENAME_LOGPAGE', ':RenameLog');
23 function plugin_rename_action()
27 $method = rename_getvar('method');
28 if ($method == 'regex')
30 $src = rename_getvar('src');
31 $dst = rename_getvar('dst');
34 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 foreach ($arr1 as $page)
46 if (! is_pagename($page))
48 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();
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 (! is_pagename($page))
75 return rename_phase2('notvalid');
77 return rename_refer();
82 function rename_getvar($key)
86 return isset($vars[$key]) ? $vars[$key] : '';
89 // ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òºî¤ë
90 function rename_err($err, $page = '')
92 global $_rename_messages;
98 $body = $_rename_messages["err_$err"];
102 foreach ($page as $_page)
104 $tmp .= "<br />$_page";
110 $body = sprintf($body, htmlspecialchars($page));
112 $msg = sprintf($_rename_messages['err'], $body);
116 //Âè°ìÃʳ¬:¥Ú¡¼¥¸Ì¾¤Þ¤¿¤ÏÀµµ¬É½¸½¤ÎÆþÎÏ
117 function rename_phase1($err = '', $page = '')
119 global $script, $_rename_messages;
121 $msg = rename_err($err, $page);
122 $refer = rename_getvar('refer');
123 $method = rename_getvar('method');
125 $radio_regex = $radio_page = '';
126 if ($method == 'regex')
128 $radio_regex =' checked';
132 $radio_page = ' checked';
134 $select_refer = rename_getselecttag($refer);
136 $s_src = htmlspecialchars(rename_getvar('src'));
137 $s_dst = htmlspecialchars(rename_getvar('dst'));
140 $ret['msg'] = $_rename_messages['msg_title'];
141 $ret['body'] = <<<EOD
143 <form action="$script" method="post">
145 <input type="hidden" name="plugin" value="rename" />
146 <input type="radio" name="method" value="page"$radio_page />
147 {$_rename_messages['msg_page']}:$select_refer<br />
148 <input type="radio" name="method" value="regex"$radio_regex />
149 {$_rename_messages['msg_regex']}:<br />
151 <input type="text" name="src" size="80" value="$s_src" /><br />
153 <input type="text" name="dst" size="80" value="$s_dst" /><br />
154 <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
161 //ÂèÆóÃʳ¬:¿·¤·¤¤Ì¾Á°¤ÎÆþÎÏ
162 function rename_phase2($err = '')
164 global $script, $_rename_messages;
166 $msg = rename_err($err);
167 $page = rename_getvar('page');
168 $refer = rename_getvar('refer');
174 $related = rename_getrelated($refer);
176 if (count($related) > 0)
178 $msg_related = $_rename_messages['msg_do_related'].
179 '<input type="checkbox" name="related" value="1" checked="checked" /><br />';
181 $msg_rename = sprintf($_rename_messages['msg_rename'], make_pagelink($refer));
183 $s_page = htmlspecialchars($page);
184 $s_refer = htmlspecialchars($refer);
187 $ret['msg'] = $_rename_messages['msg_title'];
188 $ret['body'] = <<<EOD
190 <form action="$script" method="post">
192 <input type="hidden" name="plugin" value="rename" />
193 <input type="hidden" name="refer" value="$s_refer" />
195 {$_rename_messages['msg_newname']}:<input type="text" name="page" size="80" value="$s_page" /><br />
197 <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
201 if (count($related) > 0)
203 $ret['body'] .= "<hr /><p>{$_rename_messages['msg_related']}</p><ul>";
205 foreach ($related as $name)
207 $ret['body'] .= '<li>' . make_pagelink($name) . '</li>';
209 $ret['body'] .= '</ul>';
214 //¥Ú¡¼¥¸Ì¾¤È´ØÏ¢¤¹¤ë¥Ú¡¼¥¸¤òÎóµó¤·¡¢phase3¤Ø
215 function rename_refer()
217 $page = rename_getvar('page');
218 $refer = rename_getvar('refer');
220 $pages[encode($refer)] = encode($page);
221 if (rename_getvar('related') != '')
223 $from = strip_bracket($refer);
224 $to = strip_bracket($page);
225 foreach (rename_getrelated($refer) as $_page)
227 $pages[encode($_page)] = encode(str_replace($from, $to, $_page));
230 return rename_phase3($pages);
233 //Àµµ¬É½¸½¤Ç¥Ú¡¼¥¸¤òÃÖ´¹
234 function rename_regex($arr_from, $arr_to)
237 foreach ($arr_to as $page)
244 if (count($exists) > 0)
246 return rename_phase1('already', $exists);
250 foreach ($arr_from as $refer)
252 $pages[encode($refer)] = encode(array_shift($arr_to));
254 return rename_phase3($pages);
257 function rename_phase3($pages)
259 global $script, $_rename_messages;
262 $files = rename_get_files($pages);
265 foreach ($files as $_page=>$arr)
267 foreach ($arr as $old=>$new)
269 if (file_exists($new))
271 $exists[$_page][$old] = $new;
275 $pass = rename_getvar('pass');
276 if ($pass != '' && pkwk_login($pass))
278 return rename_proceed($pages, $files, $exists);
280 else if ($pass != '')
282 $msg = rename_err('adminpass');
284 $method = rename_getvar('method');
285 if ($method == 'regex')
287 $s_src = htmlspecialchars(rename_getvar('src'));
288 $s_dst = htmlspecialchars(rename_getvar('dst'));
289 $msg .= $_rename_messages['msg_regex'] . '<br />';
290 $input .= "<input type=\"hidden\" name=\"method\" value=\"regex\" />";
291 $input .= "<input type=\"hidden\" name=\"src\" value=\"$s_src\" />";
292 $input .= "<input type=\"hidden\" name=\"dst\" value=\"$s_dst\" />";
296 $s_refer = htmlspecialchars(rename_getvar('refer'));
297 $s_page = htmlspecialchars(rename_getvar('page'));
298 $s_related = htmlspecialchars(rename_getvar('related'));
299 $msg .= $_rename_messages['msg_page'] . '<br />';
300 $input .= "<input type=\"hidden\" name=\"method\" value=\"page\" />";
301 $input .= "<input type=\"hidden\" name=\"refer\" value=\"$s_refer\" />";
302 $input .= "<input type=\"hidden\" name=\"page\" value=\"$s_page\" />";
303 $input .= "<input type=\"hidden\" name=\"related\" value=\"$s_related\" />";
306 if (count($exists) > 0)
308 $msg .= $_rename_messages['err_already_below'] . "<ul>";
309 foreach ($exists as $page=>$arr)
312 $msg .= make_pagelink(decode($page));
313 $msg .= $_rename_messages['msg_arrow'];
314 $msg .= htmlspecialchars(decode($pages[$page]));
318 foreach ($arr as $ofile=>$nfile)
320 $msg .= '<li>' . $ofile . $_rename_messages['msg_arrow'] . $nfile."</li>\n";
326 $msg .= "</ul><hr />\n";
328 $input .= '<input type="radio" name="exist" value="0" checked="checked" />' . $_rename_messages['msg_exist_none'] . '<br />';
329 $input .= '<input type="radio" name="exist" value="1" />' . $_rename_messages['msg_exist_overwrite'] . '<br />';
333 $ret['msg'] = $_rename_messages['msg_title'];
334 $ret['body'] = <<<EOD
336 <form action="$script" method="post">
338 <input type="hidden" name="plugin" value="rename" />
340 {$_rename_messages['msg_adminpass']}
341 <input type="password" name="pass" value="" />
342 <input type="submit" value="{$_rename_messages['btn_submit']}" />
345 <p>{$_rename_messages['msg_confirm']}</p>
349 $ret['body'] .= "<ul>\n";
350 foreach ($pages as $old=>$new)
352 $ret['body'] .= '<li>' . make_pagelink(decode($old)) .
353 $_rename_messages['msg_arrow'] . htmlspecialchars(decode($new)) . "</li>\n";
355 $ret['body'] .= "</ul>\n";
359 function rename_get_files($pages)
362 $dirs = array(BACKUP_DIR, DIFF_DIR, DATA_DIR);
363 if (exist_plugin_convert('attach'))
365 $dirs[] = UPLOAD_DIR;
367 if (exist_plugin_convert('counter'))
369 $dirs[] = COUNTER_DIR;
374 foreach ($dirs as $path)
376 $dir = opendir($path);
377 if (! $dir) continue;
379 while ($file = readdir($dir))
381 if ($file == '.' or $file == '..')
385 foreach ($pages as $from=>$to)
387 $pattern = '/^' . str_replace('/', '\/', $from) . '([._].+)$/';
388 if (! preg_match($pattern, $file, $matches))
392 $newfile = $to . $matches[1];
393 $files[$from][$path . $file] = $path . $newfile;
400 function rename_proceed($pages, $files, $exists)
402 global $now, $_rename_messages;
404 if (rename_getvar('exist') == '')
406 foreach ($exists as $key=>$arr)
413 foreach ($files as $page=>$arr)
415 foreach ($arr as $old=>$new)
417 if ($exists[$page][$old])
423 // link¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·¤¹¤ë BugTrack/327 arino
429 $postdata = get_source(RENAME_LOGPAGE);
430 $postdata[] = '*' . $now . "\n";
431 if (rename_getvar('method') == 'regex')
433 $postdata[] = '-' . $_rename_messages['msg_regex'] . "\n";
434 $postdata[] = '--From:[[' . rename_getvar('src') . "]]\n";
435 $postdata[] = '--To:[[' . rename_getvar('dst') . "]]\n";
439 $postdata[] = '-' . $_rename_messages['msg_page'] . "\n";
440 $postdata[] = '--From:[[' . rename_getvar('refer') . "]]\n";
441 $postdata[] = '--To:[[' . rename_getvar('page') . "]]\n";
443 if (count($exists) > 0)
445 $postdata[] = "\n" . $_rename_messages['msg_result'] . "\n";
446 foreach ($exists as $page=>$arr)
448 $postdata[] = '-' . decode($page) .
449 $_rename_messages['msg_arrow'] . decode($pages[$page]) . "\n";
450 foreach ($arr as $ofile=>$nfile)
452 $postdata[] = '--' . $ofile .
453 $_rename_messages['msg_arrow'] . $nfile . "\n";
456 $postdata[] = "----\n";
458 foreach ($pages as $old=>$new)
460 $postdata[] = '-' . decode($old) .
461 $_rename_messages['msg_arrow'] . decode($new) . "\n";
464 // ¹¹¿·¤Î¾×ÆͤϥÁ¥§¥Ã¥¯¤·¤Ê¤¤¡£
466 // ¥Õ¥¡¥¤¥ë¤Î½ñ¤¹þ¤ß
467 page_write(RENAME_LOGPAGE, join('', $postdata));
470 $page = rename_getvar('page');
473 $page = RENAME_LOGPAGE;
477 header('Location: ' . get_script_uri() . '?' . rawurlencode($page));
481 function rename_getrelated($page)
484 $pages = get_existpages();
485 $pattern = '/(?:^|\/)' . preg_quote(strip_bracket($page), '/') . '(?:\/|$)/';
486 foreach ($pages as $name)
492 if (preg_match($pattern, $name))
500 function rename_getselecttag($page)
505 foreach (get_existpages() as $_page)
507 if ($_page == $whatsnew)
511 $selected = ($_page == $page) ? ' selected' : '';
512 $s_page = htmlspecialchars($_page);
513 $pages[$_page] = "<option value=\"$s_page\"$selected>$s_page</option>";
516 $list = join("\n ", $pages);
519 <select name="refer">
520 <option value=""></option>