OSDN Git Service

ぱんだ:[[自作プラグイン]]
[pukiwiki/pukiwiki.git] / plugin / rename.inc.php
1 <?php
2 // $Id: rename.inc.php,v 1.1 2002/12/05 05:02:27 panda Exp $
3 /*
4 Last-Update:2002-10-29 rev.5
5
6 *¥×¥é¥°¥¤¥ó rename
7 ¥Ú¡¼¥¸¤Î̾Á°¤òÊѤ¨¤ë
8
9 *Usage
10  http:.../pukiwiki.php?plugin=rename(&refer=¥Ú¡¼¥¸Ì¾)
11
12 *¥Ñ¥é¥á¡¼¥¿
13 -&refer=¥Ú¡¼¥¸Ì¾~
14  ¥Ú¡¼¥¸¤ò»ØÄê
15
16 */
17
18 define('RENAME_LOGPAGE','RenameLog');
19
20 function plugin_rename_init() {
21         $messages = array('_rename_messages'=>array(
22         'err' => '<p>¥¨¥é¡¼:%s</p>',
23         'err_nomatch' => '¥Þ¥Ã¥Á¤¹¤ë¥Ú¡¼¥¸¤¬¤¢¤ê¤Þ¤»¤ó¡£',
24         'err_notvalid' => '¥ê¥Í¡¼¥à¸å¤Î¥Ú¡¼¥¸Ì¾¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£',
25         'err_adminpass' => '´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£',
26         'err_notpage' => '%s¤Ï¥Ú¡¼¥¸Ì¾¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£',
27         'err_norename' => '%s¤ò¥ê¥Í¡¼¥à¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£',
28         'err_already' => '¥Ú¡¼¥¸¤¬¤¹¤Ç¤Ë¸ºß¤·¤Þ¤¹¡£:%s',
29         'err_already_below' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤¬¤¹¤Ç¤Ë¸ºß¤·¤Þ¤¹¡£',
30         'msg_title' => '¥Ú¡¼¥¸Ì¾¤ÎÊѹ¹',
31         'msg_page' => 'Êѹ¹¸µ¥Ú¡¼¥¸¤ò»ØÄê',
32         'msg_regex' => 'Àµµ¬É½¸½¤ÇÃÖ´¹',
33         'msg_related' => '´ØÏ¢¥Ú¡¼¥¸',
34         'msg_do_related' => '´ØÏ¢¥Ú¡¼¥¸¤â¥ê¥Í¡¼¥à¤¹¤ë',
35         'msg_rename' => '%s¤Î̾Á°¤òÊѹ¹¤·¤Þ¤¹¡£',
36         'msg_oldname' => '¸½ºß¤Î̾Á°',
37         'msg_newname' => '¿·¤·¤¤Ì¾Á°',
38         'msg_adminpass' => '´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É',
39         'msg_arrow' => '¢ª',
40         'msg_exist_none' => '¤½¤Î¥Ú¡¼¥¸¤ò½èÍý¤·¤Ê¤¤',
41         'msg_exist_overwrite' => '¤½¤Î¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤­¤¹¤ë',
42         'msg_confirm' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤ò¥ê¥Í¡¼¥à¤·¤Þ¤¹¡£',
43         'msg_result' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤­¤·¤Þ¤·¤¿¡£',
44         'btn_submit' => '¼Â¹Ô',
45         'btn_next' => '¼¡¤Ø',
46         ));
47         set_plugin_messages($messages);
48 }
49
50 function plugin_rename_action() {
51         global $vars,$adminpass,$whatsnew,$WikiName,$BracketName;
52         global $_rename_messages;
53
54         // XSS
55         foreach (array('refer','page','src','dst','method','related') as $var) {
56                 $s_vars[$var] = htmlspecialchars($vars[$var]);
57         }
58
59         set_time_limit(60);
60
61         if ($vars['method'] == 'regex') {
62                 if ($vars['src'] == '') { return rename_phase1($s_vars); }
63                 $pages = get_existpages();
64                 $arr0 = preg_grep('/'.str_replace(array('(',')'),'',$vars['src']).'/',$pages);
65                 if (!is_array($arr0) or count($arr0) == 0) { return rename_phase1($s_vars,'nomatch'); }
66                 $arr1 = preg_replace("/{$vars['src']}/",$vars['dst'],$arr0);
67                 $arr2 = preg_grep("/^(($WikiName)|($BracketName))$/",$arr1);
68                 if (count($arr2) != count($arr1)) { return rename_phase1($s_vars,'notvalid'); }
69                 return rename_regex($s_vars,$arr0,$arr1);
70         } else { // $vars['method'] = 'page'
71                 if ($vars['refer'] == '') { return rename_phase1($s_vars); }
72                 if (!is_page($vars['refer'])) { return rename_phase1($s_vars,'notpage',$s_vars['refer']); }
73                 if ($vars['refer'] == $whatsnew) { return rename_phase1($s_vars,'norename',$s_vars['refer']); }
74                 if ($vars['page'] == '' or $vars['page'] == $vars['refer']) { return rename_phase2($s_vars); }
75                 if (!preg_match("/^(($WikiName)|($BracketName))$/",$vars['page'])) { return rename_phase2($s_vars,'notvalid'); }
76                 return rename_refer($s_vars);
77         }
78 }
79 // ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òºî¤ë
80 function rename_err($err,$page='') {
81         global $_rename_messages;
82         if ($err == '') { return ''; }
83         $body = $_rename_messages["err_$err"];
84         if (is_array($page)) {
85                 $tmp = '';
86                 foreach ($page as $_page) { $tmp .= "<br />$_page"; }
87                 $page = $tmp;
88         }
89         if ($page != '') { $body = sprintf($body,$page); }
90         $msg = sprintf($_rename_messages['err'],$body);
91         return $msg;
92 }
93 // From->To¥á¥Ã¥»¡¼¥¸¤òºî¤ë
94 function rename_arrow($from,$to) {
95         global $_rename_messages;
96         return "$from{$_rename_messages['msg_arrow']}$to";
97 }
98 //Âè°ìÃʳ¬:¥Ú¡¼¥¸Ì¾¤Þ¤¿¤ÏÀµµ¬É½¸½¤ÎÆþÎÏ
99 function &rename_phase1(&$s_vars,$err='',$page='') {
100         global $script,$vars,$_rename_messages;
101         $msg = rename_err($err,$page);
102
103         if ($vars['method'] == 'regex') { $radio_regex =' checked'; }
104         else { $radio_page = ' checked'; }
105         $select_refer = rename_getselecttag($vars['refer']);
106
107         $ret['msg'] = $_rename_messages['msg_title'];
108         $ret['body'] = <<<EOD
109 $msg
110 <form action="$script" method="post">
111  <div>
112   <input type="hidden" name="plugin" value="rename" />
113   <input type="radio" name="method" value="page"$radio_page />
114   {$_rename_messages['msg_page']}:$select_refer<br />
115   <input type="radio" name="method" value="regex"$radio_regex />
116   {$_rename_messages['msg_regex']}:<br />
117   From:<br />
118   <input type="text" name="src" size="80" value="{$s_vars['src']}" /><br />
119   To:<br>
120   <input type="text" name="dst" size="80" value="{$s_vars['dst']}" /><br />
121   <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
122  </div>
123 </form>
124 EOD;
125         return $ret;
126 }
127 //ÂèÆóÃʳ¬:¿·¤·¤¤Ì¾Á°¤ÎÆþÎÏ
128 function &rename_phase2(&$s_vars,$err='') {
129         global $script,$vars,$_rename_messages;
130         $msg = rename_err($err);
131
132         $related = rename_getrelated($vars['refer']);
133         sort($related);
134         if (count($related) > 0) {
135                 $rename_related = $_rename_messages['msg_do_related'].
136                         '<input type=checkbox name="related" value="1" checked /><br />';
137         }
138         if ($s_vars['page'] == '') { $s_vars['page'] = $s_vars['refer']; }
139         $msg_rename = sprintf($_rename_messages['msg_rename'],make_link($vars['refer']));
140
141         $ret['msg'] = $_rename_messages['msg_title'];
142         $ret['body'] = <<<EOD
143 $msg
144 <form action="$script" method="post">
145  <div>
146   <input type="hidden" name="plugin" value="rename" />
147   <input type="hidden" name="refer" value="{$s_vars['refer']}" />
148   $msg_rename<br />
149   {$_rename_messages['msg_newname']}:<input type="text" name="page" size="80" value="{$s_vars['page']}" /><br />
150   $rename_related
151   <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
152  </div>
153 </form>
154 EOD;
155
156         if (count($related) > 0) {
157                 $ret['body'].= "<hr /><p>{$_rename_messages['msg_related']}</p><ul>";
158                 foreach ($related as $name) { $ret['body'].= '<li>'.make_link($name).'</li>'; }
159                 $ret['body'].= '</ul>';
160         }
161         return $ret;
162 }
163 //¥Ú¡¼¥¸Ì¾¤È´ØÏ¢¤¹¤ë¥Ú¡¼¥¸¤òÎóµó¤·¡¢phase3¤Ø
164 function &rename_refer(&$s_vars) {
165         global $vars;
166
167         $pages[encode($vars['refer'])] = encode($vars['page']);
168         if ($vars['related']) {
169                 $from = strip_bracket($vars['refer']);
170                 $to =   strip_bracket($vars['page']);
171                 $related = rename_getrelated($vars['refer']);
172                 foreach ($related as $page) {
173                         $pages[encode($page)] = encode(str_replace($from,$to,$page));
174                 }
175         }
176         return rename_phase3($s_vars,$pages);
177 }
178 //Àµµ¬É½¸½¤Ç¥Ú¡¼¥¸¤òÃÖ´¹
179 function &rename_regex(&$s_vars,&$arr_from,&$arr_to) {
180         global $vars;
181
182         $exists = array();
183         foreach ($arr_to as $page) {
184                 if (is_page($page)) { $exists[] = $page; }
185         }
186         if (count($exists) > 0) { return rename_phase1($s_vars,'already',$exists); }
187
188         $pages = array();
189         foreach ($arr_from as $refer) {
190                 $pages[encode($refer)] = encode(array_shift($arr_to));
191         }
192         return rename_phase3($s_vars,$pages);
193 }
194 function &rename_phase3(&$s_vars,&$pages) {
195         global $script,$vars,$_rename_messages,$adminpass;
196
197         $files = rename_get_files($pages);
198
199         $exists = array();
200         foreach ($files as $_page=>$arr) {
201                 foreach ($arr as $old=>$new) {
202                         if (is_readable($new)) { $exists[$_page][$old] = $new; }
203                 }
204         }
205
206         if ($vars['pass'] != '') {
207                 if (md5($vars['pass']) == $adminpass)
208                         return rename_proceed($s_vars,$pages,$files,$exists);
209                 else
210                         $msg = rename_err('adminpass');
211         }
212
213         if ($s_vars['method'] == "regex") {
214                 $msg .= $_rename_messages['msg_regex']."<br />";
215                 $input .= "<input type=\"hidden\" name=\"method\" value=\"regex\" />";
216                 $input .= "<input type=\"hidden\" name=\"src\" value=\"{$s_vars['src']}\" />";
217                 $input .= "<input type=\"hidden\" name=\"dst\" value=\"{$s_vars['dst']}\" />";
218         } else {
219                 $msg .= $_rename_messages['msg_page']."<br />";
220                 $input .= "<input type=\"hidden\" name=\"method\" value=\"page\" />";
221                 $input .= "<input type=\"hidden\" name=\"refer\" value=\"{$s_vars['refer']}\" />";
222                 $input .= "<input type=\"hidden\" name=\"page\" value=\"{$s_vars['page']}\" />";
223                 $input .= "<input type=\"hidden\" name=\"related\" value=\"{$s_vars['related']}\" />";
224         }
225
226         if (count($exists) > 0) {
227                 $msg .= $_rename_messages['err_already_below']."<ul>";
228                 foreach ($exists as $page=>$arr) {
229                         $msg .= "<li>".rename_arrow(make_link(decode($page)),decode($pages[$page]))."<ul>\n";
230                         foreach ($arr as $ofile=>$nfile) { $msg .= "<li>".rename_arrow($ofile,$nfile)."</li>\n"; }
231                         $msg .= "</ul></li>\n";
232                 }
233                 $msg .= "</ul><hr />";
234
235                 $input .= '<input type="radio" name="exist" value="0" checked />'.$_rename_messages['msg_exist_none'].'<br />';
236                 $input .= '<input type="radio" name="exist" value="1" />'.$_rename_messages['msg_exist_overwrite'].'<br />';
237         }
238         $ret['msg'] = $_rename_messages['msg_title'];
239         $ret['body'] .= <<<EOD
240 <p>$msg</p>
241 <form action="$script" method="post">
242  <div>
243   <input type="hidden" name="plugin" value="rename" />
244   $input
245   {$_rename_messages['msg_adminpass']}
246   <input type="password" name="pass" value="" />
247   <input type="submit" value="{$_rename_messages['btn_submit']}" />
248  </div>
249 </form>
250 <p>{$_rename_messages['msg_confirm']}</p>
251 EOD;
252
253         ksort($pages);
254         $ret['body'] .= "<ul>\n";
255         foreach ($pages as $old=>$new) {
256                 $ret['body'] .= "<li>".rename_arrow(make_link(decode($old)),decode($new))."</li>\n";
257         }
258         $ret['body'] .= "</ul>\n";
259         return $ret;
260 }
261
262 function &rename_get_files(&$pages) {
263         $files = array();
264         $dirs = array(BACKUP_DIR,DIFF_DIR,DATA_DIR);
265         if (exist_plugin_convert('attach')) { $dirs[] = UPLOAD_DIR; }
266         if (exist_plugin_convert('counter')) { $dirs[] = COUNTER_DIR; }
267         // and more ...
268
269         foreach ($dirs as $path) {
270                 if (!$dir = opendir($path)) { continue; }
271                 while ($file = readdir($dir)) {
272                         if ($file == '.' or $file == '..') { continue; }
273                         foreach ($pages as $from=>$to) {
274                                 $pattern = '/^'.str_replace('/','\/',$from).'([._].+)$/';
275                                 if (!preg_match($pattern,$file,$matches)) { continue; }
276                                 $newfile = $to.$matches[1];
277                                 $files[$from][$path.$file] = $path.$newfile;
278                         }
279                 }
280         }
281         return $files;
282 }
283
284 function rename_proceed(&$s_vars,&$pages,&$files,&$exists) {
285         global $script,$vars,$_rename_messages,$now;
286
287         if (!$vars['exist'])
288                 foreach ($exists as $key=>$arr) { unset($files[$key]); }
289
290         set_time_limit(0);
291         foreach ($files as $page=>$arr) {
292                 foreach ($arr as $old=>$new) {
293                         if ($exists[$page][$old]) { unlink($new); }
294                         rename($old,$new);
295                 }
296         }
297
298         $data = array();
299         if (is_page(RENAME_LOGPAGE)) {
300                 //¥Ú¡¼¥¸¤òÆɤ߽Ф¹
301                 $data = get_source(RENAME_LOGPAGE);
302                 $old = join("",$data);
303                 if (substr($old,-1) != "\n") { $data[] = "\n"; }
304         }
305         //¥³¥á¥ó¥È¤òÁÞÆþ
306         $data[] = '*'.$now."\n";
307         if ($vars['method'] == 'regex') {
308                 $data[] = '-'.$_rename_messages['msg_regex']."\n";
309                 $data[] = '--From:'.$s_vars['src']."\n";
310                 $data[] = '--To:'.$s_vars['dst']."\n";
311         } else {
312                 $data[] = '-'.$_rename_messages['msg_page']."\n";
313                 $data[] = '--From:'.$s_vars['refer']."\n";
314                 $data[] = '--To:'.$s_vars['page']."\n";
315         }
316         if (count($exists) > 0) {
317                 $data[] = "\n".$_rename_messages['msg_result']."\n";
318                 foreach ($exists as $page=>$arr) {
319                         $data[] = '-'.rename_arrow(decode($page),decode($pages[$page]))."\n";
320                         foreach ($arr as $ofile=>$nfile) { $data[] = '--'.rename_arrow($ofile,$nfile)."\n"; }
321                 }
322                 $data[] = "----\n";
323         }
324         foreach ($pages as $old=>$new)
325                 $data[] = '-'.rename_arrow(decode($old),decode($new))."\n";
326         $new = join('',$data);
327
328         if (is_page(RENAME_LOGPAGE)) {
329                 // º¹Ê¬¥Õ¥¡¥¤¥ë¤ÎºîÀ®
330                 file_write(DIFF_DIR,RENAME_LOGPAGE,do_diff($old,$new));
331
332                 // ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎºîÀ®
333                 if ($do_backup) {
334                         $oldtime = filemtime(get_filename(encode(RENAME_LOGPAGE)));
335                         make_backup(encode(RENAME_LOGPAGE).'.txt', $old, $oldtime);
336                 }
337         }
338
339         // ¥Õ¥¡¥¤¥ë¤Î½ñ¤­¹þ¤ß
340         file_write(DATA_DIR, RENAME_LOGPAGE, $new);
341
342         put_lastmodified(); //ºÇ½ª¹¹¿·¥Ú¡¼¥¸¤òºî¤êľ¤¹
343
344         //¥ê¥À¥¤¥ì¥¯¥È
345         $page = rawurlencode(($vars['page'] == '') ? RENAME_LOGPAGE : $vars['page']);
346         header("Location: $script?$page");
347         die();
348 }
349
350 function &rename_getrelated($page) {
351         $related = array();
352         $pages = get_existpages();
353         $pattern = '/[\[\/]'.str_replace('/','\/',strip_bracket($page)).'[\]\/]/';
354         foreach ($pages as $name) {
355                 if ($name == $page) { continue; }
356                 if (preg_match($pattern,$name)) { $related[] = $name; }
357         }
358         return $related;
359 }
360 function &rename_getselecttag($page) {
361         global $whatsnew;
362
363         $pages =array();
364         foreach (get_existpages() as $_page) {
365                 if ($_page == $whatsnew) { continue; }
366                 $selected = ($_page == $page) ? ' selected' : '';
367                 $pages[$_page] = "<option value=\"$_page\"$selected>$_page</option>";
368         }
369         ksort($pages);
370         $list = join("\n ",$pages);
371         return <<<EOD
372 <select name="refer">
373  <option value=""></option>
374  $list
375 </select>
376 EOD;
377         return $ret;
378 }
379 ?>