#/usr/bin/perl
use XML::RSS;
use utf8;

<<DOC; 
L'entrée dans le bash : perl fichier.pl  nom_répertoire numéro_rubrique
L'objectif : 
- parcourir tous les fichiers et tous les répertoires dans un répertoire 
- pour obtenir les extractions de TITRE et DESCRIPTION.
- les sorties : un txt, un xml
DOC
#-----------------------------------------------------------
my $rep="$ARGV[0]";  # $rep = le nom du répertoire de départ
# on s'assure que le nom du répertoire ne se termine pas par un "/"
my $rubrique = "$ARGV[1]";

$rep=~ s/[\/]$//;  # on enlève la fin de la ligne
# on initialise une variable contenant le flux de sortie 
open(OUT, ">>:encoding(utf-8)", "BAO1_sortie-biblioRSS_slurp_$rubrique.txt");
open(OUTXML, ">>:encoding(utf-8)", "BAO1_sortie-biblioRSS_slurp_$rubrique.xml");
print OUTXML "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
print OUTXML "<sortieCorpus>\n";

# on va créer une dictionnaire au début.
my %dico_test;
#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse!
#----------------------------------------
close OUT;
print OUTXML "</sortieCorpus>\n";
close OUTXML;
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_);  # @_ représente le paramètre du sous-programme
    
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);  # je mets tous les fichiers et les répertoires de ce répertoire dans une liste.
    closedir(DIR);
    foreach my $file (@files) {
    # et quand on lit le répertoire, il y a des répertoires cachés "." et "..",
    # mais il ne faut pas traiter "." (récursivité infinie) non plus "..".
	next if $file =~ /^\.\.?$/;  # sauter et continuer
	$file = $path."/".$file;  # il faut reconstruire le chemin d'accès.
	if (-d $file) { # -d (directory) vérifie c'est un répertoire ou un fichier
	    &parcoursarborescencefichiers($file);	#recurse!
	}
	if (-f $file) { # -f (file) vérifie si c'est un fichier
		if ($file =~/$rubrique.+xml$/){
			my $rss = new XML::RSS;
			eval {$rss->parsefile($file);};
			if ( $@ ) {
				$@ =~ s/at \/.*?$//s; ## supprimer le numéro de ligne dans le module
				print STDERR "\nERROR in '$file':\n$@\n";
			}
			else {
				foreach my $item (@{$rss->{'items'}}) {
					my $titre=$item->{'title'};
					my $description=$item->{'description'};
					if (not exists $dico_test{$titre}) {
						$dico_test{$titre}=$description;
						($titre,$description)=&nettoyage($titre,$description);
						
						print OUT "TITRE : ", $titre, "\n";
						print OUT "DESCP : ", $description, "\n";
						print OUT "----------------------", "\n";
						print OUTXML "<item>\n";
						print OUTXML "<title>$titre</title>\n";
						print OUTXML "<description>$description</description>\n";
						print OUTXML "</item>\n";
					}
				}
			}

	    	print "$file est le ", $i++,"\n";
	    }
	}
    }
}
#----------------------------------------------
sub nettoyage {

	my $titre = $_[0]; # créer une variable de valeur du premier paramètre : $titre
	my $description = $_[1]; # créer une variable de valeur du deuxième paramètre : $description


	$titre =~ s/&lt;.+?&gt;//g;
	$titre =~ s/&#38;#39;/'/g;
	$titre =~ s/&#38;#34;/"/g;
	$titre =~ s/&/&amp;/g;
	# pour tous les titres, on ajoute un point à la fin.
	$titre =~ s/$/\./g;
	$description =~ s/&lt;.+?&gt;//g;
	$description =~ s/&#38;#39;/'/g;
	$description =~ s/&#38;#34;/"/g;
	$description =~ s/&/&amp;/g;
	return $titre, $description;
}

