#!/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);

#On va utiliser la bibliotheque xml
use XML::RSS;

<<DOC; 
Votre Nom : Nataly Jahchan, Maria Goryainova
FEVRIER 2012
usage : perl scriptarborescence.pl repertoire-a-parcourir
Le programme prend en entree le nom du repertoire contenant les fichiers
à traiter
Le programme construit en sortie un fichier structure contenant sur chaque
ligne le nom du fichier et le resultat du filtrage :
<FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>du filtrage</CONTENU></FICHIER>
DOC

#on va utiliser la bibliotheque XML::RSS qui nous permet de recuperer des elements d'un fichier rss

#--------------L'ENCODAGE---------------#


# On definit la variable qui 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
open(OUT1,">:encoding($encodagesortie)","SORTIE.txt"); 
open(OUT2,">:encoding($encodagesortie)","SORTIE.xml"); 



# On declare une variable qui va correspondre au premier argument de la ligne de commande (le premier fichier que l'on traite)
my $rep="$ARGV[0]";

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

#Declaration des hash pour enregistrer les titres et un pour les resumes
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="";

#On initialise une variable contenant le flux de sortie pour le fichier txt 
my $output1="SORTIE.txt";
#S'il n'ouvre pas on arrete le programme
if (!open (FILEOUT1,">:encoding($encodagesortie)", $output1)) { die "Pb a l'ouverture du fichier $output1"};

#On declare une variable contenant le flux de sortie pour le fichier txt
my $output2="SORTIE.xml";
#S'il ne s'ouvre pas on arrete le programme
if (!open (FILEOUT2,">:encoding($encodagesortie)",$output2)) { die "Pb a l'ouverture du fichier $output2"};

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

&parcoursarborescencefichiers($rep);	#recurse!

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

#on precise le format de sortie selon des informations suivantes:
print FILEOUT1 $DUMPFULL1;
close(FILEOUT);
print FILEOUT2 "<?xml version=\"1.0\" encoding=\"$encodagesortie\" ?>\n";
print FILEOUT2 "<PARCOURS>\n";
print FILEOUT2 "<NOM>Goryainova, Jahchan</NOM>\n";
print FILEOUT2 "<FILTRAGE>\n".$DUMPFULL2."\n</FILTRAGE>\n";
print FILEOUT2 "</PARCOURS>\n";
close(FILEOUT2);
exit;



#On cree un sous-programme - sub pour le script
sub parcoursarborescencefichiers {
	
    # On divise l'arborescence a parcourir selon des fichiers
    my $path = 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;
        if (-d $file) {
            &parcoursarborescencefichiers($file);	#recurse!
        }
        if (-f $file) {
	    #Si le fichier a une extension xml on applique les choses suivantes:
            if ($file=~/\.xml$/) {
		
		$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";
			$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";
			$DUMPFULL2.="<RESUME>$resume</RESUME></ARTICLE>\n";
			
		    }
		    else 
			#Sinon, on ne fait rien
			{
			$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 la premiere solution avec les expressions regulieres
#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;
}


