package Ernad::Pages; use strict; use warnings; use Carp qw(confess); use Encode; use File::Path; use XML::LibXML; use Ernad::Files; use Krichel::File; ## bad version for trabbi sub install { my $doc=shift; my $out_file=shift; my $debug=shift // ''; use File::Basename; use File::Copy; if(not ref($doc) eq 'XML::LibXML::Document') { confess "I need a document here."; } my $fh = File::Temp->new(); my $tmp_file = $fh->filename; if(not -f $out_file) { &Krichel::File::prepare($out_file); if($debug) { print "I installed $out_file\n"; } $doc->toFile($out_file,1); return 1; } $doc->toFile($tmp_file,1); my $diff=`diff -w $tmp_file $out_file`; chomp $diff; if(not $diff) { if($debug) { print "$out_file is unchanged.\n"; } return 0; } $diff=decode('UTF-8', $diff); if(diff_matches_date_or_time($diff)) { if($debug) { print "I keep old version of $out_file\n"; } return 0; } if($debug) { print "I install a new version of $out_file\n$diff\n"; } copy($tmp_file,$out_file); return 1; } sub diff_matches_date_or_time { my $diff=shift; ## first case, date only my $dareg="\\d{4}\\x{2012}\\d{2}\\x{2012}\\d{2}"; my $r="^\\d+c\\d+\\s*[<>]\\s*$dareg\\.\\s*---\\s*[<>]\\s+$dareg\\.\\s*".'$'; if($diff=~m|$r|) { return 'date'; } ## extent for the time $dareg.="\\s+at\\s+\\d{2}:\\d{2}:\\d{2}"; ## same definition of r as above $r="^\\d+c\\d+\\s*[<>]\\s*$dareg\\.\\s*---\\s*[<>]\\s+$dareg\\.\\s*".'$'; if($diff=~m|$r|) { return 'time'; } return 0; } sub install_new { my $doc=shift; my $out_file=shift; my $debug=shift // ''; #use Text::Diff; if(not ref($doc) eq 'XML::LibXML::Document') { confess "I need a document here."; } if(not -f $out_file) { &Krichel::File::prepare($out_file); if($debug) { print "I installed $out_file\n"; } $doc->toFile($out_file,1); return 1; } my $string=$doc->toString(1); my $diff; ### $diff = diff $out_file, \$string, { STYLE => "OldStyle" }; if(not $diff) { if($debug) { print "$out_file is unchanged.\n"; } return 0; } $diff=decode('UTF-8', $diff); ## the datetime has to be a separate line, ending with a dot. my $dareg="\\d{4}\\x{2012}\\d{2}\\x{2012}\\d{2}"; if($diff=~m|^\d+c\d+\s*[<>]\s*$dareg\.\s*---\s*[<>]\s+$dareg\.\s*$|) { if($debug) { print "I keep old version of $out_file\n$diff\n"; } return 0; } ## continue with time added ... $dareg.=" at [012]:[0-9]:[0-5][0-9]:[0-5][0-9] UTC"; if($debug) { print "I install a new version of $out_file\n$diff\n"; } $doc->toFile($out_file,1); return 1; } 1;