#!/usr/bin/perl
#
# Copyright (c) 2001,2002 Florent Villard (warly@laposte.net)
# Published under the GPL license.
#
use strict;
my $version = "0.1.0";
@ARGV == 2 or usage();
open my $DIFF, "diff -u $ARGV[0] $ARGV[1]|";
open my $F1, $ARGV[0];
open my $F2, $ARGV[1];
while (<$F2>){
print;
/
/ and last;
}
my ($file_orig,$file_new,$para1,$para2);
my $wait = 1;
($para1,$para2) = (0,0);
while (<$DIFF>){
/^---/ || /^\+\+\+/ and next;
s/<((?:sub)?title)>.*<\/\1>//g;
if (/^@@ -(\d+),(\d+) \+(\d+),(\d+) @@/){
$wait = 0 if $1 > 48;
next if $wait;
wdiff_para( $file_orig, $file_new, $para1, $para2);
($file_orig, $file_new, $para1, $para2) = ('','',0,0);
next
}
next if $wait;
$_ or next;
if (/^[- ]/){
my $t = $_;
$t =~ s/^[- ]//;
while ($t =~ /<\/para>/g) { $para1-- }
while ($t =~ /]*>/g) { $para1++ }
$file_orig .= $t
}
if (s/^[+ ]//) {
my $t = $_;
while ($t =~ /<\/para>/g) { $para2-- }
while ($t =~ /]*>/g) { $para2++ }
$file_new .= $t
}
}
wdiff_para($file_orig, $file_new, $para1, $para2);
print "
\n";
exit;
sub clean_para{
my ($f,$para) = @_;
$$f =~ s/(<.?body[^>]*>|<.?vie[^>]*>|<.?part[^>]*>|<.?chapter[^>]*>)//g;
$$f =~ s,<.?img[^>]*>,,g;
$$f =~ s,<(day|title|subtitle|src|caption|index|label|scale)[^>]*>.+\1>,,g;
$$f !~ /^\s*]*>/ and $para++;
$$f =~ s/^\s*(]*>\s*)*//;
if ($para > 0) { $$f =~ s,(\s*)*$,,}
}
sub get_day {
my ($f,$sent,$day) = @_;
while (<$f>){
if (m,]*>(.+),){
$day = $1;
}
return $day if /\Q$sent/
}
0
}
sub wdiff_para {
my ($file_orig, $file_new, $para1, $para2) = @_;
my ($new, $old, $it);
clean_para(\$file_orig,$para1);
clean_para(\$file_new,$para2);
open my $A, '>viediff-1.tmp';
print $A $file_orig;
open my $B, '>viediff-2.tmp';
print $B $file_new;
open my $C, "wdiff -y '' -z '' -1 viediff-1.tmp viediff-2.tmp|";
while (<$C>){
if (/<(para|day)([^>]*)>/ && $it) {
$it -= s/<(para|day)([^>]*)>/<$1>/g
}
while (/<\/i>/g) { $it-- }
while (//g) { $it++ }
s/<(para|day)([^>]*)>/<$1$2>/g;
s/<\/(para|day)><\/i>/<\/i><\/$1>/g;
if (/<\/(para|day)>/ && $it) {
s/<\/(para|day)>/<\/i><\/$1>/g
}
$old .= $_
}
$it = 0;
close $C;
open my $C, "wdiff -w '' -x '' -2 viediff-1.tmp viediff-2.tmp|";
while (<$C>){
if (/<(para|day)([^>]*)>/ && $it) {
$it -= s/<(para|day)([^>]*)>/<$1>/g
}
while (/<\/b>/g) { $it-- }
while (//g) { $it++ }
s/<(para|day)([^>]*)>/<$1$2>/g;
s/<\/(para|day)><\/b>/<\/b><\/$1>/g;
if (/<\/(para|day)>/ && $it) {
s/<\/(para|day)>/<\/b><\/$1>/g
}
$new .= $_
}
print "
------ Ancien texte ------------------------
$old
------ Nouveau texte -----------------------
$new\n"
}
sub usage {
print "viediff version $version
usage:
viediff \n\n";
exit
}