#!/usr/bin/perl -w # Visual diff in Tk # Copyright Clinton Pierce 2001 # Re-distributable under the same terms as Perl itself use strict; use Tk; use Tk::Font; use Algorithm::Diff qw(traverse_sequences); die "$0: 2 Args" unless (@ARGV == 2); sub fill { local(*A,$/); open(A, $_[0]) || die "$_[0]: $!"; # Changing the split re changes how the document # is diff'd. Using \b goes word-by-word, using # \n goes line-by-line, etc. return split(/\b/, <A>); } my $mw=new MainWindow; my $tb=$mw->Scrolled('Text')->pack(-expand => 1, -fill => 'both'); my $fn=$mw->Font(); my $fo=$mw->Font(-overstrike => 1); my @a1=fill(shift); my @a2=fill(shift); traverse_sequences(\@a1, \@a2, { MATCH => sub { $tb->insert('end', $a1[$_[0]], 'match'); }, DISCARD_A => sub { $tb->insert('end', $a1[$_[0]], 'disca'); }, DISCARD_B => sub { $tb->insert('end', $a2[$_[1]], 'discb'); }, }); $tb->tagConfigure('match', -foreground => 'black', -font => $fn); $tb->tagConfigure('disca', -foreground => 'red', -font => $fo); $tb->tagConfigure('discb', -foreground => 'blue', -font => $fn); $mw->MainLoop;
In reply to Visual diff in Tk by clintp
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |