#!/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 XML::RSS;
use Data::Dumper;
use Data::Dump qw(dump);
use strict;
use utf8;
use Timer::Simple;
use warnings;
binmode(STDOUT, ":encoding(UTF-8)");

# 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";
				
				# Récupération de la date 
				$file=~/^(\d{4})\/(\d{2})\/(\d{2})/; 
				my $dateFilRSS = $1."-".$2."-".$3; 
				
				# Création de l'objet XML::RSS / Remise à zéro de l'objet XML::RSS 
				my $rss=new XML::RSS; 
				
				# Remplissage de l'objet XML::RSS  via parsefile
				eval {$rss->parsefile($file); };
				
				if( $@ ) {
					$@ =~ s/at \/.*?$//s;               # remove module line number
					print STDERR "\nERROR in '$file':\n$@\n";
				} 
				else {
					# Extraction du contenu textuel des titres et des descriptions 
					foreach my $item (@{$rss->{'items'}}) {
						
						#$numberItem++;
						
						# Récupération des contenus textuels (nettoyés) 
						my $titre=&nettoyage($item->{'title'});
						my $description=&nettoyage($item->{'description'});
						
						# Pour ne pas récupérer plusieurs fois la même information 
						if (!(exists $dico_titres{$titre})) { 
                            $numberItem++;
							$dico_titres{$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 de l'argument passé à la procédure 
	my $texte=shift @_;
	
	# Nettoyage de la chaîne de caractères
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g;
	$texte.=".";  # Ajout d'un point à la fin de la chaîne de caractères
    $texte=~s/&lt;.+?&gt;//g;
	$texte=~s/&#38;#39;/'/g;
	$texte=~s/&#38;#34;/"/g;
	$texte=~s/&nbsp;//g;
	$texte=~s/&amp;/et/g;   # ou $description=~s/&amp;//g;
    $texte=~s/&/et/g;    # On change les esperluettes restantes, souvent celles dans des noms de marque, par "et" 
	$texte=~s/\.+$/\./;   # Suppresion de points successifs 
	$texte=~s/\?\./\?/g;   # Suppression d'un point suivant un point d'interrogation
	
	return $texte;
}

#----------------------------------------------
# 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
}

