diff --git "a/outils/extrait-xml-\303\251diteur/README.md" "b/outils/extrait-xml-\303\251diteur/README.md" index 36c877e..599d2e9 100644 --- "a/outils/extrait-xml-\303\251diteur/README.md" +++ "b/outils/extrait-xml-\303\251diteur/README.md" @@ -5,3 +5,24 @@ renommer pour lui donner la même racine que le document auquel il fait référence. Il travaille sur un fichier ou sur un répertoire de fichiers “.zip”. +**N.B. : certains cas problématiques ne sont toujours pas traités de façon adéquate et sont laissés à la charge de l’utilisateur.** + +### Usage +``` + extraitXmlEditeur.pl -r répertoire -n nombre_fichiers -m motif [ -l log ] + extraitXmlEditeur.pl -f fichier [ -l log ] + extraitXmlEditeur.pl -h +``` + +### Options +``` + -f indique le nom du fichier “.zip” contenant le fichier XML éditeur à extraire. + -h affiche cette aide. + -l indique le nom du fichier “log” recevant les messages d’erreur du programme. + -m indique le préfixe utilisé au début du nom des fichiers “.zip” du répertoire donné par + l’option “-r”. + -n indique le nombre de fichier “.zip” attendus. + -r indique le répertoire où se trouve les fichiers “.zip” déchargés par le programme + “harvestCorpus.pl” et d’où doivent être extrait les fichiers XML éditeurs. +``` + diff --git "a/outils/extrait-xml-\303\251diteur/extraitXmlEditeur.pl" "b/outils/extrait-xml-\303\251diteur/extraitXmlEditeur.pl" new file mode 100755 index 0000000..db76c46 --- /dev/null +++ "b/outils/extrait-xml-\303\251diteur/extraitXmlEditeur.pl" @@ -0,0 +1,284 @@ +#!/usr/bin/perl + + +# Déclaration des pragmas +use strict; +use utf8; +use open qw/:std :utf8/; + +# Appel des modules externes de base +use Encode qw(decode_utf8 encode_utf8 is_utf8); +use Getopt::Long; + +my ($programme) = $0 =~ m|^(?:.*/)?(.+)|; + +# Variables nécessaires pour les options +my $aide = undef; +my $fichier = undef; +my $log = undef; +my $motif = undef; +my $nombre = undef; +my $pdf = undef; +my $repertoire = undef; + +# integre les options que l'on peut donner en lancant le programme +eval { + $SIG{__WARN__} = sub {usage(1);}; + GetOptions( + "fichier=s" => \$fichier, + "help" => \$aide, + "log=s" => \$log, + "motif=s" => \$motif, + "nombre=i" => \$nombre, + "pdf" => \$pdf, + "repertoire=s" => \$repertoire, + ); + }; +$SIG{__WARN__} = sub {warn $_[0];}; + +usage(2) if not $repertoire and not $fichier; +usage(2) if $repertoire and (not $nombre or not $motif); + +if ( $log ) { + if ( -f $log ) { + open(LOG, ">>:utf8", $log) or die "$!,"; + } + else { + open(LOG, ">:utf8", $log) or die "$!,"; + } + my @time = localtime(); + my $jour = (qw(Dimanche Lundi Mardi Mercredi Jeudi Vendredi Samedi))[$time[6]]; + my $mois = (qw(Janvier Février Mars Avril Mai juin Juillet Août Septembre Octobre Novembre Décembre))[$time[4]]; + my $annee = $time[5] + 1900; + my $date = "$jour $time[3] $mois $annee "; + $date .= sprintf("%02d:%02d:%02D", $time[2], $time[1], $time[0]); + if ( $repertoire ) { + print LOG "\n===> $repertoire <=== $date\n\n"; + } + elsif ( $fichier ) { + print LOG " - $fichier : $date\n"; + } + } +else { + open(LOG, ">&STDERR") or die "$!,"; + } + +if ( $repertoire ) { + if ( not -d $repertoire ) { + print STDERR "Erreur : répertoire \"$repertoire\" absent\n"; + exit 3; + } + + if ( $nombre < 1 ) { + print STDERR "Erreur : le nombre de fichier doit être un entier positif\n"; + exit 4; + } + + my @restant = (); + foreach my $valeur (1 .. $nombre) { + $restant[$valeur] = 1; + } + + opendir(DIR, $repertoire) or die "$!,"; + my @fichiers = sort grep(/^${motif}_?\d+\.zip\z/, readdir DIR); + closedir DIR; + + foreach my $fichier (@fichiers) { + my ($valeur) = $fichier =~ /^${motif}_?(\d+)\.zip/; + my ($base) = $fichier =~ /^(${motif}_?\d+)\.zip/; + $restant[$valeur] = 0; + if ( -f "$repertoire/$base.xml" ) { + next; + } + traite($repertoire, $fichier, $base); + } + + my $absent = 0; + foreach my $valeur (1 .. $nombre) { + if ( $restant[$valeur] ) { + $absent ++; + print LOG "Pas de fichier ZIP pour document n° $valeur\n"; + } + } + + if ( $absent ) { + print LOG "Total : $absent fichiers ZIP absents\n"; + } + } + +elsif ( $fichier ) { + my ($chemin, $nom, $base) = $fichier =~ m|^(.*/)((.+)\.[Zz][Ii][Pp])|o; + $chemin = "." if not $chemin; + traite($chemin, $nom, $base); + } + + +exit 0; + + +sub usage +{ +my $code = shift; + +print STDERR "\n"; +print STDERR "Usage : $programme -r répertoire -n nombre_fichiers -m motif [ -l log ] \n"; +print STDERR " $programme -f fichier [ -l log ] \n"; +print STDERR " $programme -h \n"; + +exit $code; +} + +sub erreur +{ +my ($message, $code) = @_; + +print LOG "$message\n"; + +exit $code; +} + +sub traite +{ +my ($directory, $file, $base) = @_; + +my @pdf = (); +my @xml = (); +my $type = 0; + +open(INP, "unzip -l $directory/$file 2>&1 |") or die "$!,"; +while() { + if ( /\.pdf\s*$/io ) { + my @tmp = split(/\s+/); + push(@pdf, $tmp[$#tmp]); + erreur("Erreur sur fichier \"$file\"", 5) if $tmp[$#tmp] !~ /\.pdf\z/i; + } + elsif ( /\.xml\s*$/io ) { + my @tmp = split(/\s+/); + push(@xml, $tmp[$#tmp]); + erreur("Erreur sur fichier \"$file\"", 6) if $tmp[$#tmp] !~ /\.xml\z/i; + } + elsif ( /\.xml\b/io ) { + my @tmp = split(/\s+/); + push(@xml, $tmp[$#tmp]); + erreur("Erreur sur fichier \"$file\"", 6) if $tmp[$#tmp] !~ /\.xml\b/i; + } + elsif ( /unzip: +cannot find zipfile directory/o ) { + print LOG "Le fichier \"$file\" n'est pas une archive ZIP\n"; + $type = 1; + last; + } + elsif ( /: +zipfile is empty/o ) { + print LOG "L'archive ZIP \"$file\" est vide\n"; + $type = 2; + last; + } + } +close INP; + +return $type if $type; + +if ( $#pdf > 0 ) { + my @tmp = (); + foreach my $pdf (@pdf) { + my ($debut) = $pdf =~ /^(.+)\.pdf/io; + if (grep(/^$debut.xml\z/i, @xml) > 0) { + push(@tmp, $pdf); + next; + } + $debut =~ s/pdf/xml/o; + if (grep(/^$debut.xml\z/, @xml) > 0) { + push(@tmp, $pdf); + } + $debut =~ s/PDF/XML/o; + if (grep(/^$debut.xml\z/i, @xml) > 0) { + push(@tmp, $pdf); + } + ($debut) = $pdf =~ m|^(?:.+/)?(.+)\.pdf|io; + if (grep(/^$debut.xml\b/i, @xml) > 0) { + push(@tmp, $pdf); + } + } + if ( $#tmp == 0 ) { + @pdf = @tmp; + } + elsif ( $#tmp > 0 ) { + print LOG "Attention : PDF multiples pour \"$file\"\n"; + return 3; + } + elsif ( $#xml < 0 or $#xml > 0 ) { + print LOG "Attention : cas bizarre pour \"$file\"\n"; + return 4; + } + } + +if ( $#pdf == 0 ) { + my ($debut) = $pdf[0] =~ /^(.+)\.pdf/io; + my @cibles = grep(/^$debut.xml\z/i, @xml); + if ( $#cibles == 0 ) { + my ($racine) = $debut =~ m|^(?:.*/)?(.+)|o; + system "unzip -j $directory/$file $cibles[0] > /dev/null"; + if ( -f "$racine.xml" ) { + system "mv $racine.xml $directory/$base.xml" + } + elsif ( -f "$racine.XML" ) { + system "mv $racine.XML $directory/$base.xml" + } + else { + print LOG "Erreur : pas de fichier \"$racine.xml\" extrait de \"$file\"\n"; + } + } + else { + if ( $debut =~ /\bpdf\b/o ) { + $debut =~ s/pdf/xml/o; + } + if ( $debut =~ /\bPDF\b/o ) { + $debut =~ s/PDF/XML/o; + } + @cibles = grep(/^$debut.xml\z/i, @xml); + if ( $#cibles == 0) { + my ($racine) = $debut =~ m|^(?:.*/)?(.+)|o; + system "unzip -j $directory/$file $cibles[0] > /dev/null"; + if ( -f "$racine.xml" ) { + system "mv $racine.xml $directory/$base.xml" + } + elsif ( -f "$racine.XML" ) { + system "mv $racine.XML $directory/$base.xml" + } + else { + print LOG "Erreur : pas de fichier \"$racine.xml\" extrait de \"$file\"\n"; + } + } + elsif ( $#xml == 0 ) { + my ($entree, $xml) = $xml[0] =~ m|^((?:.*/)?(.+\.xml.*))|; + system "unzip -j $directory/$file $entree > /dev/null"; + if ( -f "$xml" ) { + system "mv $xml $directory/$base.xml" + } + else { + print LOG "Erreur : pas de fichier \"$xml\" extrait de \"$file\"\n"; + } + } + else { + print LOG "Pas de XML \"$debut.xml\" pour \"$file\"\n"; + } + } + } +elsif ( $#xml == 0 ) { + my ($entree, $xml) = $xml[0] =~ m|^((?:.*/)?(.+\.xml))|; + system "unzip -j $directory/$file $entree > /dev/null"; + if ( -f "$xml" ) { + system "mv $xml $directory/$base.xml" + } + else { + print LOG "Erreur : pas de fichier \"$xml\" extrait de \"$file\"\n"; + } + } +elsif ( $#pdf > 0 ) { + print LOG "Attention : encore des PDF multiples pour \"$file\"\n"; + } +else { + print LOG "Attention : autre cas bizarre pour \"$file\"\n"; + } + +return 0; +}