#!/usr/bin/perl
#use strict; # 1303 déclarer les erreurs OU on met #/usr/bin/perl -w (warning)
use utf8;
<<DOC; 
Nom : YU Xin
Date : 13/03/2019, 15/04/2019
usage : perl script.pl repertoire-a-parcourir numero-rubrique
perl bao2_yu_viaRegrep.pl 2018 3476
Le programme prend en entrée le nom du répertoire contenant les fichiers
à traiter et le nom de la rubrique à traiter (via une suite de chiffres)
Le programme construit en sortie 2 fichiers :
- un fichier TXT
- un fichier structuré en XML
Les 2 fichiers contiennent les zones textuelles extraites des fils RSS
DOC
#-----------------------------------------------------------
# $ARGV[] ne prend pas en compte des fichiers pl
my $rep="$ARGV[0]"; # répertoire-a-parcourir
my $rubrique = "$ARGV[1]";
my $i=1;
my %doublons; #créer un tableau associatif / valeur à une clef
# enlever le "/" dans le nom du répertoire s'il est à la fin
$rep=~ s/[\/]$//;
#----------------------------------------
open(OUT, ">:encoding(utf-8)", "bao2-sortie-$rubrique-egrep.txt");
open(OUTXML, ">:encoding(utf-8)", "bao2-sortie-$rubrique-egrep.xml");
print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print OUTXML "<racine>\n";
open(TALISMANE, ">:encoding(utf-8)", "bao2-sortie-$rubrique-talismane.txt");
&parcoursarborescencefichiers($rep);	#recurse
close OUT;
print OUTXML "</racine>\n";
close OUTXML;
close TALISMANE;
exit;
#----------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_);
    opendir(DIR, $path) or die "Can't open $path ! Raison : $!\n"; # opendir() : fonction permettant d'ouvrir un répertoire. elle fonctionne comme ls -la répertoire-a-parcourir
    my @files = readdir(DIR); # readdir() : fonction permettant de lire le contenu du répertoire. il renvoie la liste de ressource du répertoire dans la variable @files
    closedir(DIR);
    foreach my $file (@files) { # on examine la liste @files, on enregistre chaque ligne de la liste dans une variable $file
	# foreach (@files) {} si on ne crée pas de nouvelle variable
		next if $file =~ /^\.\.?$/; # on ne traite pas les fichiers cachés : le nom du fichier commence par . ou ..
		$file = $path."/".$file; # à partir de $ARGV[0], recréer un chemin 
		if (-d $file) { #-d : opérateur pour tester si $file est un dossier 
			print "On entre dans le dossier $file\n";
			&parcoursarborescencefichiers($file);	#recurse! on ré-ouvert le dossier $file
		}
		if (-f $file) { # -f : détecter si $file est un fichier
			# TRAITEMENT à réaliser sur chaque fichier
			if($file =~/$rubrique.+\.xml$/) { # on cherche dans le nom du fichier les fichiers xml dont les noms contiennent la rubrique que l'on a passé sur le 3ere argument 
				print $i++," : $file  \n"; # imprimer $i, puis i++
				open(FIC, "<:encoding(utf-8)", $file);
				my $tout_le_texte="";
				while (my $ligne = <FIC>) {
					chomp $ligne; # enlever le retour à la ligne, parce que l'on va chercher tous les patrons de titre+description du fichier xml
					$tout_le_texte = $tout_le_texte . $ligne . " ";
				}
				close FIC;				
				my $talismane=""; # 0227 : on définit cette variable en dehors de la boucle
				while ($tout_le_texte =~ /<item>.*?<title>([^<]*)<\/title>.*?<description>([^<]*)<\/description>.*?<\/item>/g) {
					my $titre = $1; # on ne peut pas travailler/ modifier la variable $1 car elle fait partie du programme donc on l'enregistre dans une variable
					my $description = $2;
					#my $date = $file;
					#$date =~ s/,1-0,0.xml/ /g;
					my ($titrenettoyage, $descriptionnettoyage) = &nettoyage($titre, $description); # l'appel du sous-programme commence par un '&'
					if (exists $doublons{$titrenettoyage}) {
							print "Titre $titrenettoyage existe déjà\n";
							$doublons{$titrenettoyage}++;
					}
					else { # si la clé n'existe pas
						$doublons{$titrenettoyage}=1;
						# 0227 : talismane traite une paire de titre+description. on les concatène ici sauf que les doublons	
						# 1303 problème !! $talismane = $talismane.$titrenettoyage."\n".$descriptionnettoyage;
						# résolution : 
						# 1/ créer les variables pour talismane
						my $titrenettoyagetal = $titrenettoyage;
						my $descriptionnettoyagetal = $descriptionnettoyage;
						# 2/ découper les phrases
						# ajouter à la fin de … ou . ou ? ou ! un retour à la ligne
						$descriptionnettoyagetal =~ s/([…\.\?\!]+)/$1\n/g;
						$titrenettoyagetal =~ s/([…\.\?\!]+)/$1\n/g;
						$talismane = $talismane . $titrenettoyagetal . "\n\n" . $descriptionnettoyagetal . "\n\n";
						# segmenter les phrases dans $descriptionnettoyage
						print OUT "$titrenettoyage\n"; # OUT, le fichier txt
						print OUT "$descriptionnettoyage\n";
						print OUTXML "<item>\n";
						# 27/02 ajouter les sorties étiquetés avec treetagger
						# pour insérer les lignes de commandes extérieures, on utilise system("") OU ' '
						my ($titrett, $descriptiontt) = &etiquetagett($titrenettoyage, $descriptionnettoyage);
						print OUTXML "<titre>$titrett</titre>\n";
						print OUTXML "<description>$descriptiontt</description>\n";
						print OUTXML "</item>\n";
					} # else
				} # while
				# 27/02 ajouter les sorties étiquetées avec talismane. on traite tous les titres et descriptions ensemble. 
				my $etiquetageta = &etiquetageTalismane($talismane);
				print TALISMANE "$etiquetageta";				
			} #if		
		} # if
	} # foreach
} # parcoursarborescencefichiers

# définir le sous-programme/fonction qui renvoie une valeur
sub nettoyage {
	my $var = $_[0]; #my ($tit, $des) = @_;
	my $var1 = $_[1];
	# ajouter un point à la fin du titre
	$var = $var . "." ; # $var .= ".";
	$var1 =~ s/&#38;#39;/'/g;
	$var =~ s/&#38;#39;/'/g;
	$var1 =~ s/&amp;/&/g;
	$var =~ s/&amp;/&/g;
	return $var, $var1;
}

# étiquetage treetagger
sub etiquetagett {
	my($titt, $destt) = @_;
	my $titretagge;
	my $descriptiontagge;
	# le programme tokenise-utf8.pl prend l'argument comme un fichier, donc insérer les données dans un fichier temporaire
	open (TMP, ">:encoding(utf-8)", "bao2_temp.txt");
	print TMP $titt;
	close TMP;
	# étape 1 tokenisation, &amp; sera séparé en &amp ET ; donc on résout ce problème dans le sub nettoyage
	# tag les token, 3 colonnes pour chaque mot
	system("perl5.28.0.exe tokenise-utf8.pl -f  bao2_temp.txt | tree-tagger.exe french-utf8.par -token -lemma  -no-unknown  > bao2_tag_temp.txt");
	# étape 2 ajouter les balises à ce qui est taggé, générer 20190313_tag_temp.txt.xml
	system("perl5.28.0.exe treetagger2xml-utf8.pl  bao2_tag_temp.txt utf-8");
	{
		local $/=undef; # variable spéciale de perl, qui contient / (retour à la ligne), undef on enlève ce /
		open (FIC, "<:encoding(utf-8)", "bao2_tag_temp.txt.xml");
		# ouvrir le fichier  et le lire,  ne pas lire ligne par ligne, on le lit tout
		$titretagge = <FIC>;
		# enlever l'entête du fichier xml
		$titretagge =~ s/<\?xml version.+?>//g;
		close FIC;
	}
	
	open (TMP, ">:encoding(utf-8)", "bao2_temp.txt");
	print TMP $destt;
	close TMP;
	system("perl5.28.0.exe tokenise-utf8.pl -f  bao2_temp.txt | tree-tagger.exe french-utf8.par -token -lemma  -no-unknown  > bao2_tag_temp.txt");
	system("perl5.28.0.exe treetagger2xml-utf8.pl  bao2_tag_temp.txt utf-8");
	{
		local $/=undef;
		open (FIC, "<:encoding(utf-8)", "bao2_tag_temp.txt.xml");
		$descriptiontagge = <FIC>;
		$descriptiontagge =~ s/<\?xml version.+?>//g;	
		close FIC;
	}
	#print "$titretagge\n";
	return $titretagge,$descriptiontagge;
} # etiquetagett

sub etiquetageTalismane{
	my $var = shift @_;
	open (TMP, ">:encoding(utf-8)", "bao2_talismane.txt");
	print TMP $var;
	close TMP; 

	# lorsque ce programme est en dehors du répertoire 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=bao2_talismane.txt --outFile=bao2_talismane.tal");
	
	my $file;
	{
		local $/=undef;
		open (FIC, "<:encoding(utf-8)", "bao2_talismane.tal");
		$file = <FIC>;
		$file =~ s/<\?xml version.+?>//g;	
		close FIC;
	}
	return $file;
} # etiquetageTalismane