#/usr/bin/perl
#-----------------------------------------------------------
use utf8;
use strict;
binmode(STDOUT, ":encoding(UTF-8)");
#-----------------------------------------------------------
# Ce programme s'utilise ainsi :
# perl parcours-arborescence.pl 2021 3208
# Il prend en arguments 2 éléments : (1) le nom de l'arborescence 2021
# contenant les fils RSS de l'année 2021, (2) le nom de la rubrique à traiter
# ici 3208 pour A la une
#-----------------------------------------------------------
#if ($#ARGV != 1) {print "Il manque un argument à votre programme....\n";exit;} 
my $rep=shift @ARGV;
my @RUBRIQUES=@ARGV;
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;

#obtenir l'extraction pour trois rubriques, en parcourant la liste des rubriques
foreach my $r (@RUBRIQUES){
	# créer un dictionnaire vide qui enregistre les informations distingues (sans répétition) pour chaque rubrique
	my %dico_des_titres=();
	# créer un nouveau fichier .txt et un nouveau fichier .xml qui contient le numéro de rubrique 
	open my $output, ">:encoding(UTF-8)","$r-corpus-titre-description.txt";
	open my $output2, ">:encoding(UTF-8)","$r-corpus-titre-description.xml";
	print $output2 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus>\n";
	# parcourir l'arborescence et trouver les informations dans la rubrique ciblée
	# en portant les paramètres nom de l'arborescence, le numéro de rubrique, le fichier .txt, le fichier .xml, 
	# et le dictionnaire qui mémorise les informations déjà enregistrées
	&parcoursarborescencefichiers($rep,$r,$output,$output2,%dico_des_titres);
	print $output2 "</corpus>\n";
	close $output;
	close $output2;
}


exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift @_;
	my $rubrique = shift @_;
	my $output = shift @_;
	my $output2 = shift @_;
	my %dico_des_titres = shift @_;
	# ouvrir le dossier et lire le contenu dedans 
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);
	# parcourir chaque élément
	# !! important, trier tous les sous-dossiers et fichiers en ordre, car Perl ne traite pas forcément les fichiers en ordre
    foreach my $file (sort @files) {
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file;
		# si c'est un dossier, on conitue le parcours
		if (-d $file) {
			print "On entre dans le REPERTOIRE : $file \n";
			&parcoursarborescencefichiers($file,$rubrique,$output,$output2,%dico_des_titres);	#recurse!
			print "On sort du REPERTOIRE :  $file \n";
		}
		# si c'est un fichier, on lit le fichier
		if (-f $file) {
			if ($file =~ /$rubrique.+\.xml$/) {
				print "Traitement du fichier $file \n";
				open my $input, "<:encoding(UTF-8)",$file;
				$/=undef; # par défaut cette variable contient \n
				my $ligne=<$input> ;
				close($input);
				# capter tous les éléments entre <titre></titre> et <description></descrptions>
				# grâce aux () qui entresitre les données qu'on peut récupérer avec $1 et $2
				# utiliser .+? pour ne pas être gourmand arrêter la capture juste avant </titre> et </descrption>
				# L'indication /gs est pour prendre tous les items et ne pas s'arrêter au premier
				while ($ligne=~/<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) {
					my $titre=&nettoyage($1);
					my $description=&nettoyage($2);
					# ne pas prendre en compte les éléments qui se répètent
					if (!(exists $dico_des_titres{$titre})) { 
						$dico_des_titres{$titre}=$description ;
						# écire dans le fichier .txt
						print $output "$titre \n";
						print $output "$description \n";
						print $output "----------------------------\n";
						# écrire dans le fichier .xml
						print $output2 "<item><titre>$titre</titre><description>$description</description></item>\n";
					}
				}
			}
		}
    }
}
#----------------------------------------------
sub nettoyage {
	my $texte=shift @_;
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g;
	$texte.=".";
	$texte=~s/\.+$/\./;
	$texte=~s/&lt;.+?&gt;//g;
    $texte=~s/&#38;#39;/'/g;
    $texte=~s/&#38;#34;/"/g;
    $texte=~s/$/\./g;
	$texte=~s/\.+$/\./g;
	return $texte;
}
#----------------------------------------------
