#/usr/bin/perl -w
<<DOC; 
Votre Nom : Pantikina
Avril 2006
 usage : perl SORTIE_etiquetage.pl arbo-fils
 Le programme prend en entrée le nom du répertoire contenant les fichiers
 à traiter (arbo-fils)
 Le programme construit en sortie un fichier structuré contenant sur chaque
 ligne le nom du fichier et le résultat de l'étiquetage :
<FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>étiquetage et mise en forme xml</CONTENU></FICHIER>
DOC
#-----------------------------------------------------------
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=déclare la variable. Pour le moment le contenu de DUMPFULL correspond à des fichiers séparés (du rép. arb-fils)
my $DUMPFULL1="";
#----------------------------------------
my $output1 = "SORTIE_etiquetage.xml";
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};

my $desc = "tag.txt";
my $outtagger = "tag.tt";

#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse!
&etiq;
&xml;
#----------------------------------------
print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Névéna Pantikina</NOM>\n";
print FILEOUT "<ETIQUETAGE>\n";
print FILEOUT "$DUMPFULL1\n";
print FILEOUT "</ETIQUETAGE>\n";
print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
exit;
#----------------------------------------------
# parcourt l'arborescence des répertoires, détecte fichiers xml, récupère description, transforme, segmente : 1 mot par ligne, imprime dans un fichier intermédiaire :
#   <!nom_fichier>
#   mot
#   mot
#   ...
#   <!nom_fichier>
#   mot
#   mot
#   ...

sub parcoursarborescencefichiers {
    my $path = shift(@_);
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
#    warn " == > @files\n";
    closedir(DIR);

    my $i = 0; #on annonce le compteur des fichiers du répertoire

    # on ouvre en écriture le fichier tag.txt. On va y stocker les résultats après étiquetage avec Tree-tagger
    open (OUTTAG,">$desc");

    foreach my $file (@files) {
	next if $file =~ /^\.\.?$/;
	$file = $path."/".$file;
#	warn "==> $file\n";
	if (-d $file) {
	    &parcoursarborescencefichiers($file);	#recurse!
	}
	if (-f $file) {
#	    warn "==> $file\n";
	    open(F,$file);
	    while($ligne=<F>) {
#		warn "==> $ligne\n";
		if($ligne=~/<description>(.+)<\/description>/) {
#remplacement des caractères mal codés. Noter que certaines lettres ont deux représentations (provenant de fichiers au codage différent) et nécessitent deux expressions de substitution
		    $temp=$1;
		    $temp=~ s/&\#38;\#39;/\'/g;
		    $temp=~ s/&\#38;\#34;/\"/g;
		    $temp=~s/&\#233;/é/g;
		    $temp=~s/Ã©/é/g;
		    $temp=~s/&\#234;/ê/g;
		    $temp=~s/Ãª/ê/g;
		    $temp=~s/Ã¨/è/g;
		    $temp=~s/Ã/à/g;
		    $temp=~s/Ã§/ç/g;
		    $temp=~s/à§/ç/g;
		    $temp=~s/Ã´/ô/g;
		    $temp=~s/\"//g;
#----------------------------------------------------------------------		
#Formatage du fichier en entrée "un mot par ligne" en vue de l'étiquetage par Tree-tagger et nettoyage supplémentaire
#----------------------------------------------------------------------
		    $temp=~s/[ ,\.;:\?!\'-]/\n/g;
		    $temp=~s/\/\/www//g;
# supprimer les lignes vides = si une ligne commence par un ou plusieurs espaces, ne contient que des espaces jusqu’à la fin de ligne, supprime-là			
		    $temp=~s/^\s$//g; 

#écrire dans OUTTAG les résultats du traitement sur les contenus $1 (stockés dans $temp)
		    print OUTTAG "<! $file>\n"; 
		    print OUTTAG "$temp\n"; 
		}
	    }
	}
    }
    close (OUTTAG);
}
#-----------------------------------------------
# ouverture, lecture fichier intermédiaire
#  étiquetage
#  impression dans un autre fichier

sub etiq {
#appeler le programme treetagger. Pour chaque fichier stocké temporairemet dans tag.txt il va effectuer l'étiquetage et écrire les résultats dans la variable $outtagger, c'est à dire, dans des fichiers resultat_taggage1 à 50.txt
	$ENV{'PATH'} = "./bin;";
  
    system("set $ENV{'PATH'}");
    system("./bin/tree-tagger.exe ./lib/french.par -token -lemma -sgml -no-unknown $desc > $outtagger");
    }
#---------------------------------
# transformation en xml
sub xml {
    open (TAG, "$outtagger") || die "impossible d'ouvrir le fichier $outtagger";
    while (<TAG>) {
	chop ($_);
#-----------------------------------------------------------------------
#ouvrir les fichiers sortie après l'étiquetage, les parcourir ligne par ligne et effectuer les modifications indiquées dans l'expression régulière
	$_ =~ s/\"/<![CDATA[\"]]>/g; #évite erreur d'interprétation XML 
	$_ =~ s/([^\t]*)\t([^\t]*)\t(.*)/\n<element>\n <data type=\"type\">$2<\/data>\n <data type=\"lemma\">$3<\/data>\n <data type=\"string\">$1<\/data>\n<\/element>\n/g;
	
	$DUMPFULL1 .= $_;
#	warn "$DUMPFULL1\n",
    }

    close(TAG);
}
