#/usr/bin/perl
use XML::RSS;
use utf8;
use open ':utf8';
binmode(STDIN,":utf8");
binmode(STDOUT,":utf8");
#-----------------------------------------------------------
<<DOC; 
Trang LAM
 Février 2019
 Bibliothèque XML::RSS
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir rubrique
 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 contient les contenus textuels des balises <titre> et <description>
 - un fichier TXT étiqueté par Talismane 
DOC
#-----------------------------------------------------------
my $rep="$ARGV[0]";#on récupère le chemin de la racine de l'arborescence (2018)
my $rubrique="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
my $i=0;
my $compteur=0; #initialiser du compteur d'item 
my %doublons;
#ouvrir les fichiers de sortie avant le parcours des fichiers 
open(OUT, ">:encoding(utf-8)", "./resultat/bao2/talismane/bao2-$rubrique-xmlrss-talismane.txt");
#open(OUTXML, ">:encoding(utf-8)", "bao2-$rubrique-regexp-talismane.xml");
print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print OUTXML "<PARCOURS type=\"$rubrique\">\n"; 
print OUTXML "<NOM>Trang LAM</NOM>\n";
open(TALISMANE, ">:encoding(utf8)", "./resultat/bao2/talismane/sortie-$rubrique-xmlrss-talismane.txt")


#----------------------------------------
&parcoursarborescencefichiers($rep);	# on lance la récursion.... et elle se terminera après examen de toute l'arborescence
close OUT;
print OUTXML "</PARCOURS>\n";
close OUTXML;
close TALISMANE;
system("unlink bao2_tag_talismane.txt");
system("unlink bao2_tag_talismane.tal");
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_); #shift va supprimer le premier élément du tableau @_ (les arguments fournis) et le renvoyer. Dans notre cas, on va récupérer le nom du répertoire
    opendir(DIR, $path) or die "can't open $path: $!\n";#une fonction qui permet d'ouvrir un répertoire
    my @files = readdir(DIR);
	#readdir: lire tous les fichiers/répertoires contenus dans le répertoire prinicipal
    closedir(DIR);
 #----------------------------    
	#pour chaque fichier 
	foreach my $file (@files) {
		next if $file =~ /^\.\.?$/; #la fonction next qui nous permet d'éliminer les réperoires . et ..
		#next permet de passer au prochain élément de la liste si l'élément correspond à la regEx
		$file = $path."/".$file;#on recrée une variable 2018/Jan = la ressource file est un chemin 
		if (-d $file) { #-d= pour tester s'il sagit d'un répertoire; -d est vrai si c'est un répertoire
			print "<NOUVEAU REPERTOIRE> ==>", $file, "\n";
			#on relance le parcours du répertoire
			&parcoursarborescencefichiers($file);	
			print "<FIN REPERTOIRE> ==>",$file,"\n";
		}
		#on teste s'il s'agit d'un fichier ==> condition d'arrêt : quand on arrive sur un fichier, car on ne relance par de parcours !
		if (-f $file) {
			#si le fichier est un fichier .xml et correspond bien à la rubrique souhaitée
			if ($file=~/$rubrique.+\.xml$/) {			
				print $i++," : $file \n";
				my $rss=new XML::RSS;
				eval {$rss->parsefile($file); };
				if( $@ ) {
					$@ =~ s/at \/.*?$//s;               # remove module line number
					print STDERR "\nERROR in '$file':\n$@\n";
				}
				else {
					foreach my $item (@{$rss->{'items'}}) {
						my $description=$item->{'description'};
						my $titre=$item->{'title'};
						$titre=~s/<[^>]+>//g;
						$description=~s/<[^>]+>//g;
						$compteur++; #compteur d'items	
						my $pourtalismane="";
						#post-traitement = nettoyage + rajout "."
						my ($titrenettoye,$descriptionnettoye) = &nettoyage($titre,$description);
					#si la clé n'existe pas on ajoute la clé dans le dico et on traite le titre ==> évite les doublons !!
						if (exists $doublons{$titrenettoye}) {
						$doublons{$titrenettoye}++;
						}
						else {
							$doublons{$titrenettoye}=1;
							my $titrenettoyetal = $titrenettoye ;
							my $descriptionnettoyetal = $descriptionnettoye ;
							$titrenettoyetal =~ s/([…\.\?\!]+)/$1\n\n/g; 
							$descriptionnettoyetal =~ s/([…\.\?\!]+)/$1\n\n/g;
							$titrenettoyetal =~ s/(\n)+ +/$1/g; 
							$descriptionnettoyetal =~ s/(\n)+ +/$1/g;
							$pourtalismane = $pourtalismane . $titrenettoyetal . "\n\n" . $descriptionnettoyetal . "\n\n" ;
							print OUT "TITRE: $titrenettoye\n";
							print OUT "DESCRIPTION: $descriptionnettoye\n";
							print OUTXML "<item num=\"$compteur\">\n";
							print OUTXML "<titre>$titreTT</titre>\n";
							print OUTXML "<description>$descriptionTT</description>\n";
							print OUTXML "</item>\n";
						}			
				my $etiquetTa = &etiquetageTalismane($pourtalismane);
				print TALISMANE "$etiquetTa";
					}
				}
			}
		}
    }
}
#post traitement: nettoyage + rajout
sub nettoyage {

	my $var = $_[0]; #my ($tit, $des) = @_;
	my $var1 = $_[1];

	$var = $var . "." ; # $var .= ".";
	$var1 =~ s/&#38;#39;/'/g;
	return $var, $var1;
}
#------------------------------
sub etiquetageTalismane {

my $var = shift @_;
open (TMP, ">:encoding(utf8)", "bao2_tag_talismane.txt" );
print TMP $var;
close TMP;
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_tag_talismane.txt --outFile=bao2_tag_talismane.tal");
my $lefil;
{
local $/=undef;
open(FIC1, "<:encoding(utf8)", "bao2_tag_talismane.tal");
$lefil = <FIC1>;
close FIC1;
}
return $lefil;

}
