#!usr/bin/perl

<<DOC;
Noelie BOTTERO & Yimina
Projet encadré 2 2020-2021
Pour lancer le programme : perl BAO1_regexp.pl dossier-a-parcourir num-rubrique
Ce programme parcourt l'arborescence d'un flux RSS issu du site web du Monde afin d'en extraire le contenu textuel
des balises titres et descriptions. Le programme prend en entrée le nom du dossier-racine 
contenant les fichiers à traiter et le nom de la rubrique à traiter parmi ces fichiers.

Première version : Utilisation des regexp

DOC
#----------------------------------------
my $rep="$ARGV[0]";
my $rubrique="$ARGV[1]";
$rep=~s/[\/]$//;

# ouverture des fichiers INPUT et OUTPUT
# Un fichier au format txt et un xml
open(OUT,">:encoding(utf8)","BAO1_$rubrique.txt");
open(OUTXML,">:encoding(utf8)","BAO1_$rubrique.xml");

# Ecriture des balises XML d'en-tête
print OUTXML "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print OUTXML "<corpus2020>\n";
my %dico_des_titres=();
# ----------------------------------------

# Appel de la fonction parcoursarborescencefichiers
&parcoursarborescencefichiers($rep);

#------------------------------------------

#Ecriture de la balise XML de fin
print OUTXML "</corpus2020>\n";

# Fermeture des fichiers
close OUT;
close OUTXML;
exit;
#------------------------------------------

# Définition de la fonction parcoursarborescencefichiers
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 ignore les rep . et ..
		$file = $path."/".$file; # le . sert a concatener les chaine de caractere 
		if (-d $file) {
		# fonction de récursivité
		&parcoursarborescencefichiers($file);
	}
	if (-f $file) {
		#on traite uniquement les fichiers xml
		if ($file =~/$rubrique.+xml$/) {
			print $i++, " Traitement du fichier ",$file, "\n";
			open(FIC,"<:encoding(utf-8)",$file);
			$/=undef;
			my$textelu=<FIC>;
			close FIC;
			while ($textelu=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg) {
				my $titre=$1;
				my $description=$2;
				if (!(exists $dico_des_titres{$titre})) {
					$dico_des_titres{$titre}=$description;
					
					# Appel du sous-programme de nettoyage
					($titre,$description)=&nettoyage($titre,$description);
					
					# Ecriture des résultats dans les fichiers de sortie
					print OUT $titre,"\n";
					print OUT $description,"\n";
					print OUT "-----------------\n";
					
					# Ecriture des résultats dans les fichiers de sortie XML
					print OUTXML "<item>\n";
					print OUTXML "<titre>$titre</titre>\n";
					print OUTXML "<description>$description</description>\n";
					print OUTXML "</item>\n";
				}
			}
		}
	}
}
}
# --------------------------------------

# Procédure de nettoyage préliminaire des fichiers xml avant le traitement du contenu textuel
sub nettoyage {
	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;
    return $titre,$description;
}
