#!/usr/bin/perl
#Importation du module: Unicode::String
use Unicode::String qw(utf8);
#introduit dans un fichier perl de la documentation intégree au programme
<<DOC; 
Votre Nom : FEREDJ	Siham
	2012
    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:
    - un fichier contenant le corpus  extrait des fils RSS (format texte)
    - un fichier contenant le corpus extrait des fils RSS (format XML)
    
DOC
    
#--------------------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------------------
#on récupère le nom du répertoire tapé par l'utilisateur dans l'entrée standard
my $rep="$ARGV[0]"; 
#on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//; 

#on initialise deux variables pour créer des fichiers de sortie(xml et txt)
my $DUMPXML=""; 
my $DUMPTXT="";

#on initialise une variable qui servira à traiter le numero de la rubrique à choisir par l'utilisateur plus tard.
my $numero="";
#on initialise une variable qui servira à traiter le nom de la rubrique. 
my $rubrique="";
#on initialise une variable qui servira à traiter la date de chaque article. 
my $date="";
#--------------------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------------------

# L'utilisateur entre son choix de rubrique dans l'entrée standard.  
print "Entrez le numéro  de la rubrique a traiter ou * pour traiter toutes les rubriques : \n";
print "0 : A la une\t\t\t\t8 : Medias\n
1 : International\t\t\t9 : Rendez-vous\n
2 : Europe\t\t\t\t10 : Sports\n
3 : Livres\t\t\t\t11 : Opinions\n
4 : Cinema\t\t\t\t12 : Planete\n
5 : Technologies\t\t\t13 : Voyages\n
6 : Politique\t\t\t\t14 : Culture\n
7 : Economie\t\t\t\t15 : Societe\n
ALL:* \n\n
Votre choix : ";

# on récupère dans une variable appelé $identifiant le choix de la rubrique de l'utilisateur tapé dans l'entrée standard.
$identifiant = <STDIN>;

# on supprime le dernier caractère de retour à la ligne, s'il y en a un.
chomp($identifiant);

#On fait une condition pour traiter le choix de la rubrique de l'utilisateur:

#Si la variable $identifiant est équivalent à 0
if ($identifiant eq 0){
	#Le numéro sera: 3208
	$numero="3208";
	#Le nom de la varaiable rubrique sera: a_la_une
	$rubrique="a_la_une";
	} 
#Sinon si la variable $identifiant est équivalent à	1
elsif ($identifiant eq 1){
	#Le numéro sera: 3210
	$numero="3210";
	#Le nom de la varaiable rubrique sera: international
	$rubrique="international";
	}
#Sinon si la variable $identifiant est équivalent à	2	
elsif ($identifiant eq 2){
	#Le numéro sera: 3214
	$numero="3214";
	#Le nom de la varaiable rubrique sera: europe
	$rubrique="europe";
	}
#Sinon si la variable $identifiant est équivalent à	3	
elsif ($identifiant eq 3){
	#Le numéro sera: 3260
	$numero="3260";
	#Le nom de la varaiable rubrique sera: livres
	$rubrique="livres";
	}
#Sinon si la variable $identifiant est équivalent à	4	
elsif ($identifiant eq 4){
	#Le numéro sera: 3476
	$numero="3476";
	#Le nom de la varaiable rubrique sera: cinema
	$rubrique="cinema";
	}
#Sinon si la variable $identifiant est équivalent à	5	
elsif ($identifiant eq 5){
	#Le numéro sera: 651865
	$numero="651865";
	#Le nom de la varaiable rubrique sera: technologie
	$rubrique="technologie";
	}
#Sinon si la variable $identifiant est équivalent à	6	
elsif ($identifiant eq 6){
	#Le numéro sera: 823353
	$numero="823353";
	#Le nom de la varaiable rubrique sera: politique
	$rubrique="politique";
	}
#Sinon si la variable $identifiant est équivalent à	7	
elsif ($identifiant eq 7){
	#Le numéro sera: 3234
	$numero="3234";
	#Le nom de la varaiable rubrique sera: economie
	$rubrique="economie";
	}
#Sinon si la variable $identifiant est équivalent à	8	
elsif ($identifiant eq 8){
	#Le numéro sera: 3236
	$numero="3236";
	#Le nom de la varaiable rubrique sera: medias
	$rubrique="medias";
	}
#Sinon si la variable $identifiant est équivalent à	9	
elsif ($identifiant eq 9){
	#Le numéro sera: 3238
	$numero="3238";
	#Le nom de la varaiable rubrique sera: rendez-vous
	$rubrique="rendez-vous";
	}
#Sinon si la variable $identifiant est équivalent à	10	
elsif ($identifiant eq 10){
	#Le numéro sera: 3242
	$numero="3242";
	#Le nom de la varaiable rubrique sera: sport
	$rubrique="sport";
	}
#Sinon si la variable $identifiant est équivalent à	11	
elsif ($identifiant eq 11){
	#Le numéro sera: 3232
	$numero="3232";
	#Le nom de la varaiable rubrique sera: opinions
	$rubrique="opinions";
	}
#Sinon si la variable $identifiant est équivalent à	12	
elsif ($identifiant eq 12){
	#Le numéro sera: 32344
	$numero="32344";
	#Le nom de la varaiable rubrique sera: planete
	$rubrique="planete";
	}
#Sinon si la variable $identifiant est équivalent à	13	
elsif ($identifiant eq 13){
	#Le numéro sera: 3246
	$numero="3246";
	#Le nom de la varaiable rubrique sera: voyages
	$rubrique="voyages";
	}
#Sinon si la variable $identifiant est équivalent à	14	
elsif ($identifiant eq 14){
	#Le numéro sera: 3546
	$numero="3546";
	#Le nom de la varaiable rubrique sera: culture
	$rubrique="culture";
	}
#Sinon si la variable $identifiant est équivalent à	15	
elsif ($identifiant eq 15){
	#Le numéro sera: 3224
	$numero="3224";
	#Le nom de la varaiable rubrique sera: societe
	$rubrique="societe";
	}
#Sinon si la variable $identifiant est équivalent à	16	
elsif ($identifiant eq "*"){
	#Le numéro sera toutes les rubriques
	$numero="ALL";
	#Le nom de la varaiable rubrique sera:
	$rubrique="toutes_les_rubriques";
	}
#Sinon on affiche dans l'entrée standard:		
else{ 
	print "Veuillez encore indiquer la rubrique a traiter\n"; 
	}  

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

#attribution des noms de sorties pour les formats xml et txt:
#my $output1_xml="SORTIE_REGEX_".$rubrique.".xml";
#my $output2_txt="SORTIE_REGEX_".$rubrique.".txt";
my $output3="SORTIE-extract-txt-".$rubrique."-treetagger.xml";
#création des fichiers xml et txt en utf-8
my $encodagesortie="utf-8";
#if (!open(OUTXML,">:encoding($encodagesortie)",$output1_xml)) { die "Pb a l'ouverture du fichier $output1_xml.xml"};
#if (!open(OUTTXT,">:encoding($encodagesortie)",$output2_txt)) { die "Pb a l'ouverture du fichier $output2_txt.txt"};
if (!open (OUTXML,">:encoding($encodagesortie)", $output3)) { die "Pb a l'ouverture du fichier $output3.xml"};
#--------------------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------------------

#on appelle le sous-programme
&parcoursarborescencefichiers($rep);

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

#Pour les fichiers de sorties en format XML:
#on crée les balises en début de fichier XML de sortie
print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"; 
#print OUTXML "<NOM>FEREDJ Siham</NOM>\n";
#le contenu du filtage contenu dans la variable $$DUMPXML sera intégré dans la balise <FILTRAGE>
print OUTXML "<ETIQUETAGE rubrique=\"".$rubrique."\" identifiant=\"$numero\">\n".$DUMPXML."</ETIQUETAGE>\n";
close(OUTXML);
#Pour les fichiers de sorties en sortie TXT:
#on va remplir le fichier de sortie avec le contenu de DUMPTXT
print OUTTXT "$DUMPTXT";
close (OUTTXT);

# Fin du programme
exit;

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

###########################################Le traitement ####################################
#Procédure pour le parcours d'arborescence de fichiers:
sub parcoursarborescencefichiers { 
	#$path récupère la première valeur du tableau
    my $path = shift(@_); 
	#on ouvre le répertoire appelé par le nom DIR, sinon un messsage d'erreur s'affiche
    opendir(DIR, $path) or die "can't open $path: $!\n"; 
	#on stocke le contenu du répertoire dans le tableau @files
    my @files = readdir(DIR); 
	#on ferme le répertoire
    closedir(DIR);
    
	#pour chaque fichier ou répertoire présent dans le tableau @files on effctue les instructions suivantes:
    foreach my $file (@files) {
	#on veut ignorer les fichiers commençant par un .
	next if $file =~ /^\.\.?$/;
	#on écrase la variable $file pour la remplacer par $nomdefichier
	my $nomdefichier=$file;
	#on récupère le chemin d'accès complet au fichier
	$file = $path."/".$file; 
	
	
	#Savoir si la variable $file est un répertoire ou un fichier.
	# avec l'option -d on vérifie que file est un répertoire, il faut donc à nouveau fouiller ce répertoire
	if (-d $file) { 
		#on relance le sous programme sur $file
	    &parcoursarborescencefichiers($file);	
	    
	}
	# l'option -f vérifie que la variable file est un fichier
	if ((-f $file) && ($file=~/.xml$/) && ($nomdefichier!~/^fil/)) {
		#initialisation de la variable
		my $file2traite="";
		#traitement de tous le fichiers 
		if ($numero eq "ALL") { 
			$file2traite=$file;
		}
		else {
			#traitement d'une rubrique en particulier
			if ($file=~/0,2-$numero,1-0,0\.xml$/) {
				$file2traite=$file;
			}
		}
		if ($file2traite ne "") {
		    #lecture de $file
			# je prepare la sortie :
			$DUMPXML.="<file>\n<name>$file</name>\n";
		    open(FILE, $file); 
			#Doit chercher l'encodage de la première ligne du fichier
		    my $firstline=<FILE>;
		    $firstline=~/encoding=['"]([^'"]+)['"]/;
			#L'encodage est stocké dans le nom d'une variable appelée "encodage"
		    my $encodage=$1;
			#on ferme le fichier
		    close(FILE);
			#ouverture du fichier en écriture
		    open(FILE,"<:encoding($encodage)", $file); 
			#iinitialisation de la variable $texte
		    my $texte=""; 
			#tant que le programme peut lire des lignes dans le fichier, il le fait:
		    while (my $ligne=<FILE>) {
			#je retire le retour à la ligne et on remplace par rien
			$ligne =~ s/\n//g; 
			#je concatène les lignes du fichier pour obtenir un texte
			$texte .= $ligne; 
		    }
			#je cherche tout ce qu'il y a comme blanc entre les chevrons fermants et chevrons ouvrants et je remplace par ><
		    $texte =~ s/> *</></g; 
			#je cherche la balise pubdate et je mémorise après le contenu de cette balise dans la variable $date
		    $texte=~/<pubDate>([^<]+)<\/pubDate>/; 
		    my $date=$1;
			#j'affiche la date dans l'entrée standard.
		    print $date,"\n";
			#Si c'est pas de l'utf-8, on transforme la variable $date en utf-8
		    if (uc($encodage) ne "UTF-8") {utf8($date);} 
			#je mets la variable date dans la balise date
		    $DUMPXML.="<date>".$date."</date>\n"; 
			#on met le texte dans la balise items
		    $DUMPXML.="<items>\n"; 
		    #on fait l'extraction du contenu textuel en utilisant regex.
		    while ($texte =~ /<item><title>([^<]+)<\/title>.+?<description>([^<]+)<\/description>/g){
			#on met le contenu textuel de $1 dans la variable $title
			my $titre=$1; 
			#on met le contenu textuel de $2 dans la variable $resume
			my $resume=$2; 
			#Si c'est pas de l'utf-8, je transforme la variable $tire et $resume en utf-8
			if (uc($encodage) ne "UTF-8") {utf8($titre);utf8($resume);}
			#on suprime les scories que peuvent apparaitre dans le contenu textuel. Le resultat sera renvoyé à la variable $titre
			$titre = &nettoietexte($titre); 
			#on suprime les scories que peuvent apparaitre dans le contenu textuel. Le resultat sera renvoyé à la variable $resume
			$resume = &nettoietexte($resume);
			#----------------------------------------------------------------------------
			# ici il faut lancer l etiquetage de $titre et $resume avant de les integrer dans $DUMPXML
            my ($titreetiquete,$resumeetiquete)=&etiquetage($titre,$resume);			
			#----------------------------------------------------------------------------
			#on stocke tous les résultats du contenu textuel dans la variable $DUMPTXT et $DUMPXML
			$DUMPTXT.="$titre \n";
			$DUMPTXT.="$resume \n";
			$DUMPXML.="<item><title>$titreetiquete</title><abstract>$resumeetiquete</abstract></item>\n";
		    }
		    $DUMPXML.="</items>\n</file>\n";
			#On écrit les sorties nécessaires dans les fichiers
			#on ferme le fichier
		    close(FILE);
		}
	    }
    }
}
#--------------------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------------------

#Procédure pour nettoyer le texte:
#La procédure renvoie à la fin la variable $texte.
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;/&/g;
	$texte =~ s/&#34;/"/g;
	$texte =~ s/&#39;/'/g;
	$texte =~ s/<[^>]+>//g;
    return $texte;
    }

#--------------------------------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------------------------------
#etiquetage avec TreeTagger
sub etiquetage {
    
	my ($titre, $texte)=@_;	
    #----- le titre
    my $codage="utf-8";
    my $tmptag="texteaetiqueter.txt";
    open (TMPFILE,">:encoding(utf-8)", $tmptag);
    print TMPFILE $titre,"\n";
    close(TMPFILE);
    system("perl ./tokenise-utf8.pl $tmptag | tree-tagger.exe ./french-utf8.par -lemma -token -no-unknown -sgml > treetagger.txt");
    system("perl ./treetagger2xml-utf8.pl treetagger.txt $codage ");
    # lecture du resultat tagge en xml :
    open(OUT,"<:encoding(utf-8)","treetagger.txt.xml");
    my $fistline=<OUT>;
    my $titreetiquete="";
    while (my $l=<OUT>) {
	$titreetiquete.=$l;
    }
    close(OUT);

	#------ le resume
    my $codage="utf-8";
    my $tmptag="texteaetiqueter.txt";
    open (TMPFILE,">:encoding(utf-8)", $tmptag);
    print TMPFILE $texte,"\n";
    close(TMPFILE);
    system("perl ./tokenise-utf8.pl $tmptag | tree-tagger.exe ./french-utf8.par -lemma -token -no-unknown -sgml > treetagger.txt");
    system("perl ./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 ($titreetiquete,$texteetiquete);
	
	
}	
