| 1 |
wakaba |
1.1 |
package Yuki::DiffText;
|
| 2 |
|
|
use strict;
|
| 3 |
|
|
use Algorithm::Diff qw(traverse_sequences);
|
| 4 |
|
|
use vars qw($VERSION @EXPORT_OK @ISA);
|
| 5 |
|
|
use vars qw($diff_text $diff_msgrefA $diff_msgrefB @diff_deleted @diff_added);
|
| 6 |
|
|
require Exporter;
|
| 7 |
|
|
@ISA = qw(Exporter);
|
| 8 |
|
|
@EXPORT_OK = qw(difftext);
|
| 9 |
|
|
$VERSION = '0.1';
|
| 10 |
|
|
|
| 11 |
|
|
=head1 NAME
|
| 12 |
|
|
|
| 13 |
|
|
Yuki::DiffText - A wrapper of Algorithm::Diff for YukiWiki.
|
| 14 |
|
|
|
| 15 |
|
|
=head1 SYNOPSIS
|
| 16 |
|
|
|
| 17 |
|
|
use strict;
|
| 18 |
|
|
use Yuki::DiffText qw(difftext);
|
| 19 |
|
|
|
| 20 |
|
|
my @array1 = ( "Alice", "Bobby", "Chris", );
|
| 21 |
|
|
my @array2 = ( "Alice", "Chris", "Diana", );
|
| 22 |
|
|
my $difftext = difftext(\@array1, \@array2);
|
| 23 |
|
|
print $difftext;
|
| 24 |
|
|
|
| 25 |
|
|
# Result:
|
| 26 |
|
|
# =Alice
|
| 27 |
|
|
# -Bobby
|
| 28 |
|
|
# =Chris
|
| 29 |
|
|
# +Diana
|
| 30 |
|
|
|
| 31 |
|
|
=head1 SEE ALSO
|
| 32 |
|
|
|
| 33 |
|
|
=over 4
|
| 34 |
|
|
|
| 35 |
|
|
=item L<Algorithm::Diff>
|
| 36 |
|
|
|
| 37 |
|
|
=back
|
| 38 |
|
|
|
| 39 |
|
|
=head1 AUTHOR
|
| 40 |
|
|
|
| 41 |
|
|
Hiroshi Yuki <[email protected]> http://www.hyuki.com/
|
| 42 |
|
|
|
| 43 |
|
|
=head1 LICENSE
|
| 44 |
|
|
|
| 45 |
|
|
Copyright (C) 2002 by Hiroshi Yuki.
|
| 46 |
|
|
|
| 47 |
|
|
This program is free software; you can redistribute it and/or
|
| 48 |
|
|
modify it under the same terms as Perl itself.
|
| 49 |
|
|
|
| 50 |
|
|
=cut
|
| 51 |
|
|
|
| 52 |
|
|
sub difftext {
|
| 53 |
|
|
($diff_msgrefA, $diff_msgrefB) = @_;
|
| 54 |
|
|
undef $diff_text;
|
| 55 |
|
|
undef @diff_deleted;
|
| 56 |
|
|
undef @diff_added;
|
| 57 |
|
|
traverse_sequences(
|
| 58 |
|
|
$diff_msgrefA, $diff_msgrefB,
|
| 59 |
|
|
{
|
| 60 |
|
|
MATCH => \&df_match,
|
| 61 |
|
|
DISCARD_A => \&df_delete,
|
| 62 |
|
|
DISCARD_B => \&df_add,
|
| 63 |
|
|
}
|
| 64 |
|
|
);
|
| 65 |
|
|
&diff_flush;
|
| 66 |
|
|
return $diff_text;
|
| 67 |
|
|
}
|
| 68 |
|
|
|
| 69 |
|
|
sub diff_flush {
|
| 70 |
|
|
$diff_text .= join('', map { "-$_\n" } splice(@diff_deleted));
|
| 71 |
|
|
$diff_text .= join('', map { "+$_\n" } splice(@diff_added));
|
| 72 |
|
|
}
|
| 73 |
|
|
|
| 74 |
|
|
sub df_match {
|
| 75 |
|
|
my ($a, $b) = @_;
|
| 76 |
|
|
&diff_flush;
|
| 77 |
|
|
$diff_text .= "=$diff_msgrefA->[$a]\n";
|
| 78 |
|
|
}
|
| 79 |
|
|
|
| 80 |
|
|
sub df_delete {
|
| 81 |
|
|
my ($a, $b) = @_;
|
| 82 |
|
|
push(@diff_deleted, $diff_msgrefA->[$a]);
|
| 83 |
|
|
}
|
| 84 |
|
|
|
| 85 |
|
|
sub df_add {
|
| 86 |
|
|
my ($a, $b) = @_;
|
| 87 |
|
|
push(@diff_added, $diff_msgrefB->[$b]);
|
| 88 |
|
|
}
|
| 89 |
|
|
|
| 90 |
|
|
1;
|