$_page"; } $page = $tmp; } if ($page != '') { $body = sprintf($body,htmlspecialchars($page)); } $msg = sprintf($_rename_messages['err'],$body); return $msg; } //第一段階:ページ名または正規表現の入力 function rename_phase1($err='',$page='') { global $script,$_rename_messages; $msg = rename_err($err,$page); $refer = rename_getvar('refer'); $method = rename_getvar('method'); $radio_regex = $radio_page = ''; if ($method == 'regex') { $radio_regex =' checked'; } else { $radio_page = ' checked'; } $select_refer = rename_getselecttag($refer); $s_src = htmlspecialchars(rename_getvar('src')); $s_dst = htmlspecialchars(rename_getvar('dst')); $ret['msg'] = $_rename_messages['msg_title']; $ret['body'] = <<
{$_rename_messages['msg_page']}:$select_refer
{$_rename_messages['msg_regex']}:
From:

To:


EOD; return $ret; } //第二段階:新しい名前の入力 function rename_phase2($err='') { global $script,$_rename_messages; $msg = rename_err($err); $page = rename_getvar('page'); $refer = rename_getvar('refer'); if ($page == '') { $page = $refer; } $related = rename_getrelated($refer); $msg_related = ''; if (count($related) > 0) { $msg_related = $_rename_messages['msg_do_related']. '
'; } $msg_rename = sprintf($_rename_messages['msg_rename'],make_pagelink($refer)); $s_page = htmlspecialchars($page); $s_refer = htmlspecialchars($refer); $ret['msg'] = $_rename_messages['msg_title']; $ret['body'] = <<
$msg_rename
{$_rename_messages['msg_newname']}:
$msg_related
EOD; if (count($related) > 0) { $ret['body'].= "

{$_rename_messages['msg_related']}

'; } return $ret; } //ページ名と関連するページを列挙し、phase3へ function rename_refer() { $page = rename_getvar('page'); $refer = rename_getvar('refer'); $pages[encode($refer)] = encode($page); if (rename_getvar('related') != '') { $from = strip_bracket($refer); $to = strip_bracket($page); foreach (rename_getrelated($refer) as $_page) { $pages[encode($_page)] = encode(str_replace($from,$to,$_page)); } } return rename_phase3($pages); } //正規表現でページを置換 function 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('already',$exists); } $pages = array(); foreach ($arr_from as $refer) { $pages[encode($refer)] = encode(array_shift($arr_to)); } return rename_phase3($pages); } function rename_phase3($pages) { global $script,$adminpass,$_rename_messages; $msg = $input = ''; $files = rename_get_files($pages); $exists = array(); foreach ($files as $_page=>$arr) { foreach ($arr as $old=>$new) { if (file_exists($new)) { $exists[$_page][$old] = $new; } } } $pass = rename_getvar('pass'); if (md5($pass) == $adminpass) { return rename_proceed($pages,$files,$exists); } else if ($pass != '') { $msg = rename_err('adminpass'); } $method = rename_getvar('method'); if ($method == 'regex') { $s_src = htmlspecialchars(rename_getvar('src')); $s_dst = htmlspecialchars(rename_getvar('dst')); $msg .= $_rename_messages['msg_regex']."
"; $input .= ""; $input .= ""; $input .= ""; } else { $s_refer = htmlspecialchars(rename_getvar('refer')); $s_page = htmlspecialchars(rename_getvar('page')); $s_related = htmlspecialchars(rename_getvar('related')); $msg .= $_rename_messages['msg_page']."
"; $input .= ""; $input .= ""; $input .= ""; $input .= ""; } if (count($exists) > 0) { $msg .= $_rename_messages['err_already_below']."
\n"; $input .= ''.$_rename_messages['msg_exist_none'].'
'; $input .= ''.$_rename_messages['msg_exist_overwrite'].'
'; } $ret['msg'] = $_rename_messages['msg_title']; $ret['body'] = <<$msg

$input {$_rename_messages['msg_adminpass']}

{$_rename_messages['msg_confirm']}

EOD; ksort($pages); $ret['body'] .= "
    \n"; foreach ($pages as $old=>$new) { $ret['body'] .= "
  • ". make_pagelink(decode($old)). $_rename_messages['msg_arrow']. htmlspecialchars(decode($new)). "
  • \n"; } $ret['body'] .= "
\n"; return $ret; } function 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; } // 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; } $newfile = $to.$matches[1]; $files[$from][$path.$file] = $path.$newfile; } } } return $files; } function rename_proceed($pages,$files,$exists) { global $script,$now,$_rename_messages; if (rename_getvar('exist') == '') { foreach ($exists as $key=>$arr) { 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); // linkデータベースを更新する BugTrack/327 arino links_update($old); links_update($new); } } $postdata = get_source(RENAME_LOGPAGE); $postdata[] = '*'.$now."\n"; if (rename_getvar('method') == 'regex') { $postdata[] = '-'.$_rename_messages['msg_regex']."\n"; $postdata[] = '--From:[['.rename_getvar('src')."]]\n"; $postdata[] = '--To:[['.rename_getvar('dst')."]]\n"; } else { $postdata[] = '-'.$_rename_messages['msg_page']."\n"; $postdata[] = '--From:[['.rename_getvar('refer')."]]\n"; $postdata[] = '--To:[['.rename_getvar('page')."]]\n"; } if (count($exists) > 0) { $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[] = '--'.$ofile. $_rename_messages['msg_arrow'].$nfile."\n"; } } $postdata[] = "----\n"; } foreach ($pages as $old=>$new) { $postdata[] = '-'.decode($old). $_rename_messages['msg_arrow'].decode($new)."\n"; } // 更新の衝突はチェックしない。 // ファイルの書き込み page_write(RENAME_LOGPAGE, join('',$postdata)); //リダイレクト $page = rename_getvar('page'); if ($page == '') { $page = RENAME_LOGPAGE; } header("Location: $script?".rawurlencode($page)); die(); } function rename_getrelated($page) { $related = array(); $pages = 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) { global $whatsnew; $pages =array(); foreach (get_existpages() as $_page) { if ($_page == $whatsnew) { continue; } $selected = ($_page == $page) ? ' selected' : ''; $s_page = htmlspecialchars($_page); $pages[$_page] = ""; } ksort($pages); $list = join("\n ",$pages); return << $list EOD; return $ret; } ?>