#/usr/bin/perl
# utilisation : perl bao1.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 la rubrique A la une)
#-----------------------------------------------------------
use utf8;
use strict;
binmode(STDOUT, ":encoding(UTF-8)");
#-----------------------------------------------------------
if ($#ARGV != 1) {print "Il manque un argument à votre programme....\n";exit;} # on s'assure qu'il ne manque aucun argument
my $rep="$ARGV[0]"; #le répertoire 2021 sera le premier argument
my $RUBRIQUE="$ARGV[1]"; #la rubrique choisie est le deuxième argument
$rep=~ s/[\/]$//;# on s'assure que le nom du répertoire ne se termine pas par un "/"

#ouverture des fichiers#

open my $output, ">:encoding(UTF-8)","corpus-titre-description.txt"; #on créé un fichier txt qui recevra les titres et descriptions
open my $output2, ">:encoding(UTF-8)","corpus-titre-description.xml"; #on créé un fichier xml qui recevra les titres et descriptions
print $output2 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus>\n"; #on écrit le début de notre fichier xml final
#----------------------------------------
&parcoursarborescencefichiers($rep); #on appelle notre fonction de récursivité
#----------------------------------------
print $output2 "</corpus>\n"; #on écrit la fin de notre fichier xml final

#fermeture des fichiers#

close $output;
close $output2;
#----------------------------------------------
exit;
#----------------------------------------------
#définition de la fonction#

sub parcoursarborescencefichiers {
    my $path = shift(@_); #on récupère le path, ici 2021 et on le supprime de la liste
    opendir(DIR, $path) or die "can't open $path: $!\n"; #on ouvre le dossier
    my @files = readdir(DIR); #on le lit
    closedir(DIR); #on le ferme
    foreach my $file (@files) { #pour chaque fichier
		next if $file =~ /^\.\.?$/; #on skip si le path du fichier est ../
		$file = $path."/".$file; #on ajoute le path récupéré au fichier
		if (-d $file) { #si le fichier est en fait un répertoire
			print "On entre dans le REPERTOIRE : $file \n"; #on écrit dans le terminal pour qu'on voit ce qu'il se passe
			&parcoursarborescencefichiers($file);	#on fait une récursivité
			print "On sort du REPERTOIRE :  $file \n"; #on écrit dans le terminal pour qu'on voit ce qu'il se passe
		}
		if (-f $file) { #si le fichier est vraiment un fichier
			if ($file =~ /$RUBRIQUE.+\.xml$/) { #si le fichier est la rubrique qui m'intéresse
				print "Traitement du fichier $file \n"; #on écrit dans le terminal pour qu'on voit ce qu'il se passe
				open my $input, "<:encoding(UTF-8)",$file; #on ouvre le fichier
				$/=undef; # par défaut cette variable contient \n donc on supprime le saut de ligne
				my $ligne=<$input> ; #on sauvegarde les lignes du fichier dans une variable
				close($input); #on ferme le fichier
				while ($ligne=~/<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) { #on va chercher cette expression jusqu'à ce qu'il n'y en ait plus dans le fichier (grâce à g), s sert à transformer les . en potentiel caractère non imprimable donc on ne peut rater aucun item avec cette expression
				#on va sauvegarder le texte contenu entre ()
					my $titre=&nettoyage($1); #on appelle la fonction nettoyage sur la première "variable" sauvegardé dans l'expression matchée
					my $description=&nettoyage($2); #on appelle la fonction nettoyage sur la deuxième "variable" sauvegardé dans l'expression matchée
					print $output "$titre \n"; #on écrit dans le fichier txt final le titre de l'article
					print $output "$description \n"; #on écrit dans le fichier txt final la description de l'article
					print $output2 "<item><titre>$titre</titre><description>$description</description></item>\n"; #on écrit dans le fichier xml final le titre et la description de l'article
				}
			}
		}
    }
}
#----------------------------------------------
#définition de la fonction qui va permettre de ne récupérer que le texte des titres et des descriptions#

sub nettoyage {
	my $texte=shift @_; #on récupère la valeur et on la supprime de la liste
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g; #on va supprimer les éléments qui ne sont pas du véritable texte
	$texte.=".";
	$texte=~s/\.+$/\./;
	return $texte; #on retourne la valeur textuelle finale
}
#----------------------------------------------
