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 <hyuki@hyuki.com> 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;
|