#!/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);
my $encodagesortie="utf-8";

#-----------------------TRAITEMENT DU REPERTOIRE 
my $repertoire="$ARGV[0]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
# : si la chaine de caratère $rep finie par un / on substitue (s/) la séquence ([\/]$) par (/) rien (/) : s/[RegExp]/substitution/
$repertoire=~ s/[\/]$//;

#-----------------------TABLE 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-regexp.xml";
open(SORTIE,">:encoding($encodagesortie)",$sortie1);
#----------------------------------------
my $CONTENU2="";
my $sortie2="SORTIE.txt";
open(SORTIE2,">:encoding($encodagesortie)",$sortie2);

#------LANCEMENT DE LA PROCEDURE DE PARCOURS DE L'ARBORESCENCE ----------------------------------
#
&parcoursarborescencefichiers($repertoire);	

#--------CREATION  FORME DU FICHIER XML--------------------------------
#doc xml
print SORTIE "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print SORTIE "<PARCOURS>\n";
print SORTIE "<NOM-RUBRIQUE>A LA UNE</NOM-RUBRIQUE>\n";
print SORTIE "<FILTRAGE>".$CONTENU1."</FILTRAGE>\n";
print SORTIE "</PARCOURS>\n";
close(SORTIE);
#doc txt
print SORTIE2 $CONTENU2;
close (SORTIE2);
exit;

# ---------------------------NETTOYAGE DU 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/œ/oe/g;
$texte =~ s/amp;amp;//g;
$texte =~ s/amp;//g;
$texte =~ s/&/and/g;

return $texte
}
#-----------------------------ETIQUETAGE TRETAGGER-----------------

sub etiquetageavectreetagger {
    my ($texte)=@_;
    #----- le titre
    my $codage="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 $codage ");
    # lecture du resultat tagge en xml :
    open(OUT,"<:encoding(utf-8)","treetagger.txt.xml");
    my $fistline=<OUT>;
    my $texteetiquete="";
    while (my $l=<OUT>) {
	$texteetiquete.=$l;
    }
    close(OUT);
    # on renvoie les resultats :
    return ($texteetiquete);
}
#-----------------------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);
    #@files 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 =~ /^\.\.?$/;
		$fichier = $path."/".$fichier;
		#si on tombe sur un repertoire on lance a nouveau la procedure de parcours de l'arborescence
		if (-d $fichier) {
			&parcoursarborescencefichiers($fichier);	
		}
		#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`;
				#on affiche l'encodage
				print "ENCODAGE  : $encodage \n";
				#on ote le dernier caractere si celui si est un separateur
				chomp($encodage);
				open(FILE,"<:encoding($encodage)", $fichier);
				my $texte="";
				while (my $ligne = <FILE>){
					chomp($ligne);
					$texte.=$ligne;
				}
				close (FILE);
				$texte=~s/ +/ /g;
				$texte=~s/> +</></g;
				
				#--------------------------------FILTRAGE DU TEXTE---------------------------------------------
				
				#on initialise un compteur qui va nous permettre d'avoir chaque article numerote
				my $numeroarticle=0;
				
				#on recherche le titre et la description (resume) dans le fils rss
				while ($texte =~ /<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gi) {
					#on stock le titre et le contenu (resume) dans les variables $1 et $2
					my $titre = $1;
					my $contenu=$2;
					print $titre, "\n";
                			print $contenu;
					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 numero=\"$numeroarticle\"><item><title>$titreetiquete</title><description>$contenuetiquete</description></item></ARTICLE>\n";
                    				 #On définit à 1 la valeur de la cle de $contenu
                    				 $tableaucontenu{$test}=1;
					}
				}
			}
		}	
	}
}

