#/usr/bin/perl
use XML::RSS;
# perl parcours-arborescence-fichiers-ORIGINE.pl 2016 3208

<<DOC; 
Votre Nom : POULAIN
JANVIER 2016
 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
print "-----------------------------------------------------------\n";
print "------------------DEBUT DU PROGRAMME -----------------------\n";
print "-----------------------------------------------------------\n";
#-----------------------------------------------------------
# variable contenant le nom du dossier à parcourir par le programme donné par l'utilisateur
my $rep="$ARGV[0]";
# variable contenant le numéro qui correspond à une rubrique dans les noms de fichiers pour pouvoir séparer les contenu par rubrique
my $rubrique="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# on initialise une pile qui nous permettra de vérifier que l'article n'a pas déjà été extrait, pour éviter les doublons
my %dico;
#----------------------------------------
# configuration du fichier de sortie
my $output0="$rubrique-perl.txt";
if (!open (FILEOUT,">:encoding(utf-8)","$output0")) { die "Pb a l'ouverture du fichier $output0"};
close(FILEOUT);
my $output1="$rubrique-perl.xml";
if (!open (FILEOUT,">:encoding(utf-8)","$output1")) { die "Pb a l'ouverture du fichier $output1"};
# préparation du fichier selon la syntaxe xml
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Mathilde</NOM>\n";
close(FILEOUT);

my $output2="$rubrique-PROF-perl.txt";
if (!open (FILEOUT2,">:encoding(utf-8)","$output2")) { die "Pb a l'ouverture du fichier $output0"};
close(FILEOUT2);
# my $output2="$rubrique-PROF.xml";
# open (PRO2, ">$rubrique-PROF.xml");
# print PRO2 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
# print PRO2 "<PARCOURS>\n";
# print PRO2 "<NOM>Mathilde</NOM>\n";
# close(PRO2);
#---------------------------------------- APPEL DU SOUS PROGRAMME
&parcoursarborescencefichiers($rep);	# on lance la récursion.... et elle se terminera après examen de toute l'arborescence
#---------------------------------------- FIN DU SOUS PROGRAMME
# fin du fichier xml selon la syntaxe approprié pour avoir un fichier xml bien formé
open (FILEOUT, ">>:encoding(utf-8)", $output1);
print FILEOUT "</PARCOURS>\n";
# open (PRO2, ">>:encoding(utf-8)", $output2);
# print PRO2 "</PARCOURS>\n";
exit;
#---------------------------------------------- SOUS PROGRAMME QUI PARCOURT L'ARBORESCENCE
sub parcoursarborescencefichiers 
{
    # RÉCUPÉRATION DE LA VARIABLE CONTENANT LE CHEMIN DE CHAQUE DOSSIER
    my $path = shift(@_);
    opendir(DIR, $path) or die "can't open $path: $!\n";
    # OUVERTURE ET PARCOUR DE TOUS LES RÉPERTOIRES
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (@files) 
    { # POUR CHAQUE FICHIER À L'INTÉRIEUR DES DOSSIERS
		# PASSER SI LE NOM DE FICHIER EST . OU .. CELA SIGNIFIE QU'IL LE NOM DE FICHIER CORRESPOND EN FAIT AU CHEMIN DU REPERTOIRE COURANT OU DU REPERTOIRE PARENT, DONC PERMET D'ÉVITER UNE BOUCLE INFINIE
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file; # renommer le chemin relatif du dossier par rapport ou je suis pour pouvoir le retrouver
		if (-d $file) 
		{ # test si $file est un répertoire ou non
			# SI C'EST UN REPERTOIRE, ON L'AFFICHE ET ON LE PARCOURT AVEC LE SOUS PROGRAMME -> RECURSIVITÉ
			print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
			&parcoursarborescencefichiers($file);	#recurse! récursivité de la procédure
			print "<FIN REPERTOIRE> ==> ",$file,"\n";
		}
		if (-f $file) 
		{ # test si $file est un fichier ou pas
		# SI C'EST UN FICHIER, ON LANCE LE PROGRAMME DE TRAITEMENT DES FICHIERS
			if ($file =~ /$rubrique.+\.xml$/)
			{ # ON CHERCHE LES FICHIERS XML UNIQUEMENT ET QUI CONTIENNENT LE NOM DE LA RUBRIQUE QUE L'ON SOUHAITE
				#       TRAITEMENT à réaliser sur chaque fichier
				# ON OUVRE LE FICHIER DAS UNE VARIABLE $FILE
				print "<",$i++,"> ==> ",$file,"\n";
				$codage="utf-8";
				open (FIC, "<:encoding($codage)", $file);
				# ON OUVRE UN FICHIER DE SORTIE EN TXT
				open (OUT, ">>:encoding($codage)", "$rubrique-perl.txt");
				# ON OUVRE UN FICHIER DE SORTIE EN XML
				open (OUT2, ">>:encoding($codage)", "$rubrique-perl.xml");
				# ON INITIALISE LA VARIABLE $TEXTE QUI VA CONTENIR CE QUI NOUS INTERESSE DANS LE CONTENU DU FICHIER
				
				# -------------------------extraction des infos par xml::rss--------------------------
				my $rss = new XML::RSS;
				# ------------------------------------------------------
				my $TEXTEDUFILXML="";
				$TEXTEDUFILXML="<FILE name=\"$file\">\n";
				# ------------------------------------------------------
				$rss->parsefile($file);
				my $nombredechampsdescription = 0;

				foreach my $item(@{$rss->{'items'}}) {
					$nombredechampsdescription++;
					$TEXTEDUFILXML.= "<article id=\"$nombredechampsdescription\">\n";
					my $titre=$item->{'title'};
					my $description=$item->{'description'};
					print OUT "TITRE = $titre\n";
					print OUT "DESCRIPTION = $description\n";
				    $TEXTEDUFILXML="<titre>".$titre."</titre>\n";
				    $TEXTEDUFILXML="<description>".$description."</description>\n";
				    print OUT2 "<titre>".$titre."</titre>\n";
				    print OUT2 "<description>".$description."</description>\n";
				}
					
				# ------------------------------------------------------
				$TEXTEDUFILXML="</FILE>\n";
				
				
# 				print OUT $TEXTEDUFILXML;
# 				print OUT2 $TEXTEDUFILXML;
				
				# ON FERME LES DEUX FICHIERS DE SORTIE
				close OUT;
				close OUT2;
				
				
				#	Fin du filtreur
				# ON INCREMENTE LE COMPTEUR DE FICHIER
			}
			
			# TRAITEMENT DE LA PROFONDEUR
			
		}
    }
}