#/usr/bin/perl
use utf8;

<<DOC; 
Natalia Kalashnikova
M1 TAL 2018-2019 P3
1er argument - répertoire à parcourir
2ème argument - la rubrique à traiter
DOC
#----------------
#déclaration des variables

my $rep="$ARGV[0]";
my $rub = "$ARGV[1]";
my %jumeaux;

#on vérifie que le nom du répertoire ne se termine pas par "/"
$rep=~ s/[\/]$//;

#création du répertoire de sortie
mkdir "out";
my $out_xml=".\/out\/$rub.xml";
my $out_txt=".\/out\/$rub.txt";
my $tal = ".\/out\/talismane-$rub.txt"

#ouverture des fichiers
open(OUTXML, ">:encoding(utf8)", $out_xml;
if (!open (OUTXML,">:encoding(utf8)",$out_xml)) { die "Je peux pas ouvrir ce fichier - $out_xml"};

open(OUTTXT, ">:encoding(utf8)", $out_txt;
if (!open (OUTTXT,">:encoding(utf8)",$out_txt)) { die "Je peux pas ouvrir ce fichier - $out_txt"};

open(OUTTAL, ">:encoding(utf8)", $tal;
if (!open (OUTTXT,">:encoding(utf8)",$tal)) { die "Je peux pas ouvrir ce fichier - $tal"};
#----------
print OUTXML "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
print OUTXML "<root>\n";
#----------

&recursion($rep);	
#----------------
print OUTXML "</root>";
close(OUTTXT);
close(OUTXML);
close(OUTTAL);
exit;
#-----------------------

#déclaration de la fonction du parcours d'arborescence
sub recursion {
    my $path = shift(@_);
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (@files) {
        #on vérifie que le fichier n'est pas un répertoire caché
        next if $file =~ /^\.\.?$/; 
        $file = $path."/".$file;
        if (-d $file) { 
        #ici on parcourt l'arborescence: mois -> jour
            &recursion($file);
        }
        if (-f $file) { 
        #ici on est au niveau de fichier et on peut procéder au traitement
        #on traite que les fichiers .xml
            if ($file=~/$rub.+\.xml$/) {
                print "$file\n";
                print "#----------------------#";
                open my $input, "<:encoding(utf8)" ,$file;
                my $texte= "";
                while (my $stroka = <$input>) {
                    chomp $stroka; 
                    $stroka =~ s/\r//g;
                    $texte = $texte . $stroka;
                    }
                #on nettoie le texte 
                    $texte =~ s/> +</></g;
                    $texte =~ s/xE([0-9])//g;
                    $texte =~ s/&#38;#39;/'/g;
                    
                my $tal_draft="";

                while ($texte =~ /<item>(<link>(.+?)<\/link>)?<title>(.+?)<\/title>(<link>(.+?)<\/link>)?<description>(.+?)<\/description>/g) {
                    my $titre = $1.".";
                    my $description = $2;
                    $description =~ s/<.+?>//g
                    if (!(exists $jumeaux{$titre})) {
                    #on ajoute le titre dans le dico
                        $jumeaux{$titre}=1;
                    #écriture dans le fichier xml
                        print $out_xml "\t<item>\n";
                        my ($titre4TT,$description4TT) = &tag_tree($titre, $description);
                        print $out_xml "\t\t<titre> $titre4TT </titre>\n";
                        print $out_xml "\t\t<description> $description4TT </description>\n";
                        print $out_xml "\t</item>\n\n";
                        
                    #écriture dans le fichier txt
                        print $out_txt "$titre\n";
                        print $out_txt "$description\n\n";
                    #écriture dans le fichier talismane
                        my $titre4TAL = $titre;
                        my $description4TAL = $description;
                        $titre4TAL =~ s/([.\…\?\!]+)/$1\n\n/g;
                        $description4TAL =~ s/([.\…\?\!]+)/$1\n\n/g;
                        $tal_draft = $tal_draft . $titre4TAL . "\n\n" . $description4TAL . "\n\n";
                    }
                    else {
                        $jumeaux{$titre}++;
                    }
                }
                my $tag4tal = &tag_tal($tal_draft);
				print $tal "$tag4tal";
            }
        }
        }
}

#définition de la fonction de l'étiquetage de treetagger

sub tag_tree {
	my $zagolovok = shift(@_);
	my $opisanie = shift(@_);

	my $zag_rslt;
	my $opis_rslt;

	open (tempo, ">:encoding(utf8)", "output/temp.txt");
	print tempo $zagolovok ;
	close tempo;

	system("perl5.26.3.exe tokenise-utf8.pl -f output/temp.txt | tree-tagger.exe -token -lemma -no-unknown french-utf8.par > output/tag_tmp.txt");
	system("perl5.26.3.exe treetagger2xml-utf8.pl output/tag_tmp.txt UTF-8");
	{
        local $/=undef;
        open(tt_rslt, "<:encoding(utf8)", "output/tag_tmp.txt.xml");
        $zag_rslt = <tt_rslt>;
        close tt_rslt;
        $zag_rslt =~ s/<\?xml.+?>//;
	}

	open (tempo, ">:encoding(utf8)", "output/temp.txt");
	print tempo $opisanie ;
	close tempo;
	system("perl5.26.3.exe tokenise-utf8.pl -f output/temp.txt | tree-tagger.exe -token -lemma -no-unknown french-utf8.par > output/tag_tmp.txt");
	system("perl5.26.3.exe treetagger2xml-utf8.pl output/tag_tmp.txt UTF-8");
	{
        local $/=undef;
        open(tt_rslt, "<:encoding(utf8)", "output/tag_tmp.txt.xml");
        $opis_rslt = <tt_rslt>;
        $opis_rslt =~ s/<\?xml.+?>//;
        close tt_rslt;
	}
    print "$zagolovok\n";
	return $zag_rslt, $opis_rslt;
}
#définition de la fonction de l'étiquetage de talismane

sub tag_tal {
    my $var4tal = shift @_;
    open (tempo, ">:encoding(utf8)", "./output/text4tal.txt" );
    print tempo $var4tal;
    close tempo;
    system ("java -Xmx1G -Dconfig.file=./TALISMANE/talismane-fr-5.0.4.conf -jar ./TALISMANE/talismane-core-5.1.2.jar --analyse --sessionId=fr --encoding=UTF8 --inFile=./output/text4tal.txt --outFile=./output/tal_tagged.txt");
    my $concat;
    {
        local $/=undef;
        open(tal_rslt, "<:encoding(utf8)", "./output/tal_tagged.txt");
        $concat = <tal_rslt>;
        close tal_rslt;
    }
    return $concat;
}