﻿#!/usr/bin/perl -w 
use XML::RSS; 
use Unicode::String qw(utf8); 


#Par Uliana Petrunina
#Date : 02/06/2014
#Usage : perl parcours-filtrage-rss.pl 2008/ alaune
#Description : Ce script permet d'extraire le texte entre les balises <title> et <description> en utilisant les fonctionnalités du module #XML::RSS. La ligne de commande prend deux  arguments : le nom du dossier (2008/) et le numéro de la rubrique. Après le traitement du #fichier, le script écrit le contenu des balises dans les deux paragraphes respectivement dans un nouveau fichier TXT et XML. Il assigne aussi le nom de la rubrique (celui qui est passé en paramètre) au nom du fichier de sortie.



my $arg=$ARGV[0];
my $rub=$ARGV[1];
print " La rubrique est $rub";
$rub=~s/[ ,]//g;
$rub = lc($rub);
my $num=&selectRub($rub);



my $encodagesortie="utf-8"; 
my $encodage=`file -i $arg | cut -d= -f2`;
my %dicoElts=();


open(OUT1,">:encoding($encodagesortie)","2008-sortie-txt-rss-$rub.txt");
open(OUT2,">:encoding($encodagesortie)","2008-sortie-xml-rss-$rub.xml"); 
print OUT2 "<?xml version=\"1.0\" encoding=\"$encodagesortie\" ?>\n";
print OUT2 "<files>\n";  





my $racine="$arg";
print " Répertoire de départ : $racine\n ";
$racine=~ s/[\/]$//;


&recursive($racine);
#---------------------------------------------------------- 
print OUT2 "</files>\n"; 
close(OUT1); 
close(OUT2);
exit;

#---------------------------------------------------------------------------------------------------------
#------------On va appliquer les fonctionnalités de la module XML::RSS dans la procédure récursive
sub recursive { 
    my $dossier=shift(@_);
    opendir(DOSSIER, $dossier);
    my @files=readdir(DOSSIER);
    closedir(DOSSIER);
    print "liste des fichiers de $dossier : @files\n";
    print "Le chemin est le suivant : @files\n";
    foreach $fic (@files){
	next if $fic =~ /^\.\.?$/; #print "On ne fait rien\n";
	next if $fic =~ /\.txt$/; #print "On ne fait rien\n";
	
	$fic = $dossier."/".$fic;
	#print "FICHIER : $fic \n";
	if (-d $fic){
	    &recursive($fic);
	}
	if (-f $fic){
		if ($fic=~/.*-$num.*\.xml$/){
	    print "$fic\n";
	    my $rss=new XML::RSS;
	    eval {$rss->parsefile($fic);}; 
	    if( $@ ) { 
		#si l'opération échoue
		$@ =~ s/at \/.*?$//s; # l'opérateur de substitution s enlève l'extension du fichier remove module line number 
		print STDERR "\nERROR in '$fic':\n$@\n"; 
	    } 
	    # si succès 
	    else { 
		#---------------------------------------------------------------------------------------------
		#------------------------------------------------------------------------------------------- 
		my %TMPdicoElts=(); 
		my $date=$rss->{'channel'}->{'pubDate'};
		print OUT2 "<file>\n"; 
		print OUT2 "<name>$fic</name>\n";  		
		print OUT2 "<date>$date</date>\n";
		print OUT2 "<items>\n";		

		foreach my $item (@{$rss->{'items'}}) { 
		    my $titre=$item->{'title'}; 
		    my $resume=$item->{'description'};
		    
		    
#--------------SUPPRESSION DES DOUBLONS : on va stocker les valeurs des balises dans un dictionnaire pour éviter des doublons------
		    #cle- $titre, valeur - $desription
		    if (!(exists $dicoElts{$titre})) { 
			$TMPdicoElts{$titre}=$resume; 
			$dicoElts{$titre}=$resume; 
		    }
		}
		while (my ($key,$val) = each %TMPdicoElts) { 
		    my $titre=$key;
		    my $resume=$val;
		    $titre=&nettoietexte($titre); 
		    $resume=&nettoietexte($resume); 
		    if (uc($encodage) ne "UTF-8") {utf8($titre);utf8($resume)}; 
		    print OUT1 "Titre : $titre \n"; 
		    print OUT1 "Resume : $resume \n";
		    print OUT2 "<item><title>$titre</title><abstract>$resume</abstract></item>\n"; 
		}

	    } 
		print OUT2 "</items>\n</file>\n";
	}
	}

    }
}
#--------------------------------------------------------------------------------------------------------------------
sub nettoietexte {
	my $texte=shift;
	$texte =~ s/&lt;/</g;
	$texte =~ s/&gt;/>/g;
	$texte =~ s/<a href[^>]+>//g;
	$texte =~ s/<img[^>]+>//g;
	$texte =~ s/<\/a>//g;
	$texte =~ s/&#38;#39;/'/g;
	$texte =~ s/&#38;#34;/"/g;
	$texte =~ s/<[^>]+>//g;
	$texte=~ s/&nbsp;&nbsp;//g;
	$texte =~ s/&#39;/'/g;
	$texte=~ s/&#39;&#34;/'/g;
	$texte=~s/&#34;/''/g;
	$texte=~s/&//g;
	return $texte;
}
	
		
sub selectRub{
my $rub=shift@_;
my %liste_rubriques=("alaune", 3208, "societe", 3224, "sports", 3242,
"cinema", 3476, "rendez-vous", 3238, "culture", 3246, "europe", 
3214, "livres", 3260,  "medias", 3236, "voyages", 3546, "economie", 3234, 
"environnement_sciences", 3244,"international", 3210, "opinions", 
3232, "societe", 1, "politique", 823353, "technologies", 651865, 
"examens2008", 3404, "fil municipales_cantonales_2008", 987718 );
$value=0;
for my $key( keys %liste_rubriques ) {
	if ($key eq $rub) {
        $value = $liste_rubriques{$key};
    }
    }
print "le numero est $value\n";

return $value;
}

