OSDN Git Service

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