summaryrefslogtreecommitdiff
path: root/lib/VNDB/Util
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2010-11-26 09:04:35 +0100
committerYorhel <git@yorhel.nl>2010-11-26 09:04:35 +0100
commitdd0ebd6963f42dc00eedc5d896ed3c60b99b72f1 (patch)
tree5f07cf150f7a28a4dae66d9c34c6d6b511bf3fff /lib/VNDB/Util
parent625871cba8a2fe71c70b3d2946a5f37993d1f263 (diff)
Use word-level (instead of character-level) diff for large fields
Primary reason for this change is because Algorithm::Diff::Fast isn't all that fast for character-level diffs. :-/
Diffstat (limited to 'lib/VNDB/Util')
-rw-r--r--lib/VNDB/Util/CommonHTML.pm9
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/VNDB/Util/CommonHTML.pm b/lib/VNDB/Util/CommonHTML.pm
index a862911d..280ceddb 100644
--- a/lib/VNDB/Util/CommonHTML.pm
+++ b/lib/VNDB/Util/CommonHTML.pm
@@ -153,7 +153,7 @@ sub htmlHiddenMessage {
# Where @fields is a list of fields as arrayrefs with:
# [ shortname, displayname, %options ],
# Where %options:
-# diff => 1/0, whether do show a diff on this field
+# diff => 1/0/regex, whether to show a diff on this field, and what to split it with (1 = character-level diff)
# serialize => coderef, should convert the field into a readable string, no HTML allowed
# htmlize => same as serialize, but HTML is allowed and this can't be diff'ed
# split => coderef, should return an array of HTML strings that can be diff'ed. (implies diff => 1)
@@ -226,7 +226,7 @@ sub revdiff {
my($i, $type, $old, $new, $short, %o) = @_;
$o{serialize} ||= $o{htmlize};
- $o{diff}++ if $o{split};
+ $o{diff} = 1 if $o{split};
$o{join} ||= '';
my $ser1 = $o{serialize} ? $o{serialize}->($old->{$short}, $old) : $old->{$short};
@@ -234,8 +234,9 @@ sub revdiff {
return if $ser1 eq $ser2;
if($o{diff} && $ser1 && $ser2) {
- my @ser1 = $o{split} ? $o{split}->($ser1) : map xml_escape($_), split //, $ser1;
- my @ser2 = $o{split} ? $o{split}->($ser2) : map xml_escape($_), split //, $ser2;
+ my $sep = ref $o{diff} ? qr/($o{diff})/ : qr//;
+ my @ser1 = $o{split} ? $o{split}->($ser1) : map xml_escape($_), split $sep, $ser1;
+ my @ser2 = $o{split} ? $o{split}->($ser2) : map xml_escape($_), split $sep, $ser2;
return if $o{split} && $#ser1 == $#ser2 && !grep $ser1[$_] ne $ser2[$_], 0..$#ser1;
$ser1 = $ser2 = '';