2 // PukiWiki - Yet another WikiWikiWeb clone
3 // $Id: rename.inc.php,v 1.23 2005/01/23 08:08:00 henoheno Exp $
5 // Rename plugin: Rename page-name and related data
7 // Usage: http://path/to/pukiwikiphp?plugin=rename[&refer=page_name]
9 define('PLUGIN_RENAME_LOGPAGE', ':RenameLog');
11 function plugin_rename_action()
15 if (PKWK_READONLY) die_message('PKWK_READONLY prohibits this');
17 $method = plugin_rename_getvar('method');
18 if ($method == 'regex') {
19 $src = plugin_rename_getvar('src');
20 if ($src == '') return plugin_rename_phase1();
22 $src_pattern = '/' . preg_quote($src, '/') . '/';
23 $arr0 = preg_grep($src_pattern, get_existpages());
24 if (! is_array($arr0) || empty($arr0))
25 return plugin_rename_phase1('nomatch');
27 $dst = plugin_rename_getvar('dst');
28 $arr1 = preg_replace($src_pattern, $dst, $arr0);
29 foreach ($arr1 as $page)
30 if (! is_pagename($page))
31 return plugin_rename_phase1('notvalid');
33 return plugin_rename_regex($arr0, $arr1);
37 $page = plugin_rename_getvar('page');
38 $refer = plugin_rename_getvar('refer');
41 return plugin_rename_phase1();
43 } else if (! is_page($refer)) {
44 return plugin_rename_phase1('notpage', $refer);
46 } else if ($refer == $whatsnew) {
47 return plugin_rename_phase1('norename', $refer);
49 } else if ($page == '' || $page == $refer) {
50 return plugin_rename_phase2();
52 } else if (! is_pagename($page)) {
53 return plugin_rename_phase2('notvalid');
56 return plugin_rename_refer();
62 function plugin_rename_getvar($key)
65 return isset($vars[$key]) ? $vars[$key] : '';
68 // ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òºî¤ë
69 function plugin_rename_err($err, $page = '')
71 global $_rename_messages;
73 if ($err == '') return '';
75 $body = $_rename_messages['err_' . $err];
76 if (is_array($page)) {
78 foreach ($page as $_page) $tmp .= '<br />' . $_page;
81 if ($page != '') $body = sprintf($body, htmlspecialchars($page));
83 $msg = sprintf($_rename_messages['err'], $body);
87 //Âè°ìÃʳ¬:¥Ú¡¼¥¸Ì¾¤Þ¤¿¤ÏÀµµ¬É½¸½¤ÎÆþÎÏ
88 function plugin_rename_phase1($err = '', $page = '')
90 global $script, $_rename_messages;
92 $msg = plugin_rename_err($err, $page);
93 $refer = plugin_rename_getvar('refer');
94 $method = plugin_rename_getvar('method');
96 $radio_regex = $radio_page = '';
97 if ($method == 'regex') {
98 $radio_regex =' checked';
100 $radio_page = ' checked';
102 $select_refer = plugin_rename_getselecttag($refer);
104 $s_src = htmlspecialchars(plugin_rename_getvar('src'));
105 $s_dst = htmlspecialchars(plugin_rename_getvar('dst'));
108 $ret['msg'] = $_rename_messages['msg_title'];
109 $ret['body'] = <<<EOD
111 <form action="$script" method="post">
113 <input type="hidden" name="plugin" value="rename" />
114 <input type="radio" name="method" value="page"$radio_page />
115 {$_rename_messages['msg_page']}:$select_refer<br />
116 <input type="radio" name="method" value="regex"$radio_regex />
117 {$_rename_messages['msg_regex']}:<br />
119 <input type="text" name="src" size="80" value="$s_src" /><br />
121 <input type="text" name="dst" size="80" value="$s_dst" /><br />
122 <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
129 //ÂèÆóÃʳ¬:¿·¤·¤¤Ì¾Á°¤ÎÆþÎÏ
130 function plugin_rename_phase2($err = '')
132 global $script, $_rename_messages;
134 $msg = plugin_rename_err($err);
135 $page = plugin_rename_getvar('page');
136 $refer = plugin_rename_getvar('refer');
137 if ($page == '') $page = $refer;
140 $related = plugin_rename_getrelated($refer);
141 if (! empty($related))
142 $msg_related = $_rename_messages['msg_do_related'] .
143 '<input type="checkbox" name="related" value="1" checked="checked" /><br />';
145 $msg_rename = sprintf($_rename_messages['msg_rename'], make_pagelink($refer));
146 $s_page = htmlspecialchars($page);
147 $s_refer = htmlspecialchars($refer);
150 $ret['msg'] = $_rename_messages['msg_title'];
151 $ret['body'] = <<<EOD
153 <form action="$script" method="post">
155 <input type="hidden" name="plugin" value="rename" />
156 <input type="hidden" name="refer" value="$s_refer" />
158 {$_rename_messages['msg_newname']}:<input type="text" name="page" size="80" value="$s_page" /><br />
160 <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
164 if (! empty($related)) {
165 $ret['body'] .= '<hr /><p>' . $_rename_messages['msg_related'] . '</p><ul>';
167 foreach ($related as $name)
168 $ret['body'] .= '<li>' . make_pagelink($name) . '</li>';
169 $ret['body'] .= '</ul>';
174 //¥Ú¡¼¥¸Ì¾¤È´ØÏ¢¤¹¤ë¥Ú¡¼¥¸¤òÎóµó¤·¡¢phase3¤Ø
175 function plugin_rename_refer()
177 $page = plugin_rename_getvar('page');
178 $refer = plugin_rename_getvar('refer');
180 $pages[encode($refer)] = encode($page);
181 if (plugin_rename_getvar('related') != '') {
182 $from = strip_bracket($refer);
183 $to = strip_bracket($page);
184 foreach (plugin_rename_getrelated($refer) as $_page)
185 $pages[encode($_page)] = encode(str_replace($from, $to, $_page));
187 return plugin_rename_phase3($pages);
190 //Àµµ¬É½¸½¤Ç¥Ú¡¼¥¸¤òÃÖ´¹
191 function plugin_rename_regex($arr_from, $arr_to)
194 foreach ($arr_to as $page)
198 if (! empty($exists)) {
199 return plugin_rename_phase1('already', $exists);
202 foreach ($arr_from as $refer)
203 $pages[encode($refer)] = encode(array_shift($arr_to));
204 return plugin_rename_phase3($pages);
208 function plugin_rename_phase3($pages)
210 global $script, $_rename_messages;
213 $files = plugin_rename_get_files($pages);
216 foreach ($files as $_page=>$arr)
217 foreach ($arr as $old=>$new)
218 if (file_exists($new))
219 $exists[$_page][$old] = $new;
221 $pass = plugin_rename_getvar('pass');
222 if ($pass != '' && pkwk_login($pass)) {
223 return plugin_rename_proceed($pages, $files, $exists);
224 } else if ($pass != '') {
225 $msg = plugin_rename_err('adminpass');
228 $method = plugin_rename_getvar('method');
229 if ($method == 'regex') {
230 $s_src = htmlspecialchars(plugin_rename_getvar('src'));
231 $s_dst = htmlspecialchars(plugin_rename_getvar('dst'));
232 $msg .= $_rename_messages['msg_regex'] . '<br />';
233 $input .= '<input type="hidden" name="method" value="regex" />';
234 $input .= '<input type="hidden" name="src" value="' . $s_src . '" />';
235 $input .= '<input type="hidden" name="dst" value="' . $s_dst . '" />';
237 $s_refer = htmlspecialchars(plugin_rename_getvar('refer'));
238 $s_page = htmlspecialchars(plugin_rename_getvar('page'));
239 $s_related = htmlspecialchars(plugin_rename_getvar('related'));
240 $msg .= $_rename_messages['msg_page'] . '<br />';
241 $input .= '<input type="hidden" name="method" value="page" />';
242 $input .= '<input type="hidden" name="refer" value="' . $s_refer . '" />';
243 $input .= '<input type="hidden" name="page" value="' . $s_page . '" />';
244 $input .= '<input type="hidden" name="related" value="' . $s_related . '" />';
247 if (! empty($exists)) {
248 $msg .= $_rename_messages['err_already_below'] . '<ul>';
249 foreach ($exists as $page=>$arr) {
250 $msg .= '<li>' . make_pagelink(decode($page));
251 $msg .= $_rename_messages['msg_arrow'];
252 $msg .= htmlspecialchars(decode($pages[$page]));
254 $msg .= '<ul>' . "\n";
255 foreach ($arr as $ofile=>$nfile)
256 $msg .= '<li>' . $ofile .
257 $_rename_messages['msg_arrow'] . $nfile . '</li>' . "\n";
260 $msg .= '</li>' . "\n";
262 $msg .= '</ul><hr />' . "\n";
264 $input .= '<input type="radio" name="exist" value="0" checked="checked" />' .
265 $_rename_messages['msg_exist_none'] . '<br />';
266 $input .= '<input type="radio" name="exist" value="1" />' .
267 $_rename_messages['msg_exist_overwrite'] . '<br />';
271 $ret['msg'] = $_rename_messages['msg_title'];
272 $ret['body'] = <<<EOD
274 <form action="$script" method="post">
276 <input type="hidden" name="plugin" value="rename" />
278 {$_rename_messages['msg_adminpass']}
279 <input type="password" name="pass" value="" />
280 <input type="submit" value="{$_rename_messages['btn_submit']}" />
283 <p>{$_rename_messages['msg_confirm']}</p>
287 $ret['body'] .= '<ul>' . "\n";
288 foreach ($pages as $old=>$new)
289 $ret['body'] .= '<li>' . make_pagelink(decode($old)) .
290 $_rename_messages['msg_arrow'] .
291 htmlspecialchars(decode($new)) . '</li>' . "\n";
292 $ret['body'] .= '</ul>' . "\n";
296 function plugin_rename_get_files($pages)
299 $dirs = array(BACKUP_DIR, DIFF_DIR, DATA_DIR);
300 if (exist_plugin_convert('attach')) $dirs[] = UPLOAD_DIR;
301 if (exist_plugin_convert('counter')) $dirs[] = COUNTER_DIR;
305 foreach ($dirs as $path) {
306 $dir = opendir($path);
307 if (! $dir) continue;
309 while ($file = readdir($dir)) {
310 if ($file == '.' || $file == '..') continue;
312 foreach ($pages as $from=>$to) {
313 $pattern = '/^' . str_replace('/', '\/', $from) . '([._].+)$/';
314 if (! preg_match($pattern, $file, $matches))
317 $newfile = $to . $matches[1];
318 $files[$from][$path . $file] = $path . $newfile;
325 function plugin_rename_proceed($pages, $files, $exists)
327 global $now, $_rename_messages;
329 if (plugin_rename_getvar('exist') == '')
330 foreach ($exists as $key=>$arr)
334 foreach ($files as $page=>$arr) {
335 foreach ($arr as $old=>$new) {
336 if (isset($exists[$page][$old]) && $exists[$page][$old])
340 // link¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·¤¹¤ë BugTrack/327 arino
346 $postdata = get_source(PLUGIN_RENAME_LOGPAGE);
347 $postdata[] = '*' . $now . "\n";
348 if (plugin_rename_getvar('method') == 'regex') {
349 $postdata[] = '-' . $_rename_messages['msg_regex'] . "\n";
350 $postdata[] = '--From:[[' . plugin_rename_getvar('src') . ']]' . "\n";
351 $postdata[] = '--To:[[' . plugin_rename_getvar('dst') . ']]' . "\n";
353 $postdata[] = '-' . $_rename_messages['msg_page'] . "\n";
354 $postdata[] = '--From:[[' . plugin_rename_getvar('refer') . ']]' . "\n";
355 $postdata[] = '--To:[[' . plugin_rename_getvar('page') . ']]' . "\n";
358 if (! empty($exists)) {
359 $postdata[] = "\n" . $_rename_messages['msg_result'] . "\n";
360 foreach ($exists as $page=>$arr) {
361 $postdata[] = '-' . decode($page) .
362 $_rename_messages['msg_arrow'] . decode($pages[$page]) . "\n";
363 foreach ($arr as $ofile=>$nfile)
364 $postdata[] = '--' . $ofile .
365 $_rename_messages['msg_arrow'] . $nfile . "\n";
367 $postdata[] = '----' . "\n";
370 foreach ($pages as $old=>$new)
371 $postdata[] = '-' . decode($old) .
372 $_rename_messages['msg_arrow'] . decode($new) . "\n";
374 // ¹¹¿·¤Î¾×ÆͤϥÁ¥§¥Ã¥¯¤·¤Ê¤¤¡£
376 // ¥Õ¥¡¥¤¥ë¤Î½ñ¤¹þ¤ß
377 page_write(PLUGIN_RENAME_LOGPAGE, join('', $postdata));
380 $page = plugin_rename_getvar('page');
381 if ($page == '') $page = PLUGIN_RENAME_LOGPAGE;
384 header('Location: ' . get_script_uri() . '?' . rawurlencode($page));
388 function plugin_rename_getrelated($page)
391 $pages = get_existpages();
392 $pattern = '/(?:^|\/)' . preg_quote(strip_bracket($page), '/') . '(?:\/|$)/';
393 foreach ($pages as $name) {
394 if ($name == $page) continue;
395 if (preg_match($pattern, $name)) $related[] = $name;
400 function plugin_rename_getselecttag($page)
405 foreach (get_existpages() as $_page) {
406 if ($_page == $whatsnew) continue;
408 $selected = ($_page == $page) ? ' selected' : '';
409 $s_page = htmlspecialchars($_page);
410 $pages[$_page] = '<option value="' . $s_page . '"' . $selected . '>' .
411 $s_page . '</option>';
414 $list = join("\n" . ' ', $pages);
417 <select name="refer">
418 <option value=""></option>