#/usr/bin/perl
<<DOC; 
Nurul Zulaikha AZMI MURAD 22003626
BAO2 TreeTagger UDpipe
cmd: perl script repertoire rubrique
DOC
#----------------------------------------------------------- 
my $rep="$ARGV[0]"; # le répertoire à parcourir
my $rubrique="$ARGV[1]"; # la rubrique sur laquelle on travaille
my %dico_des_titres=();
my $numberItem=0; #le nombre d'articles
my $nbFile=0; #le nombre de fichiers

# on s'assure que le nom du répertoire ne se termine pas par un "/" 
$rep=~ s/[\/]$//;

#Initialisation des fichiers de sorties 
open my $OUTXT,">: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"; # écriture de l'en-tête dans le fichier xml
print $OUTXML "<extraction rubrique=\"$rubrique\">\n"; # écriture de la balise racine dans le fichier xml
#---------------------------------------- 
#appel de la fonction 
&parcoursarborescencefichiers($rep); #recurse! 
#---------------------------------------- 
print $OUTXML "</extraction>";
close $OUTXT; 
close $OUTXML; 
#---------------------------------------- 
#appel de la fonction TreeTagger et UDpipe
&etiquetageTT; 
&etiquetageUD; 
#---------------------------------------- 
print "Nb item : $numberItem \n"; 
print "sortiexml-slurp_$rubrique"	;

# temps écoulé depuis le lancement du programme 
print "time so far: ", $t->elapsed, " seconds\n"; 
exit; 
#---------------------------------------------- 
#on lance la 1ere fonction appelée 
sub parcoursarborescencefichiers { 
	my $path = shift(@_); 
	opendir(my $DIRhandle, $path) or die "can't open $path: $!\n"; 
	my @files = readdir($DIRhandle); 
	closedir($DIRhandle); 
	
	foreach my $file (@files) { 
		next if $file =~ /^\.\.?$/; 
		$file = $path."/".$file; 
		if (-d $file) { # -d vrai si l'objet est un répertoire
		&parcoursarborescencefichiers($file); #recurse! 
		} 
		
		#Selection de la rubrique 
		if (-f $file) { # si l'objet n'est pas un répertoire
			if ($file =~/$rubrique.+xml$/) 
			{ 
				$nbFile++;
				open my $fic,"<:encoding(utf8)",$file; 
				$/=undef;
				my $textelu=<$fic>; 
				close $fic;
				
				print "$nbFile Traitement de : $file  \n";
				while ($textelu=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg) {
					$numberItem++;
					
					#fonction nettoyage
					my $titre=&nettoyage($1); # $1 correspond à ce qui est mémorisé entre parenthèses dans les balises title
					my $description=&nettoyage($2); # $2 correspond à ce qui est mémorisé entre parenthèses dans les balises description
				
					if (!(exists $dico_des_titres{$titre})) { 
					$dico_des_titres{$titre}=$description ;    
					
					
                    #Appel de la fonction etiquetage des données dans le fichier xml
                   ($titre_etiquette,$description_etiquette)=&etiquetageTT($titre,$description);
                    
					# Ecriture des résultats en sorties
					print $OUTXT "$titre \n";
					print $OUTXT "$description \n";
					print $OUTXT "---------------------------------------------------------------------------\n";
                    
                    # Ecriture des résultats en sorties et des balises
					print $OUTXML "<item number= \"$numberItem\" >\n<titre>\n<article>$titre_etiquette</article>\n</titre>\n<description>$description_etiquette</description>\n</item>\n\n";
					}
				}

			}
		}
	}
}

#------------------------------------------------	
# appel a la fonction nettoyage
sub nettoyage { 
	my $texte=shift @_;
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g;
	$texte.=".";
	$texte=~s/\.+$/\./; 
	$texte=~s/&nbsp//g; #pour eviter le probleme d'espace 
	$texte=~s/&amp//g; #pour eviter le probleme d'espace 
	return $texte; 
	}
#----------------------------------------------
#Définition de la fonction étiquetage
sub etiquetageTT {
    my $titre = $_[0];
    my $description = $_[1];
    
#-----------------etiquetage titre-----------------------------
	open (TEMP, ">:encoding(utf8)", "BAO2_temp.txt");
    print TEMP $titre;
    close TEMP;
	
    # lancement de TreeTagger sur le titre
    system ("perl -f tokenise-utf8.pl BAO2_temp.txt | ./tree-tagger.exe ./tree-tagger1/french-utf8.par -token -lemma -no-unknown > BAO2_TT_temp.txt");
    system ("perl treetagger2xml-utf8.pl BAO2_TT_temp.txt utf8"); 
    
	# resultat en xml
	open (CONTENU, "<:encoding(utf8)", "BAO2_TT_temp.txt.xml");
	$/=undef;
    my $titre_etiquette_xml=<CONTENU>;
    close CONTENU;
    $titre_etiquette_xml=~s/^<\?xml[^>]+>//;
	
#-----------------etiquetage description-----------------------------
    open (TEMP, ">:encoding(utf8)", "BAO2_temp.txt");
    print TEMP $description;
    close TEMP;
    
    # lancement de TreeTagger sur la description
    system ("perl tokenise-utf8.pl BAO2_temp.txt | ./tree-tagger.exe ./tree-tagger1/french-utf8.par -token -lemma -no-unknown > BAO2_TT_temp.txt");
    system ("perl treetagger2xml-utf8.pl BAO2_TT_temp.txt utf8"); 
   
   # resultat en xml
	open (CONTENU, "<:encoding(utf8)", "BAO2_TT_temp.txt.xml");
    $/=undef;
	
	my $description_etiquette_xml=<CONTENU>;
    close CONTENU;
    $description_etiquette_xml=~s/^<\?xml[^>]+>//;
    return $titre_etiquette_xml,$description_etiquette_xml;
}

sub etiquetageUD{
	system("./udpipe.exe --tokenize --tag --parse --tokenizer=presegmented ./distrib-udpipe-1.2.0-bin/modeles/french-sequoia-ud-2.5-191206.udpipe sortie-slurp_$rubrique.txt > sortieudpipe-slurp_$rubrique");
}