#/usr/bin/perl
<<DOC; 
Votre Nom : Arianna BISAZZA
JANVIER 2005
 usage : perl AB_parcours-ttagger <repertoire-a-parcourir> <fichier-sortie>
 
 Le programme prend en entrée le nom du répertoire contenant les fichiers
 à traiter et le nom du fichier en sortie.
 Le programme construit en sortie un fichier structuré (XML) contenant sur chaque
 ligne le nom du fichier et le résultat de l'étiquetage :
<PARCOURS>
<NOM>mon nom</NOM>
<ETIQUETAGE>
<FICHIER name="fichierSource_1.xml">
contenu de l'étiquetage du 1er fichier
</FICHIER>
<FICHIER name="fichierSource_2.xml">
contenu de l'étiquetage du 2ème fichier
</FICHIER>
...etc.
</ETIQUETAGE>
</PARCOURS>

DOC
#-----------------------------------------------------------
$author="Arianna Bisazza";
$chemin="./treetagger-win32/";

###   "../../COURS-PROJET-ENCADRE/projet-etiquetage-2/treetagger-win32";
###   "/cygdrive/d/MASTER_TAL/PROJET_XML/BoiteAoutils/COURS-PROJET-ENCADRE/projet-etiquetage-2/treetagger-win32";

my $rep="$ARGV[0]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# on initialise une variable contenant le flux de sortie 
my $DUMPFULL="";
#----------------------------------------
# ouverture du fichier sortie (2ème paramètre de la ligne de commande)
my $output1="$ARGV[1]";
if (!open (FILEOUT,">$output1")) { die "Probleme a l'ouverture du fichier $output1"};
#----------------------------------------
# appel du sous-prog parcoursRep
&parcoursRep($rep);	#recurse!
#----------------------------------------
print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>$author</NOM>\n";
print FILEOUT "<ETIQUETAGE>\n".$DUMPFULL."</ETIQUETAGE>\n";
print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
exit;


#----------------------------------------------
# parcoursRep -- procédure qui parcourt un repertoire de façon recursive, à la recherche de fichiers
sub parcoursRep {
	# recupère le nom du chemin à parcourir, passé en paramètre
    my $path = shift(@_);
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (@files) {
	next if $file =~ /^\.\.?$/;
	$file = $path."/".$file;
	if (-d $file) {
	    &parcoursRep($file);	#recurse!
	}
	if ((-f $file) && ($file =~/\.xml$/)) {
#       TRAITEMENT à réaliser sur chaque fichier
#	appel du sous-prog etiqueteur
    &etiqueteur($file);
	print $i++,"\n";
	}
    }
}
#----------------------------------------------
# etiqueteur -- procédure qui FILTRE lez zones textuelles du fils RSS, 
# 		    SEGMENTE le texte en mots et lance TREE-TAGGER sur le texte ainsi obtenu.

sub etiqueteur {
	# recupère le nom du fichier à traiter, passé en paramètre
	my $fichier = shift(@_);
		
	$DUMPFULL.="<FICHIER name=\"$fichier\">\n";
	open(FICH_IN, "$fichier");
		# boucle sur les lignes du fichier ouvert en lecture
		while ($ligne=<FICH_IN>)  {
			# filtrage des zones de texte, 
			# les lignes rencoyant à des liens URL sont excluses
			if (($ligne =~ /\<title\>([^<]+)\<\/title\>/) || ($ligne =~ /\<description\>([^<]+)\<\/description\>/) && ($ligne !~ /http/)) {
			
			# chaque ligne extraite est affectée à la variable $zoneTexte
			$zoneTexte = $1;
			
			$zoneTexte=&nettoyeur($zoneTexte);
						
			# segmentation du texte par la fonction split. Chaque mot est rangé dans un tableau, ce qui donne un tableau de scalaires:  @texteTab
			@textTab = split (/[ ,;!?\"\'\.:]/,$zoneTexte);
			
			# ouverture d'un fichier temporaire
			open(FileTemp, ">toto.tmp");
			# dans lequel on écrit sur chaque ligne un mot (ou mieux un élément du tableau @texteTab)
			foreach $elmt (@textTab) {
				print FileTemp $elmt,"\n";
				}  # fin boucle sur le tableau @texteTab 
			close(FileTemp);
			
			# maintenant on peut lancer treetagger sur le fichier créé
			system("$chemin/bin/tree-tagger.exe -token -lemma -no-unknown $chemin/lib/french.par toto.tmp toto.out");
			
			# on lance le script perl treetagger2xml qui transforme la sortie de treetagger en un fichier xml
			system("perl ttagger2xml.pl toto.out");
			
			# ouverture du fichier ainsi obtenu en lecture
			open (FileTemp, "toto.out.xml");
			
			# concaténation de la ligne étiquetée à la variable contenant le flux de sortie (DUMPFULL)
			while ($lig=<FileTemp>){
				# attention à ne pas prendre l'entête xml, qui est déja dans notre fichier
				if ($lig !~ /xml version/){
				$DUMPFULL.="$lig";
				}
			}
		}
		}# fin boucle sur les lignes
	
	$DUMPFULL.="</FICHIER>\n";
	close(FICH_IN);
}

#----------------------------------------------
# nettoyeur -- procédure qui REMPLACE les caractères spéciaux

sub nettoyeur {
	# recupère le nom du fichier à traiter, passé en paramètre
	my $ligne = shift(@_);
	# nettoyage des caractères spéciaux (ligne par ligne)
			$ligne =~ s/&#38;#39;/\'/g;
			$ligne =~ s/&#233;/é/g;
			$ligne =~ s/&#234;/ê/g;
			$ligne =~ s/&#38;#34;/\"/g;
	return $ligne;
}
			