$_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 = array(); $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 = array(); $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, $_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 ($pass != '' && pkwk_login($pass)) { 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 = array(); $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 ... $matches = array(); foreach ($dirs as $path) { $dir = opendir($path); if (! $dir) 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; } ?>