#/usr/bin/perl
#FAZLIU Doruntina
#BAO2 - « extraction du texte » : parcourir toute l'arborescence et extraire les contenus textuels de tous les fils (classement des #		textes extraits par RUBRIQUE)
# Ce programme s'utilise ainsi :
# perl parcours-arborescence.pl 2021 3210
# 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 3210 pour A la une
#-----------------------------------------------------------
use utf8;
use strict;
binmode(STDOUT, ":encoding(UTF-8)");
if ($#ARGV != 1) {print "Il manque un argument à votre programme....\n";exit;}

# Récupérer les arguments de la liste @ARGV sur laquelle le programme été exécuté
my $rep="$ARGV[0]";
my $RUBRIQUE="$ARGV[1]";

#Echapemment des caractéres "/" dans le chemin du répertoire
$rep=~ s/[\/]$//;

#Créer les fichiers de sortie
open my $sortie_txt, ">:encoding(UTF-8)","corpus-titre-description-$RUBRIQUE.txt";
open my $sortie_xml, ">:encoding(UTF-8)","pre-corpus-titre-description-$RUBRIQUE.xml";

print $sortie_xml "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus>\n";

#récuperation du contenu textuel avec la fonction de recursion
&parcoursarborescencefichiers($rep);

print $sortie_xml "</corpus>\n";

# fermeture des fichiers 
close $sortie_txt;
close $sortie_xml;

#annotation du fichier txt corpus-titre-description.txt avec udpipe.
&etiquetageUP;
#annotation du fichier xml corpus-titre-description.xml
&etiquetageTT;
exit;
#-----------------------------------------------------------
sub etiquetageUP {
	system("./distrib-udpipe-1.2.0-bin/udpipe-1.2.0-bin/bin-win32/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 > corpus-annotation-ud-$RUBRIQUE.udpipe");
	system("perl ./distrib-udpipe-1.2.0-bin/udpipe2xml-version-sans-titrevsdescription-v2.pl corpus-annotation-ud-$RUBRIQUE.udpipe");
}
#-----------------------------------------------------------

sub etiquetageTT {
	system("./distrib-treetagger/tree-tagger.exe -lemma -token -no-unknown -sgml ./distrib-treetagger/french-utf8.par  pre-corpus-titre-description-$RUBRIQUE.xml  >  corpus-annotation-tt-$RUBRIQUE ");
	system("perl ./distrib-treetagger/treetagger2xml-utf8.pl corpus-annotation-tt-$RUBRIQUE UTF8");
}
#----------------------------------------------

sub parcoursarborescencefichiers {
	#Récupérerle chemin du répertoire
    my $path = shift(@_);

	#Ouvre de répertoire, si erreur, affiche : Impossible d'ouvrir
	opendir(DIR, $path) or die "Impossible d'ouvrir $path: $!\n";

	#Mets les fichiers du répertoire dans un liste
    my @files = readdir(DIR);
	# feremeture du dossier
    closedir(DIR);
#-----------------------------------------------------------------------------------------------------
	# On traite chaque fichier
    foreach my $file (@files) {
		#Si àa marche bien, on ignore les fichiers cachés
		next if $file =~ /^\.\.?$/;

		#Reecriture du chemin
		$file = $path."/".$file;
		
		#Avec -d, on verifie si le fichier est un dossier, si c'est le cas on relance
		if (-d $file) {
			print "On entre dans le REPERTOIRE : $file \n";

			&parcoursarborescencefichiers($file);
			print "On sort du REPERTOIRE :  $file \n";
		}

		
	   # Si c'est un fichier, on le traite
		if (-f $file) {
			if ($file =~ /$RUBRIQUE.+\.xml$/) {
				print "Traitement du fichier $file \n";
#--------------------------------------------------------------------------------------------------
				#ouvrir le fichier
				open my $input, "<:encoding(UTF-8)",$file;
				#supprimer une variable pour pouvoir traite le texte 
				$/=undef;

				#lire chaque ligne du fichier
				my $ligne=<$input> ;
				#ferme le fichier RSS.
				close($input);
#--------------------------------------------------------------------------------------------------------
			
				while ($ligne=~/<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) {
					# Le premier variable
					my $titre=&nettoyage($1);
					# Le deuxieume variable
					my $description=&nettoyage($2);
					#print du contenu de titre nettoyé
					print $sortie_txt "$titre \n";
					#print du contenu de description nettoyé
					print $sortie_txt "$description \n";
					# print les tires entre le titre et le description
					print $sortie_txt "-----------------\n";
					# pre-traitement avec Tree-tagger la tokénisation de contenu textuel
					my ($titreSEG,$descriptionSEG)=&segmentationTD($titre,$description);
					# Écriture des résultats dans le fichier xml
					print $sortie_xml "<item><titre>\n$titreSEG\n</titre><description>\n$descriptionSEG\n</description></item>\n";
				}
			}
		}
    }
}

#-----------------------------------------------------------
sub segmentationTD {
	# sous-programme pour la segmentation de titre dans $arg1 et de description nettoyé $arg2
	my ($arg1,$arg2)=@_;
	# ouvrir le fichier "title_output.txt
	open my $tmp, ">:encoding(UTF-8)","toto.txt";
	#on écrit le titre dans le fichier
	print $tmp $arg1;
	# fermeture de fichier 
	close $tmp;
	#le fichier avec le titre segementé va être envoyé dans le deuxieme fichier toto2
	system("perl ./distrib-treetagger/tokenise-utf8.pl toto.txt > toto2.txt");
	undef $/;
#-------------------------------------------------------------------------------
	# Ouvrir le deuxieume fichier
	open my $tmp2, "<:encoding(UTF-8)","toto2.txt";
	#On lit le fichier, on met le contenu dans la variable $titresegmente.
	my $titresegmente=<$tmp2>;
	close $tmp2;

	#on fait la même chose qu'on a fait pour le titre, pour le description
	open $tmp, ">:encoding(UTF-8)","toto.txt";
	print $tmp $arg2;
	close $tmp;
	system("perl ./distrib-treetagger/tokenise-utf8.pl toto.txt > toto2.txt");
	open  $tmp2, "<:encoding(UTF-8)","toto2.txt";
	my $descriptionsegmente=<$tmp2>;
	close $tmp2;
	$/="\n";

	#On revoie les deux variables contenant le titre et la description segmenté.
	return $titresegmente,$descriptionsegmente;
}

#-----------------------------------------------------------
sub nettoyage {

	my $texte=shift @_;
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g;
	$texte.=".";
	$texte=~s/\.+$/\./;
	return $texte;
}
#----------------------------------------------
