# /usr/bin/perl
use utf8;	# Assigner l'encodage 
use strict;
binmode(STDOUT, ":encoding(UTF-8)"); 	# Assigner l'encodage de sortie
#-----------------------------------------------------------
# Ce programme s'utilise ainsi :
# perl parcours-arborescence.pl 2021 3476
# Il prend en arguments 2 éléments : (1) le nom de l'arborescence 2021
# contenant les fils RSS de l'année 2021, (2) le nom de la rubrique à traiter
# ici 3208 pour A la une
if ($#ARGV != 1) {print "Il manque un argument à votre programme....\n";exit;}
my $rep="$ARGV[0]"; # Assigner le ARGV pour le script
my $RUBRIQUE="$ARGV[1]";
$rep=~ s/[\/]$//;	# on s'assure que le nom du répertoire ne se termine pas par un "/"
# Ouverture de ficher TXT et XML pour la sorite
open my $outputtxt, ">:encoding(UTF-8)","corpusTitreDesc-$RUBRIQUE.txt";
open my $outputxml, ">:encoding(UTF-8)","preTitreDesc-$RUBRIQUE.xml";
print $outputxml "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus>\n"; # Ouverture de balise XML corpus
&parcoursarborescencefichiers($rep); # Recurse!
print $outputxml "</corpus>\n"; # Fermeture de balise XML corpus
close $outputtxt;	# Fermeture des fichiers TXT et XML.
close $outputxml;
&etiquetageUP;	# Annoter avec udpipe TXT
&etiquetageTT; 	#O Annoter avec TreeTagger
exit;

#-----------------------------------------------------------
# Etiquetage UDpipe
sub etiquetageUP {
	# system(): permet d'écrire dans le terminal à partir d'un script Perl.
	# Execution de UDpipe, Tokenization de texte, POS tagging, annotation syntaxique, 
	# On renvoie le résultat dans un fichier au format CoNLL nommé corpus-titre-description.udpipe.
	system("./distrib-udpipe/udpipe-1.2.0-bin/bin-win32/udpipe.exe --tokenize --tag --parse --tokenizer=presegmented ./distrib-udpipe/modeles/french-sequoia-ud-2.5-191206.udpipe corpusTitreDesc-$RUBRIQUE.txt > annotationUD-$RUBRIQUE.udpipe");
	system("perl ./distrib-udpipe/udpipe2xml-version-sans-titrevsdescription-v2.pl annotationUD-$RUBRIQUE.udpipe");}
#-----------------------------------------------------------
# Etiqueetage TreeTagger
sub etiquetageTT {
	# On répeat la processus de UDpipe for TreeTagger cette fois
	system("./distrib-treetagger/tree-tagger.exe -lemma -token -no-unknown -sgml ./distrib-treetagger/french-utf8.par preTitreDesc-$RUBRIQUE.xml > annotationTT-$RUBRIQUE ");
	system("perl ./distrib-treetagger/treetagger2xml-utf8.pl annotationTT-$RUBRIQUE UTF8");}
#----------------------------------------------
sub parcoursarborescencefichiers {		# Parcourir le RSS
    my $path = shift(@_);
	# Ouverture de repertoire
	opendir(DIR, $path) or die "Peut pas ouvrir $path: $!\n";
    my @files = readdir(DIR);	# Lire les fichers dans le dossier
    closedir(DIR);	# Fermeture de dossier
    foreach my $file (@files) {
		next if $file =~ /^\.\.?$/;	# On ne traite pas ceux qui matchent . ou .. 
		$file = $path."/".$file;
		if (-d $file) {	# Verification de dossier
			print "On entre dans le REPERTOIRE : $file \n";
			&parcoursarborescencefichiers($file);
			print "On sort du REPERTOIRE :  $file \n";
		}
		if (-f $file) {
			if ($file =~ /$RUBRIQUE.+\.xml$/) {		# Fichier avec le numero de rubrique
				print "Traitement du fichier $file \n";
				open my $input, "<:encoding(UTF-8)",$file;	# Ouverture de ficher en mode écriture
				$/=undef;	# Enlever la valeur de default de saut ligne
				my $ligne=<$input> ;	# Assigner le contenu au variable $ligne.
				close($input);	# Fermeture de fichier RSS.

				while ($ligne=~/<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) {	# Extraction de titre et description
					my $titre=&nettoyage($1);	# Avoir le titre et description propre
					my $description=&nettoyage($2);
					print $outputtxt "$titre \n";	# Ecriture dans le fichier
					print $outputtxt "$description \n";
					print $outputtxt "#-------------------#\n";
					my ($titreSEG,$descriptionSEG)=&segmentationTD($titre,$description);
					print $outputxml "<item><titre>\n$titreSEG\n</titre><description>\n$descriptionSEG\n</description></item>\n";
				}
			}
		}
    }
}

#-----------------------------------------------------------
#On définit la fonction qui va permettre de segmenter le texte en un token par ligne. Ce résultat sera mis dans le fichier de pré-corpus XML qui sera utilisé ensuite pour l'annotation par TreeTagger.
sub segmentationTD {
	my ($arg1,$arg2)=@_;
	open my $tmp, ">:encoding(UTF-8)","resultat1.txt"; # Ecriture des données textuelles dans un fichier Résultat1
	print $tmp $arg1;	# Ecriture de titre dans le fichier Résultat1
	close $tmp;

	system("perl ./distrib-treetagger/tokenise-utf8.pl resultat1.txt > resultat2.txt");
	undef $/;
	open my $tmp2, "<:encoding(UTF-8)","resultat2.txt";	 # Ouverture de ficher Resultat2 
	my $titresegmente=<$tmp2>;
	close $tmp2;

	open $tmp, ">:encoding(UTF-8)","resultat1.txt";	# Recuperation de description
	print $tmp $arg2;
	close $tmp;
	system("perl ./distrib-treetagger/tokenise-utf8.pl resultat1.txt > resultat2.txt");
	open  $tmp2, "<:encoding(UTF-8)","resultat2.txt";
	my $descriptionsegmente=<$tmp2>;
	close $tmp2;
	$/="\n";
	return $titresegmente,$descriptionsegmente;
}

#-----------------------------------------------------------
# Nettoyage du texte
sub nettoyage {
	my $texte=shift @_;
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g; # Remplacement les balises CDATA par rien.
	$texte.=".";
	$texte=~s/\.+$/\./;	# Remplacement des points par un seul.
	return $texte; # Renvoie le texte propre.
}

