--- diff.inc.php.orig Sun Oct 31 14:21:47 2004 +++ diff.inc.php Sun Feb 20 23:27:42 2005 @@ -16,6 +16,7 @@ $action = isset($vars['action']) ? $vars['action'] : ''; switch ($action) { case 'delete': $retval = plugin_diff_delete($page); break; + case 'undo': $retval = plugin_diff_undo($page); break; default: $retval = plugin_diff_view($page); break; } return $retval; @@ -27,6 +28,7 @@ global $script, $hr; global $_msg_notfound, $_msg_goto, $_msg_deleted, $_msg_addline, $_msg_delline, $_title_diff; global $_title_diff_delete; + global $_title_diff_undo; $r_page = rawurlencode($page); $s_page = htmlspecialchars($page); @@ -50,6 +52,7 @@ $diffdata = preg_replace('/^(\+)(.*)$/m', ' $2', $diffdata); $menu[] = "
  • " . str_replace('$1', $s_page, $_title_diff_delete) . '
  • '; + $menu[] = "
  • $_title_diff_undo
  • "; $msg = "
    $diffdata
    \n"; } else if ($is_page) { @@ -111,5 +114,90 @@ EOD; return array('msg'=>$_title_diff_delete, 'body'=>$body); +} + +// 変更点を元に戻す +function plugin_diff_undo($page) +{ + global $script, $vars; + global $_title_diff_undo; + global $_msg_diff_adminpass, $_btn_undo, $_msg_invalidpass; + + $filename = DIFF_DIR . encode($page) . '.txt'; + $body = ''; + if (! is_pagename($page)) $body = "Invalid page name"; + if (! file_exists($filename)) $body = make_pagelink($page) . "'s diff seems not found"; + if ($body) return array('msg'=>$_title_diff_undo, 'body'=>$body); + + if (isset($vars['pass'])) { + if (pkwk_login($vars['pass'])) { + + if (file_exists($filename)) { + $postdata = ''; + $diffdata = file($filename); + foreach($diffdata as $_line) { + $match = array(); + if(preg_match('/^[\s\-](.*)$/',$_line,$match)) { + $postdata .= $match[1] . "\n"; + } + } + // Create wiki text + file_write(DATA_DIR, $page, $postdata); + + // make diff data from backup + $backups = get_backup($page); + $_olddata = array_pop($backups); + $count = count($backups); + if( $count>0 ) { + $olddata = join('', $_olddata['data']); + $predata = join('', $backups[$count]['data']); + + // Create and write diff + $diffdata = do_diff($predata, $olddata); + file_write(DIFF_DIR, $page, $diffdata); + + // update backup + $strout = ''; + foreach($backups as $data) { + $strout .= PKWK_SPLITTER . ' ' . $data['time'] . "\n"; // Splitter format + $strout .= join('', $data['data']); + } + $strout = preg_replace("/([^\n])\n*$/", "$1\n", $strout); + + $fp = _backup_fopen($page, 'wb') + or die_message('cannot write file ' . htmlspecialchars($realfilename) . + '
    maybe permission is not writable or filename is too long'); + _backup_fputs($fp, $strout); + _backup_fputs($fp, $body); + _backup_fclose($fp); + } + else { + // no backup + unlink($filename); + } + } + header('Location: ' . get_script_uri() . '?' . rawurlencode($page)); + exit; + + } else { + $body .= "

    $_msg_invalidpass

    \n"; + } + } + + $s_page = htmlspecialchars($page); + $body .= <<$_msg_diff_adminpass

    +
    +
    + + + + + +
    +
    +EOD; + + return array('msg'=>$_title_diff_undo, 'body'=>$body); } ?>