#/usr/bin/perl

#Ce script contient les memes operations que les scripts de la premiere boite a outils, a l'exception que l'on a ajoute ici le traitement d'etiquetage a l'aide de TreeTagger

#On va utilitser une bibliotheque unicode string avec la fonction utf-8. qw: quote word, il extrait l'argument entre parenthese de la chaine
use Unicode::String qw(utf8);
#-----------------------------------------------------------
mkdir(SORTIE);
#-----------------------------------------------------------

# On declare une variable qui prend pour valeur le premier fichier qu'il va traiter
my $rep="$ARGV[0]";
# on s'assure que le nom du repertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# on initialise une variable contenant le flux de sortie; on declare des hash pour enregistrer les titres (1) et les resumes (2) 
my %dictionnairedesitems=();
my %dictionnairesdesrubriques=();
#----------------------------------------
&parcoursarborescencefichierspourrepererlesrubriques($rep);	# on recupere les rubriques...
#----------------------------------------
my @liste_rubriques = keys(%dictionnairesdesrubriques);
foreach my $rub (@liste_rubriques) {
    print $rub,"\n";
    #----------------------------------------
    my $output1="SORTIE/SORTIE-extract-txt-".$rub.".xml";
    my $output2="SORTIE/SORTIE-extract-txt-".$rub.".txt";
    my $output3="SORTIE/SORTIE-extract-txt-".$rub."-treetagger.xml";
    if (!open (FILEOUT1,">:encoding(utf-8)", $output1)) { die "Pb a l'ouverture du fichier $output1"};
    if (!open (FILEOUT2,">:encoding(utf-8)",$output2)) { die "Pb a l'ouverture du fichier $output2"};
    if (!open (FILEOUT3,">:encoding(utf-8)",$output3)) { die "Pb a l'ouverture du fichier $output3"};
    print FILEOUT1 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
    print FILEOUT1 "<PARCOURS>\n";
    print FILEOUT3 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
    print FILEOUT3 "<PARCOURS>\n";
    close(FILEOUT1);
    close(FILEOUT2);
    close(FILEOUT3);
}
#----------------------------------------
&parcoursarborescencefichiers($rep);	# on traite tous les fichiers
#----------------------------------------
foreach my $rub (@liste_rubriques) {
    my $output1="SORTIE/SORTIE-extract-txt-".$rub.".xml";
    my $output3="SORTIE/SORTIE-extract-txt-".$rub."-treetagger.xml";
    if (!open (FILEOUT1,">>:encoding(utf-8)", $output1)) { die "Pb a l'ouverture du fichier $output1"};
    if (!open (FILEOUT3,">>:encoding(utf-8)",$output3)) { die "Pb a l'ouverture du fichier $output3"};
    print FILEOUT1 "</PARCOURS>\n";
    print FILEOUT3 "</PARCOURS>\n";
    close(FILEOUT1);
    close(FILEOUT3);
}
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);	#recurse!
	}
	if (-f $file) {
	    if (($file=~/\.xml$/) && ($file!~/\/fil.+\.xml$/)) {
		open(FILE, $file);
		#print "Traitement de :\n$file\n";
		my $texte="";
		while (my $ligne=<FILE>) {
		    $ligne =~ s/\n//g;
		    $texte .= $ligne;
		}
		close(FILE);
		$texte=~/encoding ?= ?[\'\"]([^\'\"]+)[\'\"]/i;
		my $encodage=$1;
		#print "ENCODAGE : $encodage \n";
		if ($encodage ne "") {
		    print "Extraction dans : $file \n";
		    my $tmptexteXML="<file>\n";
		    $tmptexteXML.="<name>$file</name>\n";
		    my $tmptexteXMLtagger="<file>\n";
		    $tmptexteXMLtagger.="<name>$file</name>\n";
		    $texte =~ s/> *</></g;
		    $texte=~/<pubDate>([^<]+)<\/pubDate>/;
		    $tmptexteXML.="<date>$1</date>\n";
		    $tmptexteXML.="<items>\n";
		    $tmptexteXMLtagger.="<date>$1</date>\n";
		    $tmptexteXMLtagger.="<items>\n";
		    my $tmptexteBRUT="";
		    open(FILE,"<:encoding($encodage)", $file);
		    #print "Traitement de :\n$file\n";
		    $texte="";
		    while (my $ligne=<FILE>) {
			$ligne =~ s/\n//g;
			$texte .= $ligne;
		    }
		    close(FILE);
		    $texte=~s/> *</></g;
		    # on recherche la rubrique
		    $texte=~/<channel><title>([^<]+)<\/title>/;
		    my $rub=$1;
		    $rub=~s/é/e/gi;
		    $rub=~s/è/e/gi;
		    $rub=~s/ê/e/gi;
		    $rub=~s/à/a/gi;
			$rub=~ s/Le *Monde *\. *fr *://gi;
			$rub=~ s/ //g;
			$rub=~ s/s$//;
		    $rub=uc($rub);
		    #print $rub,"\n";
		    #----------------------------------------
		    my $output1="SORTIE/SORTIE-extract-txt-".$rub.".xml";
		    my $output2="SORTIE/SORTIE-extract-txt-".$rub.".txt";
		    my $output3="SORTIE/SORTIE-extract-txt-".$rub."-treetagger.xml";
		    if (!open (FILEOUT1,">>:encoding(utf-8)", $output1)) { die "Pb a l'ouverture du fichier $output1"};
		    if (!open (FILEOUT2,">>:encoding(utf-8)", $output2)) { die "Pb a l'ouverture du fichier $output2"};
		    if (!open (FILEOUT3,">>:encoding(utf-8)", $output3)) { die "Pb a l'ouverture du fichier $output3"};
		    #----------------------------------------
		    my $compteurItem=0;
		    my $compteurEtiquetage=0;
		    while ($texte =~ /<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/g) {
			my $titre=$1;
			my $resume=$2;
			#print "T : $titre \n R : $resume \n";
			if (uc($encodage) ne "UTF-8") {utf8($titre);utf8($resume);}
			$titre = &nettoietexte($1);
			$resume = &nettoietexte($2);
			$compteurItem++;
			if (!(exists($dictionnairedesitems{$resume}))) {
			    $compteurEtiquetage++;
			    print "Etiquetage (num : $compteurEtiquetage)  sur item (num : $compteurItem) \n";
                            my ($titreetiquete,$texteetiquete)=&etiquetageavectreetagger($titre,$resume);
			    $tmptexteBRUT.="§ $titre \n";
			    $tmptexteBRUT.="$resume \n";
			    $tmptexteXML.="<item><title>$titre</title><abstract>$resume</abstract></item>\n";
			    $tmptexteXMLtagger.="<item>\n<title>\n$titreetiquete</title>\n<abstract>\n$texteetiquete</abstract>\n</item>\n";
			    $dictionnairedesitems{$resume}++;
			}
			else {
			    $tmptexteXML.="<item><title>-</title><abstract>-</abstract></item>\n";
			}
		    }
		    $tmptexteXML.="</items>\n</file>\n";
		    $tmptexteXMLtagger.="</items>\n</file>\n";
		    print FILEOUT1 $tmptexteXML;
		    print FILEOUT2 $tmptexteBRUT;
		    print FILEOUT3 $tmptexteXMLtagger;
		    close FILEOUT1;
		    close FILEOUT2;
		    close FILEOUT3;
		}
		else {
		    print "$file ==> $encodage \n";
		}
	    }
	}
    }
}
#----------------------------------------------------
#Le sous-programme de nettoyage du texte
sub nettoietexte {
    my $texte=shift;
    $texte =~ s/&lt;/</g;
    $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;#34;/"/g;
    $texte =~ s/&#233;/é/g;
    $texte =~ s/&#234;/ê/g;
    $texte =~ s/<[^>]+>//g;
    $texte =~ s/&nbsp;/ /g;
    $texte=~s/&#39;/'/g;
    $texte=~s/&#34;/"/g;
    $texte=~s/&amp;#39;/'/g;
    $texte=~s/&amp;#34;/"/g;
    return $texte;
}
#-----------------------------------------------------------------------------------
#On a recours au sous-programme de parcours de l'arborescence des fichiers  qui est le meme pour ce script que pour le script de la boite a outils 1
sub parcoursarborescencefichierspourrepererlesrubriques {
    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) {
	    &parcoursarborescencefichierspourrepererlesrubriques($file);	#recurse!
	}
	if (-f $file) {
	    if (($file=~/\.xml$/) && ($file!~/\/fil.+\.xml$/)) {
		open(FILE,$file);
		#print "Traitement de :\n$file\n";
		my $texte="";
		while (my $ligne=<FILE>) {
		    $ligne =~ s/\n//g;
		    $texte .= $ligne;
		}
		close(FILE);
		$texte=~/encoding ?= ?[\'\"]([^\'\"]+)[\'\"]/i;
		my $encodage=$1;
		if ($encodage ne "") {
		    open(FILE,"<:encoding($encodage)", $file);
		    #print "Traitement de :\n$file\n";
		    $texte="";
		    while (my $ligne=<FILE>) {
			$ligne =~ s/\n//g;
			$texte .= $ligne;
		    }
		    close(FILE);
		    $texte =~ s/> *</></g;
		    if ($texte=~ /<channel><title>([^>]+)<\/title>/) {
			my $rub=$1;
			$rub=~s/é/e/gi;
			$rub=~s/è/e/gi;
			$rub=~s/ê/e/gi;
			$rub=~s/à/a/gi;
			$rub=~ s/Le *Monde *\. *fr *://gi;
			$rub=~ s/ //g;
			$rub=~ s/s$//;
			$rub=uc($rub);
			$dictionnairesdesrubriques{$rub}++;
		    }
		}
		else {
		    #print "$file ==> $encodage \n";
		}
	    }
	}
    }
}

#Le programme TreeTagger est lance en tant que sous-programme pour le texte a traiter. On definit l'encodage des fichiers utf-8; on cree un fichier ou on va stocker les tokens 
sub etiquetageavectreetagger {
    my ($titre,$texte)=@_;
    #----- le titre
    my $codage="utf-8";
    my $tmptag="texteaetiqueter.txt";
    open (TMPFILE,">:encoding(utf-8)", $tmptag);
    print TMPFILE $titre,"\n";
    close(TMPFILE);
	#On fait appel au programme treetagger qui va associer les lemmes et les pos a chaque mot du fichier traite
    system("/usr/local/ActivePerl-5.14/bin/perl tokenise-utf8.pl $tmptag | ./tree-tagger ./french-par-linux-3.2-utf8.bin -lemma -token -no-unknown -sgml > treetagger.txt");
    
    system("/usr/local/ActivePerl-5.14/bin/perl treetagger2xml-utf8.pl treetagger.txt $codage");
    # lecture du resultat tagge en xml :
    open(OUT,"<:encoding(utf-8)","treetagger.txt.xml");
    my $fistline=<OUT>;
    my $titreetiquete="";
    while (my $l=<OUT>) {
	$titreetiquete.=$l;
    }
    close(OUT);
    #----- le resume
    open (TMPFILE,">:encoding(utf-8)", $tmptag);
    print TMPFILE $texte,"\n";
    close(TMPFILE);
    system("/usr/local/ActivePerl-5.14/bin/perl tokenise-utf8.pl $tmptag | ./tree-tagger ./french-par-linux-3.2-utf8.bin -lemma -token -no-unknown -sgml > treetagger.txt");
    system("/usr/local/ActivePerl-5.14/bin/perl treetagger2xml-utf8.pl treetagger.txt $codage");
    # lecture du resultat tagge en xml :
    open(OUT,"<:encoding(utf-8)","treetagger.txt.xml");
    my $fistline=<OUT>;
    my $texteetiquete="";
    while (my $l=<OUT>) {
	$texteetiquete.=$l;
    }
    close(OUT);
    # on renvoie les resultats :
    return ($titreetiquete,$texteetiquete);
}
