#!/usr/bin/perl
#charger le module unicode
use Unicode::String qw(utf8);
#-----------------------------------------------------------
#recuperer le nom du repertoire racine du corpus
my $rep="$ARGV[0]";
#s'assurer que le nom du répertoire ne se termine pas par un "/"
$rep=~s/[\/]$//;
#initialiser une variable contenant le flux de sortie
my %dicoTitre=();
my %dicoResume=();
my %dictionnairesdesrubriques=();
#----------------------------------------
#recuperer les rubriques
&parcoursarborescencefichierspourrepererlesrubriques($rep);
#----------------------------------------
my @liste_rubriques = keys(%dictionnairesdesrubriques);
foreach my $rub (@liste_rubriques) {
    print $rub,"\n";
    #----------------------------------------
    my $output1="SORTIE-".$rub.".xml";
    my $output2="SORTIE-".$rub.".txt";
	my $output3="SORTIE-".$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"};
    #formater la sortie pour creer un fichier xml avec entete
    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);
}
#----------------------------------------
#traiter les fichiers du fils RSS
&parcoursarborescencefichiers($rep);
#----------------------------------------
foreach my $rub (@liste_rubriques) {
    my $output1="SORTIE-".$rub.".xml";
	my $output3="SORTIE-".$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);
    #parcourir la liste des elements pour connaitre le contenu du repertoire
    foreach my $file (@files) {
		#si le nom du fichier est equivalent a "." ou ".." passer au suivant dans le traitement de la liste
		next if $file=~ /^\.\.?$/;
		#reconstruire le chemin
		$file=$path."/".$file;
		#lancer de nouveau la procedure a chaque fois qu'on trouve un repertoire
		if (-d $file) {
			&parcoursarborescencefichiers($file);
		}
		#si $file est un fichier (sinon on ne rentre pas dans la boucle)
		if (-f $file) {
			########TRAITEMENT à réaliser sur chaque fichier#########
			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;
					$ligne=~s/\r//g;
					$texte.=$ligne;
				}
				close(FILE);
				#rechercher la balise encoding
				$texte=~/encoding ?= ?[\'\"]([^\'\"]+)[\'\"]/i;
				my $encodage=$1;
				print "ENCODAGE : $encodage \n";
				if ($encodage ne "") {
					#formater la sortie
					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;
						$ligne=~s/\r//g;
						$texte.=$ligne;
					}
					close(FILE);
					$texte=~s/> *</></g;
					#rechercher 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$//g;
					$rub=~s/-LEMONDE.FR//gi;
					$rub=uc($rub);
					print $rub,"\n";
					#----------------------------------------
					my $output1="SORTIE-".$rub.".xml";
					my $output2="SORTIE-".$rub.".txt";
					my $output3="SORTIE-".$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;
					#extraire le contenu des balises title et description (titre et resume)
					while ($texte=~ /<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/g) {
						my $titre=$1;
						my $resume=$2;
						print "T : $titre \nR : $resume \n";
						#nettoyer le contenu des balises title et description
						$titre=&nettoietexte($titre);
						$resume=&nettoietexte($resume);
						#eviter les doublons
						if ((!(exists $dicoTitre{$titre})) && (!(exists $dicoResume{$resume}))){
							#si l'encodage n'est pas utf8 faire un transcodage
							if (uc($encodage) ne "UTF-8") {utf8($titre);utf8($resume);}
							$compteurItem++;
							$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";
							$dicoTitre{$titre}++;
							$dicoResume{$resume}++;
						}
						else {
							$dicoTitre{$titre}++;
							$dicoResume{$resume}++;
						}
					}
					#fermeture des balises item et file
					$tmptexteXML.="</items>\n</file>\n";
					$tmptexteXMLtagger.="</items>\n</file>\n";
					#regler le probleme du point en fin de ligne
					$tmptexteBRUT=~s/(\.?)\s*\n/.\n/g;
					print FILEOUT1 $tmptexteXML;
					print FILEOUT2 $tmptexteBRUT;
					print FILEOUT3 $tmptexteXMLtagger;
					close(FILEOUT1);
					close(FILEOUT2);
					close(FILEOUT3);
				}
				else {
					print "$file ==> $encodage \n";
				}
			}
		}
    }
}
#----------------------------------------------------
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;
	$texte=~s/&amp;/ et /g;
	$texte=~s/&#039;/'/g;	
	$texte=~s/&/et/g;
    return $texte;
}
#-----------------------------------------------------------------------------------
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) {
		#si le nom du fichier est equivalent a "." ou ".." passer au suivant dans le traitement de la liste
		next if $file=~ /^\.\.?$/;
		#reconstruire le chemin
		$file=$path."/".$file;
		#lancer de nouveau la procedure a chaque fois qu'on trouve un repertoire
		if (-d $file) {
			&parcoursarborescencefichierspourrepererlesrubriques($file);
		}
		#si $file est un fichier (sinon on ne rentre pas dans la boucle)
		if (-f $file) {
			########TRAITEMENT à réaliser sur chaque fichier#########
			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;
					$ligne=~s/\r//g;
					$texte.=$ligne;
				}
				close(FILE);
				#rechercher la balise encoding
				$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;
						$ligne=~s/\r//g;
						$texte.=$ligne;
					}
					close(FILE);
					$texte=~s/> *</></g;
					#rechercher la rubrique
					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$//g;
						$rub=~s/-LEMONDE.FR//gi;
						$rub=uc($rub);
						$dictionnairesdesrubriques{$rub}++;
					}
				}
				else {
					print "$file ==> $encodage \n";
				}
			}
		}
	}
}
#----------------------------------------------
sub etiquetageavectreetagger {
    my ($titre,$texte)=@_;
    ########traitement du titre########
    my $codage="utf-8";
    my $tmptag="texteaetiqueter.txt";
	open (TMPFILE,">:encoding(utf-8)", $tmptag);
    print TMPFILE $titre,"\n";
    close(TMPFILE);
	#segmenter et etiqueter tmptag
    system("perl ./treetagger-win32/cmd/tokenise-fr.pl $tmptag | tree-tagger.exe ./treetagger-win32/lib/french-utf8.par -lemma -token -no-unknown -sgml > treetagger.txt");
    #formater la sortie de treetagger pour avoir un fichier XML
	system("perl ./treetagger-win32/cmd/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);
    ########traitement du resume########
    open (TMPFILE,">:encoding(utf-8)", $tmptag);
    print TMPFILE $texte,"\n";
    close(TMPFILE);
	#segmenter et etiqueter tmptag
    system("perl ./treetagger/treetagger-win32/cmd/tokenise-fr.pl $fichier.txt | tree-tagger.exe ./treetagger-win32/lib/french-utf8.par -lemma -token -no-unknown -sgml > treetagger.txt");
    #formater la sortie de treetagger pour avoir un fichier XML
	system("perl ./treetagger-win32/cmd/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);
    return ($titreetiquete,$texteetiquete);
}