#/usr/bin/perl-w
use Unicode::String qw(utf8);

use utf8;   
use Unicode::Normalize;
use Encode;
#-----------------------------------------------------------
my $rep="$ARGV[0]";

$rep=~ s/[\/]$//;


my %dicoItems=();
my %dicoRubriques=();
#----------------------------------------
&parcoursRubriques($rep);	
#----------------------------------------
my @liste_rubriques = keys(%dicoRubriques);
foreach my $rub (@liste_rubriques) {
    print $rub,"\n";
    #----------------------------------------
    my $output1="SORTIE/SORTIE-regex-txt-".$rub.".xml";
    print "$output1\n";
    my $output2="SORTIE/SORTIE-regex-txt-".$rub.".txt";
    my $output3="SORTIE/SORTIE-regex-txt-".$rub."-treetagger.xml";
    if (!open (FILEOUT1,">:encoding(utf-8)", $output1)) { die "Pb a l'ouverture du fichier $output1"};
    if (!open (FILEOUT2,">:encoding(iso-8859-15)",$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);
}
#----------------------------------------
&parcoursFichiers($rep);	# on traite tous les fichiers
#----------------------------------------
foreach my $rub (@liste_rubriques) {
    my $output1="SORTIE/SORTIE-regex-txt-".$rub.".xml";
    my $output3="SORTIE/SORTIE-regex-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 parcoursFichiers {
    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) {
	    &parcoursFichiers($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;
		    $texte=~/<channel><title>([^<]+)<\/title>/;
		    my $rub=$1;
			$rub=~s/: *Toute *l *.*\. *//gi;#* permet de definir une lettre qui est suivie de n'importe quel caractère . et se termine par un point
			$rub=~ s/Le *Monde *\. *fr *: *//gi;
			$rub=~s/- *LeMonde *\. *fr *//gi;
			$rub=NFD($rub);# Unicode normalization Form D (NFD), canonical decomposition.
			$rub=~ s/ //g;
			$rub =~ s/[^[:ascii:]]//g; # Remove all non-ascii.
			$rub =~ s/ [,-] /_/g; # Replace all " - " with "_"
			$rub =~ s/[^A-Za-z0-9]/_/g;## Replace all non-alphanumericals with _
			#$rub=~ s/ //g;
			
			$rub=lc($rub);
		    #print $rub,"\n";
		    #----------------------------------------
		    my $output1="SORTIE/SORTIE-regex-txt-".$rub.".xml";
		    my $output2="SORTIE/SORTIE-regex-txt-".$rub.".txt";
		    my $output3="SORTIE/SORTIE-regex-txt-".$rub."-treetagger.xml";
		    if (!open (FILEOUT1,">>:encoding(utf-8)", $output1)) { die "Pb a l'ouverture du fichier $output1"};
		    if (!open (FILEOUT2,">>:encoding(iso-8859-15)", $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($dicoItems{$resume}))) {
			    $compteurEtiquetage++;
			    print "Etiquetage (num : $compteurEtiquetage)  sur item (num : $compteurItem) \n";
                my ($titreetiquete,$texteetiquete)=&etiquetageavectreetagger($titre,$resume);
			    $tmptexteBRUT.="Titre : $titre \n";
			    $tmptexteBRUT.="Resume : $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";
			    $dicoItems{$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";
		}
	    }
	}
    }
}
#----------------------------------------------------
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/<[^>]+>//g;
	$texte=~ s/&nbsp;&nbsp;//g;
	$texte =~ s/&#39;/'/g;
	$texte=~ s/&#39;&#34;/'/g;
	$texte=~s/&#34;/''/g;
	$texte=~ s/\R//;

    return $texte;
}
#-----------------------------------------------------------------------------------
sub parcoursRubriques {
    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) {
	    &parcoursRubriques($file);	
	}
	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/: *Toute *l *.*\. *//gi;#* permet de definir une lettre qui est suivie de n'importe quel caractère . et se termine par un point
			$rub=~ s/Le *Monde *\. *fr *: *//gi;
			$rub=~s/- *LeMonde *\. *fr *//gi;
			$rub=NFD($rub);# Unicode normalization Form D (NFD), canonical decomposition.
			$rub=~ s/ //g;
			$rub =~ s/[^[:ascii:]]//g; # Remove all non-ascii.
			$rub =~ s/ [,-] /_/g; # Replace all " - " with "_"
			$rub =~ s/[^A-Za-z0-9]/_/g;## Replace all non-alphanumericals with _
			#$rub=~ s/ //g;
			
			$rub=lc($rub);
			$dicoRubriques{$rub}++;
		    }
		}
		else {
		}
	    }
	}
    }
}
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);
    system("perl ./treetagger/cmd/tokenise-utf8.pl $tmptag | ./treetagger/bin/tree-tagger ./treetagger/lib/french-utf8.par -lemma -token -no-unknown -sgml > treetagger.txt");
    
    system("perl ./treetagger/cmd/treetagger2xml-utf8.pl treetagger.txt $codage ");

    open(OUT,"<:encoding(utf-8)","treetagger.txt.xml");
    my $fistline=<OUT>;
    my $titreetiquete="";
    while (my $l=<OUT>) {
	$titreetiquete.=$l;
    }
    close(OUT);
    open (TMPFILE,">:encoding(utf-8)", $tmptag);
    print TMPFILE $texte,"\n";
    close(TMPFILE);
     system("perl ./treetagger/cmd/tokenise-utf8.pl $tmptag | ./treetagger/bin/tree-tagger ./treetagger/lib/french-utf8.par -lemma -token -no-unknown -sgml > treetagger.txt");
    system("perl ./treetagger/cmd/treetagger2xml-utf8.pl treetagger.txt $codage");

    open(OUT,"<:encoding(utf-8)","treetagger.txt.xml");
    my $fistline=<OUT>;
    my $texteetiquete="";
    while (my $l=<OUT>) {
	$texteetiquete.=$l;
    }
    close(OUT);
    return ($titreetiquete,$texteetiquete);
}
