#/usr/bin/perl
<<DOC; 
L'entrée dans le bash : perl fichier.pl  nom_répertoire numéro_rubrique
L'objectif : 
- parcourir tous les fichiers et tous les répertoires dans un répertoire 
- pour obtenir les extractions de TITRE et DESCRIPTION.
- les sorties : un txt, un xml

ATTENTION : pour utiliser le treeTagger, il faut d'abord l'initialer avant effectuer ce programme perl,
en exécuter la commande "PATH=$PATH:/Applications/treetagger/bin" sur mon ordinateur, pour changer le chemin vers treeTagger.
Et ça dépend de l'ordinateur, du chemin où on stocke treeTagger.
DOC
#-----------------------------------------------------------
my $rep="$ARGV[0]";  # $rep = le nom du répertoire de départ
# on s'assure que le nom du répertoire ne se termine pas par un "/"
my $rubrique = "$ARGV[1]";

$rep=~ s/[\/]$//;  # on enlève la fin de la ligne
# on initialise une variable contenant le flux de sortie 
open(OUT, ">>:encoding(utf-8)", "BAO2_treeTagger_sortie-Regexp_$rubrique.txt");
open(OUTXML, ">>:encoding(utf-8)", "BAO2_treeTagger_sortie-Regexp_$rubrique.xml");
open(OUTTALIS, ">>:encoding(utf-8)", "BAO2_Talismane_sortie-Regexp_$rubrique.txt");

print OUTXML "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
print OUTXML "<sortieCorpus>\n";

# on va créer une dictionnaire au début.
my %dico_test;
#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse!
#----------------------------------------
close OUT;
print OUTXML "</sortieCorpus>\n";
close OUTXML;
close OUTTALIS;
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_);  # @_ représente le paramètre du sous-programme
    
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);  # je mets tous les fichiers et les répertoires de ce répertoire dans une liste.
    closedir(DIR);
    foreach my $file (@files) {
    # et quand on lit le répertoire, il y a des répertoires cachés "." et "..",
    # mais il ne faut pas traiter "." (récursivité infinie) non plus "..".
	next if $file =~ /^\.\.?$/;  # sauter et continuer
	$file = $path."/".$file;  # il faut reconstruire le chemin d'accès.
	if (-d $file) { # -d (directory) vérifie c'est un répertoire ou un fichier
	    &parcoursarborescencefichiers($file);	#recurse!
	}
	if (-f $file) { # -f (file) vérifie si c'est un fichier
		if ($file =~/$rubrique.+xml$/){
			open(FIC, "<:encoding(utf-8)", $file);
			$/=undef; # ou $/="" si l'on va lire un texte, on le fait systématiquement global, sinon par défaut ligne par ligne
			my $textelu=<FIC>;
			close FIC;
			my $concatenationTalis = "";



			while ($textelu =~ /<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) {
				my $titre = $1;
				my $description = $2;

				if (not exists $dico_test{$titre}){  # éviter les doublons
					$dico_test{$titre}=$description;
					($titre,$description)=&nettoyage($titre,$description);

					$concatenationTalis = $concatenationTalis.$titre."\n";
					$concatenationTalis = $concatenationTalis.$description."§\n";


					my ($titre_etiket,$description_etiket)=&etiquetage($titre,$description);
					$titre_etiket =~ s/&//g;
					$description_etiket =~ s/&//g;
					print OUT "TITRE : ", $titre, "\n";
					print OUT "DESCP : ", $description, "\n";
					print OUT "----------------------", "\n";
					print OUTXML "<item>\n";
					print OUTXML "<title>$titre_etiket</title>\n";
					print OUTXML "<description>$description_etiket</description>\n";
					print OUTXML "</item>\n";
				}
			}

			# lancer Talismane sur $concatenationTalis
			# les données à traiter sont dans une variable, il faut les mettre dans un fichier.

			open (FILETALIS, ">:encoding(utf-8)", "bao2_test.txt");
			print FILETALIS $concatenationTalis;
			close FILETALIS;

			system ("java -Xmx1G -Dconfig.file=TALISMANE-BAO2019-DISTRIB/talismane-fr-5.0.4.conf -jar TALISMANE-BAO2019-DISTRIB/talismane-core-5.1.2.jar --analyse --sessionId=fr --encoding=UTF8 --inFile=bao2_test.txt --outFile=bao2_test.tal");

			# intégrer le résultat de l'annotation précédente dans le fichier
			open (TEMP_TALIS, "<:encoding(utf-8)", "bao2_test.tal");
			$temp_talis=<TEMP_TALIS>;
			close TEMP_TALIS;
			print OUTTALIS $temp_talis;

	    	print "$file est le ", $i++,"\n";
	    }
	}
    }
}
#----------------------------------------------
sub nettoyage {

	my $titre = $_[0]; 
	my $description = $_[1]; 


	$titre =~ s/&lt;.+?&gt;//g;
	$titre =~ s/&#38;#39;/'/g;
	$titre =~ s/&#38;#34;/"/g;
	# pour tous les titres, on ajoute un point à la fin.
	$titre =~ s/$/\./g;
	$description =~ s/&lt;.+?&gt;//g;
	$description =~ s/&#38;#39;/'/g;
	$description =~ s/&#38;#34;/"/g;
	return $titre, $description;
}

#----------------------------------------------
sub etiquetage{

	my $titre = $_[0];
	my $description = $_[1];

	open(ETI, ">:encoding(utf-8)", "temporaire.txt");
	print ETI $titre;
	close ETI;

	system ("PATH=$PATH:/Applications/treetagger/bin");
	system ("perl -f BAO2_tokenise-utf8.pl temporaire.txt | tree-tagger -token -lemma -no-unknown /Applications/treetagger/lib/french-oral-utf-8.par > temporaire.txt.pos");    
	## pour effectuer un autre programme dans le terminal
	system ("perl BAO2_treetagger2xml-utf8.pl temporaire.txt.pos utf-8");
	## les résultats sont dans le fichier temporaire.txt.pos.xml

	## il faut lire le fichier temporaire.txt.pos.xml, et puis mettre les contenu dans $titre_etiket
	open(TEMP, "<:encoding(utf-8)", "temporaire.txt.pos.xml");
	$/=undef;
	my $titre_etiket_xml=<TEMP>;
	close TEMP;
	$titre_etiket_xml=~s/^<\?xml[^>]+>//;

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

	open(ETI, ">:encoding(utf-8)", "temporaire.txt");
	print ETI $description;
	close ETI;

	system ("PATH=$PATH:/Applications/treetagger/bin");
	system ("perl -f BAO2_tokenise-utf8.pl temporaire.txt | tree-tagger -token -lemma -no-unknown /Applications/treetagger/lib/french-oral-utf-8.par > temporaire.txt.pos");    
	## pour effectuer un autre programme dans le terminal
	system ("perl BAO2_treetagger2xml-utf8.pl temporaire.txt.pos utf-8");
	## les résultats sont dans le fichier temporaire.txt.pos.xml

	## il faut lire le fichier temporaire.txt.pos.xml, et puis mettre les contenu dans $titre_etiket
	open(TEMP, "<:encoding(utf-8)", "temporaire.txt.pos.xml");
	$/=undef;
	my $description_etiket_xml=<TEMP>;
	close TEMP;
	$description_etiket_xml=~s/^<\?xml[^>]+>//;

	return $titre_etiket_xml,$description_etiket_xml;

}












