OSDN Git Service

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