#/usr/bin/perl
<<DOC;
CARON Juliette REY Camille
2020
 usage : perl bao2_carrey.pl repertoire-a-parcourir rubrique
 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 
 -> étiquetage TreeTagger & Talismane
DOC
#--------------------------------------------------------------------------------------------
use utf8;

#récupération des arguments du programme
my $rep="$ARGV[0]";
my $rubrique="$ARGV[1]";

my $i = 0;

#le nom du répertoire ne doit pas se terminer pas par un "/"
$rep=~ s/[\/]$//;

#ouverture des fichiers de sortie
open(OUT,">:encoding(utf8)","SORTIEBAO2/sortie-txt-brut_$rubrique.txt");
open(OUTTALISMANE, ">:encoding(utf8)", "SORTIEBAO2/sortie-talismane_$rubrique.txt");
open(OUTXML,">:encoding(utf8)","SORTIEBAO2/sortie-tt-xml_$rubrique.xml");

#écriture des premières lignes du fichier de sortie xml
print OUTXML "<!--?xml version=\"1.0\" encoding=\"utf-8\" ?-->\n";
print OUTXML "<corpus2019>\n";

#initialisation du dico pour les doublons
my @dico_des_titres;
#----------------------------------------
&parcoursarborescencefichiers($rep);	#parcours de l'arborescence avec une fonction recursive
#----------------------------------------

#fermeture des fichiers
print OUTXML "</corpus2019>\n";
close OUT;
close OUTXML;
close OUTTALISMANE;
exit;
#-----------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_);   #chemin du repertoire
    opendir(DIR, $path) or die "can't open $path: $!\n";   #ouverture repertoire (ou probleme)
    my @files = readdir(DIR);      #lecture du contenu du repertoire
    closedir(DIR);     #fermeture repertoire
    foreach my $file (@files) {         #boucle sur les éléments du repertoire
        next if $file =~ /^\.\.?$/;
        $file = $path."/".$file;
        if (-d $file) { #si c'est un répertoire
            &parcoursarborescencefichiers($file);   #recursif
        }
        if (-f $file) { #si c'est un fichier
            if ($file=~/$rubrique.+\.xml$/) {
				print $i++," Traitement de : ",$file,"\n";
				open(FIC,"<:encoding(utf8)",$file);
				$/=undef;    
                my $textelu;
                while (my $line = <FIC>) { #on continue à lire tant que c'est possible
					chomp $line;    #supprimer le caractère de fin de ligne
					$textelu = $textelu . " $line";}
				close FIC;
				
			    #initialisation du texte global
                my $titredescriptionglobal="";

                while ($textelu =~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg) {  #R.E. pour récup. les 2 parties qui nous intéressent
                    my $titre = $1;         #on stocke les deux chaînes extraites dans des variables locales
                    my $description = $2;
					
					if ( !(exists $dico_des_titres{$titre}) ) {   #éviter les doublons
					
					$dico_des_titres{$titre}=$description ;
					
					#appel du sous-programme de nettoyage 
					($titre,$description)=&nettoyage($titre,$description);
					
                    $titredescriptionglobal=$titredescriptionglobal.$titre."\n";
                    $titredescriptionglobal=$titredescriptionglobal.$description."\n";
					
					#appel de la fonction d'étiquetage TreeTagger
					my ($titre_etiket,$description_etiket)=&etiquetageTREE($titre,$description);
					
					#écriture des résultats en sorties
					print OUT $titre,"\n";
					print OUT $description,"\n\n";
					print OUTXML "<item>\n<titre>$titre_etiket</titre>\n<description>$description_etiket</description>\n</item>\n";
					}
				}
                #étiquetage talismane = aussi par appel d'une fonction (parce que c'est + cool)
				my $etiqTALIS = &etiquetageTALIS($titredescriptionglobal);
				#écriture en sortie
				print OUTTALISMANE "$etiqTALIS";

			}
		}
    }
}

#-------------------------------------------------------------
#------------------FONCTIONS----------------------------------
#-------------------------------------------------------------

#FONCTION DE NETTOYAGE
sub nettoyage {

    my $titre = $_[0];
    my $description = $_[1];
	
	#on remplace/supprime tous les éléments qui posent pb (surtout les car. transcodés)
	$titre=~s/^<!\[CDATA\[//;
	$titre=~s/\]\]>$//;
	$titre=~s/<.+?>//g;
    $titre=~s/&#39;/'/g;
    $titre=~s/&#34;/"/g;
    $titre=~s/$/\./g;
	$titre=~s/&amp;/&/g; 

	$description=~s/^<!\[CDATA\[//;
	$description=~s/\]\]>$//;
    $description=~s/<.+?>//g;
    $description=~s/&#39;/'/g;
    $description=~s/&#34;/"/g;
	$description=~s/&amp;/&/g;

    return $titre,$description;
}

#----------------------------------------------
#FONCTION ETIQUETAGE TALISMANE
sub etiquetageTALIS {

    my $y = shift @_;
    open (TALIS, ">:encoding(utf8)", "PROCESS/bao_test.txt" );  #on stocke les fichiers qui ne nous serviront plus à la fin du programme dans un dossier PROCESS 
    print TALIS $y;
    close TALIS;
    system ("java -Xmx1G -Dconfig.file=TALISMANE/talismane-fr-5.0.4.conf -jar TALISMANE/talismane-core-5.1.2.jar --analyse --sessionId=fr --encoding=UTF8 --inFile=PROCESS/bao_test.txt --outFile=PROCESS/bao_test.tal");
	#le dossier TALISMANE contient tous les fichiers/applications nécessaires pour effectuer l'étiquetage avec TALISMANE
    my $temp;
    {
        local $/=undef;
        open(TEMP, "<:encoding(utf8)", "PROCESS/bao_test.tal");
        $temp = <TEMP>;
        close TEMP;
    }
    return $temp;

}

#----------------------------------------------
#FONCTION ETIQUETAGE TREETAGGER
sub etiquetageTREE {
	my $titre = $_[0];
	my $description = $_[1];
	#-----------------etiquetage titre-----------------------------
	my $titre_etik_xml;
	open (ETI, ">:encoding(utf8)", "PROCESS/temporaire.txt");
	print ETI $titre ;
	close ETI;
	system("perl -f tokenise-utf8.pl -f PROCESS/temporaire.txt | ./TTAGGER/tree-tagger.exe -token -lemma -no-unknown TTAGGER/french-utf8.par > PROCESS/test.txt.pos");
	#le dossier TTAGGER contient tous les fichiers/applications nécessaires pour effectuer l'étiquetage avec TreeTagger
	system("perl -f TTAGGER/treetagger2xml-utf8.pl PROCESS/test.txt.pos utf8");
	{
        local $/=undef;
        open(TEMP, "<:encoding(utf8)", "PROCESS/test.txt.pos.xml");
        $titre_etik_xml = <TEMP>;
        close TEMP;
        $titre_etik_xml =~ s/<\?xml.+?>//;
	}
	#-----------------etiquetage description-----------------------------
	my $description_etik_xml;
	open (ETI, ">:encoding(utf8)", "PROCESS/temporaire.txt");
	print ETI $description ;
	close ETI;
	system("perl -f tokenise-utf8.pl -f PROCESS/temporaire.txt | ./TTAGGER/tree-tagger.exe -token -lemma -no-unknown TTAGGER/french-utf8.par > PROCESS/test.txt.pos");
	system("perl TTAGGER/treetagger2xml-utf8.pl PROCESS/test.txt.pos utf8");
	{
        local $/=undef;
        open(TEMP, "<:encoding(utf8)", "PROCESS/test.txt.pos.xml");
        $description_etik_xml = <TEMP>;
        $description_etik_xml =~ s/<\?xml.+?>//;
        close TEMP;
	}
    print "$titre\n";
	return $titre_etik_xml, $description_etik_xml;   #on renvoie les éléments étiquetés
}