#/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 fichier xml annotés avec talismane, l'entrée de XMLexo-13
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 
# il faut assurer que le fichier existe pas avant le traitement
open(OUTXML, ">>:encoding(utf-8)", "BAO2_Talismane_sortie-Regexp_$rubrique.xml");
print OUTXML "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
print OUTXML "<sortieTalismane>\n";

# on va créer une dictionnaire au début.
my %dico_test;
#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse!
#----------------------------------------
print OUTXML "</sortieTalismane>\n";
close OUTXML;
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;
			print OUTXML "<file name=\"$file\">\n";

			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);


					my ($titre_xml,$description_xml)=&xml_talismane($titre,$description);
					print OUTXML $titre_xml,"\n";
					print OUTXML $description_xml,"\n";
				}
			}
			print OUTXML "</file>\n";

	    	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;
	$titre =~ s/&amp;/et/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;
	$description =~ s/&amp;/et/g;
	return $titre, $description;
}

#----------------------------------------------
sub xml_talismane{

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

	################ traiter les textes de titre avec talismane #############
	$/=undef;
	open(ETI, ">:encoding(utf-8)", "temporaire_titre.txt");
	print ETI $titre;
	close ETI;

	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=temporaire_titre.txt --outFile=temporaire_titre.tal");
	
	open (TEMP, "<:encoding(utf-8)", "temporaire_titre.tal");

	# écrire le résultat de talismane dans un fichier temporaire
	open (TALI, ">:encoding(utf-8)", "talismane_titre.txt");
	$temp_talis=<TEMP>;
	close TEMP;
	print TALI $temp_talis;
	close TALI;

	# ajouter les balises sur les annotations de talismane
	open(ENTREE, "<:encoding(utf-8)", "talismane_titre.txt");
	open(OUT, ">:encoding(utf-8)", "xml_titre.xml");
	print OUT "<titre>\n";

	####### lire le fichier ligne par ligne
	$/="\n";
	while (my $ligne1=<ENTREE>){

		# voir si la ligne commence par le numéro
		if ($ligne1=~/^[0-9]{1,}.+/){

			# si la ligne commence par 1, ajouter la balise <p> 
			if ($ligne1=~/^1[^\d]+/){
				print OUT "<p>\n";

				# séparer les étiquettes annotées, et les stocker dans une liste
				my @liste1=split(/\t/,$ligne1);
				print OUT "<item>";
				foreach my $a1 (@liste1) {
					print OUT "<a>$a1</a>";
				}
			}
			# sinon, annoter directement les étiquettes avec les balises
			else {
				my @liste1=split(/\t/,$ligne1);
				print OUT "<item>";
				foreach my $a1 (@liste1) { 
					print OUT "<a>$a1</a>";
				}
			}
			print OUT "</item>\n";
		}
		# si la ligne ne commence pas par numéro (la ligne vide dans notre cas)
		# fermer la balise </p>
		else {
			print OUT "</p>\n";
		}
	}
	print OUT "</titre>\n";
	close ENTREE;
	close OUT;
	################ traiter les textes de titre avec talismane #############
	$/=undef;
	open(ETI, ">:encoding(utf-8)", "temporaire_description.txt");
	print ETI $description;
	close ETI;

	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=temporaire_description.txt --outFile=temporaire_description.tal");
	
	open (TEMP, "<:encoding(utf-8)", "temporaire_description.tal");
	open (TALI, ">:encoding(utf-8)", "talismane_description.txt");
	$temp_talis=<TEMP>;
	close TEMP;
	print TALI $temp_talis;
	close TALI;

	# ajouter les balises sur les annotations de talismane
	open(ENTREE, "<:encoding(utf-8)", "talismane_description.txt");
	open(OUT, ">:encoding(utf-8)", "xml_description.xml");
	print OUT "<description>\n";
	$/="\n";
	while (my $ligne2=<ENTREE>){

		# voir si la ligne commence par le numéro
		if ($ligne2=~/^[0-9]{1,}.+/){

			# si la ligne commence par 1, ajouter la balise <p> 
			if ($ligne2=~/^1[^\d]+/){
				print OUT "<p>\n";
				# séparer les étiquettes annotées, et les stocker dans une liste
				my @liste2=split(/\t/,$ligne2);
				print OUT "<item>";
				foreach my $a2 (@liste2) {
					print OUT "<a>$a2</a>";
				}
			}
			# sinon, annoter directement les étiquettes avec les balises
			else {
				my @liste2=split(/\t/,$ligne2);
				print OUT "<item>";
				foreach my $a2 (@liste2) { 
					print OUT "<a>$a2</a>";
				}
			}
			print OUT "</item>\n";
		}
		# si la ligne ne commence pas par numéro (la ligne vide dans notre cas)
		# fermer la balise </p>
		else {
			print OUT "</p>\n";
		}
	}
	print OUT "</description>\n";
	close ENTREE;
	close OUT;
	#----------------------------------------------
	# lire les textes étiquetés par talismane et annoté avec les balises
	open(TITRE, "<:encoding(utf-8)", "xml_titre.xml");
	open(DESC, "<:encoding(utf-8)", "xml_description.xml");
	$/=undef;
	my $titre_xml=<TITRE>;
	my $description_xml=<DESC>;
	close TITRE;
	close DESC;
	$titre_xml =~ s/<</-</g;
	$titre_xml =~ s/>>/>-/g;
	$titre_xml =~ s/&//g;
	$description_xml =~ s/<</-</g;
	$description_xml =~ s/>>/>-/g;
	$description_xml =~ s/&//g;

	return $titre_xml,$description_xml;
}