#/usr/bin/perl
use XML::XPath; #on signale que l'on va utiliser la bibliothèque XML::XPath
use XML::Entities; #on signale que l'on va utiliser la bibliothèque XML::Entities

<<DOC; 
Votre Nom : Roxane Anquetil et Marine Damiani
Mai 2010
 usage : perl des_fils_au_graph 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)
 - un fichier contenant une liste de patrons extrait du corpus (selon le fichier de patrons donné par l'utilisateur)
 - un graph obtenu à l'aide de patron2graph.exe
DOC
#-----------------------------------------------------------
#on entre dans le programme principal
use XML::RSS; #on signale que l'on va utiliser la bibliothèque XML::RSS
use XML::Entities; #on signale que l'on va utiliser la bibliothèque XML::Entities
#on enregistre le répertoire donné en entrée
my $rep="$ARGV[0]";
# on s'assure que le nom du répertoire ne se termine pas par un "/" si ça se termine par / on remplace par rien
$rep=~ s/[\/]$//;
#on demande à l'utilisateur de donner le fichier de patrons et le motif
print "Quel est le fichier qui contient les patrons à extraire?\n";
my $patterns_file=<STDIN>;
print "Quel est le fichier qui contient les motifs à afficher sous forme de graphe?\n";
my $motif=<STDIN>;
#on crée une variable qui contiendra le texte venant des fils
my $TEXTEDUFIL="";
#----------------------------------------
#on ouvre le fichier de sortie au format xml
my $sortie="corpus.xml";
if (!open (SORTIE,">$sortie")) { die "Pb a l'ouverture du fichier $sortie"};
#on ouvre le fichier de sortie au format texte
my $sortie2="corpus.txt";
if (!open (OUT,">$sortie2")) { die "Pb a l'ouverture du fichier $sortie"};

#on lance le sous programme qui parcourt l'arborescence et extrait le contenu des fils
#----------------------------------------------
&parcoursarborescencefichiers($rep);	# on appelle le sous programme
#----------------------------------------
#on crée les balises pour notre fichier XML de sortie
#le contenu du filtage contenu dans la variable $TEXTEDUFIL sera intégré dans la balise <FILTRAGE>
print SORTIE "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
print SORTIE "<PARCOURS>\n";
print SORTIE "<NOM>Marine et Roxane</NOM>\n";
print SORTIE "<FILTRAGE>".$TEXTEDUFIL."</FILTRAGE>\n";
print SORTIE "</PARCOURS>";
close(SORTIE);
#on va remplir le fichier de sortie au format texte avec le contenu de la variable TEXTE
print OUT "$TEXTE";
close(OUT);
#on lance le sous programme qui va découper notre sortie texte
#pour la suite du traitement les fichiers texte brut ne doivent pas dépasser 10 ko
#-----------------------------------------
&decoupage;
#----------------------------------------
#on affiche la liste des petits fichiers texte (moins de 10 ko) qui ont été créés à partir de notre corpus.txt
print @fic_tree;
#on initialise un compteur pour numéroter les fichiers étiquetés
my $e=0;
#pour chaque petit fichier
foreach my $tree (@fic_tree){

#début étiquetage
system("perl treetagger-win32/cmd/tokenise-fr.pl $tree > fichier-a-etiqueter-unmotparligne.txt");
#une fois utilisé on supprime le petit fichier texte
unlink("$tree");
system("tree-tagger.exe treetagger-win32/lib/french.par -lemma -token -sgml fichier-a-etiqueter-unmotparligne.txt > resultat-etiquetage$e.txt");
unlink("fichier-a-etiqueter-unmotparligne.txt");
system("perl treetagger-win32/cmd/treetagger2xml.pl resultat-etiquetage$e.txt");
unlink("resultat-etiquetage$e.txt");
#on ouvre le fichier que l'on vient d'étiqueter
open(FIC, "resultat-etiquetage$e.txt");
#on lance le script qui extrait les patrons à l'aide de la bibliothèque XML::XPath
#on lui donne en argument le fichier que l'on vient d'étiqueter et le fichier de patrons donné par l'utilisateur
#ce script va créer un fichier res_extract.txt contenant tous les patrons extraits
system("perl bao3_rb.pl resultat-etiquetage$e.txt.xml $patterns_file");
#on ferme ensuite le fichier que l'on vient d'étiqueter
close(FIC);
#on supprime le fichier que l'on vient d'étiqueter avant de passer au suivant
unlink("resultat-etiquetage$e.txt.xml");
#on incrémente le compteur et on passe au tour de boucle suivant
$e++;
}
#dernière étape, on lance patron2graph sur le résultat de l'extraction avec le motif donné par l'utilisateur
system "./patron2graphe.exe ISO-8859-1 res_extract.txt $motif";
#on sort du programme
exit;
#----------------------------------------------
#on entre dans le sous programme
sub parcoursarborescencefichiers {
    my $path = shift(@_); # $path récupère la première valeur du tableau
    opendir(DIR, $path) or die "can't open $path: $!\n"; # on ouvre le répertoire appelé par le nom DIR, sinon un messsage d'erreur s'affiche
    my @files = readdir(DIR); # on stocke le contenu du répertoire dans le tableau @files
    closedir(DIR); #on ferme le répertoire
    foreach my $file (@files) {
	# pour chaque fichier ou répertoire présent dans le tableau @files on effctue les instructions suivantes:
	next if $file =~ /^\.\.?$/; # on veut ignorer les fichiers commençant par un .
	$file = $path."/".$file; # on récupère le chemin d'accès complet au fichier
	if (-d $file) { # avec l'option -d on vérifie que file est un répertoire, il faut donc à nouveau fouiller ce répertoire
	    &parcoursarborescencefichiers($file);	#on relance le sous programme sur $file
	}
	if (-f $file) { # l'option -f vérifie que file est un fichier
	
	if ($file=~/0,2-3210,1-0,0\.xml/) { # on ne garde dans l'arborescence que les fichier 0,2-3208,1-0,0.xml, rubrique internationale
		my $rss = XML::RSS->new; # crée variable $rss qui utilisera la méthode XML::RSS
		#-----------------------------------------------------------
		$TEXTEDUFIL.="<nom_fichier>$file</nom_fichier>\n";
		#print $TEXTEDUFIL;		
		#-----------------------------------------------------------
		$rss->parsefile($file);
		my $nombredechampdescription=0;
#la méthode XML::RSS permet de travailler sur chaque item des fils
		foreach my $item (@{$rss->{'items'}}) {
			$nombredechampdescription++;
	#le TEXTEDUFIL 
			$TEXTEDUFIL.="<article_nb>$nombredechampdescription</article_nb>\n";
			my $description=$item->{'description'};
			$description=~s/<[^>]+>//g;	
#XML::Entities permer de décoder les entités (et donc d'éviter d'avoir à filter à l'aide de REGEX)
			XML::Entities::decode('all', $description);
#on supprime Retrouvez...
			$description=~s/Retrouvez *l.*ensemble *des//g;
#enregistremet de $description dans les variables
#$TEXTEDUFIL va servir pour la sortie XML
			$TEXTEDUFIL.=$description."\n";
#$TEXTE va servir pour la sortie texte
			$TEXTE.="".$description."\n";
#pour la sortie texte on normalise la casse 
#pour que dans notre corpus on puisse analyser 
#les patrons syntaxique sans distinction de casse
			$TEXTE=~ tr /A-Z/a-z/ ;
#de la même manière pour uniformiser le corpus
#on supprime les accents
			$TEXTE=~ tr /àéèëçù/aeeecu/ ;			
			
		}
		}
#----------------------------------------------------------
			}
			}
}
#----------------------------------------------
#début du sous programme découpeur
sub decoupage{
#on ouvre le corpus complet au format texte (avec casse normalisée et accents supprimés)
open (TEXTE,"corpus.txt");
#on crée des compteurs
#$p compte le nombre de lignes dans notre corpus
my $p=0;
#$c permet de savoir à partir de quelle ligne on coupe le corpus
my $c=1;
#$d permet de savoir jusqu'à quelle ligne on coupe le corpus
my $d=50;
#
#tant qu'il y a des lignes dans le corpus
while ($ligne = <TEXTE>) {
#on incrémente le compteur de lignes
$p++;
}
#ici on calcule en combien de parties de 50 lignes (pour avoir un peu moins de 10Ko) on va devoir couper le fichier
#si $p est impair
$div=($p % 2);
if ($div == 1)
{
#on prend le resultat de la division entière
#et pajoute 1 car perl tronque les nombre à virgule
$nb=int($p/50)+1;
}
#si $p est pair
#on divise simplement par 50
else { $nb=($p/50);}
#on ferme le corpus
close (TEXTE);
#$fois va compter le nombre d'itération de 0
#jusqu'au nombre de parties à créer ($nb)
for($fois=0;$fois<$nb;$fois++){
#on ouvre le corpus
open (TEXTE,"corpus.txt");
#on initialise le nom du petit fichier à créer
my $sortie="sortie$fois.txt";
#on ouvre le petit fichier 
if (!open (RESU,">$sortie")) { die "Pb a l'ouverture du fichier $sortie"};
#le début de la découpe commence à $c et se fini à $d
my($first,$last) = ($c,$d);
#on utilse le flip flop (..) en comparaison sur la ligne courant $.
#pour plus d'info sur cette ligne: http://articles.mongueurs.net/magazines/perles/perles-07.html
$.==$first .. $.==$last and print RESU while <TEXTE> ;
#on incrémente $c et $d de 50 avant de passer au tour de boucle suivant
$c=($c+50);
$d=($d+50);
#on ferme le fichier, indispensable entre chaque tout de boucle pour que le while <TEXTE> fonctionne
close (TEXTE);
#on incrémente un liste de tous les petits fichiers créés
#cette liste servira dans la suite du programme principal pour connaître la liste des fichiers à étiqueter
@fic_tree=(@fic_tree,$sortie);
}
}

