#/usr/bin/perl
#perl fichier.pl repertoire (rubrique)
<<DOC; 
Votre Nom : QIU
MARS 2021
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
 Le programme prend en entrée le nom du répertoire contenant les fichiers
DOC
#-----------------------------------------------------------
use strict;
use utf8;
use Timer::Simple;
# on instancie un timer commencant à 0.0s par défaut
my $t = Timer::Simple->new();
# on lance le timer
$t->start;
#-----------------------------------------------------------
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/[\/]$//; #2020

open my $OUT ,">:encoding(utf8)","./sortie/sortietxt_$rubrique.txt";
open my $OUTXML,">:encoding(utf8)","./sortie/sortiexml_$rubrique.xml";
open my $OUTUDPIPE, ">:encoding(utf8)", "./sortie/sortietxtUD_$rubrique.txt";
print $OUTXML "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print $OUTXML "<corpus2020>\n";
# On crée un dictionnaire pour stocker des titres parcourus.
my %dico_des_titres=();
my $numberItem=0;
my $nbFile=0;
print $OUTXML "<extraction type=\"$rubrique\">\n";
print $OUTXML "<etudiant><prenom>Haiyan</prenom><nom>QIU</nom><prenom>Jinyuan</prenom><nom>Xu</nom></etudiant>\n";
#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse! 调用子程序
#---------------------------------------- 
print $OUTXML "</extraction>\n";
print $OUTXML "</corpus2020>\n";
close $OUT;
close $OUTXML;
close $OUTUDPIPE;
#----------------------------------------
&etiquetageUD;
&etiquetageTT;
#----------------------------------------
print "Nb item : $numberItem \n";
print "time so far: ", $t->elapsed, " seconds\n";
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_); 
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);

	foreach my $file (@files) {
		next if $file =~ /^\.\.?$/;   # on traite pas les fichirs . ou .. 
		$file = $path."/".$file;
		if (-d $file) {            #-d permet de tester le statut de la chaine de car qui designe le fichier
			&parcoursarborescencefichiers($file);	#recurse!
		}
		#on teste s'il s'agit d'un fichier
		if (-f $file) {  
			if ($file =~/$rubrique.+\.xml$/){
				print $nbFile++," Traitement de : ",$file,"\n";
				open my $fic,"<:encoding(utf8)",$file;
				$/=undef;     #ou $\=""
				#TRAITEMENT DES FICHIERS XML
				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;
						my($titre,$description)=&nettoyage($titre,$description);
						print $OUT $titre,"\n";
						print $OUT $description,"\n";
						print $OUT "\n";
						my ($titretokenisee, $descriptiontokenisee)=&preetiquetage($titre, $description); 
						print $OUTXML "<item num=\"$numberItem\">\n<titre>\n$titretokenisee\n</titre><description>\n$descriptiontokenisee\n</description>\n</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;
}

sub preetiquetage{
	# arguments gérés par la liste @_
	my $titre=$_[0];
	my $description=$_[1]; 
	#on veut lancer le problème tokenizer sur les données envoyées à la procédure
	open my $empt, ">:encoding(utf8)", "tempfile.txt";
	print $empt $titre;
	close $empt;
	system("perl -f ./projet-treetagger/tokenise-utf8.pl tempfile.txt > toktitre.txt.pos");
	open my $temp, "<:encoding(utf8)", "toktitre.txt.pos";
	$/=undef;
	my $titre_xml=<$temp>;
	close $temp;

	#une deuxième fois pour les descriptions 
	open my $empt, ">:encoding(utf8)", "tempfile.txt";
	print $empt $description;
	close $empt;  
	system("perl -f ./projet-treetagger/tokenise-utf8.pl tempfile.txt > tokdescriptions.txt.pos");
	open my $temp, "<:encoding(utf8)", "tokdescriptions.txt.pos";
	$/=undef;
	my $description_xml=<$temp>;
	close $temp;

	# faut renvoyer le contenu du fichier fichiertitre et fichierdescription dans le programme principale
	return $titre_xml, $description_xml;

}

sub etiquetageUD{

	system("./distrib-udpipe-1.2.0-bin/udpipe-1.2.0-bin/bin-osx/udpipe --tokenize --tag --parse ./distrib-udpipe-1.2.0-bin/modeles/french-sequoia-ud-2.5-191206.udpipe ./sortie/sortietxt_$rubrique.txt > ./sortie/sortietxtUD_$rubrique.txt");

}

sub etiquetageTT{
	
	system("perl -f ./projet-treetagger/tokenise-utf8.pl ./sortie/sortiexml_$rubrique.xml | ./projet-treetagger/tree-tagger ./projet-treetagger/french-utf8.par -token -lemma -no-unknown -sgml > ./sortie/sortiexmlTT_$rubrique");
	system("perl ./projet-treetagger/treetagger2xml-utf8.pl ./sortie/sortiexmlTT_$rubrique utf8")
}

























