#/usr/bin/perl
<<DOC; 
 Author: Zhuang QI
 usage : perl BAO2.pl [epertoire-a-parcourir] [rubrique]
 Le programme prend en entrée le nom du répertoire-racine contenant les fichiers
 à traiter et le nom de la rubrique à traiter parmi ces fichiers
DOC
#-----------------------------------------------------------
use strict;
use utf8;
#chronométrie
use Timer::Simple;
my $t = Timer::Simple->new();
$t->start;
#-----------------------------------------------------------
my $rep="$ARGV[0]";
my $rubrique ="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
#créer un dossier temporaires qui vont être effacés à l'issue du programme
system("mkdir TMP");
#fichiers de sortie
open(OUT,">:encoding(utf8)","TXT/sortie_BAO2_$rubrique.txt");
open(OUTXML,">:encoding(utf8)","XML/sortiexml_$rubrique.xml");
print OUTXML "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print OUTXML "<corpus2020>\n";
my %dico_des_titres=();
my $numberItem=0;
my $i=0;
#----------------------------------------
&parcoursarborescencefichiers($rep);	
#----------------------------------------
print OUTXML "</corpus2020>\n";
close OUT;
close OUTXML;
#----------------------------------------
&etiquetageTT;
&etiquetageUD;
#----------------------------------------
system ("rm -rf TMP");
#----------------------------------------
print "Nb item : $numberItem \n";
# temps écoulé depuis le lancement du programme
print "time so far: ", $t->elapsed, " seconds\n";
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_);
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (@files) {
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file;
		if (-d $file) {
			&parcoursarborescencefichiers($file);	
		}
		if (-f $file) {
			if ($file =~/$rubrique.+xml$/) {
				print $i++," Traitement de : ",$file,"\n";
				open(FIC,"<:encoding(utf8)",$file);
				$/=undef;   
				my $textelu=<FIC>;
				close FIC;
				my $texte2tag="";
				while ($textelu=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg) {
					my $titre=$1;
					my $description=$2;
					$numberItem++;
					if (!(exists $dico_des_titres{$titre})) { 
						$dico_des_titres{$titre}=$description ;
						# Appel du sous-programme de nettoyage 
						($titre,$description)=&nettoyage($titre,$description);
						# Ecriture des résultats en sorties
						print OUT $titre,"\n";
						print OUT $description,"\n";
						print OUT "\n";
						# pré-étiquetage avant treetagger
						my ($titre_etiket,$description_etiket)=&preetiquetage($titre,$description);
						#--------------------------------------
						print OUTXML "<item><titre>\n$titre_etiket\n</titre><description>\n$description_etiket\n</description></item>\n";
					}
				}
			}
		}
    }
}
#----------------------------------------------
sub nettoyage {
    my $titre = $_[0];
    my $description = $_[1];
	$titre=~s/^<!\[CDATA\[//;
	$titre=~s/\]\]>$//;
	$description=~s/^<!\[CDATA\[//;
	$description=~s/\]\]>$//;
    $description=~s/&lt;.+?&gt;//g;
    $description=~s/&#38;#39;/'/g;
    $description=~s/&#38;#34;/"/g;
    $titre=~s/&lt;.+?&gt;//g;
    $titre=~s/&#38;#39;/'/g;
    $titre=~s/&#38;#34;/"/g;
    $titre=~s/$/\./g;
	$titre=~s/\.+$/\./g;
    return $titre,$description;
}
#----------------------------------------------
sub preetiquetage {
    my $titre = $_[0];
    my $description = $_[1];
	#-----------------etiquetage titre-----------------------------
	open (ETI, ">:encoding(utf8)", "TMP/temporaire.txt");
    print ETI $titre;
    close ETI;
    system ("perl -f TreeTagger/utf8-tokenize.perl TMP/temporaire.txt > TMP/test.txt.pos");
    open (TEMP, "<:encoding(utf8)", "TMP/test.txt.pos");
    $/=undef;
    my $titre_etik_xml=<TEMP>;
    close TEMP;
	#-----------------etiquetage description-----------------------------
    open (ETI, ">:encoding(utf8)", "TMP/temporaire.txt");
    print ETI $description;
    close ETI;
    system ("perl -f TreeTagger/utf8-tokenize.perl TMP/temporaire.txt > TMP/test.txt.pos");
    open (TEMP, "<:encoding(utf8)", "TMP/test.txt.pos");
    $/=undef;
    my $description_etik_xml=<TEMP>;
    close TEMP;
    return $titre_etik_xml,$description_etik_xml;
}

#----------------------------------------------
sub etiquetageTT {
    system ("perl -f TreeTagger/utf8-tokenize.perl TMP/sortiexml_BAO2_$rubrique.xml | TreeTagger/tree-tagger.exe TreeTagger/french.par -token -lemma -no-unknown -sgml > TXT/sortie_treetagger_$rubrique.txt");
    system ("perl treetagger2xml-utf8.pl TXT/sortie_treetagger_$rubrique.txt utf8"); 
	system ("mv TXT/sortie_treetagger_$rubrique.txt.xml TXT/sortie_treetagger_$rubrique.xml" );
	system ("mv TXT/sortie_treetagger_$rubrique.xml XML" );
}

#-----------------------------------------------
sub etiquetageUD {
	# Etiquetage avec udpipe --------------
	# lancer udpipe : distrib-udpipe-1.2.0-bin
	system("udpipe/udpipe.exe --tokenize --tokenizer=presegmented --tag --parse udpipe/french-gsd-ud-2.5-191206.udpipe TXT/sortie_BAO2_$rubrique.txt > TXT/sortie_udpipe_$rubrique.txt");
	system("perl udpipe2xml.pl TXT/sortie_udpipe_$rubrique.txt");
	system("mv TXT/sortie_udpipe_$rubrique.txt.xml TXT/sortie_udpipe__$rubrique.xml");
	system ("mv TXT/sortie_udpipe__$rubrique.xml XML");
}

