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






EOD; return $ret; } //第二段階:新しい名前の入力 function plugin_rename_phase2($err = '') { global $script, $_rename_messages; $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 = '' . '
'; $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'] = <<
$msg_rename

$msg_related
EOD; if (! empty($related)) { $ret['body'] .= '

' . $_rename_messages['msg_related'] . '

'; } return $ret; } //ページ名と関連するページを列挙し、phase3へ function plugin_rename_refer() { $page = plugin_rename_getvar('page'); $refer = plugin_rename_getvar('refer'); $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 plugin_rename_phase3($pages); } //正規表現でページを置換 function plugin_rename_regex($arr_from, $arr_to) { $exists = array(); foreach ($arr_to as $page) if (is_page($page)) $exists[] = $page; 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); } } function plugin_rename_phase3($pages) { global $script, $_rename_messages; $msg = $input = ''; $files = plugin_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 = 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'] . '
'; $input .= ''; $input .= ''; $input .= ''; } 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'] . '
'; $input .= ''; $input .= ''; $input .= ''; $input .= ''; } if (! empty($exists)) { $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_confirm']}

EOD; ksort($pages, SORT_STRING); $ret['body'] .= '
    ' . "\n"; foreach ($pages as $old=>$new) $ret['body'] .= '
  • ' . make_pagelink(decode($old)) . $_rename_messages['msg_arrow'] . htmlsc(decode($new)) . '
  • ' . "\n"; $ret['body'] .= '
' . "\n"; return $ret; } 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; // and more ... $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; } } } } return $files; } function plugin_rename_proceed($pages, $files, $exists) { global $now, $_rename_messages; if (plugin_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 (isset($exists[$page][$old]) && $exists[$page][$old]) unlink($new); rename($old, $new); // linkデータベースを更新する BugTrack/327 arino links_update($old); links_update($new); } } $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[] = '--' . $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(PLUGIN_RENAME_LOGPAGE, join('', $postdata)); //リダイレクト $page = plugin_rename_getvar('page'); if ($page == '') $page = PLUGIN_RENAME_LOGPAGE; pkwk_headers_sent(); header('Location: ' . get_script_uri() . '?' . pagename_urlencode($page)); exit; } function plugin_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 plugin_rename_getselecttag($page) { global $whatsnew; $pages = array(); foreach (get_existpages() as $_page) { if ($_page === $whatsnew) continue; $selected = ($_page === $page) ? ' selected' : ''; $s_page = htmlsc($_page); $pages[$_page] = ''; } ksort($pages, SORT_STRING); $list = join("\n" . ' ', $pages); return << $list EOD; }