#/usr/bin/perl
#-----------------------------------------------------------
# Remarque préalable : les nouvelles modifications apportées 
# par rapport au script de la BAO précédente seront sous la forme suivante :

### --- DEBUT DE LA MODIFICATION --- ###
# Modification
### --- FIN DE LA MODIFICATION --- ###
#-----------------------------------------------------------
# Notre script perl prend deux arguments : le nom de l'arborescence 
# 1) Le nom de l'arborescence 2021 contenant les fils RSS de l'année 2021
# 2) Le nom de la rubrique à traiter ("3208" pour la rubrique "À la une" par exemple).
# Ligne de commande : perl BAO2.pl dossier_arborescence rubrique
#-----------------------------------------------------------
use utf8;
use strict;
binmode(STDOUT, ":encoding(UTF-8)");
use File::Copy;
#-----------------------------------------------------------
# Validation des arguments donnés au programme

# On s'assure que le bon nombre d'arguments a été fourni par l'utilisateur
if ($#ARGV != 1) {
	print "Le nombre d'arguments est incorrect.\n";
	exit;
} 
#-----------------------------------------------------------
# Le programme principal

# On prend les arguments et on les stocke dans des variables associées
my $repertoire="$ARGV[0]";
my $rubrique="$ARGV[1]";
# On crée une table de hashage pour ne pas avoir de doublons
my %h_sans_doublons=();
my $nbItem=0;
# On s'assure que le nom du répertoire ne se termine pas par un 
# "/" à l'aide d'une expression régulière
$repertoire=~ s/[\/]$//;
# On ouvre deux fichiers afin d'écrire la sortie
open my $output_txt, ">:encoding(UTF-8)","perl-corpus-titre-description-$rubrique.txt";
open my $output_xml, ">:encoding(UTF-8)","perl-precorpus-titre-description-$rubrique.xml";
# On print un entête xml au fichier xml
print $output_xml "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus>\n";
# On lance notre fonction "parcours_arborescence_fichiers" qui va fonctionner
# de manière récursive sur le répertoire passé en argument
&parcours_arborescence_fichiers($repertoire);	
# On ajoute la balise de fin dans le fichier xml
print $output_xml "</corpus>\n";
#print "$nbItem";
# On ferme les deux fichiers créés
close $output_txt;
close $output_xml;


### --- DEBUT DE LA MODIFICATION --- ###
# 1) Annotation du fichier perl-corpus-titre-description-$rubrique.txt par UDPipe
&etiquetage_UDPipe;

# 2) Annotation du fichier perl-precorpus-titre-description-$rubrique.xml par TreeTagger
&etiquetage_TreeTagger;

# On supprime les fichiers tampons
unlink("fichier_tampon1.txt");
unlink("fichier_tampon2.txt");
# On met les fichiers de sortie dans le dossier de sortie BAO2 dédié
move("perl-corpus-titre-description-$rubrique.txt", "BAO2") or die "Erreur 1 $!";
move("perl-precorpus-titre-description-$rubrique.xml", "BAO2") or die "Erreur 2 $!";
move("perl-corpus-titre-description-$rubrique", "BAO2") or die "Erreur 3 $!";
move("perl-corpus-titre-description-$rubrique.xml", "BAO2") or die "Erreur 4 $!";
move("perl-corpus-titre-description-$rubrique.udpipe", "BAO2") or die "Erreur 5 $!";
move("perl-corpus-titre-description-$rubrique.udpipe.xml", "BAO2") or die "Erreur 6 $!";
### --- FIN DE LA MODIFICATION --- ###

# On sort du programme
exit;
#-----------------------------------------------------------
# Les sous-programmes

# 1) Fonction permettant à la fois de parcourir toute l'arborescence
# et d'extraire les titres et descriptions nettoyés de chaque fichier
sub parcours_arborescence_fichiers {
    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;
		# si le fichier est un dossier, on continue à parcourir l'arborescence de manière récursive
		if (-d $file) {
			&parcours_arborescence_fichiers($file);	
		}
		if (-f $file) {
			# si le fichier est bien un fichier RSS (xml) avec la rubrique souhaitée
			if ($file =~ /$rubrique.+\.xml$/) {
				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) {
					# si le titre n'est pas déjà dans la table de hashage
					# alors on écrit dans nos fichiers txt et xml
					# (on considère qu'un article est un doublon si son titre est identique)
					if (!(exists $h_sans_doublons{$1})) {
						# RQ : les tables de hashage on toujours besoin d'une valeur
						# on met ici une valeur par défaut (1)
						$h_sans_doublons{$1}=1;
						$nbItem++;
						my $titre=&nettoyage($1);
						my $description=&nettoyage($2);
						print $output_txt "$titre \n";
						print $output_txt "$description \n";
						print $output_txt "------------------------\n";
						### --- DEBUT DE LA MODIFICATION --- ###
						# on utilise le programme tokenize offert par treetagger pour segmenter chaque titre et description
						my($titreSEG, $descriptionSEG)=&segmentationTD($titre, $description);
						print $output_xml "<item>\n<titre>\n$titreSEG\n</titre>\n<description>\n$descriptionSEG\n</description>\n</item>\n";
						### --- FIN DE LA MODIFICATION --- ###
					}
				}
			}
		}
	}
}
# 2) Fonction de nettoyage permettant de nettoyer les données
# - on nettoie notamment les CDATA présents pour des sections 
# qui ne devaient pas être reconnus comme balisage, ainsi que quelques entités XML
# - on fait en sorte d'avoir (seul) point à chaque fin de titre 
# ou de description pour faciliter l'étiquetage en BAO2
sub nettoyage {
	my $texte=shift @_;
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g;
	$texte=~s/&lt;.+?&gt;//g;
    $texte=~s/&#38;#39;/'/g;
    $texte=~s/&#38;#34;/"/g;
	$texte=~s/&nbsp;//g;
	$texte.=".";
	$texte=~s/\.+$/\./;
	return $texte;
}

#-----------------------------------------------------------
### --- DEBUT DE LA MODIFICATION --- ###
# Trois nouveaux sous-programmes :

# Un sous-programme permettant d'avoir un token par ligne pour que TreeTagger puisse correctement annoter
# Cette segmentation sera stockée dans un fichier nommé "perl-precorpus-titre-description.xml"
sub segmentationTD{
	my ($arg1, $arg2)=@_;
	# ecriture des données textuelles dans un fichier_tampon, tokeniser ce fichier et récupérer les données
	open my $tmp1, ">:encoding(UTF-8)", "fichier_tampon1.txt";
	print $tmp1 $arg1;
	close $tmp1;
	system("perl ./Ressources_treetagger/tokenise-utf8.pl fichier_tampon1.txt > fichier_tampon2.txt");
	undef $/; #lecture globale du fichier
	open my $tmp2, "<:encoding(UTF-8)", "fichier_tampon2.txt";
	my $titresegmente=<$tmp2>;
	close $tmp2;
	open my $tmp1, ">:encoding(UTF-8)", "fichier_tampon1.txt";
	print $tmp1 $arg2;
	close $tmp1;
	system("perl ./Ressources_treetagger/tokenise-utf8.pl fichier_tampon1.txt > fichier_tampon2.txt");
	undef $/; #lecture globale du fichier
	open my $tmp2, "<:encoding(UTF-8)", "fichier_tampon2.txt";
	my $descriptionsegmente=<$tmp2>;
	close $tmp2;
	#on remet les choses en ordre
	$/="\n";
	return $titresegmente, $descriptionsegmente
}

# Un sous-programme qui prend en entrée le precorpus XML créé par segmentationTD
sub etiquetage_TreeTagger {
	# Etiquetage TreeTagger avec les ressources Treetagger et le precorpus xml
	system("./Ressources_treetagger/tree-tagger.exe -lemma -token -no-unknown -sgml ./Ressources_treetagger/french-utf8.par perl-precorpus-titre-description-$rubrique.xml > perl-corpus-titre-description-$rubrique");
	# Conversion du résultat TreeTagger au format xml avec un programme de conversion donné déjà créé
	system("perl ./Ressources_treetagger/treetagger2xml-utf8-meilleur.pl perl-corpus-titre-description-$rubrique UTF8");
}

# Un sous-programme qui prend en entrée un texte brut contenant un titre et une description
sub etiquetage_UDPipe {
	# Etiquetage UDPipe avec les ressources UDPipe et le corpus txt
	system("./UDpipe/udpipe-1.2.0-bin/bin-win64/udpipe.exe --tokenize --tag --parse --tokenizer=presegmented ./UDpipe/modeles/french-sequoia-ud-2.5-191206.udpipe perl-corpus-titre-description-$rubrique.txt > perl-corpus-titre-description-$rubrique.udpipe"); 
	# On lance le script "udpipe2xml-version-sans-titrevsdescription-v2.pl" qui va créer un nouveau fichier 
	# à partir du fichier udpipe qu'on vient de créer, passant du format .conll à .xml
	# Ce fichier sera utile pour nos deux prochaines boîtes à outils
	system("perl ./UDPipe/udpipe2xml-version-sans-titrevsdescription-v2.pl perl-corpus-titre-description-$rubrique.udpipe");
}

### --- FIN DE LA MODIFICATION --- ###
#-----------------------------------------------------------

