#!/usr/bin/perl

########################################################################################################################"
<<DOC; 

 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
 Le programme prend en entrée le nom du répertoire contenant les fichiers
 à traiter
 Le programme construit en sortie un fichier structuré contenant sur chaque
 ligne le nom du fichier, le numero de l'article et le résultat du filtrage :
 <FICHIER><NOM>du fichier</NOM></FICHIER><ARTICLE>numero</ARTICLE><CONTENU>du filtrage</CONTENU></FICHIER>
DOC
###########################################################################################################################
use strict;
use warnings;

use Unicode::String qw(utf8);
#On utilise une bibliothèque permettant de récupérer des éléments d'un fichier RSS
use XML::RSS;

#--------------------TRAITEMENT DU REPERTOIRE

#le fichier traite sera celui donne en premier argument dans le terminal
my $repertoire="$ARGV[0]";
#Initialisation de la méthode du module xml::rss
my $rss=new XML::RSS;
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$repertoire=~ s/[\/]$//;
# 
#-----------------------TABLE DE HACHAGE------------------------------------------

#initialisation d'une table de hachage qui  permettra de ne pas avoir de doublon dans les fils rss recuperes (titre et resume) 
my %tableaucontenu=();


#---------------------------CREATION DES SORTIES--------------------------------------
#On cree un fichier pour chaque type de sortie (XML et TXT)
my $CONTENU1="";
my $sortie1="SORTIE-RSS.xml";
open(SORTIE1,">:encoding(utf-8)",$sortie1);
#----------------------------------------
my $CONTENU2="";
my $sortie2="SORTIE-RSS.txt";
open(SORTIE2,">:encoding(utf-8)",$sortie2);

#-------------------LANCE LA PROCEDURE DE PARCOURS DE l'ARBORESCENCE---------------------
#
&parcoursarborescencefichiers($repertoire);

#------------------CREATION FORME DOC XML---------------------
#doc xml
print SORTIE1 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print SORTIE1 "<PARCOURS>\n";
print SORTIE1 "<NOM>Antunes Laetitia et Masse Linda</NOM>\n";
print SORTIE1 "<FILTRAGE>".$CONTENU1."</FILTRAGE>\n";
print SORTIE1 "</PARCOURS>\n";
close(SORTIE1);
#doc txt
print SORTIE2 $CONTENU2;
close (SORTIE2);
exit;
#--------------------------FONCTION NETTOYAGE TEXTE----------------------------
#On remplace les entites HTML et les caracteres speciaux
sub nettoietexte {
my $texte = shift(@_);
$texte =~ s/> *</></g;
$texte =~ s/&lt;/</g;
$texte =~ s/&gt;/>/g;
$texte =~ s/<a href[^>]+>//g;
$texte =~ s/<img[^>]+>//g;
$texte =~ s/<\/a>//g;
$texte =~ s/&#39;/'/g;
$texte =~ s/<[^>]+>//g;
$texte =~ s/&#233;/é/g;
$texte =~ s/&#234;/ê/g;
$texte =~ s/&#38/'/g;
$texte =~ s/;#39;//g;
$texte =~ s/;#34;//g; 
$texte =~ s/&#34;//g;

return $texte;
}
# ---------------------FONCTION ETIQUETAGE TREETAGGER-----------------------

sub etiquetageavectreetagger {
    my ($texte)=@_;
    #----- le titre
    my $encodage="utf-8";
    my $fichtemp="texteaetiqueter.txt";
    open (TMPFILE,">:encoding(utf-8)", $fichtemp);
    print TMPFILE $texte,"\n";
    close(TMPFILE);
    system("perl ./treetagger-win32/cmd/tokenise-fr.pl $fichtemp | ./treeTagger/bin/tree-tagger ./treetagger-win32/lib/french-utf8.par -lemma -token -no-unknown -sgml > treetagger.txt");
    system("perl ./treetagger-win32/cmd/treetagger2xml-utf8.pl treetagger.txt $encodage ");
    # lecture du resultat tagge en xml :
    open(SORTIE,"<:encoding(utf-8)","treetagger.txt.xml");
    my $fistline=<SORTIE>;
    my $texteetiquete="";
    while (my $l=<SORTIE>) {
	$texteetiquete.=$l;
    }
    close(SORTIE);
    # on renvoie les resultats :
    return ($texteetiquete);
}

#-------------------------------------------FONCTION DE PARCOURS DE L'ARBORESCENCE------
sub parcoursarborescencefichiers {
    #on vide la premiere ligne du tableau
    my $path = shift(@_);
    #on ouvre le repertoire et utilise la fonction die qui retournera notre message d'erreur si il ne parvient pas a ouvrir le repertoire
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @fichiers = readdir(DIR);
    #@fichier est la liste des fichiers contenu dans DIR. readdir(DIR) est l'équivalent de ls DIR.
    closedir(DIR);
    #On traite chaque fichier du repertoire
    foreach my $fichier (@fichiers) {
		#si le fichier n'existe pas passer au suivant
		next if $fichier =~ /^\.\.?$/;
		#si on tombe sur un repertoire on lance a nouveau la procedure de parcours de l'arborescence
		$fichier = $path."/".$fichier;
		if (-d $fichier) {
			&parcoursarborescencefichiers($fichier);	#recurse!
		}
		#on recupere le fichier correspondant a la rubrique "A la une=0,2-3208,1-0,0" au format xml
		if (-f $fichier){
		
			if($fichier=~/0,2-3208,1-0,0\.xml$/) {
				#on recupere l'encodage du fichier grace a la commande file -i
				
				my $encodage=`file -i $fichier| cut -d= -f2`;
				print "ENCODAGE  : $encodage \n";
				chomp($encodage);
				
				
				#-------------- FILTRAGE DU CONTENU TEXTUEL---------------------------------------------
				
				
				open(FICHIER,"<:encoding($encodage)", $fichier);
				#On crée une variable pour instancier un objet RSS
           			my $rss=new XML::RSS;
           			#Les résultats de parse_file sont stockés dans $rss
           			$rss->parsefile($fichier);
           			#on initialise un compteur qui va nous permettre d'avoir chaque article numerote
           			my $numeroarticle=0;
           			foreach my $item (@{$rss->{'items'}}) {
    						
    						#On récupère le titre et le résumé pour l'item en fonction des balises du document rss
               				        my $titre=$item->{'title'};

                				my $contenu=$item->{'description'};
                				#modifie l'encodage si pas en utf-8
                				if (uc($encodage) ne "UTF-8") {utf8($titre);utf8($contenu);}
                				#on lance la procedure de nettoyage sur le titre et sur le contenu
                				$titre = &nettoietexte($titre);
               				        $contenu = &nettoietexte($contenu);
               				        
               				        #---------------------LANCEMENT PROCEDURE ETIQUETAGE-------------------------------
               				        
               				         #les variables titreetiquete et contenuetiquete contiendront le resultat de traitement de treetagger
               				        my $titreetiquete =&etiquetageavectreetagger($titre);
						my $contenuetiquete =&etiquetageavectreetagger($contenu);
						
						#-------------------PAS DE DOUBLONS + ECRITURE EN SORTIE--------------------------------------------
						
                				#on verifie que le resume ne soit pas deja dans notre table de hachage avec un test sur le contenu
                				my $test=$contenu;
                				# si la cle du contenu n'esxiste pas dans notre table de hachage:
                				if(!exists $tableaucontenu{$test}){
                					#on incremente notre compteur
                					$numeroarticle++;
                				        #On écrit les sorties dans le fichier txt puis dans le xml prevu a cet effet
                   				 	$CONTENU2 = $CONTENU2 . $titre."\n".$contenu."\n";
						 	$CONTENU1 =  $CONTENU1 . "<ARTICLE num=\"$numeroarticle\"><item><title>$titreetiquete</title><description>$contenuetiquete</description></item></ARTICLE>\n";
                    				 #On définit à 1 la valeur de la clef de $contenu
                    				 $tableaucontenu{$test}=1;
                    				 }
                		}
				}
					
			}
		
		}	
}	


