use XML::RSS;#/usr/bin/perl
#-----------------------------------------------------------
<<DOC; 
Nom : Meixin & Yuchen
Février 2019
 usage : perl BAO1_xml_rss.pl repertoire-a-parcourir flux-à-traiter
 Le programme prend en entrée le nom du répertoire contenant les fichiers à traiter et le code du flux RSS
 Le programme construit en sortie un fichier TXT et un fichier XML
DOC
#-----------------------------------------------------------
use XML::RSS;
#-----------------------------------------------------------
#on récupère le nom du répertoire
my $rep="$ARGV[0]";
#on récupère le code de rubrique
my $rubrique="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
my $i=0;
#un hash de doublons
my %doublons;
#on crée les fichiers pour mettre dedans les résultats
open(OUT, ">:encoding(utf-8)", "sortie-$rubrique-xmlrss.txt");
open(OUTXML, ">:encoding(utf-8)", "sortie-$rubrique-xmlrss.xml");
#préparation du fichier 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;
#----------------------------------------------
#on crée une fonction
sub parcoursarborescencefichiers {
    #on récupère le nom du répertoire fourni en arg
	my $path = shift(@_);
	#on ouvre ce répertoire
    opendir(DIR, $path) or die "can't open $path: $!\n";
    #on lit le répertoire 
	my @files = readdir(DIR);
    closedir(DIR);
    
	foreach my $file (@files) {
		#quand on parcourt une liste, si la condition est réalisée, on passe au suivant
		next if $file =~ /^\.\.?$/;
		#reconstruire un chemin relatif qui permet d'accéder aux ressources
		$file = $path."/".$file;
		#-d:ecq c'est un répertoire? (d:directory)
		if (-d $file) {
		    print "on entre dans $file \n";
			&parcoursarborescencefichiers($file);	#recurse!
		}
		#-f:non, c'est pas un répertoire, c'est un fichier (f:file)
		if (-f $file) {
			#si c'est un fichier, on le traite
			#pour dire au programme qu'on arrête sur telle ou telle rubrique
			#on ajout en haut une variable $rubrique pour filtrer
		    if ($file=~/$rubrique.+\.xml$/) {			
				print $i++," : $file \n";
				my $rss=new XML::RSS;
				#traitement des fichiers xml
				#parsefile ($file, \%options):analyser un fichier
				#eval():une fonction pour vérifier s'il y a des erreurs de syntaxe ou d'exéxutation, en cas d'erreur, le message d'erreur est assigné à $@
				eval {$rss->parsefile($file); };
				if( $@ ) {
					$@ =~ s/at \/.*?$//s;               # remove module line number
					print STDERR "\nERROR in '$file':\n$@\n";
				} 
				else {
					foreach my $item (@{$rss->{'items'}}) {
						my $description=$item->{'description'};
						my $titre=$item->{'title'};
						my ($titrenettoye,$descriptionnettoye) = &nettoyage($titre,$description);
						#si exister les doublons:
						if (exists $doublons{$titrenettoye}) {
							#incrémentation
							$doublons{$titrenettoye}++;
						}
						#si n'exister pas les doublons:
						else {
							#"1" indiqueque la sortie actuelle est sortie immédiatement sans mise en cache
							$doublons{$titrenettoye}=1;
							print OUT "$titrenettoye\n";
							print OUT "$descriptionnettoye\n";
							print OUTXML "<article>\n";
							print OUTXML "<titre>$titrenettoye</titre>\n";
							print OUTXML "<description>$descriptionnettoye</description>\n";
							print OUTXML "</article>\n";
						}
					}
				}		
			}
		}
    }
}

sub nettoyage {
#@_ : my ($titre,$description) = @_
	my $var = $_[0]; 
	my $var1 = $_[1];
	#pour faciliter la segmentation au plus tard, on ajoute un point
	$var = $var . "." ; # $var .= ".";
	$var1 =~ s/&#38;#39;/'/g; #$var1 = $var1 . ".";
return $var, $var1;
}

#----------------------------------------------
