Mercurial > hg > Applications > casawiki
diff Yuki/DiffText.pm @ 0:a2f0a2c135cf
hg init
author | Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 06 Jun 2010 22:00:38 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Yuki/DiffText.pm Sun Jun 06 22:00:38 2010 +0900 @@ -0,0 +1,90 @@ +package Yuki::DiffText; +use strict; +use Algorithm::Diff qw(traverse_sequences); +use vars qw($VERSION @EXPORT_OK @ISA); +use vars qw($diff_text $diff_msgrefA $diff_msgrefB @diff_deleted @diff_added); +require Exporter; +@ISA = qw(Exporter); +@EXPORT_OK = qw(difftext); +$VERSION = '0.1'; + +=head1 NAME + +Yuki::DiffText - A wrapper of Algorithm::Diff for YukiWiki. + +=head1 SYNOPSIS + + use strict; + use Yuki::DiffText qw(difftext); + + my @array1 = ( "Alice", "Bobby", "Chris", ); + my @array2 = ( "Alice", "Chris", "Diana", ); + my $difftext = difftext(\@array1, \@array2); + print $difftext; + + # Result: + # =Alice + # -Bobby + # =Chris + # +Diana + +=head1 SEE ALSO + +=over 4 + +=item L<Algorithm::Diff> + +=back + +=head1 AUTHOR + +Hiroshi Yuki <hyuki@hyuki.com> http://www.hyuki.com/ + +=head1 LICENSE + +Copyright (C) 2002 by Hiroshi Yuki. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut + +sub difftext { + ($diff_msgrefA, $diff_msgrefB) = @_; + undef $diff_text; + undef @diff_deleted; + undef @diff_added; + traverse_sequences( + $diff_msgrefA, $diff_msgrefB, + { + MATCH => \&df_match, + DISCARD_A => \&df_delete, + DISCARD_B => \&df_add, + } + ); + &diff_flush; + return $diff_text; +} + +sub diff_flush { + $diff_text .= join('', map { "-$_\n" } splice(@diff_deleted)); + $diff_text .= join('', map { "+$_\n" } splice(@diff_added)); +} + +sub df_match { + my ($a, $b) = @_; + &diff_flush; + $diff_text .= "=$diff_msgrefA->[$a]\n"; +} + +sub df_delete { + my ($a, $b) = @_; + push(@diff_deleted, $diff_msgrefA->[$a]); +} + +sub df_add { + my ($a, $b) = @_; + push(@diff_added, $diff_msgrefB->[$b]); +} + +1;