#/usr/bin/perl
#-----------------------------------------------------------
use utf8;
use strict;
binmode(STDOUT, ":encoding(UTF-8)");

#-----------------------------------------------------------
#MODE D'EMPLOI :
#perl bao1_parcours_arborescence_nettoyage.pl nom_dossier numero_rubrique
#-----------------------------------------------------------

#Si la longueur de la liste d'arguments est différent de 1, ça veut dire qu'il manque un argument et qu'on sort du programme (on rappelle que perl est à index 0).
if ($#ARGV != 1) {print "Il manque un argument à votre programme....\n";exit;} 

#le premier argument, le nom du dossier, est stocké dans la variable $rep.
my $rep="$ARGV[0]";

#Le deuxième argument, le numéro de la rubrique, est stocké dans la variable $RUBRIQUE.
my $RUBRIQUE="$ARGV[1]";

#Pour normaliser le nom des dossiers, on enlève tous les slashs à la fin des noms.
$rep=~ s/[\/]$//;

#On ouvre deux fichiers en écriture, encodage UTF-8 : 
#- un fichier de texte brut
#- un fichier XML. 
#Chaque fichier s'appellera titre-description-propre suivi du numéro de la rubrique qu'on a choisie. Il y a aura donc deux fichiers par rubrique.
open my $txt, ">:encoding(UTF-8)","titre-description-propre_$RUBRIQUE.txt";
open my $xml, ">:encoding(UTF-8)","titre-description-propre_$RUBRIQUE.xml";

#On écrit la déclaration de la version XML et la balise racine <corpus> dans le fichier XML.
print $xml "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus>\n";

#On fait appel au sous-programme &parcoursarborescencefichiers qu'on va définir plus tard en bas. 
&parcoursarborescencefichiers($rep);

#On écrit la balise fermante de <corpus> dans le fichier XML
print $xml "</corpus>\n";

#On ferme les fichiers de sortie et on sort du programme.
close $txt;
close $xml;

exit;

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

#DEFINITION DU SOUS-PROGRAMME &parcoursarborescencefichiers : il va servir à parcourir toutes l'arborescence des fichiers et écrire les résultats dans les fichiers de sorite.

sub parcoursarborescencefichiers {
	
	#On enlève le premier argument de la liste d'arguments ($rep) et on le met dans la variable $path.
    my $path = shift(@_);
	
	#On ouvre le dossier (fonction opendir()) correspondant au chemin dans la variable $path. Si ça ne marche pas, on fait afficher sur le terminal "Impossible d'ouvrir" suivi du nom du dossier.
    opendir(DIR, $path) or die "Impossible d'ouvrir $path: $!\n";
    
	#On lit le nom de tous les fichiers du dossier ouvert et on met les noms dans la liste @files.
	my @files = readdir(DIR);
    
	#On ferme le dossier.
	closedir(DIR);
	
	#Pour chaque fichier qui se trouve dans la liste @files :
    foreach my $file (@files) {
		
		#On ne traite pas (next if) les fichiers qui se terminent par . (répertoire courant) ou .. (répertoire parent). 
		next if $file =~ /^\.\.?$/;
		
		#Chaque nom de fichier est renommé par ce qui se trouve dans la variable $path à ce moment donné suivi du nom du fichier traité. Ca va permettre de donner à chaque fichier son chemin relatif par rapport au répertoire pris en entrée au tout début du programme.
		$file = $path."/".$file;
		
		#Si le chemin correspond à un répertoire (option -d pour directory), on print sur le terminal "On entre dans un répertoire" et on refait appel à la fonction &parcoursarborescencefichiers mais cette fois-ci avec en entrée le nom du répertoire rencontré. C'est une fonction récursive car elle fait appel à elle-même.
		if (-d $file) {
			print "On entre dans le REPERTOIRE : $file \n";
			&parcoursarborescencefichiers($file);
			print "On sort du REPERTOIRE :  $file \n";
		}
		
		#Si le chemin correspond à un fichier :
		if (-f $file) {
			
			#Si le nom du fichier contient le numéro de la rubrique qu'on a rentrée avec l'extension .xml :
			if ($file =~ /$RUBRIQUE.+\.xml$/) {
				
				#On imprime sur le terminal "Traitement du fichier".
				print "Traitement du fichier $file \n";
				
				#On ouvre le fichier en lecture, comme l'indique le <. 
				open my $input, "<:encoding(UTF-8)",$file;
				
				#Par défaut, la variable $/ contient un saut de ligne (\n). Quand on le undef, on enlève cette valeur par défaut.
				$/=undef;
				
				#Grâce à undef, on peut accéder à l'entierté du contenu de notre fichier avec chevrons <$input>. On met le contenu entier du fichier dans la variable $ligne.
				my $ligne=<$input> ;
				
				#On ferme le fichier RSS.
				close($input);
				
				#Tant que on match l'expression régulière ci-dessous :
				while ($ligne=~/<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) {
					
					#On récupère le contenu du premier groupe de capture (le titre), on le fait passer dans le sous-programme &nettoyage qu'on définira en-dessous et on met le résultat du nettoyage dans la variable $titre.
					my $titre=&nettoyage($1);
					
					#On fait la même chose avec le deuxième groupe de cpature (la description).
					my $description=&nettoyage($2);
					
					#On écrit le titre dans le TXT suivi d'un retour à la ligne.
					print $txt "$titre \n";
					
					#On écrit la description dans le txt suivi d'un retour à la ligne.
					print $txt "$description \n";
					
					#On écrit des tirets dans le TXT pour séparer chaque couple de titre-description du suivant.
					print $txt "----------------------------\n";
					
					#On écrit dans le XML le titre dans les balises <titre> et la description dans les balises <description>.
					print $xml "<item><titre>$titre</titre><description>$description</description></item>\n";
				}
			}
		}
    }
}

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

#DEFINITION DU SOUS-PROGRAMME NETTOYAGE

sub nettoyage {
	
	#On met dans la variable $texte le premier argument de la liste d'arguments (le groupe de capture correspondant au titre ou à la description).
	my $texte=shift @_;
	
	#Les titres et descriptions se trouvent dans une balise <![CDATA[]]> qui permet de déspécialiser tout ce qui se trouve à l'intérieur pour ne pas qu'ils soient interprétés comme des balises XML.
	#On enlève tous les <![CDATA[ en début de texte et les ]]> en fin de texte grâce à "sub". 
	#L'option "g" permet de dire à sub de continuer jusqu'à la fin du texte.
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g;
	
	#On rajoute un . à la fin de la description ou du titre. Ca va permettre à aider UDpipe à segmenter dans la BAO2.
	$texte.=".";
	
	#Si le titre ou la description se finissait déjà par un point, on va avoir deux points d'affilé. On remplace donc les ".." par ".".
	$texte=~s/\.+$/\./;
	return $texte;
}
#----------------------------------------------
