#/usr/bin/perl
<<DOC; 
Votre Nom : Xiaoxia & Wenfei
 2019-2020-S2-Projet BaO-BaO2-étiquetage
 Commande : perl BaO2-etiquetage.pl repertoire-a-parcourir code-rubrique
 Moyen : On extrait des contenus à l'aide des expression régulières et les étiqueter par 2 moyens :
           - Treetagger
		   - Talismane
 Entrée : 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.
 Sortie : Avec les étiqueteurs Treetagger et Talismane, nous pouvons enfin recevoir 4 fichiers finaux :
           - BaO2-etiquetage-sortie-slurp_$rubrique.txt : les titres et les descriptions séparés
             par "-----------" sous forme de texte brut
           - BaO2-etiquetage-sortietreetagger-slurp_$rubrique.xml : document structuré et étiqueté par Treetagger
		     Sa structure arborescente est la suivante :
			 <corpus2019>
			   <item name="file">
			     <titre>
				   <article>
				     <element>
					   <data>Type</data>
					   <data>Lemma</data>
					   <data>Token</data>
					 </element>
				   </article>
				 </titre>
				 <description>
				   <article>
				     <element>
					   <data>Type</data>
					   <data>Lemma</data>
					   <data>Token</data>
					 </element>
				   </article>
				 </description>
			   </item>
			 </corpus2019>
           - BaO2-etiquetage-sortietalismane-slurp_$rubrique.txt : texte brut avec l'étiquetage donné par
             Talismane sans d'autres informations
 Fonction supplémentaire : À la fin de la programme, il nous affiche le temps de calcul.
 Remarques : Partie pour le cours Document Sctructuré
             le script du cours va produire la sortie de TALISMANE sans le remarqueur
			 "debuttitre""fintitre""debutdescription""findescription", mais pout le cours
			 Document Structuré, il nous faut avoir une telle sortie de TALISMANE. La partie
			 ici est juste pour produire ce fichier et il est un peut répétitif du script en
			 classe. Et pour gagner du temps, je n'ai pas refonctionner cette partie pour
			 toutes les rubriques de mon projet.
DOC

#-----------------------------------------------------------
# Introduire le module pour obtenir le temps
use Time::HiRes qw(gettimeofday tv_interval);
my $timepg = [gettimeofday];
# Récupérer le nom du répertoire, soit 2019 ici
my $rep="$ARGV[0]";
# Récupérer le code de rubrique
my $rubrique ="$ARGV[1]";
# Assurer que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# Préparer les fichiers (TXT et XML) de sortie où on met les résultats
open(OUT,">:encoding(utf8)","BaO2-etiquetage-sortie-slurp_$rubrique.txt");
open(OUTXML,">:encoding(utf8)","BaO2-etiquetage-sortietreetagger-slurp_$rubrique.xml");
open(OUTTALISMANE,">:encoding(utf8)","BaO2-etiquetage-sortietalismane-slurp_$rubrique.txt");
print OUTXML "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print OUTXML "<corpus2019>\n";
# ================================================
# Partie pour le cours "Document Sctructuré"
#open(OUTTALISMANEINFO,">:encoding(utf8)","BaO2-etiquetage-sortietalismane-info-slurp_$rubrique.txt");
# ================================================

# Mémoriser des titres et des descriptions rencontrés en table de hashage
my %dico_des_titres=();

#----------------------------------------
# Faire appel au sous programme parcoursarborescencefichiers en prenant le répertoire comme argument
&parcoursarborescencefichiers($rep);	#recurse!

#----------------------------------------
# Fermer des fichers de sortie
print OUTXML "</corpus2019>\n";
close OUT;
close OUTXML;
close OUTTALISMANE;
# ================================================
# Partie pour le cours "Document Sctructuré"
#close OUTTALISMANEINFO;
# ================================================

#----------------------------------------
# Afficher le temps de calcul
print "\n\nScript execution time: " . tv_interval($timepg) . " seconds.\n";

#----------------------------------------
# Sortir de la programme
exit;

#----------------------------------------------
sub parcoursarborescencefichiers {
    # Récupérer le répertoire (mois)
    my $path = shift(@_);
	# Stocker le contenu du répertoire
    opendir(DIR, $path) or die "can't open $path: $!\n";
	# readdir : lire le répertoire et le résultat donné est une liste
    my @files = readdir(DIR);
    closedir(DIR);
	# Parcourir la liste (les fichiers dans le répertoire)
    foreach my $file (@files) {
		# si le nom est . ou .., passer à la suite
		next if $file =~ /^\.\.?$/;
		# Reconstruire le chemin pour accéder le répertoire fils
		$file = $path."/".$file;
		# si c'est un répertoire
		if (-d $file) {
			#recurse!
			&parcoursarborescencefichiers($file);
		}
		# si c'est un fichier
		if (-f $file) {
			# TRAITEMENT à réaliser sur chaque fichier
			# si le nom de fichier contient l'identifiant de rubrique
			if ($file =~/$rubrique.+xml$/) {
				# Afficher sur l'écran le document à traitement
				print $i++," Traitement de : ",$file,"\n";
				# Obtenir le contenu
				open(FIC,"<:encoding(utf8)",$file);
				$/=undef;     #ou $\=""
				my $textelu=<FIC>;
				close FIC;
                # étape 1 : initialisation du texte global
                my $titredescriptionglobal="";
				# initialisation des titres ensemble (pour TALISMANE)
				my $titreensemble="";
				# initialisation des descriptions ensemble (pour TALISMANE)
				my $descriptionensemble="";
				# Utiliser les expressions régulières pour extraire le titre et la description de chaque article
				while ($textelu=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg) {
					# Donner respectivement des contenus mémorisés par les crochets 
					my $titre=$1;
					my $description=$2;
					# si "$dico_des_titres" n'existe pas
					if (!(exists $dico_des_titres{$titre})) { 
					$dico_des_titres{$titre}=$description ;
					# Appeler le sous-programme de nettoyage 
					($titre,$description)=&nettoyage($titre,$description);
					# Regrouper le texte global
                    $titredescriptionglobal=$titredescriptionglobal.$titre."\n";
					# § : pour identifier la fin de discours (description)
                    $titredescriptionglobal=$titredescriptionglobal.$description."§\n";
					# Appeler le sous programme etiquetage (sortie étiquetée par Treetagger)
					my ($titre_etiket,$description_etiket)=&etiquetage($titre,$description);
					# ================================================
					# Partie pour le cours "Document Sctructuré"
					# Regrouper le texte global par genre (titre vs. description)
					#$titreensemble = $titreensemble."debuttitre\n".$titre."\nfintitre\n";
					#$descriptionensemble = $descriptionensemble."debutdescription\n".$description."§\nfindescription\n";
					# ================================================
					# Ecriture des résultats en sorties
					print OUT $titre,"\n";
					print OUT $description,"\n";
					print OUT "--------------------\n";
					print OUTXML "<item name='$file'>\n<titre>$titre_etiket</titre>\n<description>$description_etiket</description></item>\n";
					}
				}
                # étape 2 : lancement de talismane sur $titredescriptionglobal
                # actuellement les données à annoter sont dans une variable
                # il faut donc les mettre dans un fichier
				# OUTTALISMANE
                open(TALIS,">:encoding(utf8)","bao1_test.txt");
                print TALIS $titredescriptionglobal;
                close TALIS;
                # lancer talismane :
				# mon script se trouve au même niveau avec le dossier "TALISMANE"
                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=bao1_test.txt --outFile=bao1_test.tal");
                
                # intégrer le resultat de l'annotation précédente dans le fichier global talismane
                open(TEMP, "<:encoding(utf8)", "bao1_test.tal");
                $temp=<TEMP>;
                close TEMP;
                print OUTTALISMANE $temp;
                # ================================================
				# Partie pour le cours "Document Sctructuré"
				# Partie Titre
                #open(FICHIER,">:encoding(utf8)","bao1_test.txt");
                #print FICHIER $titreensemble;
                #close FICHIER;
                #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=bao1_test.txt --outFile=bao1_test.tal");
                # intégrer le resultat de l'annotation précédente dans le fichier global talismane
                #open(TEMP, "<:encoding(utf8)", "bao1_test.tal");
                #$temp=<TEMP>;
                #close TEMP;
				#print OUTTALISMANEINFO "## titre : ", $file, "\n\n";
                #print OUTTALISMANEINFO $temp;
				
				# Partie Description
                #open(FICHIER,">:encoding(utf8)","bao1_test.txt");
                #print FICHIER $descriptionensemble;
                #close FICHIER;
                #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=bao1_test.txt --outFile=bao1_test.tal");
                #open(TEMP, "<:encoding(utf8)", "bao1_test.tal");
                $temp=<TEMP>;
                #close TEMP;
				#print OUTTALISMANEINFO "## description : ", $file, "\n\n";
                #print OUTTALISMANEINFO $temp;
				# ================================================
			}
		}
    }
}

#----------------------------------------------
# Le sous programme nettoyage
sub nettoyage {
    # donner la valeur du 1er élément de l'entrée à la variable "titre"
    my $titre = $_[0];
    # donner la valeur du 2nd élément de l'entrée à la variable "description"
    my $description = $_[1];
	# Remplacement
	$titre=~s/^<!\[CDATA\[//;
	$titre=~s/\]\]>$//;
    $titre=~s/&lt;.+?&gt;//g;
    $titre=~s/&#38;#39;/'/g;
    $titre=~s/&#38;#34;/"/g;
    $titre=~s/&amp;/&/g;
    $titre=~s/$/\./g; # Ajouter . pour marquer la fin de discours (titre)
    $titre=~s/^<!\[CDATA\[//;
    $titre=~s/\]\]>$//;
	$description=~s/^<!\[CDATA\[//;
	$description=~s/\]\]>$//;
    $description=~s/&lt;.+?&gt;//g;
    $description=~s/&#38;#39;/'/g;
    $description=~s/&#38;#34;/"/g;
    $description=~s/&amp;/&/g;
    $description=~s/^<!\[CDATA\[//;
    $description=~s/\]\]>$//;
	# Renvoyer les résultats
    return $titre,$description;
}
#----------------------------------------------
# Le sous programme etiquetage (Partie Treetagger)
sub etiquetage {
    # donner la valeur du 1er élément de l'entrée à la variable "titre"
    my $titre = $_[0];
	# donner la valeur du 2nd élément de l'entrée à la variable "description"
    my $description = $_[1];
	#-----------------étiquetage titre-----------------------------
	open (ETI, ">:encoding(utf8)", "temporaire.txt");
    print ETI $titre;
    close ETI;
    system ("perl -f tokenise-utf8.pl temporaire.txt | ./tree-tagger.exe french-oral-utf-8.par -token -lemma -no-unknown > test.txt.pos");
    system ("perl treetagger2xml-utf8.pl test.txt.pos utf8"); # résultats dans test.txt.pos.xml
    open (TEMP, "<:encoding(utf8)", "test.txt.pos.xml");
    $/=undef;
    my $titre_etik_xml=<TEMP>;
    close TEMP;
    $titre_etik_xml=~s/^<\?xml[^>]+>//;
	#-----------------étiquetage description-----------------------------
    open (ETI, ">:encoding(utf8)", "temporaire.txt");
    print ETI $description;
    close ETI;
    system ("perl -f tokenise-utf8.pl temporaire.txt | ./tree-tagger.exe french-oral-utf-8.par -token -lemma -no-unknown > test.txt.pos");
    system ("perl treetagger2xml-utf8.pl test.txt.pos utf8"); #résultats dans test.txt.pos.xml
    open (TEMP, "<:encoding(utf8)", "test.txt.pos.xml");
    $/=undef;
    my $description_etik_xml=<TEMP>;
    close TEMP;
    $description_etik_xml=~s/^<\?xml[^>]+>//;
    return $titre_etik_xml,$description_etik_xml;
}