#!/usr/bin/perl

<<DOC; 
Noms : PHOMMADY Elodie & AOUES Nora
Usage : perl parcours-arborescence-fichiers repertoire-a-parcourir rubrique
    Lancé depuis le répertoire ancêtre, 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


#***********************************************************
#**************** PROGRAMME PRINCIPAL **********************

#-----------------------------------------------------------
# UTILISATION DE BIBLIOTHEQUES 

use strict;
use utf8;

#-----------------------------------------------------------
# RECUPERATION DES ARGUMENTS EN LIGNE DE COMMANDE 
# + PREPARATION DES FICHIERS EN SORTIE 

my $repertoire="$ARGV[0]";
my $rubrique ="$ARGV[1]";

# Vérification que le nom du répertoire ne se termine pas par un "/"
$repertoire=~ s/[\/]$//;

# Ouverture des fichiers en sortie
open my $outputTXT, ">:encoding(utf8)", "./Resultats/Sorties_BAO1/sortie-slurp_$rubrique.txt";
open my $outputXML, ">:encoding(utf8)", "./Resultats/Sorties_BAO1/sortiexml-slurp_$rubrique.xml";

# Préparation du fichier en sortie XML  
print $outputXML "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print $outputXML "<corpus2020>\n";

# Initialisation de variables 
my %dico_titres=();
my $numberItem=0;
my $nbFile=0;

#----------------------------------------
# PARCOURS RECURSIF DE L'ARBORESCENCE 

&parcoursarborescencefichiers($repertoire);	# Appel de la procédure de parcours de l'arborencence

#----------------------------------------
# FERMETURE DES FICHIERS EN SORTIE 

print $outputXML "</corpus2020>\n";
close $outputXML;

close $outputTXT;

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

print "Nombre d'items distincts  : $numberItem \n";
exit;




#***********************************************************
#******************* SOUS-PROGRAMMES ***********************

#-----------------------------------------------------------
# PROCEDURE : Pour parcourir l'arborescence des fichiers 

sub parcoursarborescencefichiers {
	
	# Récupération de l'argument passé à la procédure 
	my $path = shift(@_);
	
	# Traitement du répertoire donné en argument : Ouverture + Lecture + Fermeture
	opendir(my $DIRhandle, $path) or die "can't open $path: $!\n";
	my @files = readdir($DIRhandle);
	closedir($DIRhandle);
	
	# Pour chaque élément (répertoire ou fichier) dans le répertoire "racine"
	foreach my $file (@files) {
		
		# Ne pas traiter les répertoires . (répertoire courant) et .. (répertoire parent)
		next if $file =~ /^\.\.?$/;
		
		# Reconstruire le chemin de l'élément par rapport à ma position actuelle 
		$file = $path."/".$file;
		
		# Test de la nature de l'élément : Répertoire 
		if (-d $file) {
			&parcoursarborescencefichiers($file);	# Appel à nouveau la procédure de parcours de l'arborencence
		}
		
		# Test de la nature de l'élément : Fichier 
		if (-f $file) {
			
			# Traitement du fichier XML correspondant à la rubrique recherchée
			if ($file =~/$rubrique.+xml$/) {
				print $nbFile++, " Traitement de : ", $file, "\n";
				
				# Ouverture du fil RSS + Lecture globale + Fermeture 
				open my $filRSS, "<:encoding(utf8)", $file;
				$/=undef;     # ou bien $\="";
				my $textelu=<$filRSS>;
				close $filRSS;
				
				# Extraction du contenu textuel des titres et des descriptions 
				while ($textelu=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg) {
					
					# Récupération des contenus textuels 
					my $titre=$1;
					my $description=$2;
					
					# Récupération de la date 
					$file=~/^(\d{4})\/(\d{2})\/(\d{2})/; 
					my $dateFilRSS = $1."-".$2."-".$3; 
					
					# Pour ne pas récupérer plusieurs fois la même information 
					if (!(exists $dico_titres{$titre})) { 
						$numberItem++;
						$dico_titres{$titre}=$description ;
						# Appel du sous-programme de nettoyage 
						($titre,$description)=&nettoyage($titre,$description);
						# Ecriture des résultats en sorties
						print $outputTXT "$titre\n";
						print $outputTXT "$description\n";
						print $outputTXT "--------------------\n";
						print $outputXML "<item numero=\"$numberItem\" date=\"$dateFilRSS\">\n";
						print $outputXML "<titre>$titre</titre>\n";
						print $outputXML "<description>$description</description>\n";
						print $outputXML "</item>\n";
					}
				}
			}
		}
	}
}

#----------------------------------------------
# PROCEDURE : Pour nettoyer des chaînes de caractères correspondant aux titres et aux descriptions

sub nettoyage {
	
	# Récupération des arguments passés à la procédure 
	my $titre = $_[0];
	my $description = $_[1];
	
	# Nettoyage des titres 
	$titre=~s/^<!\[CDATA\[//;
	$titre=~s/\]\]>$//;
	$titre=~s/&lt;.+?&gt;//g;
	$titre=~s/&#38;#39;/'/g;
	$titre=~s/&#38;#34;/"/g;
	$titre=~s/$/\./g;
	$titre=~s/\.+$/\./g;
	$titre=~s/\?\./\?/g;
	
	# Nettoyage des descriptions
	$description=~s/^<!\[CDATA\[//;
	$description=~s/\]\]>$//;
	$description=~s/&lt;.+?&gt;//g;
	$description=~s/&#38;#39;/'/g;
	$description=~s/&#38;#34;/"/g;
	$description=~s/&nbsp;//g;
	$description=~s/$/\./g;
	$description=~s/\.+$/\./g;
	$description=~s/\?\./\?/g;
	
	return $titre, $description;
}
