#!/usr/bin/perl
# entre <<DOC; DOC sont des blocs de commentaires 
<<DOC; 
Nom : Xiaomin HUANG
Date :  Mai 2021

But de ce script  :  
1) On parcours une arborescence de fil RSS, extrait, nettoie les contenus textuels des titres et des descriptions. 
2) Puis on étiquete les contenus avec UD pipe et TreeTagger. 

Commande de lancement:  
on se situe dans le répertoire"BAO2";  puis on tape " perl bao2_Xiaomin.pl 2020 3260"  " perl bao2_Xiaomin.pl 2020 3246" 
(deux paramètres:  le nom du répertoire contenant les fichiers à traiter et le nom de la rubrique à traiter parmi ces fichiers)

Sortie: 
- Un fichier sous format de txte pour l\'extration de contenue  (pareil à BAO1)
- Deux fichiers au format texte brute (txt), contenant le texte issu du fitrage étiqueté avec TreeTagger et UDPipe
- Trois fichiers structuré au format XML, contenant le contenu textuel du filtrage et celui étiqueté par TreeTagger et UD-pipe		
Usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
DOC
#-----------------------------------------------------------
use utf8; #bibliotèque pour coder en respectant les restraints de Perl
use strict; #on n'utilise que UTF-8

#-----------------------------------------------------------
#récupérer le nom d'arborescence 
my $rep="$ARGV[0]"; 
#récupérer le numéro de la rubrique 
my $rubrique="$ARGV[1]";

# on s'assure que le nom du répertoire ne se termine pas par un "/"
# "2020" pas"/2020"
$rep=~ s/[\/]$//;
#-------------------------------------------

# Ouvrir les fichiers en écriture
open my $output, ">:encoding(UTF-8)","./resultat/$rubrique.txt";
open my $outxml, ">:encoding(UTF-8)","./resultat/$rubrique.xml";

# ecrire en tê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;


#----------------------------------------------
# On déclenche le parcours recurse et ne traite que les rubriques 3260 et 3246
&parcoursarborescencefichiers($rep); #recurse!
print $outxml "</corpus2020>\n";
close $output; #fermeture du fichier texte
close $outxml; #fermeture du fichier XMLs
print "Nb item : $numberItem \n";
#----------------------------------------------
# deux étiqueteurs pour etiqueter le fichier. 
&treetagger;# Entrée:xml Sortie: xml
&udpipe; # Entrée:txt Sortie: txt


#----------------------------------------------
#Appel d'un sous-programme qui va parcourir l'arborescence de manière récursive :
#on passe le repertoire contenant les fichiers à traitées en argument du sous-programme
sub parcoursarborescencefichiers 
{
    my $path = shift(@_);
    # récupérer la racine du chemin
    #fonction shift: chercher le premier élé de la liste
    
    #---ouverture du contenue du répertoire :
    # 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) 
    	{ 	
    	# on passe des fichiers contenant "." ou ".."
			next if $file =~ /^\.\.?$/; 
		# reconstruire un chemin relatif en servant "." pour concatener les chaine de caractere 
			$file = $path."/".$file; 
			
		# -d: si c'est un repertoire: 
			if (-d $file) 
			{
	    		&parcoursarborescencefichiers($file);	#recurse!
			}
		# -f: si c'est un fichier: 
			if (-f $file) 
			{
				#----------------------------Lecture du fichier:----------------------------
				# Si le fichier est avec exrension XML et la rubrique est le deuxième paramètre
				if ($file =~/$rubrique.+xml$/)
				{
					#incrémentation du compteur :
					print $nbFile++," Traitement de : ",$file,"\n";
					
					#------------
					open my $input, "<:encoding(UTF-8)", "$file";
					# lecture global du ficher
					$/=undef;
					my $textelu=<$input>;
					close $input;
					
					#Extraction :

					while ($textelu=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg) 
					# les parentheses,marquer les zones de capture. $1, $2 permettant de les récupérer 
 	  			    # /g: tant que la recherche fonctionne bien, on s'arrete pas à la première enquete, on s'avance sur la recherche suivante.	
 	   				# / s: chercher aussi des retours à la ligne 
					{
					
						my $titre=$1;
						my $description=$2;
						
						$numberItem++;
						#si le titre n'existe pas dans le dico:
						if(!(exists $dico_des_titres{titres}))
						{
							#on ajoute le titre et la description au dictionnaire
							$dico_des_titres{titire}=$description;
							
							# Appel du sous-programme de nettoyage pour nettoyer les petits bruits des contenues textuelles pendant l'extraction
							($titre,$description)=&nettoyage($titre,$description);
							
							# Ecriture des résultats en texte brute
							print $output $titre, "\n";
							print $output $description, "\n";
							print $output "--------------------\n";

							# Ecriture des résultats en sorties en xml
							print $outxml "<item>\n";
							print $outxml "<titre>$titre</titre>\n";
							print $outxml "<description>$description</description>\n";
							print $outxml "</item>\n";


						}

				}	
			}      
			}  
		}
}

#------------------------------------------------
sub nettoyage {
	my $titre = $_[0];
	#fonction shift: chercher le premier élé de la liste
    my $description = $_[1];
	$titre=~s/^<!\[CDATA\[//g;
	## rechercher et substituer  / ADFGFQG//
	$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;
	# s'il y pls points à l'issu , on le remplace avec un seul point
	$titre=~s/\.+$/\./g;
	# ajout du point en fin de chaîne
	$titre=~s/&amp;//g;
	return $titre,$description;
}

#------------------------------------------------
sub treetagger
{
#commande système ; on fait appel à un script externe pour étiqueter le contenu textuel 
	system "perl ./utf8-tokenize.perl -f ./resultat/$rubrique.xml |./tree-tagger ./french-utf8.par  -token -lemma -no-unknown -sgml  > ./resultat/$rubrique-treetagger.txt";
	
	system "perl ./treetagger2xml-utf8.pl ./resultat/$rubrique-treetagger.txt utf-8";
}


#------------------------------------------------
sub udpipe
{

	system "./udpipe --tokenize --tokenizer=presegmented --tag --parse ./french-sequoia-ud-2.5-191206.udpipe ./resultat/$rubrique.txt > ./resultat/$rubrique-udpipe.txt";
	#la sortie en XML
	system "perl udpipe2xml-version-sans-titrevsdescription-v2.pl  ./resultat/$rubrique-udpipe.txt ";

}

#------------------------------------------------





