#!/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;
    /<body>/ 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 =~ /<para[^>]*>/g) { $para1++ }
	$file_orig .= $t
    } 
    if (s/^[+ ]//) {
	my $t = $_;
	while ($t =~ /<\/para>/g) { $para2-- }
	while ($t =~ /<para[^>]*>/g) { $para2++ }
	$file_new .= $t
    } 
}
wdiff_para($file_orig, $file_new, $para1, $para2);
print "</body>
</vie>\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*<para[^>]*>/ and $para++;
    $$f =~ s/^\s*(<para[^>]*>\s*)*/<para>/;
    if ($para > 0) { $$f =~ s,(</para>\s*)*$,</para>,}
}

sub get_day {
    my ($f,$sent,$day) = @_;
    while (<$f>){
	if (m,<day[^>]*>(.+)</day>,){
	    $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 '<i>' -z '</i>' -1 viediff-1.tmp viediff-2.tmp|";
    while (<$C>){ 
	if (/<(para|day)([^>]*)>/ && $it) {
	    $it -= s/<(para|day)([^>]*)>/<$1><i>/g
	}
	while (/<\/i>/g) { $it-- }
	while (/<i>/g) { $it++ }
	s/<i><(para|day)([^>]*)>/<$1$2><i>/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 '<b>' -x '</b>' -2 viediff-1.tmp viediff-2.tmp|";
    while (<$C>){ 
	if (/<(para|day)([^>]*)>/ && $it) {
	    $it -= s/<(para|day)([^>]*)>/<$1><b>/g
	}
	while (/<\/b>/g) { $it-- }
	while (/<b>/g) { $it++ }
	s/<b><(para|day)([^>]*)>/<$1$2><b>/g;
	s/<\/(para|day)><\/b>/<\/b><\/$1>/g;
	if (/<\/(para|day)>/ && $it) {
	    s/<\/(para|day)>/<\/b><\/$1>/g
	}
	$new .= $_
    }
    print "
<para>------ Ancien texte ------------------------</para>
$old
<para>------ Nouveau texte -----------------------</para>
$new\n"
}

sub usage {
    print "viediff version $version
    
    usage:
    
	viediff <vie.xml file 1> <vie.xml file 2>\n\n";
    exit
}
