#/usr/bin/perl
use utf8;

#--------------------------------------------------------------------------------------------------------------------------------------------------------
# SEGHIER Marina
# BAO2 "étiquetage du texte" : les contenus textuels extraits doivent être étiquetés automatiquement (Treetagger et UDpipe : annotation en morpho-syntaxe et en dépendances)
#--------------------------------------------------------------------------------------------------------------------------------------------------------

# Pour lancer le script : perl bao2.pl 2021

#-----------------------------------------------------------
my $input="$ARGV[0]"; # on stocke dans la variable input le script (1er argument de la commande)
my $rubrique="$ARGV[1]"; # on stocke dans la variable rubrique le dossier (2e argument de la commande)
$input=~ s/[\/]$//; # on s'assure que le nom du dossier ne se termine pas par un /

# on ouvre 2 fichiers en sortie (1 txt et 1 xml) en encodant en UTF-8
open my $output_txt, ">:encoding(utf8)","corpus_$rubrique.txt";
open my $output_xml, ">:encoding(utf8)","pre-corpus_$rubrique.xml";

# on écrit dans le fichier xml les 1ères balises
print $output_xml "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
print $output_xml "<corpus>\n";

# on crée un dictionnaire vide qui va contenir les titres
my %dico_titres=();

#----------------------------------------
&parcoursarborescencefichiers($input);	# on appelle la fonction parcoursarborescencefichiers
#----------------------------------------

&etiquetage_UDPipe; # on annote avec UDPipe
&etiquetage_TreeTagger; # on annote avec TreeTagger

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

# on écrit la dernière balise fermante dans le fichier xml
print $output_xml "</corpus>\n";

# on ferme le script et les fichiers
close $input;
close $output_txt;
close $output_xml;

#---------------*FONCTIONS*-----------------#

# 1) parcoursarborescencefichiers :

sub parcoursarborescencefichiers {
    my $chemin = shift(@_); # on crée la variable chemin
    opendir(DIR, $chemin) or die "Impossible d'ouvrir : $chemin .\n"; # on ouvre le chemin avec la fonction opendir
    my @fichiers = readdir(DIR);  # on ouvre les fichiers avec la fonction readdir et on les stocke dans l'array fichiers
    closedir(DIR); # et on ferme le chemin
    foreach my $fichier (@fichiers) { # boucle pour chaque fichier
		next if $fichier =~ /^\.\.?$/; # on vérifie que fichier existe bien
		$fichier = $chemin."/".$fichier; # le fichier c'est donc celui au bout du chemin haha (feuille)
		if (-d $fichier) { # test si le fichier est un répertoire (option -d)
	    	&parcoursarborescencefichiers($fichier);	# on rappelle la fonction pour y rechercher encore des fichiers
		}
		if (-f $fichier) { # test si fichier est un fichier (option -f)
	    	if ($fichier =~/$rubrique.+xml$/) { # on lance le traitement sur les fichiers qui ont l'extension xml
				print $i++," : Traitement de --> ",$fichier,"\n"; # on incrémente un compteur pour décompter les fichiers pour suivre le traitement (utile quand ce sera plus sur le corpus test)
				open my $contenu,"<:encoding(utf8)",$fichier; # on ouvre le fichier et on stocke le contenu dans la variable éponyme
				$/=undef; # par défaut cette variable contient \n
				my $texte=<$contenu>; # on définit la variable texte et contient le contenu (!)
				close $contenu; # on ferme le contenu
				while ($texte=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) { # boucle tant que où on va écrire tout ça dans le fichier xml 
		    		my $titre=&nettoyage($1); # titre correspond au 1er (.+?) ci-dessus + on lance la fonction nettoyage
		    		my $description=&nettoyage($2); # description correspond au 2e (.+?) ci-dessus + on lance la fonction nettoyage
		    		
		    		if (!(exists $dico_titres{$titre})) { # si le titre n'existe pas encore dans le dico alors on l'écrit (sinon non --> évite les doublons)
						$dico_titres{$titre}=$description ; # alors on le rajoute au dico avec sa description
						
					# on écrit le résultat dans les fichiers en sorties
					print $output_txt $titre,"\n"; # on écrit le titre dans le fichier txt
					print $output_txt $description,"\n"; # on écrit la description dans le fichier txt

					my ($titre_seg, $description_seg) = &segmentation_TD($titre,$description); # on segmente les titres et les descriptions en appelant la fonction segmentation_TD, et on les enregistre dans des nouvelles variables
					print $output_xml "<item><titre>\n$titre_seg\n</titre><description>\n$description_seg\n</description></item>\n"; # on écrit les titres segmentés et les descriptions segmentées dans le fichier xml
		    		}
				}
	    	}
		}
	}
}

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

# 2) nettoyage :

sub nettoyage {
    my $titre = $_[0]; # sera le 1er argument de la fonction quand on l'appelera
    my $description = $_[1]; # sera le 2e argument de la fonction quand on l'appelera
    # là on enlève toutes les choses indésirables pour ne garder que le texte
	$titre=~s/^<!\[CDATA\[//;
	$titre=~s/\]\]>$//;
	$titre=~s/$/\./g;
	$titre=~s/&#38;#39;/'/g;
    $titre=~s/&#38;#34;/"/g;
	$titre=~s/&lt;.+?&gt;//g;
	$description=~s/^<!\[CDATA\[//;
	$description=~s/\]\]>$//;
    $description=~s/&#38;#39;/'/g;
    $description=~s/&#38;#34;/"/g;
    $description=~s/&lt;.+?&gt;//g;
    return $titre,$description; # et on retourne le résultat (titres et descriptions)
}

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

# 3) etiquetage_UDPipe :

sub etiquetage_UDPipe{
	# distrib-udpipe-1.2.0-bin/udpipe-1.2.0-bin/bin-osx/udpipe --tokenize --tag --parse distrib-udpipe-1.2.0-bin/modeles/french-sequoia-ud-2.5-191206.udpipe test.txt > resultat2.txt
	system("data/bao2/distrib-udpipe-1.2.0-bin/udpipe-1.2.0-bin/bin-osx/udpipe --tokenize --tag --parse --tokenizer=presegmented data/bao2/distrib-udpipe-1.2.0-bin/modeles/french-sequoia-ud-2.5-191206.udpipe data/bao1/$rubrique/corpus_$rubrique.txt > data/bao2/$rubrique/corpus_$rubrique.udpipe");
}

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

# 4) etiquetage_TreeTagger :

sub etiquetage_TreeTagger{
	#perl -f tokenise-utf8.pl test.txt | ./TreeTagger/cmd/tree-tagger-french -token -lemma -sgml > resultat.txt
	system("data/bao2/TreeTagger/cmd/tree-tagger-french data/bao2/$rubrique/pre-corpus_$rubrique.xml > data/bao2/$rubrique/corpus_$rubrique");
	# perl treetagger2xml-utf8.pl resultat.txt "UTF-8"
	system("perl data/bao2/treetagger2xml-utf8.pl data/bao2/$rubrique/corpus_$rubrique UTF-8");
}

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

# 5) segmentation_TD :

sub segmentation_TD {
	#titre, description
	#perl -f tokenise-utf8.pl test.txt | ./TreeTagger/cmd/tree-tagger-french -token -lemma -sgml > resultat.txt

	my ($arg1, $arg2) = @_;
	# ecriture des données textuelles dans un fichier TOTO
	# puis tokenizer TOTO 
	# puis récup les données 
	open my $tmp, ">:encoding(UTF-8)","data/bao2/$rubrique/bao2_$rubrique.txt";
	print $tmp $arg1;
	close $tmp;
	system("perl -f data/bao2/tokenise-utf8.pl data/bao2/$rubrique/bao2_$rubrique.txt > data/bao2/$rubrique/bao2_$rubrique-2.txt");
	undef $/;
	open my $tmp2, "<:encoding(UTF-8)","data/bao2/$rubrique/bao2_$rubrique-2.txt";
	my $titre_seg=<$tmp2>;
	close $tmp2;

	open $tmp, ">:encoding(UTF-8)","data/bao2/$rubrique/bao2_$rubrique.txt";
	print $tmp $arg2;
	close $tmp;
	system("perl -f data/bao2/tokenise-utf8.pl data/bao2/$rubrique/bao2_$rubrique.txt > data/bao2/$rubrique/bao2_$rubrique-2.txt");
	open $tmp2, "<:encoding(UTF-8)","data/bao2/$rubrique/bao2_$rubrique-2.txt";
	my $description_seg=<$tmp2>;
	close $tmp2;
	$/="\n";
	return $titre_seg, $description_seg;
	
	# tous les fichiers intermédiaires sont supprimés à la fin
}