#!/usr/bin/perl

<<DOC; 
Noms : PHOMMADY Elodie & AOUES Nora
Usage : perl parcours-arborescence-fichiers repertoire-a-parcourir rubrique
    Lancé depuis le répertoire ancêtre, le programme prend en entrée le nom du répertoire-racine 
    contenant les fichiers à traiter et le nom de la rubrique à traiter parmi ces fichiers
DOC


#***********************************************************
#**************** PROGRAMME PRINCIPAL **********************

#-----------------------------------------------------------
# UTILISATION DE BIBLIOTHEQUES 

use strict;
use utf8;
use Timer::Simple;

# Instancier un timer commencant à 0.0s par défaut
my $t = Timer::Simple->new();
# Lance le timer
$t->start;

#-----------------------------------------------------------
# RECUPERATION DES ARGUMENTS EN LIGNE DE COMMANDE 
# + PREPARATION DES FICHIERS EN SORTIE 

my $repertoire="$ARGV[0]";
my $rubrique ="$ARGV[1]";

# Vérification que le nom du répertoire ne se termine pas par un "/"
$repertoire=~ s/[\/]$//;

# Ouverture des fichiers en sortie
open my $outputTXT, ">:encoding(utf8)", "./Resultats/Sorties_BAO2/sortie-slurp_$rubrique.txt";
open my $outputXML, ">:encoding(utf8)", "./Resultats/Sorties_BAO2/sortiexml-intermediaire-slurp_$rubrique.xml";
#open my $outputUDPIPE, ">:encoding(utf8)", "sortieudpipe-slurp_$rubrique.txt";

# Préparation du fichier en sortie XML  
print $outputXML "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print $outputXML "<corpus2020>\n";

# Initialisation de variables 
my %dico_titres=();
my $numberItem=0;
my $nbFile=0;

#----------------------------------------
# PARCOURS RECURSIF DE L'ARBORESCENCE 

&parcoursarborescencefichiers($repertoire);	# Appel de la procédure de parcours de l'arborencence

#----------------------------------------
# FERMETURE DES FICHIERS EN SORTIE 

print $outputXML "</corpus2020>\n";
close $outputXML;

close $outputTXT;
#close $outputUDPIPE;

#----------------------------------------
# LANCEMENT DES SOUS-PROGRAMMES D'ETIQUETAGE SUR LES FICHIERS GLOBAUX

&etiquetageTT;
&etiquetageUD;

#----------------------------------------

print "Nombre d'items distincts : $numberItem \n";

# Temps écoulé depuis le lancement du programme
print "Time so far: ", $t->elapsed, " seconds\n";
exit;




#***********************************************************
#******************* SOUS-PROGRAMMES ***********************

#-----------------------------------------------------------
# PROCEDURE : Pour parcourir l'arborescence des fichiers 

sub parcoursarborescencefichiers {
	
	# Récupération de l'argument passé à la procédure 
	my $path = shift(@_);
	
	# Traitement du répertoire donné en argument : Ouverture + Lecture + Fermeture
	opendir(DIR, $path) or die "can't open $path: $!\n";
	my @files = readdir(DIR);
	closedir(DIR);
	
	# Pour chaque élément (répertoire ou fichier) dans le répertoire "racine"
	foreach my $file (@files) {
		
		# Ne pas traiter les répertoires . (répertoire courant) et .. (répertoire parent)
		next if $file =~ /^\.\.?$/;
		
		# Reconstruire le chemin de l'élément par rapport à ma position actuelle 
		$file = $path."/".$file;
		
		# Test de la nature de l'élément : Répertoire 
		if (-d $file) {
			&parcoursarborescencefichiers($file);	#recurse!
		}
		
		# Test de la nature de l'élément : Fichier 
		if (-f $file) {
			
			# Traitement du fichier XML correspondant à la rubrique recherchée
			if ($file =~/$rubrique.+xml$/) {
				print $nbFile++," Traitement de : ",$file,"\n";
				
				# Ouverture du fil RSS + Lecture globale + Fermeture
				open my $filRSS, "<:encoding(utf8)", $file;
				$/=undef;     # ou bien $\="";
				my $textelu=<$filRSS>;
				close $filRSS;
				
				# Extraction du contenu textuel des titres et des descriptions 
				while ($textelu=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg) {
					
					# Récupération des contenus textuels 
					my $titre=$1;
					my $description=$2;
					
					# Récupération de la date 
					$file=~/^(\d{4})\/(\d{2})\/(\d{2})/; 
					my $dateFilRSS = $1."-".$2."-".$3; 
					
					#$numberItem++;
					
					# Pour ne pas récupérer plusieurs fois la même information 
					if (!(exists $dico_titres{$titre})) { 
                        $numberItem++;
						$dico_titres{$titre}=$description ;
						# Appel du sous-programme de nettoyage 
						($titre,$description)=&nettoyage($titre,$description);
						# Ecriture des résultats en sorties
						print $outputTXT "$titre\n";
						print $outputTXT "$description\n";
						#print $outputTXT "--------------------\n";
						# Phase avant treetagger : Tokenization
						my ($titre_tokenise,$description_tokenise)=&tokenisationPreTT($titre,$description);
						#--------------------------------------
						print $outputXML "<item numero=\"$numberItem\" date=\"$dateFilRSS\">\n";
						print $outputXML "<titre>\n$titre_tokenise</titre>\n";
						print $outputXML "<description>\n$description_tokenise</description>\n";
						print $outputXML "</item>\n";
					}
				}
			}
		}
    }
}

#----------------------------------------------
# PROCEDURE : Pour nettoyer des chaînes de caractères correspondant aux titres et aux descriptions

sub nettoyage {
	
	# Récupération des arguments passés à la procédure 
	my $titre = $_[0];
	my $description = $_[1];
	
	# Nettoyage des titres
	$titre=~s/^<!\[CDATA\[//;
	$titre=~s/\]\]>$//;
	$titre=~s/&lt;.+?&gt;//g;
	$titre=~s/&#38;#39;/'/g;
	$titre=~s/&#38;#34;/"/g;
	$titre=~s/&nbsp;//g;
	$titre=~s/&amp;/et/g;     # ou $description=~s/&amp;//g;
    # normalement, à ce stage là, il ne devrait plus y avoir d'esperluette en tant qu'entité
    $titre=~s/&/et/g;   # On change les esperluettes restantes, souvent celles dans des noms de marque, par "et" 
	$titre=~s/$/\./g;   # Ajout d'un point à la fin de la chaîne de caractères
	$titre=~s/\.+$/\./g;    # Suppresion de points successifs 
	$titre=~s/\?\./\?/g;    # Suppression d'un point suivant un point d'interrogation
	
	# Nettoyage des descriptions
	$description=~s/^<!\[CDATA\[//;
	$description=~s/\]\]>$//;
	$description=~s/&lt;.+?&gt;//g;
	$description=~s/&#38;#39;/'/g;
	$description=~s/&#38;#34;/"/g;
	$description=~s/&nbsp;//g;
	$description=~s/&amp;/et/g;   # ou $description=~s/&amp;//g;
    # normalement, à ce stage là, il ne devrait plus y avoir d'esperluette en tant qu'entité
    $description=~s/&/et/g;   # On change les esperluettes restantes, souvent celles dans des noms de marque, par "et"
	$description=~s/$/\./g;   # Ajout d'un point à la fin de la chaîne de caractères
	$description=~s/\.+$/\./g;    # Suppresion de points successifs 
	$description=~s/\?\./\?/g;    # Suppression d'un point suivant un point d'interrogation
	
	return $titre, $description;
}

#----------------------------------------------
# PROCEDURE : Tokénisation des chaînes de caractères => Un token par ligne 

sub tokenisationPreTT {
	
	# Récupération des arguments passés à la procédure 
	my $titre = $_[0];
	my $description = $_[1];
	
	# Tokenisation du titre
	open (ETI, ">:encoding(utf8)", "temporaire.txt");
	print ETI $titre;
	close ETI;
	system ("perl -f ./Ressources/distrib-treetagger/tokenise-utf8.pl temporaire.txt > test.txt.pos");
	open (TEMP, "<:encoding(utf8)", "test.txt.pos");
	$/=undef;
	my $titre_etik_xml=<TEMP>;
	close TEMP;
	
	# Tokenisation de la description 
	open (ETI, ">:encoding(utf8)", "temporaire.txt");
	print ETI $description;
	close ETI;
	system ("perl -f ./Ressources/distrib-treetagger/tokenise-utf8.pl temporaire.txt > test.txt.pos");
	open (TEMP, "<:encoding(utf8)", "test.txt.pos");
	$/=undef;
	my $description_etik_xml=<TEMP>;
	close TEMP;
	
	return $titre_etik_xml, $description_etik_xml;
}

#----------------------------------------------
# PROCEDURE : Etiquetage avec TreeTagger => Sortie au format XML

sub etiquetageTT {
	
	system ("cat ./Resultats/Sorties_BAO2/sortiexml-intermediaire-slurp_$rubrique.xml | ./Ressources/distrib-treetagger/tree-tagger.exe ./Ressources/distrib-treetagger/french-utf8.par -token -lemma -no-unknown -sgml > ./Resultats/Sorties_BAO2/sortiexmlTT-slurp_$rubrique");
	system ("perl ./Ressources/distrib-treetagger/treetagger2xml-utf8-global.pl ./Resultats/Sorties_BAO2/sortiexmlTT-slurp_$rubrique utf8"); 
	
	# Supprime le fichier créé avant le reformatage en XML global
	system ("rm ./Resultats/Sorties_BAO2/sortiexmlTT-slurp_$rubrique");
}

#-----------------------------------------------
# PROCEDURE : Etiquetage avec UDPipe => Sortie au format CONLL

sub etiquetageUD {
	
	system("./Ressources/distrib-udpipe-1.2.0-bin/udpipe-1.2.0-bin/bin-linux64/udpipe.exe --tokenize --tokenizer=presegmented --tag --parse ./Ressources/distrib-udpipe-1.2.0-bin/modeles/french-sequoia-ud-2.5-191206.udpipe ./Resultats/Sorties_BAO2/sortie-slurp_$rubrique.txt > ./Resultats/Sorties_BAO2/sortieudpipe-slurp_$rubrique.txt");
	
	# A tester aussi avec le modèle french-gsd-ud-2.5-191206.udpipe
}

