#!/usr/bin/perl
#On utilise une bibliothèque permettant de convertir les données textuelles en utf-8
use Unicode::String qw(utf8);
use feature "switch";

#################
# DOCUMENTATION #
#################
<<DOC; 

Ilaria Tiddi & Julie Sauvage & Kelly Masclef

FÉVRIER 2011

				usage : perl scriptarborescence.pl repertoire-a-parcourir
Le programme prend en entree le nom du repertoire contenant les fichiers à  traiter

Le programme demande à l'utilisateur quelle rubrique traiter, seule la rubrique choisie sera traitée.

Le programme construit en sortie plusieurs types de fichiers:
*Le programme construit en sortie un fichier XML structuré comme ci-dessous:
<FICHIERS>
	<FICHIER>
		<NOM>du fichier</NOM>
		<DATE>date</DATE>
		<ARTICLES rub="numéro de la rubrique">
			<ARTICLE num="numéro de l'article">
				<TITRE>Titre de l'article</TITRE>
				<RESUME>Résumé de l'article</RESUME>
			</ARTICLE>
		</ARTICLES>
	</FICHIER>
	<FICHIER>
		...
	</FICHIER>
</FICHIERS>

*Le programme construit en sortie un fichier TXT structuré comme ci-dessous:
TITRE: titre de l'article
RESUME: Résumé de l'article

*Le programme construit en sortie un fichier 

DOC

#------------------------------------------------------------------------------------------
########################
# Travail préparatoire #
########################
#-----------------------------------CHOIX DE LA RUBRIQUE-----------------------------------

&tabloCouleurs;

# on initialise une variable $rub contenant le numéro de la rubrique récupérée via l'entrée standard
$rub =<STDIN>;
#On enlève le retour chariot
chomp($rub); #à noter que chop($rub) enlèverait aussi le retour chariot, cependant chop enlève le dernier élément quel qu'il soit alors que chomp enlève seulement le retour chariot
# on initialise une variable $numRub qui va contenir le numéro de la rubrique
my $nomRub="";
my $numRub="";
#La requête est associée à une rubrique

given ($rub) {
	when ($rub eq 1) {$numRub="3208";$nomRub="A_la_une";}
	when ($rub eq 2) {$numRub="3210";$nomRub="International";}
	when ($rub eq 3) {$numRub="3214";$nomRub="Europe";}
	when ($rub eq 5) {$numRub="3224";$nomRub="Opinions";}
	when ($rub eq 4) {$numRub="3232";$nomRub="Societe";}
	when ($rub eq 6) {$numRub="3236";$nomRub="Medias";}
	when ($rub eq 7) {$numRub="3238";$nomRub="Rendez-vous";}
	when ($rub eq 8) {$numRub="3242";$nomRub="Sports";}
	when ($rub eq 9) {$numRub="3244";$nomRub="Planete";}
	when ($rub eq 10) {$numRub="3246";$nomRub="Culture";}
	when ($rub eq 11) {$numRub="3260";$nomRub="Livres";}
	when ($rub eq 12) {$numRub="3404";$nomRub="Examens";}
	when ($rub eq 13) {$numRub="3476";$nomRub="Cinema";}
	when ($rub eq 14) {$numRub="3546";$nomRub="Voyage";}
	when ($rub eq 15) {$numRub="651865";$nomRub="Technologies";}
	default {print "Je n'ai pas compris votre requête\n";}
}
#------------------------------------------------------------------------------------------
#--------------------------------------TRAITEMENT DU RÉPERTOIRE----------------------------
#Le répertoire est celui précisé en premier argument
my $rep="$ARGV[0]";
# on s'assure que le nom du repertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
#------------------------------------------------------------------------------------------
#---------------------------------------CRÉATION DES FICHIERS EN SORTIE--------------------
#On crée un fichier pour chaque sortie différente (TXT, XML)

my $XML="SORTIE-$nomRub.xml";
my $TXT="SORTIE-$nomRub.txt";
my $TreeTagger="Sortie_TreeTagger.txt";
my $TXT4TT="Entrée_TreeTagger.txt";

if (!open (FILEOUTXML,">:encoding(utf-8)", $XML)) { die "Problème à l'ouverture du fichier $XML"};
if (!open (FILEOUTTXT,">:encoding(utf-8)", $TXT)) { die "Problème à l'ouverture du fichier $TXT"};
open (OUTXML,">:encoding(utf-8)",$TXT4TT);
#On écrit l'entête du fichier XML ainsi que l'élément racine
print FILEOUTXML "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!DOCTYPE FICHIERS SYSTEM \"filrss.dtd\">\n<?xml-stylesheet type=\"text/xsl\" href=\"xslprova.xsl\"?>\n<FICHIERS>\n";

#------------------------------------------------------------------------------------------
###########################
# Traitement des fils RSS #
###########################
#------------------LANCEMENT DE LA PROCÉDURE DE PARCOURS SUR LE RÉPERTOIRE-----------------
&parcoursarborescencefichiers($rep);
#On ferme l'élément racine
print FILEOUTXML "</FICHIERS>\n";
#On ferme le fichier en sortie
close(FILEOUTXML);

#------------------------#
#  Lancement Treetagger  #
#------------------------#
&etiquetage;


#fin!
exit;




#------------------------------------------------------------------------------------------
###########################################################################################
#        							Procédures       									  #
###########################################################################################



#--------------------------PARCOURS DE L'ARBORESCENCE--------------------------------------
#PROCEDURE NUM. 1
sub parcoursarborescencefichiers {
	my $path = shift(@_); #vide la premiere ligne du tableau: "_" contient 2008
	opendir(DIR, $path) or die "Je ne peut pas ouvrir $path: $!\n"; # on definit un pointeur de repertoire
	#die permet de sortir: comme exit
	my @files = readdir(DIR); #lire le contenu du repertoire et utilise le poiteur du repertoire
	# renvoie une liste des elements constitutifs des elements du repertoire= @files  
	closedir(DIR);

	foreach my $file (@files) {
	#chaque element de la liste:un traitement different
		next if $file =~ /^\.\.?$/;# passer au suivant si le fichier n'existe pas
		$file = $path."/".$file; #heritage du chemin pere
		if (-d $file) { #appliquer la fonction si la ressource est un repertoire/un fichier: -d (applique à un repertoire), -f (un fichier)
			&parcoursarborescencefichiers($file);	#recurse!
		}
		
		#On stocke dans la variable $name, le chemin+le nom du fichier
		$name="$path/0,2-$numRub,1-0,0\.xml";

		#On récupère le fichier correspondant à la bonne rubrique et qui finit par .xml
		if ((-f $file) && ($file =~ /0,2-$numRub,1-0,0\.xml$/)) {
			
			print "Traitement en cours...\n";	 
			
			#on lance la proc. num.2 --> le traitement des fichiers
			&traiterFichier($file);
						
		
		}
	}
}

#------------------------------------------------------------------------------------------
#------------------------------TRAITEMENT DE CHAQUE FICHIER--------------------------------
#PROCEDURE NUM. 2
sub traiterFichier {
	
			my $file=shift;
			#On affiche le fichier + compteur sur la console
			print "$file : \e[1;31;40m",$i++,"\e[0m\n";
			
			#recuperation de l'encodage avec la porcédure num. 3
			$encodage=&extractEncoding($file);
			
			
			#------------------------------------------------------
			#On ouvre le fichier cette fois en précisant l'encodage récupéré pour l'ouverture
			open(FILE,"<:encoding($encodage)", $file);
			#Tant qu'il y a des lignes dans le fichier {instructions}
			while (my $ligne=<FILE>) {
				#On formate le flux textuel afin que tous les fils soient sur une seule ligne et non plusieurs
				$ligne =~ s/\n//g;
				#On concatène le tout dans une variable $texte
				$texte .= $ligne;
			}
			#On initialise un compteur qui va nous permettre d'attribuer un numéro pour chaque article
			$i=0;
			#On formate le texte
			$texte =~ s/> *</></g;
			#On récupère la date
			$texte=~/<pubDate>([^<]+)<\/pubDate>/;
			#On supprime les balises CDATA
			$texte =~ s/<!\[CDATA\[//g;
			$texte =~ s/\]\]>//g;
			#On stocke la date dans une variable $date
			my $date=$1;
			if (uc($encodage) ne "UTF-8") {utf8($date);}
			#On écrit dans le fichier en sortie le début du contenu XML
			print FILEOUTXML "<FICHIER>\n";
			print FILEOUTXML "<NOM>$name</NOM>\n";
			print FILEOUTXML "<DATE>".$date."</DATE>\n";
			print FILEOUTXML "<ARTICLES rub=\"$nomRub\">\n";
			
			#procedure num. 4 ----> filtrage du texte;
			&filtrageTexte($texte);
			
			#On ferme les dernières balises dans le fichier XML en sortie
			print FILEOUTXML "</ARTICLES>\n</FICHIER>\n";


}



#-------------------------------------------------------------------------------------------			
#------------------------------EXTRACTION DE L'ENCODAGE-------------------------------------
#PROCEDURE NUM. 3
sub extractEncoding {
	$file=shift;
	#On ouvre le fichier traité qui pointe sur FILE
	open(FILE,$file);
			#-----------on récupère l'encodage du fichier----------
			while (my $ligne=<FILE>) {
				#On pourrait se servir de la fonction file -i mais celle-ci ne fonctionne pas à tous les coups
				#On récupère donc l'encodage via une expression régulière
				#L'encodage se trouve entre "" ou ' ' 
				if ($ligne =~ /encoding=["|'](.*?)['|"]\?/){
					$encodage=$1;
					#On affiche l'encodage
					print "\e[1;34;40m$encodage\e[0m\n";
				}
			}
	#On ferme le fichier
	close(FILE);
	return $encodage;
}

#-----------------------------------------------------------------------------------------			
#-------------------------FILTRAGE DU TEXTE-----------------------------------------------
#PROCEDURE NUM. 4
#extraction de titre et description
sub filtrageTexte {
	#my $texte=shift;
	#print texte;
	while ($texte =~ /<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/g) {
				#On récupère le titre et le résumé de l'item
				my $titre=$1;
				my $resume=$2;
				if (uc($encodage) ne "UTF-8") {utf8($titre);utf8($resume);}
				#On nettoie le titre et le résumé grâce à la procédure nettoietexte
				$titre = &nettoietexte($titre);
				$resume = &nettoietexte($resume);
				
				#Si la clef du titre n'existe pas et si le titre ne contient rien {INSTRUCTIONS}
				if ((!(exists($LISTEXML{$titre})))&&($titre ne "")) {
					#On incrémente le compteur
					$i++;
					#On écrit les sorties nécessaires dans les fichiers
					print FILEOUTTXT "TITRE : $titre \n";
					print FILEOUTTXT "RESUME : $resume \n\n";
					print FILEOUTXML "<ARTICLE num=\"$i\"><TITRE>$titre</TITRE><RESUME>$resume</RESUME></ARTICLE>\n";
					print OUTXML "$resume";
					#On définit à 1 la valeur de la clef de $titre
					$LISTEXML{$titre}=1;
				}
	}
}

#------------------------------------------------------------------------------------------			
#-------------------------NETTOYAGE DU TEXTE-----------------------------------------------
#Ici on a nettoyer le texte
sub nettoietexte {
	my $texte=shift;
	$texte =~ s/&lt;/</g; #On remplace &lt par l'élément 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;
}
#------------------------------------------------------------------------------------------
sub etiquetage {
	system("perl ./TreeTagger/cmd/tokenize.pl $TXT4TT | ./TreeTagger/bin/tree-tagger -token -lemma -no-unknown -sgml ./TreeTagger/lib/french-utf8.par > $TreeTagger");
	  
	system("perl ./treetagger2xml__modif.pl $TreeTagger");
	
}
#------------------------------------------------------------------------------------------
#PROCEDURE NUM. 7
#le choix de la rubrique
sub tabloCouleurs {
	
	print "Quelle rubrique voulez-vous traiter?\n
Tapez sur le numero de la rubrique désirée:\n
\e[1;32;40m1.\e[0m\t\e[1;33;40mA la une\e[0m\t\e[1;32;40m6.\e[0m\t\e[1;33;40mMedias\e[0m\t\t\e[1;32;40m11.\e[0m\t\e[1;33;40mLivres\e[0m\n\e[1;32;40m2.\e[0m\t\e[1;33;40mInternational\e[0m\t\e[1;32;40m7.\e[0m\t\e[1;33;40mRendez-vous\e[0m\t\e[1;32;40m12.\e[0m\t\e[1;33;40mExamens\e[0m\n\e[1;32;40m3.\e[0m\t\e[1;33;40mEurope\e[0m\t\t\e[1;32;40m8.\e[0m\t\e[1;33;40mSports\e[0m\t\t\e[1;32;40m13.\e[0m\t\e[1;33;40mCinema\e[0m\n\e[1;32;40m4.\e[0m\t\e[1;33;40mSociété\e[0m\t\t\e[1;32;40m9.\e[0m\t\e[1;33;40mPlanete\e[0m\t\t\e[1;32;40m14.\e[0m\t\e[1;33;40mVoyages\e[0m\n\e[1;32;40m5.\e[0m\t\e[1;33;40mOpinions\e[0m\t\e[1;32;40m10.\e[0m\t\e[1;33;40mCulture\e[0m\t\t\e[1;32;40m15.\e[0m\t\e[1;33;40mTechnologies\e[0m\n";

}

# syntaxe TT: tree-tagger [options] <parametres> <textein> <texteout>
