OSDN Git Service

BugTrack2/139: Correct. Deleted a first space at preview.
[pukiwiki/pukiwiki.git] / plugin / rename.inc.php
1 <?php
2 // PukiWiki - Yet another WikiWikiWeb clone
3 // $Id: rename.inc.php,v 1.27 2005/02/27 07:57:26 henoheno Exp $
4 //
5 // Rename plugin: Rename page-name and related data
6 //
7 // Usage: http://path/to/pukiwikiphp?plugin=rename[&refer=page_name]
8
9 define('PLUGIN_RENAME_LOGPAGE', ':RenameLog');
10
11 function plugin_rename_action()
12 {
13         global $whatsnew;
14
15         if (PKWK_READONLY) die_message('PKWK_READONLY prohibits this');
16
17         $method = plugin_rename_getvar('method');
18         if ($method == 'regex') {
19                 $src = plugin_rename_getvar('src');
20                 if ($src == '') return plugin_rename_phase1();
21
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');
26
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');
32
33                 return plugin_rename_regex($arr0, $arr1);
34
35         } else {
36                 // $method == 'page'
37                 $page  = plugin_rename_getvar('page');
38                 $refer = plugin_rename_getvar('refer');
39
40                 if ($refer == '') {
41                         return plugin_rename_phase1();
42
43                 } else if (! is_page($refer)) {
44                         return plugin_rename_phase1('notpage', $refer);
45
46                 } else if ($refer == $whatsnew) {
47                         return plugin_rename_phase1('norename', $refer);
48
49                 } else if ($page == '' || $page == $refer) {
50                         return plugin_rename_phase2();
51
52                 } else if (! is_pagename($page)) {
53                         return plugin_rename_phase2('notvalid');
54
55                 } else {
56                         return plugin_rename_refer();
57                 }
58         }
59 }
60
61 // ÊÑ¿ô¤ò¼èÆÀ¤¹¤ë
62 function plugin_rename_getvar($key)
63 {
64         global $vars;
65         return isset($vars[$key]) ? $vars[$key] : '';
66 }
67
68 // ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òºî¤ë
69 function plugin_rename_err($err, $page = '')
70 {
71         global $_rename_messages;
72
73         if ($err == '') return '';
74
75         $body = $_rename_messages['err_' . $err];
76         if (is_array($page)) {
77                 $tmp = '';
78                 foreach ($page as $_page) $tmp .= '<br />' . $_page;
79                 $page = $tmp;
80         }
81         if ($page != '') $body = sprintf($body, htmlspecialchars($page));
82
83         $msg = sprintf($_rename_messages['err'], $body);
84         return $msg;
85 }
86
87 //Âè°ìÃʳ¬:¥Ú¡¼¥¸Ì¾¤Þ¤¿¤ÏÀµµ¬É½¸½¤ÎÆþÎÏ
88 function plugin_rename_phase1($err = '', $page = '')
89 {
90         global $script, $_rename_messages;
91
92         $msg    = plugin_rename_err($err, $page);
93         $refer  = plugin_rename_getvar('refer');
94         $method = plugin_rename_getvar('method');
95
96         $radio_regex = $radio_page = '';
97         if ($method == 'regex') {
98                 $radio_regex = ' checked="checked"';
99         } else {
100                 $radio_page  = ' checked="checked"';
101         }
102         $select_refer = plugin_rename_getselecttag($refer);
103
104         $s_src = htmlspecialchars(plugin_rename_getvar('src'));
105         $s_dst = htmlspecialchars(plugin_rename_getvar('dst'));
106
107         $ret = array();
108         $ret['msg']  = $_rename_messages['msg_title'];
109         $ret['body'] = <<<EOD
110 $msg
111 <form action="$script" method="post">
112  <div>
113   <input type="hidden" name="plugin" value="rename" />
114   <input type="radio"  name="method" id="_p_rename_page" value="page"$radio_page />
115   <label for="_p_rename_page">{$_rename_messages['msg_page']}:</label>$select_refer<br />
116   <input type="radio"  name="method" id="_p_rename_regex" value="regex"$radio_regex />
117   <label for="_p_rename_regex">{$_rename_messages['msg_regex']}:</label><br />
118   <label for="_p_rename_from">From:</label><br />
119   <input type="text" name="src" id="_p_rename_from" size="80" value="$s_src" /><br />
120   <label for="_p_rename_to">To:</label><br />
121   <input type="text" name="dst" id="_p_rename_to"   size="80" value="$s_dst" /><br />
122   <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
123  </div>
124 </form>
125 EOD;
126         return $ret;
127 }
128
129 //ÂèÆóÃʳ¬:¿·¤·¤¤Ì¾Á°¤ÎÆþÎÏ
130 function plugin_rename_phase2($err = '')
131 {
132         global $script, $_rename_messages;
133
134         $msg   = plugin_rename_err($err);
135         $page  = plugin_rename_getvar('page');
136         $refer = plugin_rename_getvar('refer');
137         if ($page == '') $page = $refer;
138
139         $msg_related = '';
140         $related = plugin_rename_getrelated($refer);
141         if (! empty($related))
142                 $msg_related = '<label for="_p_rename_related">' . $_rename_messages['msg_do_related'] . '</label>' .
143                 '<input type="checkbox" name="related" id="_p_rename_related" value="1" checked="checked" /><br />';
144
145         $msg_rename = sprintf($_rename_messages['msg_rename'], make_pagelink($refer));
146         $s_page  = htmlspecialchars($page);
147         $s_refer = htmlspecialchars($refer);
148
149         $ret = array();
150         $ret['msg']  = $_rename_messages['msg_title'];
151         $ret['body'] = <<<EOD
152 $msg
153 <form action="$script" method="post">
154  <div>
155   <input type="hidden" name="plugin" value="rename" />
156   <input type="hidden" name="refer"  value="$s_refer" />
157   $msg_rename<br />
158   <label for="_p_rename_newname">{$_rename_messages['msg_newname']}:</label>
159   <input type="text" name="page" id="_p_rename_newname" size="80" value="$s_page" /><br />
160   $msg_related
161   <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
162  </div>
163 </form>
164 EOD;
165         if (! empty($related)) {
166                 $ret['body'] .= '<hr /><p>' . $_rename_messages['msg_related'] . '</p><ul>';
167                 sort($related);
168                 foreach ($related as $name)
169                         $ret['body'] .= '<li>' . make_pagelink($name) . '</li>';
170                 $ret['body'] .= '</ul>';
171         }
172         return $ret;
173 }
174
175 //¥Ú¡¼¥¸Ì¾¤È´ØÏ¢¤¹¤ë¥Ú¡¼¥¸¤òÎóµó¤·¡¢phase3¤Ø
176 function plugin_rename_refer()
177 {
178         $page  = plugin_rename_getvar('page');
179         $refer = plugin_rename_getvar('refer');
180
181         $pages[encode($refer)] = encode($page);
182         if (plugin_rename_getvar('related') != '') {
183                 $from = strip_bracket($refer);
184                 $to   = strip_bracket($page);
185                 foreach (plugin_rename_getrelated($refer) as $_page)
186                         $pages[encode($_page)] = encode(str_replace($from, $to, $_page));
187         }
188         return plugin_rename_phase3($pages);
189 }
190
191 //Àµµ¬É½¸½¤Ç¥Ú¡¼¥¸¤òÃÖ´¹
192 function plugin_rename_regex($arr_from, $arr_to)
193 {
194         $exists = array();
195         foreach ($arr_to as $page)
196                 if (is_page($page))
197                         $exists[] = $page;
198
199         if (! empty($exists)) {
200                 return plugin_rename_phase1('already', $exists);
201         } else {
202                 $pages = array();
203                 foreach ($arr_from as $refer)
204                         $pages[encode($refer)] = encode(array_shift($arr_to));
205                 return plugin_rename_phase3($pages);
206         }
207 }
208
209 function plugin_rename_phase3($pages)
210 {
211         global $script, $_rename_messages;
212
213         $msg = $input = '';
214         $files = plugin_rename_get_files($pages);
215
216         $exists = array();
217         foreach ($files as $_page=>$arr)
218                 foreach ($arr as $old=>$new)
219                         if (file_exists($new))
220                                 $exists[$_page][$old] = $new;
221
222         $pass = plugin_rename_getvar('pass');
223         if ($pass != '' && pkwk_login($pass)) {
224                 return plugin_rename_proceed($pages, $files, $exists);
225         } else if ($pass != '') {
226                 $msg = plugin_rename_err('adminpass');
227         }
228
229         $method = plugin_rename_getvar('method');
230         if ($method == 'regex') {
231                 $s_src = htmlspecialchars(plugin_rename_getvar('src'));
232                 $s_dst = htmlspecialchars(plugin_rename_getvar('dst'));
233                 $msg   .= $_rename_messages['msg_regex'] . '<br />';
234                 $input .= '<input type="hidden" name="method" value="regex" />';
235                 $input .= '<input type="hidden" name="src"    value="' . $s_src . '" />';
236                 $input .= '<input type="hidden" name="dst"    value="' . $s_dst . '" />';
237         } else {
238                 $s_refer   = htmlspecialchars(plugin_rename_getvar('refer'));
239                 $s_page    = htmlspecialchars(plugin_rename_getvar('page'));
240                 $s_related = htmlspecialchars(plugin_rename_getvar('related'));
241                 $msg   .= $_rename_messages['msg_page'] . '<br />';
242                 $input .= '<input type="hidden" name="method"  value="page" />';
243                 $input .= '<input type="hidden" name="refer"   value="' . $s_refer   . '" />';
244                 $input .= '<input type="hidden" name="page"    value="' . $s_page    . '" />';
245                 $input .= '<input type="hidden" name="related" value="' . $s_related . '" />';
246         }
247
248         if (! empty($exists)) {
249                 $msg .= $_rename_messages['err_already_below'] . '<ul>';
250                 foreach ($exists as $page=>$arr) {
251                         $msg .= '<li>' . make_pagelink(decode($page));
252                         $msg .= $_rename_messages['msg_arrow'];
253                         $msg .= htmlspecialchars(decode($pages[$page]));
254                         if (! empty($arr)) {
255                                 $msg .= '<ul>' . "\n";
256                                 foreach ($arr as $ofile=>$nfile)
257                                         $msg .= '<li>' . $ofile .
258                                         $_rename_messages['msg_arrow'] . $nfile . '</li>' . "\n";
259                                 $msg .= '</ul>';
260                         }
261                         $msg .= '</li>' . "\n";
262                 }
263                 $msg .= '</ul><hr />' . "\n";
264
265                 $input .= '<input type="radio" name="exist" value="0" checked="checked" />' .
266                         $_rename_messages['msg_exist_none'] . '<br />';
267                 $input .= '<input type="radio" name="exist" value="1" />' .
268                         $_rename_messages['msg_exist_overwrite'] . '<br />';
269         }
270
271         $ret = array();
272         $ret['msg'] = $_rename_messages['msg_title'];
273         $ret['body'] = <<<EOD
274 <p>$msg</p>
275 <form action="$script" method="post">
276  <div>
277   <input type="hidden" name="plugin" value="rename" />
278   $input
279   <label for="_p_rename_adminpass">{$_rename_messages['msg_adminpass']}</label>
280   <input type="password" name="pass" id="_p_rename_adminpass" value="" />
281   <input type="submit" value="{$_rename_messages['btn_submit']}" />
282  </div>
283 </form>
284 <p>{$_rename_messages['msg_confirm']}</p>
285 EOD;
286
287         ksort($pages);
288         $ret['body'] .= '<ul>' . "\n";
289         foreach ($pages as $old=>$new)
290                 $ret['body'] .= '<li>' .  make_pagelink(decode($old)) .
291                         $_rename_messages['msg_arrow'] .
292                         htmlspecialchars(decode($new)) .  '</li>' . "\n";
293         $ret['body'] .= '</ul>' . "\n";
294         return $ret;
295 }
296
297 function plugin_rename_get_files($pages)
298 {
299         $files = array();
300         $dirs  = array(BACKUP_DIR, DIFF_DIR, DATA_DIR);
301         if (exist_plugin_convert('attach'))  $dirs[] = UPLOAD_DIR;
302         if (exist_plugin_convert('counter')) $dirs[] = COUNTER_DIR;
303         // and more ...
304
305         $matches = array();
306         foreach ($dirs as $path) {
307                 $dir = opendir($path);
308                 if (! $dir) continue;
309
310                 while ($file = readdir($dir)) {
311                         if ($file == '.' || $file == '..') continue;
312
313                         foreach ($pages as $from=>$to) {
314                                 $pattern = '/^' . str_replace('/', '\/', $from) . '([._].+)$/';
315                                 if (! preg_match($pattern, $file, $matches))
316                                         continue;
317
318                                 $newfile = $to . $matches[1];
319                                 $files[$from][$path . $file] = $path . $newfile;
320                         }
321                 }
322         }
323         return $files;
324 }
325
326 function plugin_rename_proceed($pages, $files, $exists)
327 {
328         global $now, $_rename_messages;
329
330         if (plugin_rename_getvar('exist') == '')
331                 foreach ($exists as $key=>$arr)
332                         unset($files[$key]);
333
334         set_time_limit(0);
335         foreach ($files as $page=>$arr) {
336                 foreach ($arr as $old=>$new) {
337                         if (isset($exists[$page][$old]) && $exists[$page][$old])
338                                 unlink($new);
339                         rename($old, $new);
340
341                         // link¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·¤¹¤ë BugTrack/327 arino
342                         links_update($old);
343                         links_update($new);
344                 }
345         }
346
347         $postdata = get_source(PLUGIN_RENAME_LOGPAGE);
348         $postdata[] = '*' . $now . "\n";
349         if (plugin_rename_getvar('method') == 'regex') {
350                 $postdata[] = '-' . $_rename_messages['msg_regex'] . "\n";
351                 $postdata[] = '--From:[[' . plugin_rename_getvar('src') . ']]' . "\n";
352                 $postdata[] = '--To:[['   . plugin_rename_getvar('dst') . ']]' . "\n";
353         } else {
354                 $postdata[] = '-' . $_rename_messages['msg_page'] . "\n";
355                 $postdata[] = '--From:[[' . plugin_rename_getvar('refer') . ']]' . "\n";
356                 $postdata[] = '--To:[['   . plugin_rename_getvar('page')  . ']]' . "\n";
357         }
358
359         if (! empty($exists)) {
360                 $postdata[] = "\n" . $_rename_messages['msg_result'] . "\n";
361                 foreach ($exists as $page=>$arr) {
362                         $postdata[] = '-' . decode($page) .
363                                 $_rename_messages['msg_arrow'] . decode($pages[$page]) . "\n";
364                         foreach ($arr as $ofile=>$nfile)
365                                 $postdata[] = '--' . $ofile .
366                                         $_rename_messages['msg_arrow'] . $nfile . "\n";
367                 }
368                 $postdata[] = '----' . "\n";
369         }
370
371         foreach ($pages as $old=>$new)
372                 $postdata[] = '-' . decode($old) .
373                         $_rename_messages['msg_arrow'] . decode($new) . "\n";
374
375         // ¹¹¿·¤Î¾×ÆͤϥÁ¥§¥Ã¥¯¤·¤Ê¤¤¡£
376
377         // ¥Õ¥¡¥¤¥ë¤Î½ñ¤­¹þ¤ß
378         page_write(PLUGIN_RENAME_LOGPAGE, join('', $postdata));
379
380         //¥ê¥À¥¤¥ì¥¯¥È
381         $page = plugin_rename_getvar('page');
382         if ($page == '') $page = PLUGIN_RENAME_LOGPAGE;
383
384         pkwk_headers_sent();
385         header('Location: ' . get_script_uri() . '?' . rawurlencode($page));
386         exit;
387 }
388
389 function plugin_rename_getrelated($page)
390 {
391         $related = array();
392         $pages = get_existpages();
393         $pattern = '/(?:^|\/)' . preg_quote(strip_bracket($page), '/') . '(?:\/|$)/';
394         foreach ($pages as $name) {
395                 if ($name == $page) continue;
396                 if (preg_match($pattern, $name)) $related[] = $name;
397         }
398         return $related;
399 }
400
401 function plugin_rename_getselecttag($page)
402 {
403         global $whatsnew;
404
405         $pages = array();
406         foreach (get_existpages() as $_page) {
407                 if ($_page == $whatsnew) continue;
408
409                 $selected = ($_page == $page) ? ' selected' : '';
410                 $s_page = htmlspecialchars($_page);
411                 $pages[$_page] = '<option value="' . $s_page . '"' . $selected . '>' .
412                         $s_page . '</option>';
413         }
414         ksort($pages);
415         $list = join("\n" . ' ', $pages);
416
417         return <<<EOD
418 <select name="refer">
419  <option value=""></option>
420  $list
421 </select>
422 EOD;
423
424 }
425 ?>