﻿#!/usr/bin/perl

#On va utilitser une bibliotheque unicode string avec la fonction utf-8. qw: quote word, il extrait l'argument entre parenthese de la chaine
use Unicode::String qw(utf8);
use XML::RSS;

<<DOC; 
Maria Goryainova, Nataly Jahchan  
FEVRIER 2012
usage : perl scriptarborescence.pl repertoire-a-parcourir
Le programme prend en entree des flux RSS et fait des operations suivantes: un traitement de nettoyage, filtrage et encodage.
En sortie il produit:
	-un fichier au format texte contenant les flux RSS avec sur chaque ligne le titre et le resume de l'article
	-un fichier au format XML contenant les flux RSS avec un numero attribue a l'article en ordre croissant, le nom du fichier, la date, le titre de l'article et le resume de l'article		
Les fichiers de sorties sont organise par leur rubrique.
DOC

# Dans ce script on va introduire le choix des rubriques pour que ca soit plus commode pour l'utilisateur de traiter les fichiers ou de reperer l'information necessaire. Ici on utilise les deux methodes - expressions regulieres et la bibliotheque XML::RSS

# On declare une variable qui prend pour valeur le premier fichier qu'il va traiter
my $rep="$ARGV[0]";

#On s'assure que le nom du repertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;

#On declare une variable pour traiter le numero qui correspond a la rubrique
my $numero="";

#On declare une variable pour traiter le nom de la rubrique
my $rubrique="";

#Declaration des hash pour enregistrer les titres (1) et les resumes (2)
my %dico1=();
my %dico2=();

#On declare des variables pour stocker les lignes extraites pour le texte brut et pour le xml 
my $DUMPFULL1="";
my $DUMPFULL2="";

#Un compteur pour attribuer un numero a chaque fichier
my $i=0;

#--------------	LE CHOIX DE LA RUBRIQUE----------------------#

print "Les numeros des rubriques sont: \n";
print "0 : A la une\n 1 : International\n 2 : Europe\n 3 : Livres\n 4 : Opinions\n 5 : Cinema\n 6 : Planete\n 7 : Technologies\n 8 : Politique\n 9 : Culture\n 10: Economie\n 11 : Societe\n ALL:* \n\n Tapez le numéro correspondant à la rubrique qui vous intéressent:  ";

#On recupere le choix et on le stocke dans une variable
$choix_rubrique = <STDIN>;


#On supprime les sauts de ligne
chomp($choix_rubrique);

#On cree des conditions pour attribuer des valeurs au choix de l'utilisateur

#Si le choix de l'utilisateur est equivalent a 0 on attribue les valeurs suivantes:
if ($choix_rubrique eq 0){ 
	$numero="3208"; 
	$rubrique="a_la_une";
	} 
	
elsif ($choix_rubrique eq 1){
	$numero="3210";
	$rubrique="international";
	}
	
elsif ($choix_rubrique eq 2){
	$numero="3214";
	$rubrique="europe";
	}
	
elsif ($choix_rubrique eq 3){
	$numero="3260";
	$rubrique="livres";
	}
	
elsif ($choix_rubrique eq 4){
	$numero="3232";
	$rubrique="opinions";
	}

elsif ($choix_rubriquee eq 5){
	$numero="3476";
	$rubrique="cinema";
	}
	
elsif ($choix_rubrique eq 6){
	$numero="32344";
	$rubrique="planete";
	}
	
elsif ($choix_rubrique eq 7){
	$numero="651865";
	$rubrique="technologies";
	}

elsif ($choix_rubrique eq 8){
	$numero="823353";
	$rubrique="politique";
	}

elsif ($choix_rubrique eq 9){
	$numero="3546";
	$rubrique="culture";
	}

elsif ($choix_rubrique eq 10){
	$numero="3234";
	$rubrique="economie";
	}

elsif ($choix_rubrique eq 11){
	$numero="3224";
	$rubrique="societe";
	}

elsif ($choix_rubrique eq "*"){
	$numero="ALL";
	$rubrique="toutes_les_rubriques";
	}
	
#Si ce qui est recupere n'est par reconnaissable on demande a nouveaux le choix de l'utilisateur		
else{ 
	print "Je n'ai pas compris.\n"; 
	}  


#On declare une variable contenant le flux de sortie pour le fichier txt
my $output1="SORTIE".$rubrique.".txt";

#On initialise une variable contenant le flux de sortie pour le fichier xml
my $output2="SORTIE".$rubrique.".xml";

# On declare une variable  comporte l'information "utf-8" 
my $encodagesortie="utf-8";

# On ouvre les fichiers de sortie dont l'encodage doit etre utf-8 et ou on va stocker le resultat. S'ils ne s'ouvrent pas, on arrete le programme
if (!open(FILEOUT1,">:encoding($encodagesortie)",$output1)) { die "Pb a l'ouverture du fichier $output1.txt"};
if (!open(FILEOUT2,">:encoding($encodagesortie)",$output2)) { die "Pb a l'ouverture du fichier $output2.xml"};

#----------------------------------------

&parcoursarborescencefichiers($rep);	#recurse!

#----------------------------------------

#On ecrit dans le fichier texte:
print FILEOUT1 $DUMPFULL1;
close(FILEOUT);

#On ecrit dans le fichier XML:
print FILEOUT2 "<?xml version=\"1.0\" encoding=\"$encodagesortie\" ?>\n";
print FILEOUT2 "<PARCOURS>\n";
print FILEOUT2 "<NOM>Goryainova,Jahchan</NOM>\n";
print FILEOUT2 "<FILTRAGE rubrique=\"".$rubrique."\" numero=\"$numero\">\n".$DUMPFULL2."\n</FILTRAGE>\n";
print FILEOUT2 "</PARCOURS>\n";
close(FILEOUT2);
exit;



#On cree toujours un sous-programme - sub pour le script
sub parcoursarborescencefichiers {
	
    # On divise l'arborescence a parcourir selon des fichiers et leurs numeros
    my ($path, $numero) = shift(@_);
    
    #On ouvre le premier fichier correspondant a la variable $path, sinon, on arrete le programme
    opendir(DIR, $path) or die "can't open $path: $!\n";
    
    #On stocke le contenu du repertoire dans le tableau files
    my @files = readdir(DIR);
    closedir(DIR);
    
     #Pour chaque fichier on a une liste
    foreach my $file (@files) {
    	
        #Ensuite, si le fichier comporte n'importe quel caractere sauf le caractere de la nouvelle ligne, on concatene les valeur de $path et $file (les lignes) en les separant par un "/"
        next if $file =~ /^\.\.?$/;
        $file = $path."/".$file;
        
        #On verifie si $file est un repertoire plutot qu'un fichier
        if (-d $file) {
        	
        	#On relance le sous-programme sur $file
            &parcoursarborescencefichiers($file, $numero);	
        }
        
        #On verifie si $file est plutot un fichier qu'un repertoire
        if (-f $file) {
        	
	    #Si le fichier a une extension xml on applique les choses suivantes:
            if ($file=~/\.xml$/) {
            	
            	#On declare une variable ou on ne met rien comme valeur si $file est un fichier
				my $filef="";
				
				#Traitement pour toutes les rubriques
				if ($numero eq "ALL") { 
				$filef=$file;
				}
				
				#Traitement d'une seule rubrique
				else {
					if ($file=~/0,2-$numero,1-0,0\.xml$/) {
					$filef=$file;
					}
				}        	
		
		
		$i++;
		#On va recuperer l'encodage dans chaque fichier RSS
		my $encodage=`file -I $file | cut -d= -f2`; 
 
		
		# On supprime les saut de ligne dans les fichiers
		chomp($encodage); 
		
		#On cree une variable pour y stocker un objet RSS
		my $rss=new XML::RSS;
		
		#On stocke les resultats de parsefile dans la variable $rss
		$rss->parsefile($file);
		#La variable $date prend pour valeur la valeur de $rss qui contient l'information "channel" et "pubDate"
		my $date=$rss->{'channel'}->{'pubDate'};
		#Si l'encodage du texte stocke dans la variable n'est pas utf-8, on le convertit en utf-8
		if (uc($encodage) ne "UTF-8") {
		    utf8($date);
		};
		# On stocke dans la variable $DUMPFULL2 les informations suivantes- le numero du fichier qui correspond a la valeur de $i, la date (la valeur de $date), entouree des balises <DATE> et </DATE> et les balises <ARTICLES>
		$DUMPFULL2.="<FICHIER num=\"$i\">\n";
		$DUMPFULL2.="<DATE>$date</DATE>\n";
		$DUMPFULL2.="<ARTICLES>\n";
		#Un compteur pour attribuer un numero a chaque article
		my $j=0;
		#Une boucle pour recuperer les elements d'item. Ici on fait la meme procedure que dans le premier script, mais en utilisant la bibliotheque XML::RSS
		foreach my $item (@{$rss->{'items'}}) {
		    my $titre=$item->{'title'};
		    my $resume=$item->{'description'};
		    if (uc($encodage) ne "UTF-8") {
			utf8($titre);
			utf8($resume);
		    }
		    #On va nettoyer le titre et le resume
		    $titre = &nettoietexte($titre);
		    $resume = &nettoietexte($resume);
		    #----------------------------------------
			#S'il y a un titre dans le 1er flux dans dico1 et qui n'est pas le meme que dans le 2eme flux, on traite
		    if ((!(exists($dico1{$titre}))) && ($titre ne "")) {
		    	
 			#Incrementation du compteur
			$j++;
			
			#On concatene dans $DUMPFULL1 (fichier texte) la valeur de $titre, et dans $DUMPFULL2 le numero de l'article avec le titre; on ne met pas de retour a la ligne pour que le fichier soit moins gros
			$dico1{$titre}=1;
			$DUMPFULL1.="Titre: $titre ";
			$DUMPFULL2.="<ARTICLE num=\"$j\"><TITRE>$titre</TITRE>";
		    }
		    
			#S'il n'y a pas de titre, on ecrit rien
		    else {
			$titre="";
		    }
		    
			#S'il n'y a pas de resume dans dico2 et le resume qu'on traite n'est pas vide, on l'ajoute dans $DUMPFULL1 et $DUMPFULL2 avec les balises correspondantes
		    if (!(exists($dico2{$resume})) && ($resume ne "")) { 
			$dico2{$resume}=1;
			$DUMPFULL1.=" Resume: $resume";
			$DUMPFULL2.="<RESUME>$resume</RESUME></ARTICLE>\n";
			
		    }
		    else {
			$resume="";
		    }

		   
		}
		#On ferme les dernieres balises dans le fichier de sortie
		$DUMPFULL2.="</ARTICLES>\n</FICHIER>\n";
		
	    }
	}
    }
}

#---------------NETTOYAGE DU TEXTE-------------------#

#Le nettoyage du texte est le meme que pour les deux premieres scripts
#Le sous-programme sub

#On nettoie le texte en remplacant certains elements par d'autres 
sub nettoietexte { 
    #Shift prend la 1ere valeur de la liste et l'enleve 
    my $texte=shift; 
    $texte =~ s/&lt;/</g; #On remplace &lt par l'element correspondant
    $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;/&/g;
    $texte =~ s/&amp;#39;/'/g;
    $texte =~ s/&#39;/'/g;
    $texte =~ s/&#38;#34;/"/g;
    $texte =~ s/&amp;#34;/"/g;
    $texte =~ s/&#34;/"/g;
    $texte =~ s/&#91;/[/g;
    $texte =~ s/&#93;/]/g;
    $texte =~ s/<[^>]+>//g; #On supprime les balises fermantes
    $texte =~ s/&nbsp;//g; #On supprime les blancs
    return $texte;
}
