use XML::RSS;#/usr/bin/perl
#-----------------------------------------------------------
<<DOC; 
CUI Danxin, NA Young-Ju, VARTAMPETIAN Markarit 
2019-2020
 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;
#-----------------------------------------------------------
#1er argument transmettre le nom de  racine -> 2019
my $rep="$ARGV[0]";
#argument qui transmet le rubique
my $rubrique="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
#~s/A/B remplacer A avec B ~sed 
$rep=~ s/[\/]$//;
my $i=0;

my %dico="dico_des_titres";
# on initialise une variable contenant le flux de sortie
#%dico est un "hash" --> key:value liste
#pour obtenir le valeur d'un key --> ${key} 

#----------------- txt -----------------------
open(OUT, ">:encoding(utf-8)", "sortie-xmlrss-$rubrique.txt");  #output fichier : txt
open(OUTXML, ">:encoding(utf-8)", "sortie-xmlrss-$rubrique.xml"); #output fichier : xml 
#----------------- xml -----------------------
print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";  #ajouter header xml
print OUTXML "<racine>\n";  #ajouter noeud racine 

#----------------------------------------
&parcoursarborescencefichiers($rep);	# activer la function pour parcourir l'arborscence + lecture de repetoire
close OUT;  #fermeture
print OUTXML "</racine>\n";
close OUTXML;  #on ouvre une fois le fichier
exit;
#----------------------------------------------
#on crée une fonction
sub parcoursarborescencefichiers {
    #on récupère le nom du répertoire fourni (argument)
	my $path = shift(@_);
    opendir(DIR, $path) or die "Can't open $path: $!\n";
	my @files = readdir(DIR);  #@file : liste de resources repetoire (nom de fichier)
    closedir(DIR);
	foreach my $file (@files) {
		#si condition -> réalisée => on passe au suivant
		next if $file =~ /^\.\.?$/; #rep .|..
		$file = $path."/".$file;  #le programme commence par 2019 tj
		#d:directory
		if (-d $file) {
			&parcoursarborescencefichiers($file);	#recurse! c'est un repetoire!
		}
		#f:file
		if (-f $file) {
			#Boucle pour traiter chaque fichier - filtreur
		    if ($file=~/$rubrique.+\.xml$/) { #on veut que des documents xml	
				print $i++," : $file \n";
				my $rss=new XML::RSS;
				#traitement des fichiers xml
				#parsefile ($file) -> analyse du fichier 
				#eval-> vérifier -> syntax errors 
				#execut -> message d'erreurs => $@
				eval {$rss->parsefile($file); };
				if( $@ ) {
					$@ =~ s/at \/.*?$//s;         
					print STDERR "\nERROR in '$file':\n$@\n";
				} 
				else {
					foreach my $item (@{$rss->{'items'}}) {
						my $description=$item->{'description'};
						my $title=$item->{'title'};
						# Appel du sous-programme de nettoyage 
						my ($title,$description) = &nettoyage($title,$description);
						if (exists $dico_des_titres{$title}) {
							$dico_des_titres{$title}++;
						}
						else {
							#	 Ecriture des résultats en sorties
							#"1" -> output immédiatement
							$dico_des_titres{$title}=1;
							print OUT "$title\n";
							print OUT "$description\n";
							print OUT "--------------------\n";
							print OUTXML "<item>\n";
							print OUTXML "<titre>$title</titre>\n";
							print OUTXML "<description>$description</description>\n";
							print OUTXML "</item>\n";
						}
						print "Traitement du fichier : $file No. : ", $i++,"\n"; #compteur: fichier de l'arborescence
					}
				}		
			}
		}
    }
}

#----------------------------------------------
sub nettoyage {
    my $title = $_[0];
    my $description = $_[1];
    $description=~s/&lt;.+?&gt;//g;
    $description=~s/&#38;#39;/'/g;
    $description=~s/&#38;#34;/"/g;
    $title=~s/&lt;.+?&gt;//g;
    $title=~s/&#38;#39;/'/g;
    $title=~s/&#38;#34;/"/g;
    $title=~s/$/\./g;
    return $title,$description;

}
