#/usr/bin/perl
<<DOC; 
Votre Nom : Gervais, Grezda, Trieu
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir rubrique
 Le programme prend en entrée le nom du répertoire-racine contenant les fichiers
 à traiter et le nom de la rubrique à traiter parmi ces fichiers
DOC
#-----------------------------------------------------------
use strict;
use utf8;
#-----------------------------------------------------------
my $rep="$ARGV[0]";
my $rubrique ="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
open my $OUT ,">:encoding(utf8)","sortie-slurp_$rubrique.txt";
open my $OUTXML,">:encoding(utf8)","sortiexml-slurp_$rubrique.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;
#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse!
#----------------------------------------
print $OUTXML "</corpus2020>\n";
close $OUT;
close $OUTXML;

#----------------------------------------
# ICI COMMENCE LE BàO 2
&etiquetudpipe;
&etiquetreetager;

#----------------------------------------
print "Nb item : $numberItem \n";
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_);
    opendir(my $DIRhandle, $path) or die "can't open $path: $!\n"; # DIR => descripteur du fichier
    my @files = readdir($DIRhandle); # readdir, ouvre le fichier DIR en mode lecture
    closedir($DIRhandle);
		foreach my $file (@files) {
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file;
		if (-d $file) {
			&parcoursarborescencefichiers($file);	#recurse!
		}
		if (-f $file) {
			if ($file =~/$rubrique.+xml$/) {
				print $nbFile++," Traitement de : ",$file,"\n";
				open my $fic,"<:encoding(utf8)",$file;
				$/=undef;     #ou $\=""
				my $textelu=<$fic>;
				close $fic;
				while ($textelu=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg) {
					my $titre=$1;
					my $description=$2;
					$numberItem++;
					if (!(exists $dico_des_titres{$titre})) { 
						$dico_des_titres{$titre}=$description ;
						# Appel du sous-programme de nettoyage 
						($titre,$description)=&nettoyage($titre,$description);
						# Ecriture des résultats en sorties
						print $OUT $titre,"\n";
						print $OUT $description,"\n";

						#etiquetudpipe($titre,$description)

						#
						#------------------------------------------------------------------------
						#1er étape, tokenisation des données dans le fichier xml
						my($titretokenisee, $descriptiontokenisee) = &tokenisationtreetager($titre,$description);
						#------------------------------------------------------------------
						print $OUT "--------------------\n";
						print $OUTXML "<item>\n";
						print $OUTXML "<titre>\n$titretokenisee\n</titre>\n";
						print $OUTXML "<description>\n$descriptiontokenisee\n</description>\n";
						print $OUTXML "</item>\n";
					}
				}
			}
		}
    }
}
#----------------------------------------------
sub nettoyage {
    #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\[//;
	$titre=~s/\]\]>$//;
	$description=~s/^<!\[CDATA\[//;
	$description=~s/\]\]>$//;
    $description=~s/&lt;.+?&gt;//g;
    $description=~s/&#38;#39;/'/g;
    $description=~s/&#38;#34;/"/g;
    $titre=~s/&lt;.+?&gt;//g;
    $titre=~s/&#38;#39;/'/g;
    $titre=~s/&#38;#34;/"/g;
    $titre=~s/$/\./g;
	$titre=~s/\.+$/\./g;
    return $titre,$description;
}
# étiquetter le fichier texte avec udpipe
sub etiquetudpipe {

	system("../distrib-udpipe-1/udpipe-1.2.0-bin/bin-osx/udpipe --tokenize --tag --parse --tokenizer=presegmented ../distrib-udpipe-1/modeles/french-sequoia-ud-2.5-191206.udpipe sortie-slurp_$rubrique.txt > result_udpipe");
}


#------------------------------------------------------------
# avec treetager on veut recreer un formatage xml avec le texte dans la forme d'un liste ou chaque element est étiquetté
# il faut se rappeler que qu'on on execute treetager, on commence par tokeniser un text avec le programme tokenizer, puis on lance le treetager
# dans fichier temporaire ou on fait la tokenisation.
# Le but: générer un fichier xml qui contiendra la tokenisation de l'ensemble des données textuelles, un gros fichier xml qui contient le tokenisation
# et un gros fichier fichier qui contiendra les balises pour chaque élément et le tokenisation.
#------------------------------------------------------------

#1er etape: tokenisation des données
#procédure tokenisation

sub etiquetreetager { 
	#lance treetager sur sortiexml-slurp_$rubrique.xml
	system("cat sortiexml-slurp_$rubrique.xml | ../tree-tagger-MacOSX-3.2.3/bin/tree-tagger -token -lemma -sgml -no-unknown ../tree-tagger-MacOSX-3.2.3/lib/french.par > sortiexml2-slurp_$rubrique.xml");

	#reformater le tout en XML...en modifiant treetager2xml!

	system ("perl ../Ressources/treetagger2xml-utf8.pl sortiexml2-slurp_$rubrique.xml utf8");
}

sub tokenisationtreetager {
	#arguments gérés par la liste @_ ( liste des arguments dans une procedure, dans ce cas deux, renvoyé comme parametres en arguments)
	my $titre=$_[0];
	my$description=$_[1];


	#on veut lancer le pg tokeizer sur les donnnés envoyes à la procedure.
	open my $tmpfile,  ">:encoding(utf8)", "tmpfile.txt";
	print $tmpfile $titre;
	close $tmpfile;
	#deux fois, pour fichier titre et pour fichier description 
	system("perl ../tree-tagger-MacOSX-3.2.3/cmd/utf8-tokenize.perl tmpfile.txt > toktitre.txt");
	$\=undef;
	open my $tmpfile,"<:encoding(utf8)", "toktitre.txt";
	my $contenutitre=<$tmpfile>;
	close $tmpfile;
	#-------------------------------------------------------------------------------------------

	open my $tmpfile,  ">:encoding(utf8)", "tmpfile.txt";
	print $tmpfile $description;
	close $tmpfile;

	system("perl ../tree-tagger-MacOSX-3.2.3/cmd/utf8-tokenize.perl tmpfile.txt > tokdescription.txt");
	$\=undef;
	open my $tmpfile,"<:encoding(utf8)", "tokdescription.txt";
	my $contenudescription=<$tmpfile>;
	close $tmpfile;

	#--------------------------------------------------------------------------------------------
	#renvoyer le contenu du fichiertitre et du fichierdescription dans le pg principale

	return $contenutitre, $contenudescription;
}


