#!/usr/bin/perl
# entre <<DOC; DOC sont des blocs de commentaires 
<<DOC; 
Votre Nom : Jiaqi XU
Mai 2021
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
 Le programme prend en entrée le nom du répertoire contenant les fichiers
 à traiter et 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'ecriture du chemin, donc enlever les / 
$rep=~ s/[\/]$//;
# on crée deux fichiers de sortie
open my $output, ">:encoding(UTF-8)","./resultat/sortie-$rubrique.txt";
open my $outxml, ">:encoding(UTF-8)","./resultat/sortiexml-$rubrique.xml";

# ecrire entete 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();
#----------------------------------------------
# on doit traiter le ficher RSS et seulement la rubrique qui nous interesse 
&parcoursarborescencefichiers($rep); #recurse!
print $outxml "</corpus2020>\n";
close $output;
close $outxml;
print "Nb item : $numberItem \n";
#----------------------------------------------
# etiqueter le fichier xml avec treetagger et ecrire le resultat en xml

&treetagger;
&udpipe;
#&etiquetagetreetagger;



#----------------------------------------------
#my $time = Timer::Simple->new();
print "temp d'exécution: $time\n";
exit;


#----------------------------------------------
# Creation de fonction
sub parcoursarborescencefichiers 
{
    my $path = shift(@_);
    # ouvrir un repertoire, opendir prend en argument le nom du repertoire et le chemin 
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);
    	foreach my $file (@files) 
    	{
			next if $file =~ /^\.\.?$/; # on ignore les rep . et .. 
			$file = $path."/".$file; # le . sert a concatener les chaine de caractere 
			if (-d $file) 
			{
				#print "on entre dans $file \n";
	    		&parcoursarborescencefichiers($file);	#recurse!
	    		#print "on sort de $file \n";
			}
			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;
					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++;
						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";

							#1. tokenization des donnees a integrer dans le fichier xml 
							#my ($titretokenisee, $descriptiontokenisee)=&tokenisationpourtreetagger($titre, $description);
							print $output "--------------------\n";
							print $outxml "<item>\n";
							#print $outxml "<titre>$titretokenisee</titre>\n";
							#print $outxml "<description>$descriptiontokenisee</description>\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(@_);
	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;
	# ajout du point en fin de chaîne
	$titre=~s/$/\./g;
	$titre=~s/\.+$/\./g;
	$titre=~s/&amp;//g;
	return $titre,$description;
}

#------------------------------------------------
sub treetagger
{
	system "perl ./utf8-tokenize.perl -f ./resultat/sortiexml-$rubrique.xml | ./tree-tagger ./french-utf8.par  -token -lemma -no-unknown -sgml  > ./resultat/sortie-treetagger-$rubrique.txt";
	system "perl ./treetagger2xml-utf8.pl ./resultat/sortie-treetagger-$rubrique.txt utf-8";
}


#------------------------------------------------
sub udpipe
{
	system "./udpipe --tokenize --tokenizer=presegmented --tag --parse ./french-sequoia-ud-2.5-191206.udpipe ./resultat/sortie-$rubrique.txt > ./resultat/sortie-udpipe-$rubrique.txt";
}

sub tokenisationpourtreetagger
{
	# arguments geres par la liste @_
	my $titre=$_[0];
	my $description=$_[1];

	open my $tmpfile, ">:encoding(utf-8)", "tmpfile.txt";
	print $tmpfile $titre;
	close $tmpfile;
	# on veut lancer le pg tokenizer sur les donnees envoyees a la procedure
	system "perl ./utf8-tokenize.perl -f tmpfile.txt > toktitre.txt";
	# renvoyer le contenu du fichier titre et celui de description dans le pg principal 
	$/=undef;
	open $tmpfile, "<:encoding(utf-8)", "toktitre.txt";
	my $contenutitre=<$tmpfile>;
	close $tmpfile;
	
	#-----------------------------------------------------------------------
	open my $tmpfile, ">:encoding(utf-8)", "tmpfile.txt";
	print $tmpfile $description;
	close $tmpfile;
	system "perl ./utf8-tokenize.perl -f tmpfile.txt > tokdescription.txt ";
	# renvoyer le contenu du fichier titre et celui de description dans le pg principal 
	$/=undef;
	open my $tmpfile, "<:encoding(utf-8)", "tokdescription.txt";
	my $contenudescription=<$tmpfile>;
	close $tmpfile;

	return $contenutitre, $contenudescription;

}

sub etiquetagetreetagger
{
	system "cat ./resultat/sortiexml-$rubrique.xml | ./tree-tagger ./french-utf8.par  -token -lemma -no-unknown -sgml  > ./resultat/sortiexml2-$rubrique.xml";
	system "perl ./treetagger2xml-utf8.pl ./resultat/sortiexml2-$rubrique.xml utf-8";
}
