#/usr/bin/perl
<<DOC; 
Nom : Sarah Terrail-Lormel
JANVIER 2008
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
 Le programme prend en entrée le nom du répertoire contenant les fichiers
 à traiter
 Le programme construit en sortie un fichier XML contenant sur chaque
 ligne le résultat du filtrage :
<PARCOURS><NOM>de l'auteur</NOM><FILTRAGE>contenu du filtrage</FILTRAGE></PARCOURS>
DOC
#-----------------------------------------------------------variable contenant le nom du répertoire contenant l'arborescence de fils
our $rep="2008";
#-----------------------------------------------------------variable contenant le nom du répertoire de sortie
our $resultat="resultats";
# -----------------------------------------------------------on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
#---------------------------------------- création d'une table de hachage (clef=code de la rubrique ; valeur=nom de la sortie xml)
my %F=("3208" =>"a_la_une.xml",
		"3210"=>"international.xml",
		"3214"=>"europe.xml",
		"3224"=>"societe.xml",
		"3232"=>"opinions.xml",
		"3234"=>"economie.xml",
		"3236"=>"medias.xml",
		"3238"=>"rdv.xml",
		"3242"=>"sports.xml",
		"3244"=>"environnement_sciences.xml",
		"3246"=>"culture.xml",
		"3476"=>"cinema.xml",
		"3260"=>"livres.xml",
		"3404"=>"examens.xml",
		"3546"=>"voyages.xml",
		"823353"=>"politique.xml",
		"651865"=>"technologies.xml");
#---------------------------------------- parcours des clefs de la table de hachage : pour chacune, lancement de la procédure de création du fichier XML de sortie et de son "entête"
my @rub = keys(%F);
my $clef;
foreach $clef (keys(%F))
{
	my $nom_fich=$F{$clef};
	&entete_fich_xml_rubrique($nom_fich);
}
#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse!
#----------------------------------------  parcours des clefs de la table de hachage : pour chacune, création de la fin du fichier XML
foreach $clef (keys(%F))
{
	my $nom_fich=$F{$clef};
	&pied_fich_xml_rubrique($nom_fich);
}
exit;

######################## DEFINITIONS DES PROCEDURES ########################
###----------------------------------------------Procédure qui parcours les fichiers et les traite
sub parcoursarborescencefichiers 
{
#	PARCOURS de l'arborescence (récursif):
    my $path = shift(@_);
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);							# récupération des éléments du répertoire dans un tableau @files
    closedir(DIR);
    foreach my $file (@files)							# parcours des éléments du tableau
	{
		next if $file =~ /^\.\.?$/;						# on zappe ceux qui s'appellent . ou ..
		$file = $path."/".$file;
		
		if (-d $file)									# s'il s'agit d'un répertoire : relancer la procédure de parcours
		{
			&parcoursarborescencefichiers($file);
		}
		
		my $text_t="";									# initialisation des deux variables qui vont contenir le flux de sortie
		my $text_d="";
		
		if (-f $file)									# s'il s'agit d'un fichier : lancer le traitement
		{	
#       TRAITEMENT réalisé sur chaque fichier :
			if ($file=~/\w+.xml/)						# on ne traite que les documents XML
			{
				open(FILEINPUT,"$file");
				while ($ligne=<FILEINPUT>)
				{
					$ligne=&net_codage($ligne);			# lancement de la procédure de "nettoyage"
					
					if ($ligne=~/<title>(.*)<\/title>/) 
					{
						$text_t.= "$1 \n";				# récupère le contenu des balises TITLE
					}
					if ($ligne=~/<description>(.*)<\/description>/)
					{
						$text_d.= "$1 \n";				# récupère le contenu des balises DESCRIPTION
					}
				}
			}
		}
		
		foreach $clef (keys(%F))
		{
			if ($file =~ /$clef/)						# si le nom fichier contient un numéro de rubrique connu
			{
				$nom_fich=$F{$clef};
				if (!open (FILEOUT,">>$resultat/$nom_fich")) { die "Pb a l'ouverture du fichier $nom_fich"};
				print FILEOUT $text_t,$text_d;
				close(FILEOUT);
			}
		}
	}
}
### ---------------------------------------------- Procédure qui produit l'entete XML
sub entete_fich_xml_rubrique
{
    my $nom_fich = shift(@_);
	system("mkdir -p ./resultats");						# création du répertoire de sortie
	if (!open (FILEOUT,">$resultat/$nom_fich")) { die "Pb a l'ouverture du fichier $nom_fich"};
	print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n"; # impression de l'en-tête XML
	print FILEOUT "<PARCOURS>\n";						# ouverture de l'élément-racine
	print FILEOUT "<NOM>Sarah Terrail-Lormel</NOM>\n";
	print FILEOUT "<FILTRAGE>\n";						# ouverture de l'élément contenant le filtrage
	close(FILEOUT);
}
#---------------------------------------------- Procédure qui produit le pied de page XML
sub pied_fich_xml_rubrique
{
    my $nom_fich = shift(@_);
	if (!open (FILEOUT,">>$resultat/$nom_fich")) { die "Pb a l'ouverture du fichier $nom_fich"};
	print FILEOUT "</FILTRAGE>\n";						# ouverture de l'élément contenant le filtrage
	print FILEOUT "</PARCOURS>\n";						# fermeture de l'élément-racine
	close(FILEOUT);
}
###------------------------------------------ Procédure qui nettoye les pb de codage 
sub net_codage
{
my $ligne=shift(@_);
$ligne=~s/&#38;#39;/'/g;								# remplacement des entités HTML
$ligne=~s/&#38;#34;/"/g;
$ligne=~s/&#34;/"/g;
$ligne=~s/&#39;/'/g;
$ligne=~s/&#38;/&/g;
$ligne=~s/Le Monde.fr.*\n//g;							# suppression des éléments <title> et <description> non désirés
$ligne=~s/Retrouvez l'ensemble.*\n//g;
$ligne=~s/Toute l'actualité au.*\n//g;
return ($ligne);
}