#/usr/bin/perl
#perl programme.pl RSS nom de la rubrique => @ARGV : les éléments vont être rangés dans cette liste: $ARGV[0] pour le premier élément
#premier argument à donner avec appel du programme: 2018
#deuxième argument à donner: le nom de la rubrique (on a choisi 3210, 3236 et 3244)
#-----------------------------------------------------------
use utf8;
#je récupère le chemin de la racine de mon arborescence 
my $repertoire="$ARGV[0]"; #my = la variable va exister dans tout le pgm, permet de limiter la portée d'une variable au plus grand bloc qui la contient
#je vais donner la rubrique que je veux en argument 
my $rubrique="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
#je stocke "2018" sans "/" dans la variable
$repertoire=~ s/[\/]$//;
my $i=0;
#mémoire des titres rencontrés en table de hashage
my %doublons; 
open(OUT, ">:encoding(utf-8)", "sortie-$rubrique.txt"); #le fichier sortie texte
open(OUTXML, ">:encoding(utf-8)", "sortie-$rubrique.xml"); #le fichier sortie xml
print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print OUTXML "<racine>\n";
#----------------------------------------
#on lance une procédure qui prend comme argument 2018
&parcoursarborescencefichiers($repertoire);	#recurse!
close OUT;
print OUTXML "</racine>\n";
close OUTXML;
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
	#on récupère le répertoire 2018
    my $path = shift(@_);
	#on veut stocker le contenu du répertoire 
    opendir(DIR, $path) or die "can't open $path: $!\n";
	#readdir permet de lire le contenu du répertoire, la fonction renvoie la liste des ressources de mon répertoire (le résultat de ls -l en bash)
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (@files) {
				#fonction next permet de passer au suivant si la condition est réalisée quand on examine une liste. on évite le "." et le "..", ne pas boucler dans l'arbo ou reculer. 
				next if $file =~ /^\.\.?$/;
				#je travaille sur le fichier en question: est-ce une répertoire ou un fichier?
				#je recrée le chemin relatif pour atteindre cette ressource à partir de l'endroit où je suis pour en connaître sa nature : nom du répertoire/nom de la ressource 
				$file = $path."/".$file;
				#-d => est ce que je suis un répertoire
				if (-d $file) {
				#répertoire => je relance la procédure de parcours 
					&parcoursarborescencefichiers($file);	#recurse!
					print "on entre dans $file \n";
				}
				#-f =>est ce que je suis un fichier
				if (-f $file) {
				#TRAITEMENT à réaliser sur chaque fichier
				#je trie la rubrique que je veux, le filtre tient compte de l'accès à la rubrique et fichier xml
					if ($file=~/$rubrique.+\.xml$/) {
								print $i++," : $file \n";
								open(FIC, "<:encoding(utf-8)", $file);
								my $tout_le_texte="";
								while (my $ligne = <FIC>) { #on lit dans ce fichier (<FIC>) => la condition veut dire tant qu'on réussit à lire on continue. une expressions conditionnelle + le fait d'attribuer la ligne qu'on lit dans la variable.
										chomp ($ligne); #supprimer le caractère de fin de ligne dans la chaîne de caractères. Mais peut être qu'il faudra supprimer \r aussi? On ne maitrise pas les données qui viennent du Monde, peut être qu'ils mettent du format Windows parfois
										$tout_le_texte = $tout_le_texte . $ligne . " " ; #=>raccourci $chaine.=" "
										#print $tout_le_texte ;
										#my $reponse = <STDIN> ; #on lit qqch du clavier 
								}
								close (FIC);
								while ($tout_le_texte =~ /<item>.*?<title>([^<]*)<\/title>.*?<description>([^<]*)<\/description>.*?<\/item>/g) { #le g va permettre d'avancer et de pas s'arrêter à la première occurence, on met entre () ce qu'on veut retrouver, mémoriser le résultat = $1 et $2 etc
								#on va ajouter un traitement automatique => je vais lancer un traitement spécifique lié à une procédure: nettoyer + ajouter un point: rendre propre, même traitement de nettoyage + titre->point
										my $titre=$1; #on mémorise les deux contenus d'extraction dans des variables locales
										my $description=$2;
										#appel d'un sous-programme: j'appelle ma fonction nettoyage dont le code est défini après
										#on fait une liste en définissant deux variables qui n'existent pas
										my($titrenettoye,$descriptionnettoye) = &nettoyage ($titre,$description); #on fera qqch en plus sur la première variable qu'on envoie au nettoyage
										#on aurait pu mettre juste if (!(exists pour dire juste de faire qqch quand ce n'est pas dans le tableau
										if (exists $doublons{$titrenettoye}) {
												$doublons{$titrenettoye}++;
										}
										else {
												$doublons{$titrenettoye}=1;
												#fonction = prendre des variables et renvoyer des valeurs 
												print OUT "***\n";
												print OUT "$titrenettoye\n"; #peut être post traitement à faire en ajoutant un point pour différencier le titre de la description
												print OUT "$descriptionnettoye\n";
												print OUTXML "\t<article>\n";
												#on souhaite récupèrer dans le chemin du fichier la date présente au début afin d'en garder une trace dans le document xml
												$file=~s/\/..-..-..\/.*\.xml//g;
												print OUTXML "\t\t<date>$file</date>\n";
												print OUTXML "\t\t<titre>$titrenettoye</titre>\n";
												print OUTXML "\t\t<description>$descriptionnettoye</description>\n";
												print OUTXML "\t</article>\n";
										}
								}
					}
				}
    }
}
#sub = sous programme, définition du sous programme, doit renvoyer une valeur
#tous les arguments passés à la procédure sont rangés dans une liste spéciale = @_ => cette liste va être instanciée avec deux éléments, le contenu textuel de la première variable et celui de la deuxième, pour y accéder il faut interroger cette liste. 
sub nettoyage {
my $var = $_[0]; #my ($tit,$des) =@_ =>j'affecte les éléments de la liste à une nouvelle liste // on peut aussi faire avec shift pour vider la liste: my $tit = shift @_ et my $des = @_
my $var1 = $_[1];
#prévoir nettoyage si corpus sale (liens etc &lt/&gt!!! et supprimer les fausses entités html => =~s/#38;#39;/'/g; => à priori pas trop de pb en 2018
#ajoute un point à la fin du titre
$var = $var . "." ; #$var .=".";
$var=~s/\.\.$/\./; #si jamais il y avait déjà un point, on remplace le double point par un seul
$var=~s/&lt;.+?&gt;//g; #on supprime les balises transcodées $lt et $gt
$var=~s/&#38;#39;/'/g; #on remplace les apostrophes transcodées
$var=~s/&#38;#34;/"/g; #on remplace les guillements doubles transcodées
$var=~s/ //g; #on supprime les caractères bizarres qui apparaissent parfois

#on fait la même chose pour les descriptions, au cas où il y aurait besoin...
$var1=~s/&lt;.+?&gt;//g; #on supprime les balises transcodées $lt et $gt
$var1=~s/&#38;#39;/'/g; #on remplace les apostrophes transcodées
$var1=~s/&#38;#34;/"/g; #on remplace les guillements doubles transcodées
$var1=~s/ //g; #on supprime les caractères bizarres qui apparaissent parfois
#on peut mettre un symbole paragraphe pour chaque item et un saut de ligne entre les items

return $var,$var1; 
}
#----------------------------------------------
