#/usr/bin/perl
#-----------------------------------------------------------
use utf8;
use strict;
binmode(STDOUT, ":encoding(UTF-8)");
#-----------------------------------------------------------
# Pour lancer le programme depuis le terminal :
# perl bao2.pl chemin_dossier_corpus numero_rubrique
#il faut avoir préalablement télécharger tout ce qui est nécessaire au bon fonctionnement de UdPipe et TreeTagger

#-----------------------------------------------------------
#on s'assure qu'il y a le bon nombre d'arguments
if ($#ARGV != 1) {print "Il manque un argument à votre programme....\n";exit;} 
#le répertoire contenant le corpus est le premier argument
my $rep="$ARGV[0]";
#le numero de rubrique est le deuxième argument
my $RUBRIQUE="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
#on ouvre les fichiers de sortie
open my $output, ">:encoding(UTF-8)","corpus-titre-description-${RUBRIQUE}.txt";
open my $output2, ">:encoding(UTF-8)","pre-corpus-titre-description${RUBRIQUE}.xml";

#on ajoute la déclaration XML dans le fichier XML
print $output2 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus>\n";
#----------------------------------------
#on lance le sous-programme qui va parcourir l'arborescence (méthode récursive)
&parcoursarborescencefichiers($rep);
#----------------------------------------
print $output2 "</corpus>\n";
close $output;
close $output2;

#----------------------------------------
#1. on annote le fichier TXT avec UdPipe
&etiquetageUP;
#2. on annote le fichier XML avec TreeTagger
&etiquetageTT;
#----------------------------------------------
exit;

#----------------------------------------------
#fonction pour étiqueter le contenu textuel avec UdPipe
sub etiquetageUP {
	#udpipe --tokenize --tag --parse udpipe_model file  > result_udpipe
	system("./distrib-udpipe-1.2.0-bin/udpipe-1.2.0-bin/bin-win64/udpipe.exe --tokenize --tag --parse --tokenizer=presegmented ./distrib-udpipe-1.2.0-bin/modeles/french-sequoia-ud-2.5-191206.udpipe corpus-titre-description-${RUBRIQUE}.txt > conll-${RUBRIQUE}.udpipe");
	system("perl ./distrib-udpipe-1.2.0-bin/udpipe2xml-version-sans-titrevsdescription-v2.pl conll-${RUBRIQUE}.udpipe");
}
#----------------------------------------------
#fonction pour étiqueter le contenu textuel avec TreeTagger (via le terminal)
sub etiquetageTT {
	system("./TreeTagger/tree-tagger.exe -lemma -token -no-unknown -sgml ./TreeTagger/french-utf8.par  pre-corpus-titre-description${RUBRIQUE}.xml  >  sortie-tt-${RUBRIQUE} ");
	system("perl ./TreeTagger/treetagger2xml-utf8.pl sortie-tt-${RUBRIQUE} UTF8");
	
}
#----------------------------------------------
#même sous-programme que dans la BAO1 pour parcourir l'arborescence
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) {
			print "On entre dans le REPERTOIRE : $file \n";
			&parcoursarborescencefichiers($file);	#recurse!
			print "On sort du REPERTOIRE :  $file \n";
		}
		if (-f $file) {
			if ($file =~ /$RUBRIQUE.+\.xml$/) {
				print "Traitement du fichier $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>/gs) {
					my $titre=&nettoyage($1);
					my $description=&nettoyage($2);
					print $output "$titre \n";
					print $output "$description \n";
					# segmentation titre et description avec le programme tokenize offert par treetagger
					my ($titreSEG,$descriptionSEG)=&segmentationTD($titre,$description);
					print $output2 "<item><titre>\n$titreSEG\n</titre><description>\n$descriptionSEG\n</description></item>\n";
				}
			}
		}
    }
}
#----------------------------------------------
#on crée une fonction qui va crée des fichiers "tampon" afin de récupérer les données textuelles 
#elle prend comme arguments le titre et la description
#cela est contraint par le mode de fonctionnement de TreeTagger qui prend en entrée un fichier

sub segmentationTD {
	my ($arg1,$arg2)=@_;
	#-----------------------------------------------
	#d'abord on écrit le contenu textuel dans le premier fichier tampon
	open my $tmp, ">:encoding(UTF-8)","temp1.txt";
	print $tmp $arg1;
	close $tmp;
	#puis on le tokenize le texte avec TreeTagger (via le terminal) et écrit le résultat dans le deuxième fichier tampon
	system("perl ./TreeTagger/tokenise-utf8.pl temp1.txt > temp2.txt");
	undef $/;
	open my $tmp2, "<:encoding(UTF-8)","temp2.txt";
	#on récupère le contenu segmenté dans le deuxième fichier tampon
	my $titresegmente=<$tmp2>;
	close $tmp2;
	#-----------------------------------------------
	#on applique le même traitement à la description (le deuxième argument passé au sous-programme)
	open $tmp, ">:encoding(UTF-8)","temp1.txt";
	print $tmp $arg2;
	close $tmp;
	system("perl ./TreeTagger/tokenise-utf8.pl temp1.txt > temp2.txt");
	open  $tmp2, "<:encoding(UTF-8)","temp2.txt";
	my $descriptionsegmente=<$tmp2>;
	close $tmp2;
	$/="\n";
	#-----------------------------------------------
	#on récupère les données segmentées
	return $titresegmente,$descriptionsegmente;
}

#----------------------------------------------
#on reprend la même fonction de nettoyage que dans la BAO1
sub nettoyage {
	my $texte=shift @_;
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g;
	$texte.=".";
	$texte=~s/\.+$/\./;
	return $texte;
}
#----------------------------------------------
