#!/usr/bin/perl
<<DOC; 
Votre Nom : Lufei LIU
un exemple de commande pour lancer l'extraction sur la rubrique "a la une" du fichier 2020
On se position sur le répertoire BAO2, puis lancer : 
	perl parcours-arborescence-fichiers-regex.pl ../2020 3208
Le programme prend en entrée le nom du répertoire contenant les fichiers + le nom de la rubrique à traiter parmi ces fichiers
Le programme construit en sortie un fichier xml et un fichier txt contenant les résultats du filtrage. 
DOC
#-----------------------------------------------------------
use strict;
use utf8;
use Timer::Simple ();
#-----------------------------------------------------------
my $rep="$ARGV[0]"; #récupérer le nom d'arborescence a traiter 
my $rubrique="$ARGV[1]"; #récupérer le numéro de la rubrique à traiter

# on s'assure que le nom du répertoire ne se termine pas par un "/"
# harmoniser l'écriture du chemin, donc enlever les / 
$rep=~ s/[\/]$//;
# on crée deux fichiers de sortie
open my $output, ">:encoding(UTF-8)","../RESULTATS/sortie-$rubrique.txt" or die ;
open my $outxml, ">:encoding(UTF-8)","../RESULTATS/sortie-$rubrique.xml" or die ;

# écrire l'entête dans le fichier de sortie xml
print $outxml "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print $outxml "<corpus2020>\n";
my %dico_des_titres=();
my $numberItem=0;
my $nbFile=0;

my $time = Timer::Simple->new();
#-----------------------------------------------------------
#recurse!
&parcoursarborescencefichiers($rep);
print $outxml "</corpus2020>\n";
close $output;
close $outxml;
print "Nb item : $numberItem \n";
#-----------------------------------------------------------
# étiqueter le fichier xml avec treetagger et écrire les résultats au format xml
&treetagger;
&udpipe;
#-----------------------------------------------------------
print "temp d'exécution: $time\n";
exit;


#-----------------------------------------------------------
# Crée une fonction pour parcours l'arborescence du fichier 2020
sub parcoursarborescencefichiers 
{
    my $path = shift(@_);
    # ouvrir un répertoire, opendir prend en argument le nom du répertoire et le chemin 
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);
    	foreach my $file (@files) 
    	{
    		# on ignore les répertoire dont le nom est . ou ..
			next if $file =~ /^\.\.?$/;
			# on concatène le nom du répertoire courant à chaque fichier qui le compose pour voir s'il s'agit d'un fichier ou d'un répertoire
			$file = $path."/".$file;
			if (-d $file) 
			{
				#print "on entre dans $file \n";
	    		&parcoursarborescencefichiers($file);	#recurse!
	    		#print "on sort de $file \n";
			}
			# s'il s'agit d'un fichier, on vérifie s'il est le ficheir dont on a besoin 
			if (-f $file) 
			{
				#on traite uniquement les fichiers xml
				if ($file =~/$rubrique.+xml$/)
				{
					print $nbFile++," Traitement de : ",$file,"\n";
					open my $input, "<:encoding(UTF-8)", "$file";
					# lecture global du ficher
					$/=undef;
					my $textelu=<$input>;
					close $input;
					# extraire les titres et les descriptions avec le regex suivant
					while ($textelu=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg) 
					{
						# l'option s dans la recherche permet de tenir compte des \n
						my $titre=$1;
						my $description=$2;
						$numberItem++;
						# on évite d'extraire des doublons titre/description
						if(!(exists $dico_des_titres{titres}))
						{
							$dico_des_titres{titire}=$description;
							# Appel du sous-programme de nettoyage 
							($titre,$description)=&nettoyage($titre,$description);
							# Ecriture des résultats en sorties
							print $output $titre, "\n";
							print $output $description, "\n";
							print $output "--------------------\n";
							print $outxml "<item>\n";
							print $outxml "<titre>$titre</titre>\n";
							print $outxml "<description>$description</description>\n";
							print $outxml "</item>\n";
						}
				}	
			}      
			}  
		}
}

#------------------------------------------------
sub nettoyage {
	# quand on lance une procédure
	# perl range les arguments de la procédure dans une liste spéciale qui s'appelle @_
	#my $titre=shift(@_); autre solution en vidant la liste des arguments du programmes...
    #my $description=shift(@_);

    # ce sous-programme de nettoyage permet surtout d'obtenir des résultats propres sans les balises xml mal formées
	my $titre = $_[0];
    my $description = $_[1];
	$titre=~s/^<!\[CDATA\[//g;
	$titre=~s/\]\]>$//g;
	$description=~s/^<!\[CDATA\[//;
	$description=~s/\]\]>$//;
    $description=~s/&lt;.+?&gt;//g;
    $description=~s/&#38;#39;/'/g;
    $description=~s/&#38;#34;/"/g;
    $description=~s/&amp;//g;
    $titre=~s/&lt;.+?&gt;//g;
    $titre=~s/&#38;#39;/'/g;
    $titre=~s/&#38;#34;/"/g;
	# l'ajout du point en fin de chaîne
	$titre=~s/$/\./g;
	$titre=~s/\.+$/\./g;
	$titre=~s/&amp;//g;
	return $titre,$description;
}

#------------------------------------------------
sub treetagger
{
	# segmenter et annoter avec treetagger directement sur le fichier de sortie xml 
	# on obtient un fichier text segmenté et étiqueté dont chaque titre et description est sous balise.
	system "perl ../BAO2/utf8-tokenize.perl -f ../RESULTATS/sortie-$rubrique.xml | ../BAO2/tree-tagger ../BAO2/french-utf8.par  -token -lemma -no-unknown -sgml  > ../RESULTATS/treetagger-$rubrique.txt";
	# convertir le resultat de segmentation et de l'étiquetage en un fichier xml dont chaque forme, lemme et pos est sous balise.
	system "perl ../BAO2/treetagger2xml-utf8.pl ../RESULTATS/treetagger-$rubrique.txt utf-8";
}


#------------------------------------------------
sub udpipe
{	
	# étiqueter le fichier de sortie au format txt avec udpipe 
	system "../BAO2/udpipe --tokenize --tokenizer=presegmented --tag --parse ../BAO2/french-sequoia-ud-2.5-191206.udpipe ../RESULTATS/sortie-$rubrique.txt > ../RESULTATS/udpipe-$rubrique.txt";
	# transformer le texte étiqueté au format xml
	system "perl ../BAO2/udpipe2xml-version-sans-titrevsdescription.pl ../RESULTATS/udpipe-$rubrique.txt";
}
