#/usr/bin/perl
<<DOC; 
Votre Nom : SF
 usage : perl parcours-arborescence-fichiers repertoire-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;
use Timer::Simple;
# on instancie un timer commencant à 0.0s par défaut
my $t = Timer::Simple->new();
# on lance le timer
$t->start;

#-----------------------------------------------------------
my $rep=shift(@ARGV);
my @RUBRIQUES=@ARGV;
print @RUBRIQUES;
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;

my $numberItem=0;
#----------------------------------------
#obtenir l'extraction pour trois rubriques, en parcourant la liste des rubriques
foreach my $r (@RUBRIQUES){
	# créer un dictionnaire vide qui enregistre les informations distingues (sans répétition) pour chaque rubrique
	my %dico_des_titres=();
	# créer un nouveau fichier .txt et un nouveau fichier .xml qui contient le numéro de rubrique 
	open my $out, ">:encoding(UTF-8)","sortie-slurp_$r.txt";
	open my $outxml, ">:encoding(UTF-8)","sortiexml-slurp_$r.xml";
	print $outxml "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
	print $outxml "<corpus2020>\n";
	# parcourir l'arborescence et trouver les informations dans la rubrique ciblée
	# en portant les paramètres nom de l'arborescence, le numéro de rubrique, le fichier .txt, le fichier .xml, 
	# et le dictionnaire qui mémorise les informations déjà enregistrées
	&parcoursarborescencefichiers($rep,$r,$out,$outxml,%dico_des_titres);
	print $outxml "</corpus2020>\n";
	close $out;
	close $outxml;
	# appler la fonction d'étiquetagge TreeTagger
	 # en donnant un paramètre pour il trouve le bon fichier grâce au repère de rubrique
	&etiquetageTT($r);
	# appler la fonction d'étiquetagge Udpipe
	 # en donnant un paramètre pour il trouve le bon fichier grâce au repère de rubrique
	&etiquetageUD($r);
}


#----------------------------------------

#----------------------------------------

#----------------------------------------
print "Nb item : $numberItem \n";
# temps écoulé depuis le lancement du programme
print "time so far: ", $t->elapsed, " seconds\n";
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_);
	my $rubrique = shift(@_);
	my $out = shift(@_);
	my $outxml = shift(@_);
	my %dico_des_titres = shift(@_);
    opendir(DIR, $path) or die "on n'arrive par à ouvrir $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (sort @files) {
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file;
		if (-d $file) {
			print "On entre dans le REPERTOIRE : $file \n";
			&parcoursarborescencefichiers($file,$rubrique,$out,$outxml,%dico_des_titres);	#recurse!
			print "On sort du REPERTOIRE :  $file \n";
		}
		if (-f $file) {
			if ($file =~/$rubrique.+xml$/) {
				print " Traitement de : ",$file,"\n";
				open my $input, "<:encoding(UTF-8)",$file;
				$/=undef; # par défaut cette variable contient \n
				my $ligne=<$input> ;
				close($input);
				while ($ligne=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg) {
					$numberItem++;
					# Appel du sous-programme de nettoyage 
					my $titre=&nettoyage($1);
					my $description=&nettoyage($2);
					if (!(exists $dico_des_titres{$titre})) { 
						$dico_des_titres{$titre}=$description;
						# Ecriture des résultats en sorties
						print $out "$titre \n";
						print $out "$description \n";
						print $out "\n";
						# pré-étiquetage avant treetagger : tokenization --------------
						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=shift(@_); autre solution en vidant la liste des arguments du programmes...
    #my $description=shift(@_);
	my $texte=shift @_;
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g;
	$texte.=".";
	$texte=~s/\.+$/\./;
	$texte=~s/&lt;.+?&gt;//g;
    $texte=~s/&#38;#39;/'/g;
    $texte=~s/&#38;#34;/"/g;
    $texte=~s/$/\./g;
	$texte=~s/\.+$/\./g;
	return $texte;
}
#----------------------------------------------
sub preetiquetage {
    my $titre = $_[0];
    my $description = $_[1];
	#-----------------etiquetage titre-----------------------------
	# créer un fichier temporaire.txt et  test.txt.pos pour enregistrer temporarement les informations
	# parce que Treetagger ne peut pas traiter directement les chaines de caractères, il faut prendre les inforamtions à partir d'un
	open (ETI, ">:encoding(utf8)", "temporaire.txt");
    print ETI $titre;
    close ETI;
    system ("perl -f ./tree-tagger-MacOSX-3.2.3/bin/tokenise-utf8.pl temporaire.txt > test.txt.pos");
    open (TEMP, "<:encoding(utf8)", "test.txt.pos");
    $/=undef;
    my $titre_etik_xml=<TEMP>;
    close TEMP;
	#-----------------etiquetage description-----------------------------
    open (ETI, ">:encoding(utf8)", "temporaire.txt");
    print ETI $description;
    close ETI;
    system ("perl -f ./tree-tagger-MacOSX-3.2.3/bin/tokenise-utf8.pl temporaire.txt > test.txt.pos");
    open (TEMP, "<:encoding(utf8)", "test.txt.pos");
    $/=undef;
    my $description_etik_xml=<TEMP>;
    close TEMP;
    return $titre_etik_xml,$description_etik_xml;
}

#----------------------------------------------
sub etiquetageTT {
	my $rubrique = shift(@_);
	# lancer tree-tagger-MacOSX-3.2.3
    system ("./tree-tagger-MacOSX-3.2.3/bin/tree-tagger ./tree-tagger-MacOSX-3.2.3/bin/french-utf8.par -token -lemma -no-unknown -sgml sortiexml-slurp_$rubrique.xml  > sortiexml-slurp_TT_$rubrique.txt");
    system ("perl ./tree-tagger-MacOSX-3.2.3/bin/treetagger2xml-utf8.pl sortiexml-slurp_TT_$rubrique.txt utf8"); 
}

#-----------------------------------------------
sub etiquetageUD {
	my $rubrique = shift(@_);
	# Etiquetage avec udpipe --------------
	# lancer udpipe : distrib-udpipe-1.2.0-bin
	system("./distrib-udpipe-1.2.0-bin/udpipe-1.2.0-bin/bin-osx/udpipe --tokenize --tag --parse ./distrib-udpipe-1.2.0-bin/modeles/french-gsd-ud-2.5-191206.udpipe sortie-slurp_$rubrique.txt > sortieudpipe-slurp_$rubrique.txt");
}

