' . $_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'] . '
';
sort($related, SORT_STRING);
foreach ($related as $name)
$ret['body'] .= '- ' . make_pagelink($name) . '
';
$ret['body'] .= '
';
}
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'] . '';
foreach ($exists as $page=>$arr) {
$msg .= '- ' . make_pagelink(decode($page));
$msg .= $_rename_messages['msg_arrow'];
$msg .= htmlsc(decode($pages[$page]));
if (! empty($arr)) {
$msg .= '
' . "\n";
foreach ($arr as $ofile=>$nfile)
$msg .= '- ' . $ofile .
$_rename_messages['msg_arrow'] . $nfile . '
' . "\n";
$msg .= '
';
}
$msg .= ' ' . "\n";
}
$msg .= '
' . "\n";
$input .= '' .
$_rename_messages['msg_exist_none'] . '
';
$input .= '' .
$_rename_messages['msg_exist_overwrite'] . '
';
}
$ret = array();
$ret['msg'] = $_rename_messages['msg_title'];
$ret['body'] = <<$msg
{$_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;
}