#/usr/bin/perl
<<DOC; 
Marianna Kucharski - Marguerite Leenhardt
 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 et le résultat du filtrage :
<FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>du filtrage</CONTENU></FICHIER>
Ce programme appelle tree-tagger pour étiqueter le contenu filtrer. Il appelle ensuite le programme
Treetagger2xml pour normaliser le résultat de l'étiquetage en fichier xml.
DOC
#-----------------------------------------------------------
my $rep="$ARGV[0]";
$rep=~ s/[\/]$//;
my $DUMPFULL1="";
#----------------------------------------
my $output1="SORTIE_treetagger.xml";
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
#----------------------------------------
&parcoursarborescencefichiers($rep);
#----------------------------------------
print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Marianna Kucharski</NOM>\n";
print FILEOUT "<FILTRAGE>\n".$DUMPFULL1."</FILTRAGE>\n";
print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    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) {
			&parcoursarborescencefichiers($file);
		}
		if (-f $file && $file =~ /0,.*\.xml$/) 
		{
#       TRAITEMENT à réaliser sur chaque fichier
#        Même filtrage que dans la BàO1. On va appeler Tree-tagger dans le programme.
			open(FILEINPUT,$file);
			
			while ($ligne = <FILEINPUT>){
				if ($ligne=~/<title>([^<]+)<\/title>/) {
					$texte_brut=&nettoyage_entites_xml($1);
					
#					1. découper le texte en mots
					 @listesdesmots=split(/[ ,;!?\"\'\.]/, $texte_brut);
#Pour passer le texte à Tree-tagger, il faut faire un prétraitement pour qu'on ait un mot par ligne.
#On utilise donc la fonction split qui découpe une chaîne de caractères selon les délimiteurs qu'on lui donne sous forme d'expression régulière.  
#Ainsi, split va découper le contenu de $texte_brut en mots et ranger ces mots dans la variable tableau @listesdesmots
	 
#					2. Ecrire dans un fichier les mots (1 par ligne)
					open(TMP,">lesmots.txt");
					foreach $elt (@listesdesmots) {
						print TMP "$elt\n";
					}
					close(TMP);
#On ouvre un fichier temporaire "lesmots.txt" en écriture. Dans ce fichier, on écrit chaque mot de la liste sur une ligne. 
#Pour cela, on utilise la fonction foreach qui va parcourir chaque élément de @listesdesmots.

#					3. Etiqueter le fichier
					system("bin/tree-tagger.exe -token -lemma lib/french.par lesmots.txt lesmotsetiquetes.txt");
#A l'aide de la commande system, on peut invoquer un programme sur le sytème d'exploitation sous-jacent.
#Ainsi, on appelle Tree-tagger en indiquant son chemin, et on précise les arguments que Tree-tagger doit prendre en compte. 
#On utilise les options -token -lemma; on appelle la bibliothèque french.par; on lui donne le fichier à étiqueter "lesmots.txt" et le fichier de sortie 
#"lesmotsetiquetes.txt"	
			
#					4. normaliser en XML le resultat de treetagger
					system("perl treetagger2xml.pl lesmotsetiquetes.txt");
#A nouveau à l'aide de la commande system, on appelle le programme treetagger2xml à appliquer sur "lesmotsetiquetes.txt".
#Ce programme va normaliser le résultats d'étiquetage de Tree-tagger en fichier XML. Le fichier de sortie sera "lesmosetiquetes.txt.xml"
					
#					5. concaténer le resultat précédent dans DUMPFULL1
					open(TMP,"lesmotsetiquetes.txt.xml");
					while ($l=<TMP>) {
					    if ($l!~/xml version/) {
						$DUMPFULL1.=$l
						}
					}
					close(TMP);
#Enfin, on concatène chaque ligne du fichier dans DUMPFULL1, à condition que la ligne soit différente de "xml version" pour pas que le fichier xm final soit valide. 
				}
				
#On recommence ci-dessous les mêmes étapes sur le contenu des balises <description>				
				if ($ligne=~/<description>([^<]+)<\/description>/) {
					$texte_brut=&nettoyage_entites_xml($1);
					
#					1. découper le texte en mots
					 @listesdesmots=split(/[ ,;!?\"\'\.]/, $texte_brut);
#					2. Ecrire ds un fichier les mots (1 par ligne)
					open(TMP,">lesmots.txt");
					foreach $elt (@listesdesmots) {
						print TMP "$elt\n";
					}
					close(TMP);
#					3. Etiqueter le fichier
					system("bin/tree-tagger.exe -token -lemma lib/french.par lesmots.txt lesmotsetiquetes.txt");
				
#					4. normaliser en XML le resultat de treetagger
					system("perl treetagger2xml.pl lesmotsetiquetes.txt");
#					5. concaténer le resultat précédent dans DUMPFULL1
					open(TMP,"lesmotsetiquetes.txt.xml");
					while ($l=<TMP>) {
					    if ($l!~/xml version/) {
						$DUMPFULL1.=$l
						}
					}
					close(TMP);
					
				}
			}
			close(FILEINPUT);
			print $i++,"\n";

		}
	}
}
#----------------------------------------------
sub nettoyage_entites_xml{
					$txt_b= shift @_;
					$txt_b=~s/&#38;#39;/\'/g;
					$txt_b=~s/&#38;#34;/\"/g;
					$txt_b=~s/&#233;/é/g;
					$txt_b=~s/&#234;/ê/g;
					return $txt_b;
}