差分表示
- 最後の更新で追加された行はこのように表示します。
- 最後の更新で削除された行はこのように表示します。
一定時間内の同一IPアドレスからの編集を一回の編集とみなし、差分をインクリメンタルに取得します。
*[incremental diff]
** ライブラリ追加
[[Algorithm::Diff::Apply http://search.cpan.org/author/ANDREWC/Algorithm-Diff-Apply-0.2.1/lib/Algorithm/Diff/Apply.pod]]を ''lib/Algorithm/Diff/Apply.pm'' に設置します。
use Algorithm::Diff::Apply qw(apply_diff); # yakty add [incremental diff]
** グローバル変数定義
# yakty add [incremental diff] start
my $info_UpdateTimeStamp = 'UpdateTimeStamp';
my $info_UpdateRemoteAddr = 'UpdateRemoteAddr';
# yakty add [incremental diff] end
15分以内の編集を同一と見なす。
my $force_update_interval = 15*60; # yakty add [incremental diff]
** do_write()内の変更
$form{mymsg} =~ s/\x0D\x0A|\x0D|\x0A/\n/g; # Walrus add [unify new-line]
my $isChanged; # yakty add [noupdate if nochange]
$isChanged = &update_diff($form{mypage}); # yakty add [incremental diff]
# Making diff
# yakty del [incremental diff] start
# {
# &open_diff;
## my @msg1 = split(/\n/, $database{$form{mypage}}); # Walrus del [unify new-line]
# my @msg1 = split(/\x0D\x0A|\x0D|\x0A/, $database{$form{mypage}}); # Walrus add [unify new-line]
# my @msg2 = split(/\n/, $form{mymsg});
# $diffbase{$form{mypage}} = &difftext(\@msg1, \@msg2);
# &close_diff;
# }
# yakty del [incremental diff] end
** update_diff()追加
-2003-07-25 (Fri) 11:11:39 ''一定時間内''の判断が全く機能していなかったので修正
-2003-10-02 (Thu) 17:56:32 UNDO機能でも使用するので、reverse_diff()を切り出し。
-[[#now]] ページ削除される場合には&reverse_diff()を行わないように変更
# yakty add [incremental diff] start
sub update_diff {
my ($page) = @_;
my @msg1 = split(/\x0D\x0A|\x0D|\x0A/, $database{$page}); # Walrus add [unify new-line]
my @msg2 = split(/\n/, $form{mymsg});
my $skippage;
&open_diff;
my $timestamp = &get_info($page, $info_UpdateTimeStamp);
if($form{mycmd} eq 'write'
if(@msg2 and $form{mycmd} eq 'write'
and time - $timestamp <= $force_update_interval
and (length($ENV{REMOTE_ADDR}) > 0 and $ENV{REMOTE_ADDR} eq &get_info($page, $info_UpdateRemoteAddr))){
# reverse diff
my @diffs = split(/\n/, $diffbase{$page});
@msg1 = &reverse_diff(\@msg1, \@diffs);
$skippage = $page;
}
my $diffmsg = &difftext(\@msg1, \@msg2);
my $isChanged = 0;
if($skippage eq $page
or $diffmsg =~ /^[^=]/m){
$isChanged = 1;
$diffbase{$page} = $diffmsg;
}
&close_diff;
&update_recent_diffs($diffmsg, $skippage); # yakty add [recent diffs]
&set_info($page, $info_UpdateTimeStamp, '' . time);
&set_info($page, $info_UpdateRemoteAddr, $ENV{REMOTE_ADDR});
return $isChanged;
}
# yakty add [incremental diff] end
** reverse_diff()追加
-2003-10-02 (Thu) 17:56:32 update_diff()から切り出し。
# yakty add [incremental diff] [undo edit] start
sub reverse_diff {
my ($msgref, $diffref) = @_;
my $lineno = 0;
my @patch;
my $hunk = [];
my $delta1 = 0;
my $delta2 = 0;
# make diff
foreach (@$diffref){
/^(.)(.*)/;
if($1 eq '-'){
push(@$hunk, ['+', $lineno+$delta1, $2]);
$delta1++;
} elsif($1 eq '+'){
push(@$hunk, ['-', $lineno+$delta2, $2]);
$delta2++;
} else {
push(@patch, $hunk) if scalar(@$hunk);
$hunk = [];
$lineno++;
}
}
push(@patch, $hunk) if scalar(@$hunk);
return &apply_diff($msgref, \@patch);
}
# yakty add [incremental diff] [undo edit] end
03345