#/usr/bin/perl
<<DOC; 
Votre Nom : Anna ANDRYCH, Marie SADOU 
JANVIER 2009
 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 structuré contenant sur chaque
 ligne le nom du fichier et le résultat du filtrage :
<FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>du filtrage</CONTENU></FICHIER>
DOC
#-----------------------------------------------------------
my $rep="$ARGV[0]";
%tableaudeslignes=(); # création d'un tableau des lignes pour les mémoriser
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# on initialise une variable contenant le flux de sortie = valeur de la racine de l'arborescence
my $DUMPFULL1=""; # $DUMPFULL1 est une variable qui concatène en sortie l'ensemble des extractions. C'est une chaîne de caractères.
#----------------------------------------
my $output1="SORTIE-culture.txt"; # $OUTPUT1 est une variable contenant le fichier en sortie = "SORTIE-culture.txt"
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
#----------------------------------------
&parcoursarborescencefichiers($rep);	# recurse!
#----------------------------------------
close(FILEOUT);
exit;
#----------------------------------------------
sub parcoursarborescencefichiers { # "sub" permet de définir un sous-programme
    my $path = shift(@_); # on récupère le premier élément du tableau dans la variable $path puisqu'on a besoin de tous les arguments de la liste. "@_"  stocke l'ensemble des arguments passés en paramètre à un sous-programme.
    opendir(DIR, $path) or die "can't open $path: $!\n"; # "opendir" permet d'ouvrir un répertoire
    my @files = readdir(DIR); # "readdir" donne l'ensemble des ressources du répertoire lu qui sont mises dans la variable $files
    closedir(DIR); # "closedir" ferme le répertoire
    foreach my $file (@files) { # pour chaque ressources du répertoire, on crée la variable $file et on vérifie le statut de chaque élément
	next if $file =~ /^\.\.?$/; # si le fichier est nommée "." ou "..", on passe au suivant.
	$file = $path."/".$file; # on réécrit le chemin complet de la ressource sur laquelle on se trouve (à partir du point de départ du programme). Si la ressource est un fichier, on lance le traitement de filtrage. Si c'est un répertoire, on relance le parcours.
	if (-d $file) { # "-d" permet de repérer des répertoires. Si $file est un répertoire, on relance le parcours.
	    &parcoursarborescencefichiers($file);	# recurse! ---- sous-programme
	} 
	if (-f $file) { # "-f" permet de repérer les fichiers.

		if($file=~/0,2-3246,1-0,0.xml/) { # pour traiter uniquement les fichiers XML de la rubrique Culture (une nouvelle boucle s'ouvre)
			open(FILEIN,"$file"); # ouverture du fichier en lecture
			$i=1; # début du compteur à 1
			print $file, "\n"; # on verra s'afficher dans la fenêtre de commande les fichiers traités au fur et à mesure
			while ($ligne = <FILEIN>){ # boucle WHILE qui lit le fichier en lecture

			if ($ligne=~/<description>([^<]+)<\/description>/) { # boucle IF avec l'expression régulière qui cherche les chaînes de caractères situées entre les balises de <description>
				
				my $recup=$1; # on crée la variable "recup" qui réfère à $1 (c'est pour les problèmes d'encodages qui apparaissent)
				if ($recup=~/^(.+)&lt;img width='1' height='1'.*$/) {$recup=$1};
				$recup=~s/&#38;#39;/\'/g; # commande de recherche-remplacement pour '
				$recup=~s/&#38;#34;/\"/g; # # commande de recherche-remplacement pour "
				$recup=~s/&#233;/é/g; # commande de recherche-remplacement pour é
				$recup=~s/&#234;/è/g; # commande de recherche-remplacement pour è
				$recup=~s/&amp;eacute;/é/g;
                $recup=~s/&amp;egrave;/è/g;
				$recup=~s/&amp;ecirc;/ê/g;
				$recup=~s/&amp;euml;/ë/g;
				$recup=~s/&amp;iuml;/ï/g;
                $recup=~s/&amp;icirc;/\î/g;
                $recup=~s/&amp;ocirc;/\ô/g;
                $recup=~s/&amp;ccedil;/\ç/g;
                $recup=~s/&amp;agrave;/\à/g;
				$recup=~s/&amp;acirc;/â/g;
				$recup=~s/&amp;uuml;/ü/g;
				$recup=~s/&amp;ucirc;/û/g;
				$recup=~s/&amp;ugrave;/ù/g;
				$recup=~s/&amp;Ouml;/Ö/g;
                $recup=~s/&#38;/&/g;
                $recup=~s/&lt;/\</g;
                $recup=~s/&gt;/\>/g;
				next if $recup =~/Toute *l.*actualit.* *au *moment *de *la *connexion/; # suppression des lignes "Toute l'actualité au moment de la connexion"
				next if $recup =~/Retrouvez *l.*ensemble *des/; # suppression des lignes "Retrouvez l'ensemble des dépèches sur http://www.lemonde.fr"
				next if $recup =~/Lisez *l.*int.*gralit.* *de *l.*article *pour *plus *d.*information./; # suppression des lignes "Lisez l'intégralité de l'article pour plus d'information."
				
				if (exists($tableaudeslignes{$recup})) { # si la ligne récupérée dans $recup existe dans le tableau des lignes. La fonction "exists" sert à interroger une clé du tableaudeslignes.
					$tableaudeslignes{$recup}++; # la fréquence de la ligne rencontrée augmente 
				}
				else { # sinon 
					$tableaudeslignes{$recup}=1; # il donne le numéro 1 à la fréquence de la ligne traitée
				$i++; # on ajoute 1 au i précédent
				print FILEOUT "$recup \n"; # on imprime la chaîne de caractères des descritpion en les numérotant
					} # fin de la boucle IF ($ligne)
					
					} # fin de boucle IF ($recup)
					} # fin de WHILE

		close(FILEIN); # fermeture du fichier en lecture
		
		
	} # fin de IF ($file=~/.xml/)
	} # fin de IF (-f $file)
    } # fin de FOREACH
} # fin de "sub"
#----------------------------------------------
