#!/usr/bin/perl
use utf8;
use strict;
binmode(STDOUT, ":encoding(UTF-8)");

# Utilisation du programme :
# perl bao2.pl fichier_fil_rss numero_rubrique
# exemple : perl bao2.pl 2021 3246

# -------------------------------------------------------------------------------

# RECUPERATION DES ARGUMENTS DONNES AU PROGRAMME
my $rep = "$ARGV[0]"; # nom de l'arborescence (2021)
my $RUBRIQUE = "$ARGV[1]"; # numéro de la rubrique à traiter (3246)
$rep=~ s/[\/]$//; # on s'assure que le nom du répertoire ne se termine par par un "/"

# OUVERTURE DES FICHIERS
open my $output_txt, ">:encoding(UTF-8)", "bao2_corpus_pl.txt"; # fichier txt avant annotation
open my $output_xml, ">:encoding(UTF-8)", "bao2_pre_corpus_pl.xml"; # fichier xml avant annotation

# ECRITURE DANS LES FICHIERS ET EXECUTION DU PROGRAMME DE LA BAO1
print $output_xml "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus>\n"; # déclaration xml
my %titres = ();
&parcoursarborescencefichiers($rep); # exécution du programme
print $output_xml "</corpus>\n";

# FERMETURE DES FICHIERS
close $output_txt;
close $output_xml;

# ETIQUETAGE
&etiquetageUP; # annotation du txt avec udpipe
&etiquetageTT; # annotation du xml avec treetagger

exit;

# -------------------------------------------------------------------------------

sub etiquetageUP{ # étiquetage avec udpipe, résultat = fichier CONLL
    system("../Programmes/udpipe/udpipe-1.2.0-bin/bin-win64/udpipe.exe --tokenize --tag --parse --tokenizer=presegmented ../Programmes/udpipe/modeles/french-sequoia-ud-2.5-191206.udpipe bao2_corpus_pl.txt > bao2_UD_pl_$RUBRIQUE.udpipe");
}

sub etiquetageTT{ # étiquetage avec treetagger, résultat = fichier XML
    system("../Programmes/treetagger/tree-tagger.exe -lemma -token -no-unknown -sgml ../Programmes/treetagger/french-utf8.par bao2_pre_corpus_pl.xml > bao2_TT_pl_$RUBRIQUE");
    system("perl ../Programmes/treetagger/treetagger2xml-utf8.pl bao2_TT_pl_$RUBRIQUE UTF-8"); # transformation du résultat en xml
}

sub parcoursarborescencefichiers {
    my $path = shift(@_); # @_ contient les arguments de la fonction, ici le répertoire 2021
    opendir(DIR, $path) or die "can't open $path: $!\n"; # ouverture du répertoire
    my @files = readdir(DIR); # liste contenant les fichiers dans le répertoire
    closedir(DIR);
    foreach my $file (@files) { # pour chaque élément contenu dans le répertoire
        next if $file =~ /^\.\.?$/; # ne rien faire si c'est un fichier caché
        $file = $path."/".$file; # concaténation pour obtenir le chemin du fichier
        if (-d $file) { # si le fichier est un dossier
            print "On entre dans le REPERTOIRE : $file \n";
            &parcoursarborescencefichiers($file); # on relance la fonction avec ce dossier
            print "On sort du REPERTOIRE :  $file \n";
        }
        if (-f $file) { # si le fichier est un fichier
            if ($file =~ /$RUBRIQUE.+\.xml$/) { # si c'est un document xml
                print "Traitement du fichier $file\n";
                open my $input, "<:encoding(UTF-8)",$file; # ouverture du fichier
                undef $/; # $/ contient \n par défaut, on supprime pour lire le fichier d'une traite
                my $ligne=<$input>; # récupération du contenu du fichier
                close($input);
                while($ligne=~/<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) { # recherche des éléments "titre" et "description"
                    my $titre = $1; # récupération du titre
					my $description = $2; # récupération de la description
                    if (!(exists $titres{$titre})) { # si le programme n'est pas encore passé par un article ayant ce titre
                        $titres{$titre} = $description ; # on l'ajoute dans un dictionnaire
                        $titre=&nettoyage($titre); # on enlève les éléments xml inutiles
                        $description=&nettoyage($description);
                        print $output_txt "$titre\n$description\n"; # écriture dans le fichier txt
                        my ($titreseg, $descriptionseg) = &segmentationTD($titre, $description); # segmentation pour préparer le texte au programme de treetagger
                        print $output_xml "<item><titre>\n$titreseg\n</titre><description>\n$descriptionseg\n</description></item>\n"; # écriture dans le fichier xml
                    }
                }
            }
        }
    }
}


sub nettoyage { # formatage des éléments "titre" et "description" trouvés dans chaque fichier
	my $texte=shift @_;
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g; # nettoyage des éléments xml inutiles
	$texte.="."; # pour rajouter un point à la fin
	$texte=~s/\.+$/\./; # pour ne garder qu'un seul point en fin de ligne
	return $texte;
}

sub segmentationTD{
    my ($arg1, $arg2) = @_;
    # écriture des données textuelles dans un fichier toto
    open my $tmp, ">:encoding(UTF-8)", "toto.txt";
    print $tmp $arg1;
    close $tmp;
    # puis tokeniser toto avec le programme tokenise
    system("perl -f ../Programmes/treetagger/tokenise-utf8.pl toto.txt > toto2.txt");
    # puis récupérer les données
    undef $/; # pour lire le fichier en une seule fois
    open my $tmp2, "<:encoding(UTF-8)", "toto2.txt";
    my $titreseg = <$tmp2>;
    close $tmp2;
    # on refait pareil pour la description
    open my $tmp, ">:encoding(UTF-8)", "toto.txt";
    print $tmp $arg2;
    close $tmp;
    system("perl -f ../Programmes/treetagger/tokenise-utf8.pl toto.txt > toto2.txt");
    undef $/; 
    open my $tmp2, "<:encoding(UTF-8)", "toto2.txt";
    my $descriptionseg = <$tmp2>;
    close $tmp2;
    $/="\n"; # on redéfinit $/
    return $titreseg, $descriptionseg;
}
