﻿#/usr/bin/perl
#-----------------------------------------------------------
<<DOC; 
Votre Nom : SF/JMD
 Février 2019
 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
 - un fichier structuré en XML 
 Les 2 fichiers contiennent les zones textuelles extraites des fils RSS
DOC
#-----------------------------------------------------------
my $rep="$ARGV[0]";
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 %doublons;
open(OUT, ">:encoding(utf-8)", "sortie-$rubrique-regexp.txt");
open(OUTXML, ">:encoding(utf-8)", "sortie-$rubrique-regexp.xml");
print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print OUTXML "<racine>\n";

#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse!
close OUT;
print OUTXML "</racine>\n";
close OUTXML;
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_); # @_ est la variable par defaut de la liste des arguments donnés au programme en cours. shift est une fonction qui retire et garde le premier élément d'une liste
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR); # retourne la liste triée par date de création
    my @files = sort @files; #tri de la liste des fichiers par ordre alphabetique 	
    closedir(DIR);
    foreach my $file (@files) {
		next if $file =~ /^\.\.?$/; # zappe si c'est . ou .. (dans la sortie du readdir)
		$file = $path."/".$file;
		if (-d $file) {          # si c'est un dossier 
		    print "on entre dans $file \n";
			&parcoursarborescencefichiers($file);	#recurse!
		}
		if (-f $file) {                                # si c'est un fichier
		    if ($file=~/$rubrique.+\.xml$/) {		# s'il contient dans son nom la rubrique souhaitée
				print $i++," : $file \n";           # on affiche le compteur incrémenté et le nom du fichier      
				open(FIC, "<:encoding(utf-8)", $file);  #
				my $tout_le_texte="";
				while (my $ligne = <FIC>) {          # on crée une var $ligne, qui prend la valeur de "lis le fichier FIC" (ligne par ligne)
					chomp $ligne;						# on supprime les nouvelles lignes
					$tout_le_texte = $tout_le_texte . $ligne . " ";       # concaténation du contenu dans la var toutletexte
				}
				close FIC;
				while ($tout_le_texte =~ /<item>.*?<title>([^<]*)<\/title>.*?<description>([^<]*)<\/description>.*?<\/item>/g) {
					my $titre = $1;        #$1 est le contenu des premières parentheses dans la regex au dessus
					my $description = $2;  # le contenu de la deuxieme
					my ($titrenettoye,$descriptionnettoye) = &nettoyage($titre,$description);   #definition des 2 var nettoyees, qui prennent la valeur du résultat de la fonction nettoyage avec en arguments les balises $titre et $desc
					if (exists $doublons{$titrenettoye}) {
						$doublons{$titrenettoye}++;
					}
					else {
						$doublons{$titrenettoye}=1;
						$file =~ s/\/.{8}\/.*\.xml$//; # récupérer la date du nom du chemin
						print OUT "$file\n"; # ecrire la date
						print OUT "$titrenettoye\n";
						print OUT "$descriptionnettoye\n";
						print OUT "\n";
						print OUTXML "<article>\n";
						print OUTXML "<date>$file</date>\n"; #ecrire la date
						print OUTXML "<titre>$titrenettoye</titre>\n";
						print OUTXML "<description>$descriptionnettoye</description>\n";
						print OUTXML "</article>\n";
					}
				}
			}
		}
    }
}

sub nettoyage {

my $tit = $_[0]; #my ($tit, $des) = @_;
my $des = $_[1];

$tit = $tit . "." ; # $tit .= ".";
$des =~ s/&#38;#39;/'/g;           # rechercher et remplacer le & et les caracteres #38-39 & et ' par ', le /g signifie global, pour toutes les subtitutions possibles et pas une seule
return $tit, $des;
}

#----------------------------------------------
