#/usr/bin/perl
#-----------------------------------------------------------
use utf8;
use strict;
binmode(STDOUT, ":encoding(UTF-8)");
#-----------------------------------------------------------
# Pour lancer le programme depuis le terminal: 
# perl bao1.pl chemin_du_corpus numero_rubrique
#-----------------------------------------------------------
if ($#ARGV != 1) {print "Il manque un argument à votre programme....\n";exit;} 

#on récupère le nom du dossier contenant les fils RSS
my $rep="$ARGV[0]";
#on récupère le nom de la rubrique à traiter
my $RUBRIQUE="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;

#on ouvre les deux fichiers de sortie (TXT et XML). Pour que ce soit plus clair, on ajoute le nom de la rubrique dans le nom du fichier. 
open my $output, ">:encoding(UTF-8)","corpus-titre-description-${RUBRIQUE}.txt";
open my $output2, ">:encoding(UTF-8)","corpus-titre-description-${RUBRIQUE}.xml";
#on crée une table de hachage pour éviter les doublons
my %titres_uniques=();
#on ajoute la déclaration XML et on ouvre la balise corpus
print $output2 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus>\n";
#on lance le sous-programme (récursion) 
&parcoursarborescencefichiers($rep);
print $output2 "</corpus>\n";
close $output;
close $output2;
exit;

#-----------------------------------------------------------

#sous-programme qui parcours l'arborescence de notre dossier 2021
sub parcoursarborescencefichiers {
	#on donne comme valeur à la variable path le premier argument
    my $path = shift(@_);
	#on ouvre le répertoire
    opendir(DIR, $path) or die "can't open $path: $!\n";
	#on met dans une liste le nom de tous les éléments présents dans le répertoire
    my @files = readdir(DIR);
    closedir(DIR);
	#on parcourt tous les éléments du répertoire
    foreach my $file (@files) {
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file;
		#si l'élément est un répertoire
		if (-d $file) {
			print "On entre dans le REPERTOIRE : $file \n";
			#on utilise la récursion
			&parcoursarborescencefichiers($file);
			print "On sort du REPERTOIRE :  $file \n";
		}
		#si l'élément est un fichier
		if (-f $file) {
			#on vérifie s'il contient dans son titre le nom de la rubrique à traiter (le deuxième argument)
			if ($file =~ /$RUBRIQUE.+\.xml$/) {
				print "Traitement du fichier $file \n";
				#on l'ouvre en mode lecture
				open my $input, "<:encoding(UTF-8)",$file;
				#on efface la valeur par défaut de la variable, à savoir \n
				$/=undef;
				#on stocke le contenu du fichier
				my $ligne=<$input> ;
				close($input);
				#on traite chaque ligne du fichier
				while ($ligne=~/<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) {
					#on fait passer le titre par le sous-programme de nettoyage et on le récupère
					my $titre=&nettoyage($1);
					#idem pour la description
					my $description=&nettoyage($2);
					#si le titre n'est pas dans la table de hachage, on ajoute le titre et la description et on l'écrit dans les fichiers de sortie
					if (!(exists $titres_uniques{$titre})) { 
						$titres_uniques{$titre}=$description;
						#on on écrit le tout dans les deux fichiers de sortie
						print $output "$titre \n";
						print $output "$description \n";
						print $output "----------------------------\n";
						print $output2 "<item><titre>$titre</titre><description>$description</description></item>\n";
					}
				}
			}
		}
    }
}
#----------------------------------------------
sub nettoyage {
	my $texte=shift @_;
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g;
	$texte.=".";
	$texte=~s/\.+$/\./;
	return $texte;
}
#----------------------------------------------
