#/usr/bin/perl
<<DOC;
Nom : Hoby RATSIMBA
JANVIER 2006
 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
#-----------------------------------------------------------
#le nom du répertoire passe en argument au programme
my $rep="$ARGV[0]";
#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
my $DUMPFULL1="";
#----------------------------------------
#on attribue le nom de fichier de sortie XML à la variable $output1
my $output1="fitrage.xml";
#on ouvre le fichier de sortie en mode d'écriture
#si le fichier ne peut pas être ouvert, le message introduit par "die" le signale
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
#----------------------------------------
#on lance le parcours récursif de l’arbre des fils
&parcoursarborescencefichiers($rep);        #recurse!
#----------------------------------------
#on formate la sortie : fichier XML avec entete
#on intègre le contenu de la variable contenant le filtrage
print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Votre nom</NOM>\n";
print FILEOUT "$DUMPFULL1\n";
print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
exit;
#----------------------------------------------
##Procedure de parcours
sub parcoursarborescencefichiers {
    my $path = shift(@_);
    #On ouvre le répertoire
    opendir(DIR, $path) or die "can't open $path: $!\n";
    #On « récupère » le  contenu du répertoire
    my @files = readdir(DIR);
    closedir(DIR);
    #Pour chacun des « éléments » contenus dans le répertoire,
    #on va vérifier son statut (répertoire -d ou fichier -f)
    foreach my $file (@files) {
        next if $file =~ /^\.\.?$/;
        #On écrit le chemin complet de l’ « élément »
        $file = $path."/".$file;
        #Si l’ « élément » est un répertoire (-d = directory) : on relance le parcours
        if (-d $file) {
            &parcoursarborescencefichiers($file);        #recurse!
        }
        #Si l’ « élément » est un fichier (-f = file)  : on lance le traitement de filtrage
        #dont le résultat est attribué à la variable $DUMPFULL1;
        #on verifie si "élément" est un fichier
        if (-f $file) {
                #si oui, on l'ouvre
                #et on l'associe à un pointeur FIC et à une variable $file;
                open(FIC, $file);
                #on commence à formater la sortie XML:
                #pour que la variable $DUMPFULL1 imprime chaque fois le résultat du traitement, on ajoute ".", l'opérateur de concaténation;
                $DUMPFULL1 .= "<FICHIER>\n<NOM>$file</NOM>\n";
                #parcours du fichier est associé au pointeur FIC;
                #Chaque ligne est stockée dans la variable $ligne;
                while ($ligne=<FIC>)
                {
                        #On vérifie si la ligne contient le motif ci-dessous;
                        ###Syntaxe de l'expession régulière:
                        #l'opérateur conditionnel =~ signifie "ressemble à"
                        #(.*) = on cherche un caractère quelconque sauf fin de ligne qui apparait 0 ou n fois
                        #g = on cherche dans tout le texte
                        #on n'oublie pas de despécialiser avec l'anti-slash le slash dans la balise fermante
                        if ($ligne=~/<description>(.*)<\/description>/g) {
                        #vu que $1 est une variable par défaut (elle désigne le contenu entre parenthèses)on préfère la remplacer par une variable locale;
                        my $var=$1;
                        #si la ligne contient le motif indiqué ci-dessus, on procède au remplacement des caractères accentués "mal affichés";
                        $var=~ s/&#38;#39;/'/g;
                        $var=~ s/&#38;#34;/"/g;
                        $var=~ s/&#234;/ê/g;
                        $var=~ s/Ã©/é/g;
                        $var=~ s/Ã§/ç/g;
                        $var=~ s/Ã¨/è/g;
                        $var=~ s/Ã/à/g;
                        $var=~ s/à´/ô/g;
                        $var=~ s/&#233;/é/g;
                        #on continue à formater la sortie par rajout du contenu des balises <description>
                        $DUMPFULL1 .= "<CONTENU>$var</CONTENU>\n";
                        }
                }
                #on ferme la balise <FICHIER> qui boucle le résultat du traitement de chaque fichier;
                $DUMPFULL1 .= "</FICHIER>\n";
                #on utilise le "compteur" de fichiers qui s'affiche sur l'écran pour s'assurer de la progression du traitement;
            print $i++,"\n";
        }
    }
}
#---------------------------------------------- 