OSDN Git Service

BugTrack/2420 AutoTicketLink - Improve regex and JSON encode
[pukiwiki/pukiwiki.git] / plugin / rename.inc.php
index a9f95a5..f85e1d7 100644 (file)
 <?php
-/////////////////////////////////////////////////
-// PukiWiki - Yet another WikiWikiWeb clone.
+// PukiWiki - Yet another WikiWikiWeb clone
+// rename.inc.php
+// Copyright 2002-2018 PukiWiki Development Team
+// License: GPL v2 or (at your option) any later version
 //
-// $Id: rename.inc.php,v 1.3 2003/03/03 07:07:28 panda Exp $
+// Rename plugin: Rename page-name and related data
 //
+// Usage: http://path/to/index.php?plugin=rename[&refer=page_name]
 
-/*
-*¥×¥é¥°¥¤¥ó rename
-¥Ú¡¼¥¸¤Î̾Á°¤òÊѤ¨¤ë
+define('PLUGIN_RENAME_LOGPAGE', ':RenameLog');
 
-*Usage
- http:.../pukiwiki.php?plugin=rename(&refer=¥Ú¡¼¥¸Ì¾)
+if (file_exists(PLUGIN_DIR . 'counter.inc.php'))
+       require_once(PLUGIN_DIR . 'counter.inc.php');
 
-*¥Ñ¥é¥á¡¼¥¿
--&refer=¥Ú¡¼¥¸Ì¾~
- ¥Ú¡¼¥¸¤ò»ØÄê
+function plugin_rename_action()
+{
+       global $whatsnew;
 
-*/
+       if (PKWK_READONLY) die_message('PKWK_READONLY prohibits this');
 
-define('RENAME_LOGPAGE','RenameLog');
+       $method = plugin_rename_getvar('method');
+       if ($method == 'regex') {
+               $src = plugin_rename_getvar('src');
+               if ($src == '') return plugin_rename_phase1();
 
-function plugin_rename_init()
-{
-       $messages = array(
-               '_rename_messages'=>array(
-                       'err' => '<p>¥¨¥é¡¼:%s</p>',
-                       'err_nomatch' => '¥Þ¥Ã¥Á¤¹¤ë¥Ú¡¼¥¸¤¬¤¢¤ê¤Þ¤»¤ó¡£',
-                       'err_notvalid' => '¥ê¥Í¡¼¥à¸å¤Î¥Ú¡¼¥¸Ì¾¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£',
-                       'err_adminpass' => '´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£',
-                       'err_notpage' => '%s¤Ï¥Ú¡¼¥¸Ì¾¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£',
-                       'err_norename' => '%s¤ò¥ê¥Í¡¼¥à¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£',
-                       'err_already' => '¥Ú¡¼¥¸¤¬¤¹¤Ç¤Ë¸ºß¤·¤Þ¤¹¡£:%s',
-                       'err_already_below' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤¬¤¹¤Ç¤Ë¸ºß¤·¤Þ¤¹¡£',
-                       'msg_title' => '¥Ú¡¼¥¸Ì¾¤ÎÊѹ¹',
-                       'msg_page' => 'Êѹ¹¸µ¥Ú¡¼¥¸¤ò»ØÄê',
-                       'msg_regex' => 'Àµµ¬É½¸½¤ÇÃÖ´¹',
-                       'msg_related' => '´ØÏ¢¥Ú¡¼¥¸',
-                       'msg_do_related' => '´ØÏ¢¥Ú¡¼¥¸¤â¥ê¥Í¡¼¥à¤¹¤ë',
-                       'msg_rename' => '%s¤Î̾Á°¤òÊѹ¹¤·¤Þ¤¹¡£',
-                       'msg_oldname' => '¸½ºß¤Î̾Á°',
-                       'msg_newname' => '¿·¤·¤¤Ì¾Á°',
-                       'msg_adminpass' => '´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É',
-                       'msg_arrow' => '¢ª',
-                       'msg_exist_none' => '¤½¤Î¥Ú¡¼¥¸¤ò½èÍý¤·¤Ê¤¤',
-                       'msg_exist_overwrite' => '¤½¤Î¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤­¤¹¤ë',
-                       'msg_confirm' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤ò¥ê¥Í¡¼¥à¤·¤Þ¤¹¡£',
-                       'msg_result' => '°Ê²¼¤Î¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤­¤·¤Þ¤·¤¿¡£',
-                       'btn_submit' => '¼Â¹Ô',
-                       'btn_next' => '¼¡¤Ø'
-               )
-       );
-       set_plugin_messages($messages);
-}
+               $src_pattern = '/' . preg_quote($src, '/') . '/';
+               $arr0 = preg_grep($src_pattern, plugin_rename_get_existpages());
+               if (! is_array($arr0) || empty($arr0))
+                       return plugin_rename_phase1('nomatch');
 
-function plugin_rename_action()
-{
-       global $vars,$adminpass,$whatsnew,$WikiName,$BracketName;
-       global $_rename_messages;
+               $dst = plugin_rename_getvar('dst');
+               $arr1 = preg_replace($src_pattern, $dst, $arr0);
+               foreach ($arr1 as $page)
+                       if (! is_pagename($page))
+                               return plugin_rename_phase1('notvalid');
 
-       // XSS
-       foreach (array('refer','page','src','dst','method','related') as $var)
-       {
-               $s_vars[$var] = array_key_exists($var,$vars) ? htmlspecialchars($vars[$var]) : '';
-       }
+               return plugin_rename_regex($arr0, $arr1);
 
-       set_time_limit(60);
+       } else {
+               // $method == 'page'
+               $page  = plugin_rename_getvar('page');
+               $refer = plugin_rename_getvar('refer');
 
-       $method = empty($vars['method']) ? '' : $vars['method'];
-       if ($method == 'regex')
-       {
-               if ($vars['src'] == '')
-               {
-                       return rename_phase1($s_vars);
-               }
-               $pages = get_existpages();
-               $arr0 = preg_grep('/'.str_replace(array('(',')'),'',$vars['src']).'/',$pages);
-               if (!is_array($arr0) or count($arr0) == 0)
-               {
-                       return rename_phase1($s_vars,'nomatch');
-               }
-               $arr1 = preg_replace("/{$vars['src']}/",$vars['dst'],$arr0);
-               $arr2 = preg_grep("/^($WikiName|$BracketName)$/",$arr1);
-               if (count($arr2) != count($arr1))
-               {
-                       return rename_phase1($s_vars,'notvalid');
-               }
-               return rename_regex($s_vars,$arr0,$arr1);
-       }
-       else // $vars['method'] = 'page'
-       {
-               if (!array_key_exists('refer',$vars) or $vars['refer'] == '')
-               {
-                       return rename_phase1($s_vars);
-               }
-               if (!is_page($vars['refer']))
-               {
-                       return rename_phase1($s_vars,'notpage',$s_vars['refer']);
-               }
-               if ($vars['refer'] == $whatsnew)
-               {
-                       return rename_phase1($s_vars,'norename',$s_vars['refer']);
-               }
-               if ($vars['page'] == '' or $vars['page'] == $vars['refer'])
-               {
-                       return rename_phase2($s_vars);
-               }
-               if (!preg_match("/^$WikiName|$BracketName$/",$vars['page']))
-               {
-                       return rename_phase2($s_vars,'notvalid');
+               if ($refer == '') {
+                       return plugin_rename_phase1();
+
+               } else if (! plugin_rename_is_page($refer)) {
+                       return plugin_rename_phase1('notpage', $refer);
+
+               } else if ($refer === $whatsnew) {
+                       return plugin_rename_phase1('norename', $refer);
+
+               } else if ($page == '' || $page === $refer) {
+                       return plugin_rename_phase2();
+
+               } else if (! is_pagename($page)) {
+                       return plugin_rename_phase2('notvalid');
+
+               } else {
+                       return plugin_rename_refer();
                }
-               return rename_refer($s_vars);
        }
 }
-// ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òºî¤ë
-function rename_err($err,$page='')
+
+// 変数を取得する
+function plugin_rename_getvar($key)
+{
+       global $vars;
+       return isset($vars[$key]) ? $vars[$key] : '';
+}
+
+// エラーメッセージを作る
+function plugin_rename_err($err, $page = '')
 {
        global $_rename_messages;
-       
-       if ($err == '')
-       {
-               return '';
-       }
-       $body = $_rename_messages["err_$err"];
-       if (is_array($page))
-       {
+
+       if ($err == '') return '';
+
+       $body = $_rename_messages['err_' . $err];
+       if (is_array($page)) {
                $tmp = '';
-               foreach ($page as $_page)
-               {
-                       $tmp .= "<br />$_page";
-               }
+               foreach ($page as $_page) $tmp .= '<br />' . $_page;
                $page = $tmp;
        }
-       if ($page != '')
-       {
-               $body = sprintf($body,$page);
-       }
-       $msg = sprintf($_rename_messages['err'],$body);
+       if ($page != '') $body = sprintf($body, htmlsc($page));
+
+       $msg = sprintf($_rename_messages['err'], $body);
        return $msg;
 }
-// From->To¥á¥Ã¥»¡¼¥¸¤òºî¤ë
-function rename_arrow($from,$to)
+
+//第一段階:ページ名または正規表現の入力
+function plugin_rename_phase1($err = '', $page = '')
 {
        global $_rename_messages;
-       
-       return "$from{$_rename_messages['msg_arrow']}$to";
-}
-//Âè°ìÃʳ¬:¥Ú¡¼¥¸Ì¾¤Þ¤¿¤ÏÀµµ¬É½¸½¤ÎÆþÎÏ
-function &rename_phase1(&$s_vars,$err='',$page='')
-{
-       global $script,$vars,$_rename_messages;
-       
-       if (!array_key_exists('refer',$vars))
-       {
-               return FALSE;
-       }
-       $msg = rename_err($err,$page);
+
+       $script = get_base_uri();
+       $msg    = plugin_rename_err($err, $page);
+       $refer  = plugin_rename_getvar('refer');
+       $method = plugin_rename_getvar('method');
 
        $radio_regex = $radio_page = '';
-       if (array_key_exists('method',$vars) and $vars['method'] == 'regex')
-       {
-               $radio_regex =' checked'; 
+       if ($method == 'regex') {
+               $radio_regex = ' checked="checked"';
+       } else {
+               $radio_page  = ' checked="checked"';
        }
-       else
-       {
-               $radio_page = ' checked'; 
-       }
-       $select_refer = rename_getselecttag($vars['refer']);
+       $select_refer = plugin_rename_getselecttag($refer);
 
-       $ret['msg'] = $_rename_messages['msg_title'];
+       $s_src = htmlsc(plugin_rename_getvar('src'));
+       $s_dst = htmlsc(plugin_rename_getvar('dst'));
+
+       $ret = array();
+       $ret['msg']  = $_rename_messages['msg_title'];
        $ret['body'] = <<<EOD
 $msg
 <form action="$script" method="post">
  <div>
   <input type="hidden" name="plugin" value="rename" />
-  <input type="radio" name="method" value="page"$radio_page />
-  {$_rename_messages['msg_page']}:$select_refer<br />
-  <input type="radio" name="method" value="regex"$radio_regex />
-  {$_rename_messages['msg_regex']}:<br />
-  From:<br />
-  <input type="text" name="src" size="80" value="{$s_vars['src']}" /><br />
-  To:<br>
-  <input type="text" name="dst" size="80" value="{$s_vars['dst']}" /><br />
+  <input type="radio"  name="method" id="_p_rename_page" value="page"$radio_page />
+  <label for="_p_rename_page">{$_rename_messages['msg_page']}:</label>$select_refer<br />
+  <input type="radio"  name="method" id="_p_rename_regex" value="regex"$radio_regex />
+  <label for="_p_rename_regex">{$_rename_messages['msg_regex']}:</label><br />
+  <label for="_p_rename_from">From:</label><br />
+  <input type="text" name="src" id="_p_rename_from" size="80" value="$s_src" /><br />
+  <label for="_p_rename_to">To:</label><br />
+  <input type="text" name="dst" id="_p_rename_to"   size="80" value="$s_dst" /><br />
   <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
  </div>
 </form>
 EOD;
        return $ret;
 }
-//ÂèÆóÃʳ¬:¿·¤·¤¤Ì¾Á°¤ÎÆþÎÏ
-function &rename_phase2(&$s_vars,$err='')
+
+//第二段階:新しい名前の入力
+function plugin_rename_phase2($err = '')
 {
-       global $script,$vars,$_rename_messages;
-       
-       $msg = rename_err($err);
-
-       $related = rename_getrelated($vars['refer']);
-       sort($related);
-       if (count($related) > 0)
-       {
-               $rename_related = $_rename_messages['msg_do_related'].
-                       '<input type="checkbox" name="related" value="1" checked="checked" /><br />';
-       }
-       if ($s_vars['page'] == '')
-       {
-               $s_vars['page'] = $s_vars['refer'];
-       }
-       $msg_rename = sprintf($_rename_messages['msg_rename'],make_link($vars['refer']));
+       global $_rename_messages;
 
-       $ret['msg'] = $_rename_messages['msg_title'];
+       $script = get_base_uri();
+       $msg   = plugin_rename_err($err);
+       $page  = plugin_rename_getvar('page');
+       $refer = plugin_rename_getvar('refer');
+       if ($page == '') $page = $refer;
+
+       $msg_related = '';
+       $related = plugin_rename_getrelated($refer);
+       if (! empty($related))
+               $msg_related = '<label for="_p_rename_related">' . $_rename_messages['msg_do_related'] . '</label>' .
+               '<input type="checkbox" name="related" id="_p_rename_related" value="1" checked="checked" /><br />';
+
+       $msg_rename = sprintf($_rename_messages['msg_rename'], make_pagelink($refer));
+       $s_page  = htmlsc($page);
+       $s_refer = htmlsc($refer);
+
+       $ret = array();
+       $ret['msg']  = $_rename_messages['msg_title'];
        $ret['body'] = <<<EOD
 $msg
 <form action="$script" method="post">
  <div>
   <input type="hidden" name="plugin" value="rename" />
-  <input type="hidden" name="refer" value="{$s_vars['refer']}" />
+  <input type="hidden" name="refer"  value="$s_refer" />
   $msg_rename<br />
-  {$_rename_messages['msg_newname']}:<input type="text" name="page" size="80" value="{$s_vars['page']}" /><br />
-  $rename_related
+  <label for="_p_rename_newname">{$_rename_messages['msg_newname']}:</label>
+  <input type="text" name="page" id="_p_rename_newname" size="80" value="$s_page" /><br />
+  $msg_related
   <input type="submit" value="{$_rename_messages['btn_next']}" /><br />
  </div>
 </form>
 EOD;
-
-       if (count($related) > 0)
-       {
-               $ret['body'].= "<hr /><p>{$_rename_messages['msg_related']}</p><ul>";
-               foreach ($related as $name) { $ret['body'].= '<li>'.make_link($name).'</li>'; }
-               $ret['body'].= '</ul>';
+       if (! empty($related)) {
+               $ret['body'] .= '<hr /><p>' . $_rename_messages['msg_related'] . '</p><ul>';
+               sort($related, SORT_STRING);
+               foreach ($related as $name)
+                       $ret['body'] .= '<li>' . make_pagelink($name) . '</li>';
+               $ret['body'] .= '</ul>';
        }
        return $ret;
 }
-//¥Ú¡¼¥¸Ì¾¤È´ØÏ¢¤¹¤ë¥Ú¡¼¥¸¤òÎóµó¤·¡¢phase3¤Ø
-function &rename_refer(&$s_vars)
+
+//ページ名と関連するページを列挙し、phase3へ
+function plugin_rename_refer()
 {
-       global $vars;
+       $page  = plugin_rename_getvar('page');
+       $refer = plugin_rename_getvar('refer');
 
-       $pages[encode($vars['refer'])] = encode($vars['page']);
-       if ($vars['related'])
-       {
-               $from = strip_bracket($vars['refer']);
-               $to =   strip_bracket($vars['page']);
-               $related = rename_getrelated($vars['refer']);
-               foreach ($related as $page)
-               {
-                       $pages[encode($page)] = encode(str_replace($from,$to,$page));
-               }
+       $pages[encode($refer)] = encode($page);
+       if (plugin_rename_getvar('related') != '') {
+               $from = strip_bracket($refer);
+               $to   = strip_bracket($page);
+               foreach (plugin_rename_getrelated($refer) as $_page)
+                       $pages[encode($_page)] = encode(str_replace($from, $to, $_page));
        }
-       return rename_phase3($s_vars,$pages);
+       return plugin_rename_phase3($pages);
 }
-//Àµµ¬É½¸½¤Ç¥Ú¡¼¥¸¤òÃÖ´¹
-function &rename_regex(&$s_vars,&$arr_from,&$arr_to)
-{
-       global $vars;
 
+//正規表現でページを置換
+function plugin_rename_regex($arr_from, $arr_to)
+{
        $exists = array();
        foreach ($arr_to as $page)
-       {
                if (is_page($page))
-               {
                        $exists[] = $page;
-               }
-       }
-       if (count($exists) > 0) {
-               return rename_phase1($s_vars,'already',$exists);
-       }
 
-       $pages = array();
-       foreach ($arr_from as $refer)
-       {
-               $pages[encode($refer)] = encode(array_shift($arr_to));
+       if (! empty($exists)) {
+               return plugin_rename_phase1('already', $exists);
+       } else {
+               $pages = array();
+               foreach ($arr_from as $refer)
+                       $pages[encode($refer)] = encode(array_shift($arr_to));
+               return plugin_rename_phase3($pages);
        }
-       return rename_phase3($s_vars,$pages);
 }
-function &rename_phase3(&$s_vars,&$pages)
+
+function plugin_rename_phase3($pages)
 {
-       global $script,$vars,$_rename_messages,$adminpass;
+       global $_rename_messages;
 
-       $files = rename_get_files($pages);
+       $script = get_base_uri();
+       $msg = $input = '';
+       $files = plugin_rename_get_files($pages);
 
        $exists = array();
        foreach ($files as $_page=>$arr)
-       {
                foreach ($arr as $old=>$new)
-               {
-                       if (is_readable($new)) {
+                       if (file_exists($new))
                                $exists[$_page][$old] = $new;
-                       }
-               }
-       }
-
-       if ($vars['pass'] != '')
-       {
-               if (md5($vars['pass']) == $adminpass)
-               {
-                       return rename_proceed($s_vars,$pages,$files,$exists);
-               }
-               else
-               {
-                       $msg = rename_err('adminpass');
-               }
-       }
-
-       if ($s_vars['method'] == "regex")
-       {
-               $msg .= $_rename_messages['msg_regex']."<br />";
-               $input .= "<input type=\"hidden\" name=\"method\" value=\"regex\" />";
-               $input .= "<input type=\"hidden\" name=\"src\" value=\"{$s_vars['src']}\" />";
-               $input .= "<input type=\"hidden\" name=\"dst\" value=\"{$s_vars['dst']}\" />";
-       }
-       else
-       {
-               $msg .= $_rename_messages['msg_page']."<br />";
-               $input .= "<input type=\"hidden\" name=\"method\" value=\"page\" />";
-               $input .= "<input type=\"hidden\" name=\"refer\" value=\"{$s_vars['refer']}\" />";
-               $input .= "<input type=\"hidden\" name=\"page\" value=\"{$s_vars['page']}\" />";
-               $input .= "<input type=\"hidden\" name=\"related\" value=\"{$s_vars['related']}\" />";
-       }
 
-       if (count($exists) > 0)
-       {
-               $msg .= $_rename_messages['err_already_below']."<ul>";
-               foreach ($exists as $page=>$arr)
-               {
-                       $msg .= "<li>".rename_arrow(make_link(decode($page)),decode($pages[$page]))."<ul>\n";
-                       foreach ($arr as $ofile=>$nfile)
-                       {
-                               $msg .= "<li>".rename_arrow($ofile,$nfile)."</li>\n";
+       $pass = plugin_rename_getvar('pass');
+       if ($pass != '' && pkwk_login($pass)) {
+               return plugin_rename_proceed($pages, $files, $exists);
+       } else if ($pass != '') {
+               $msg = plugin_rename_err('adminpass');
+       }
+
+       $method = plugin_rename_getvar('method');
+       if ($method == 'regex') {
+               $s_src = htmlsc(plugin_rename_getvar('src'));
+               $s_dst = htmlsc(plugin_rename_getvar('dst'));
+               $msg   .= $_rename_messages['msg_regex'] . '<br />';
+               $input .= '<input type="hidden" name="method" value="regex" />';
+               $input .= '<input type="hidden" name="src"    value="' . $s_src . '" />';
+               $input .= '<input type="hidden" name="dst"    value="' . $s_dst . '" />';
+       } else {
+               $s_refer   = htmlsc(plugin_rename_getvar('refer'));
+               $s_page    = htmlsc(plugin_rename_getvar('page'));
+               $s_related = htmlsc(plugin_rename_getvar('related'));
+               $msg   .= $_rename_messages['msg_page'] . '<br />';
+               $input .= '<input type="hidden" name="method"  value="page" />';
+               $input .= '<input type="hidden" name="refer"   value="' . $s_refer   . '" />';
+               $input .= '<input type="hidden" name="page"    value="' . $s_page    . '" />';
+               $input .= '<input type="hidden" name="related" value="' . $s_related . '" />';
+       }
+
+       if (! empty($exists)) {
+               $msg .= $_rename_messages['err_already_below'] . '<ul>';
+               foreach ($exists as $page=>$arr) {
+                       $msg .= '<li>' . make_pagelink(decode($page));
+                       $msg .= $_rename_messages['msg_arrow'];
+                       $msg .= htmlsc(decode($pages[$page]));
+                       if (! empty($arr)) {
+                               $msg .= '<ul>' . "\n";
+                               foreach ($arr as $ofile=>$nfile)
+                                       $msg .= '<li>' . $ofile .
+                                       $_rename_messages['msg_arrow'] . $nfile . '</li>' . "\n";
+                               $msg .= '</ul>';
                        }
-                       $msg .= "</ul></li>\n";
+                       $msg .= '</li>' . "\n";
                }
-               $msg .= "</ul><hr />";
+               $msg .= '</ul><hr />' . "\n";
 
-               $input .= '<input type="radio" name="exist" value="0" checked />'.$_rename_messages['msg_exist_none'].'<br />';
-               $input .= '<input type="radio" name="exist" value="1" />'.$_rename_messages['msg_exist_overwrite'].'<br />';
+               $input .= '<input type="radio" name="exist" value="0" checked="checked" />' .
+                       $_rename_messages['msg_exist_none'] . '<br />';
+               $input .= '<input type="radio" name="exist" value="1" />' .
+                       $_rename_messages['msg_exist_overwrite'] . '<br />';
        }
+
+       $ret = array();
        $ret['msg'] = $_rename_messages['msg_title'];
-       $ret['body'] .= <<<EOD
+       $ret['body'] = <<<EOD
 <p>$msg</p>
 <form action="$script" method="post">
  <div>
   <input type="hidden" name="plugin" value="rename" />
   $input
-  {$_rename_messages['msg_adminpass']}
-  <input type="password" name="pass" value="" />
+  <label for="_p_rename_adminpass">{$_rename_messages['msg_adminpass']}</label>
+  <input type="password" name="pass" id="_p_rename_adminpass" value="" />
   <input type="submit" value="{$_rename_messages['btn_submit']}" />
  </div>
 </form>
 <p>{$_rename_messages['msg_confirm']}</p>
 EOD;
 
-       ksort($pages);
-       $ret['body'] .= "<ul>\n";
+       ksort($pages, SORT_STRING);
+       $ret['body'] .= '<ul>' . "\n";
        foreach ($pages as $old=>$new)
-       {
-               $ret['body'] .= "<li>".rename_arrow(make_link(decode($old)),decode($new))."</li>\n";
-       }
-       $ret['body'] .= "</ul>\n";
+               $ret['body'] .= '<li>' .  make_pagelink(decode($old)) .
+                       $_rename_messages['msg_arrow'] .
+                       htmlsc(decode($new)) .  '</li>' . "\n";
+       $ret['body'] .= '</ul>' . "\n";
        return $ret;
 }
 
-function &rename_get_files(&$pages)
+function plugin_rename_get_files($pages)
 {
        $files = array();
-       $dirs = array(BACKUP_DIR,DIFF_DIR,DATA_DIR);
-       if (exist_plugin_convert('attach'))
-       {
-               $dirs[] = UPLOAD_DIR; 
-       }
-       if (exist_plugin_convert('counter'))
-       {
-               $dirs[] = COUNTER_DIR;
-       }
+       $dirs  = array(BACKUP_DIR, DIFF_DIR, DATA_DIR);
+       if (exist_plugin_convert('attach'))  $dirs[] = UPLOAD_DIR;
+       if (exist_plugin_convert('counter')) $dirs[] = COUNTER_DIR;
        // and more ...
 
-       foreach ($dirs as $path)
-       {
-               if (!$dir = opendir($path))
-               {
-                       continue;
-               }
-               while ($file = readdir($dir))
-               {
-                       if ($file == '.' or $file == '..')
-                       {
-                               continue; 
-                       }
-                       foreach ($pages as $from=>$to)
-                       {
-                               $pattern = '/^'.str_replace('/','\/',$from).'([._].+)$/';
-                               if (!preg_match($pattern,$file,$matches))
-                               {
-                                       continue; 
+       $matches = array();
+       foreach ($dirs as $path) {
+               $dir = opendir($path);
+               if (! $dir) continue;   // TODO: !== FALSE or die()?
+               while (($file = readdir($dir)) !== FALSE) {
+                       if ($file == '.' || $file == '..') continue;
+                       foreach ($pages as $from => $to) {
+                               // TODO: preg_quote()?
+                               $pattern = '/^' . str_replace('/', '\/', $from) . '([._].+)$/';
+                               if (preg_match($pattern, $file, $matches)) {
+                                       $newfile = $to . $matches[1];
+                                       $files[$from][$path . $file] = $path . $newfile;
                                }
-                               $newfile = $to.$matches[1];
-                               $files[$from][$path.$file] = $path.$newfile;
                        }
                }
        }
        return $files;
 }
 
-function rename_proceed(&$s_vars,&$pages,&$files,&$exists)
+function plugin_rename_proceed($pages, $files, $exists)
 {
-       global $script,$vars,$_rename_messages,$now;
+       global $now, $_rename_messages;
 
-       if (!$vars['exist'])
-       {
+       if (plugin_rename_getvar('exist') == '')
                foreach ($exists as $key=>$arr)
-               {
-                       unset($files[$key]); 
-               }
-       }
+                       unset($files[$key]);
 
        set_time_limit(0);
-       foreach ($files as $page=>$arr)
-       {
-               foreach ($arr as $old=>$new)
-               {
-                       if ($exists[$page][$old])
-                       {
-                               unlink($new); 
-                       }
-                       rename($old,$new);
+       foreach ($files as $page=>$arr) {
+               foreach ($arr as $old=>$new) {
+                       if (isset($exists[$page][$old]) && $exists[$page][$old])
+                               unlink($new);
+                       rename($old, $new);
                }
-       }
-
-       $postdata = get_source(RENAME_LOGPAGE);
-       $postdata[] = '*'.$now."\n";
-       if ($vars['method'] == 'regex')
-       {
-               $postdata[] = '-'.$_rename_messages['msg_regex']."\n";
-               $postdata[] = '--From:'.$s_vars['src']."\n";
-               $postdata[] = '--To:'.$s_vars['dst']."\n";
-       }
-       else
-       {
-               $postdata[] = '-'.$_rename_messages['msg_page']."\n";
-               $postdata[] = '--From:'.$s_vars['refer']."\n";
-               $postdata[] = '--To:'.$s_vars['page']."\n";
-       }
-       if (count($exists) > 0)
-       {
-               $postdata[] = "\n".$_rename_messages['msg_result']."\n";
-               foreach ($exists as $page=>$arr)
-               {
-                       $postdata[] = '-'.rename_arrow(decode($page),decode($pages[$page]))."\n";
+               // linkデータベースを更新する BugTrack/327 arino
+               $new_page = $pages[$page];
+               links_update(decode($page));
+               links_update(decode($new_page));
+       }
+       // Rename counter
+       $pages_decoded = array();
+       foreach ($pages as $old=>$new) {
+               $pages_decoded[decode($old)] = decode($new);
+       }
+       plugin_counter_page_rename($pages_decoded);
+
+       $postdata = get_source(PLUGIN_RENAME_LOGPAGE);
+       $postdata[] = '*' . $now . "\n";
+       if (plugin_rename_getvar('method') == 'regex') {
+               $postdata[] = '-' . $_rename_messages['msg_regex'] . "\n";
+               $postdata[] = '--From:[[' . plugin_rename_getvar('src') . ']]' . "\n";
+               $postdata[] = '--To:[['   . plugin_rename_getvar('dst') . ']]' . "\n";
+       } else {
+               $postdata[] = '-' . $_rename_messages['msg_page'] . "\n";
+               $postdata[] = '--From:[[' . plugin_rename_getvar('refer') . ']]' . "\n";
+               $postdata[] = '--To:[['   . plugin_rename_getvar('page')  . ']]' . "\n";
+       }
+
+       if (! empty($exists)) {
+               $postdata[] = "\n" . $_rename_messages['msg_result'] . "\n";
+               foreach ($exists as $page=>$arr) {
+                       $postdata[] = '-' . decode($page) .
+                               $_rename_messages['msg_arrow'] . decode($pages[$page]) . "\n";
                        foreach ($arr as $ofile=>$nfile)
-                       {
-                               $postdata[] = '--'.rename_arrow($ofile,$nfile)."\n";
-                       }
+                               $postdata[] = '--' . $ofile .
+                                       $_rename_messages['msg_arrow'] . $nfile . "\n";
                }
-               $postdata[] = "----\n";
+               $postdata[] = '----' . "\n";
        }
+
        foreach ($pages as $old=>$new)
-       {
-               $postdata[] = '-'.rename_arrow(decode($old),decode($new))."\n";
-       }
+               $postdata[] = '-' . decode($old) .
+                       $_rename_messages['msg_arrow'] . decode($new) . "\n";
+
+       // 更新の衝突はチェックしない。
+
+       // ファイルの書き込み
+       page_write(PLUGIN_RENAME_LOGPAGE, join('', $postdata));
 
-       // ¹¹¿·¤Î¾×ÆͤϥÁ¥§¥Ã¥¯¤·¤Ê¤¤¡£
+       // Refresh RecentChanges / Delete cache/recent.dat
+       delete_recent_changes_cache();
 
-       // ¥Õ¥¡¥¤¥ë¤Î½ñ¤­¹þ¤ß
-       page_write(RENAME_LOGPAGE, join('',$postdata));
+       //リダイレクト
+       $page = plugin_rename_getvar('page');
+       if ($page == '') $page = PLUGIN_RENAME_LOGPAGE;
 
-       //¥ê¥À¥¤¥ì¥¯¥È
-       $page = rawurlencode(($vars['page'] == '') ? RENAME_LOGPAGE : $vars['page']);
-       header("Location: $script?$page");
-       die();
+       pkwk_headers_sent();
+       header('Location: ' . get_page_uri($page, PKWK_URI_ROOT));
+       exit;
 }
 
-function &rename_getrelated($page)
+function plugin_rename_getrelated($page)
 {
        $related = array();
-       $pages = get_existpages();
-       $pattern = '/(?:^|\/)'.str_replace('/','\/',strip_bracket($page)).'(?:\/|$)/';
-       foreach ($pages as $name)
-       {
-               if ($name == $page)
-               {
-                       continue; 
-               }
-               if (preg_match($pattern,$name))
-               {
-                       $related[] = $name;
-               }
+       $pages = plugin_rename_get_existpages();
+       $pattern = '/(?:^|\/)' . preg_quote(strip_bracket($page), '/') . '(?:\/|$)/';
+       foreach ($pages as $name) {
+               if ($name === $page) continue;
+               if (preg_match($pattern, $name)) $related[] = $name;
        }
        return $related;
 }
-function &rename_getselecttag($page)
+
+function plugin_rename_getselecttag($page)
 {
        global $whatsnew;
 
-       $pages =array();
-       foreach (get_existpages() as $_page)
-       {
-               if ($_page == $whatsnew)
-               {
-                       continue; 
-               }
-               $selected = ($_page == $page) ? ' selected' : '';
-               $pages[$_page] = "<option value=\"$_page\"$selected>$_page</option>";
+       $pages = array();
+       foreach (plugin_rename_get_existpages() as $_page) {
+               if ($_page === $whatsnew) continue;
+
+               $selected = ($_page === $page) ? ' selected' : '';
+               $s_page = htmlsc($_page);
+               $pages[$_page] = '<option value="' . $s_page . '"' . $selected . '>' .
+                       $s_page . '</option>';
        }
-       ksort($pages);
-       $list = join("\n ",$pages);
+       ksort($pages, SORT_STRING);
+       $list = join("\n" . ' ', $pages);
+
        return <<<EOD
 <select name="refer">
  <option value=""></option>
  $list
 </select>
 EOD;
-       return $ret;
+
+}
+
+/**
+ * List exist pages and deleted pages
+ */
+function plugin_rename_get_existpages() {
+       $list1 = array_values(get_existpages());
+       $list2 = array_values(get_existpages(DIFF_DIR, '.txt'));
+       $list3 = array_values(get_existpages(BACKUP_DIR, '.txt'));
+       $list4 = array_values(get_existpages(BACKUP_DIR, '.gz'));
+       $list5 = array_values(get_existpages(COUNTER_DIR, '.count'));
+       $wholelist = array_merge($list1, $list2, $list3, $list4, $list5);
+       $list = array_unique($wholelist);
+       return $list;
+}
+
+/**
+ * Return where the page exists or existed
+ */
+function plugin_rename_is_page($page) {
+       $enc = encode($page);
+       if (is_page($page)) {
+               return true;
+       }
+       if (file_exists(DIFF_DIR . $enc . '.txt')) {
+               return true;
+       }
+       if (file_exists(BACKUP_DIR . $enc . '.txt')) {
+               return true;
+       }
+       if (file_exists(BACKUP_DIR . $enc . '.gz')) {
+               return true;
+       }
+       if (file_exists(COUNTER_DIR . $enc . '.count')) {
+               return true;
+       }
+       return false;
+}
+
+/**
+ * Setup initial pages (:RenameLog)
+ */
+function plugin_rename_setup_initial_pages() {
+       if (!is_page(PLUGIN_RENAME_LOGPAGE)) {
+               // Create :RenameLog
+               $body = "#freeze\n// :RenameLog (rename plugin)\n";
+               page_write(PLUGIN_RENAME_LOGPAGE, $body);
+       }
 }
-?>