#/usr/bin/perl
# utilisation : perl bao2.pl ./2021 3208
# 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 la rubrique A la une)
#-----------------------------------------------------------
use utf8;
use strict;
binmode(STDOUT, ":encoding(UTF-8)");
#-----------------------------------------------------------
if ($#ARGV != 1) {print "Il manque un argument à votre programme....\n";exit;} # on s'assure qu'il ne manque aucun argument
my $rep="$ARGV[0]"; #le répertoire 2021 sera le premier argument
my $RUBRIQUE="$ARGV[1]"; #la rubrique choisie est le deuxième argument

$rep=~ s/[\/]$//;# on s'assure que le nom du répertoire ne se termine pas par un "/"

#ouverture des fichiers#

open my $output, ">:encoding(UTF-8)","corpus-titre-description.txt"; #on créé un fichier txt qui recevra les titres et descriptions
open my $output2, ">:encoding(UTF-8)","pre-corpus-titre-description.xml"; #on créé un fichier xml qui recevra les titres et descriptions
print $output2 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus>\n"; #on écrit le début de notre fichier xml final
#----------------------------------------
&parcoursarborescencefichiers($rep); #on appelle notre fonction de récursivité
#----------------------------------------
print $output2 "</corpus>\n"; #on écrit la fin de notre fichier xml final

#fermeture des fichiers#

close $output;
close $output2;
#----------------------------------------
#on annote avec udpipe sur le fichier txt
&etiquetageUP;
#on annote avec treetagger sur le fichier xml
&etiquetageTT;
#----------------------------------------------
#suprression des fichiers qui ne serviront plus

unlink("toto.txt");
unlink("toto2.txt");
unlink("pre-corpus-titre-description.xml");
#----------------------------------------------
exit;
#----------------------------------------------
# définition des fonctions #

sub etiquetageUP { #fonction pour étiqueter avec udpipe
	system("./distrib-udpipe-1.2.0-bin/udpipe-1.2.0-bin/bin-win64/udpipe.exe --tokenize --tag --parse ./distrib-udpipe-1.2.0-bin/modeles/french-sequoia-ud-2.5-191206.udpipe corpus-titre-description.txt > corpus_titre-description.udpipe"); # on va pas utiliser --tokenizer=presegmented pour qu'udpipe tokénise lui même
}
#----------------------------------------------
sub etiquetageTT { #fonction pour étiqueter avec treetagger
	system("./treetagger/treetagger.exe -lemma -token -no-unknown -sgml ./treetagger/french-utf8.par  pre-corpus-titre-description.xml  >  corpus-titre-description ");
	system("perl ./treetagger/treetagger2xml-utf8.pl corpus-titre-description UTF8");

}
#----------------------------------------------
sub parcoursarborescencefichiers { #même fonction que dans la bao1 sauf pour l'ajout des étiqueteurs
    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);
			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;
				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 (on appelle la fonction)
					my ($titreSEG,$descriptionSEG)=&segmentationTD($titre,$description);
					print $output2 "<item><titre>\n$titreSEG\n</titre><description>\n$descriptionSEG\n</description></item>\n";
				}
			}
		}
    }
}
#----------------------------------------------
sub segmentationTD { #fonction qui tokenize les phrases
	my ($arg1,$arg2)=@_; #on prend les valeurs des deux fichiers
	#déroulement du traitement : 
	# 1. ecriture des données textuelles dans un fichier TOTO
	# 2. tokenisation de TOTO
	# 3. récupération des données
	open my $tmp, ">:encoding(UTF-8)","toto.txt"; #on ouvre le fichier temporaire
	print $tmp $arg1; #on écrit la valeur textuelle à tokeniser
	close $tmp; #on ferme le fichier
	system("perl ./treetagger/tokenise-utf8.pl toto.txt > toto2.txt"); #on tokenise et on ecrit le resultat dans un autre fichier
	undef $/; #on enlève le \n
	open my $tmp2, "<:encoding(UTF-8)","toto2.txt"; #on ouvre le fichier temporaire qui a la tokenisation
	my $titresegmente=<$tmp2>; #on garde la tokenisation dans une valeur
	close $tmp2; #on ferme le fichier
	#-----------------------------------------------
	#on fait de même pour la description
	open $tmp, ">:encoding(UTF-8)","toto.txt";
	print $tmp $arg2;
	close $tmp;
	system("perl ./treetagger/tokenise-utf8.pl toto.txt > toto2.txt");
	open  $tmp2, "<:encoding(UTF-8)","toto2.txt";
	my $descriptionsegmente=<$tmp2>;
	close $tmp2;
	$/="\n"; #on réaffecte le saut de ligne
	#-----------------------------------------------
	return $titresegmente,$descriptionsegmente;
}
#----------------------------------------------
sub nettoyage { #même fonction de nettoyage que dans la bao1
	my $texte=shift @_;  #on peut aussi faire $TIT = $_[0]
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g;
	$texte.=".";
	$texte=~s/\.+$/\./;
	return $texte;
}
#----------------------------------------------
