#/usr/bin/perl
<<DOC; 
Egle Ramdani 
FEVRIER 2006
Usage : perl filtrage-description.pl repertoire-a-parcourir
Le programme prend en entrée le nom du répertoire contenant les fichiers à traiter puis
en extrait le contenu des balises <description>. 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

# récupération du nom du répertoire -----------------------------------------------------------
my $rep="$ARGV[0]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;

# ouverture et entête du fichier XML ----------------------------------------------------------
open (FILEOUT,">filtrage-out.xml");
print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<ETIQUETEUR>Egle Ramdani</ETIQUETEUR>\n";

# lancement de procédure qui parcours l'arborescence-------------------------------------------
&parcoursarborescencefichiers($rep);

# fermeture du fichier XML --------------------------------------------------------------------
print FILEOUT "</PARCOURS>";
close(FILEOUT);
exit;

# procédure qui parcours une arborescence en recherche des fichiers ---------------------------
sub parcoursarborescencefichiers {
    # récupération du chemin du dossier à parcourir
    my $path = shift(@_);
    # ouverture du dossier ou message d'erreur
    opendir(DIR, $path) or die "Impossible d'ouvrir $path: $!\n";
    # lecture du dossier et affectation des items trouvés à un tableau scalaire
    my @items = readdir(DIR);
    # fermeture du dossier
    closedir(DIR);
    # pour chaque item trouvé on fait le suivant:
    foreach my $item (@items) {
        # on donne à l'item le chemin à partir du dossier initial
        $item = $path."/".$item;
        # si l'item en question est un dossier, on répète le traitement effectué
        if (-d $item) {
            # récursion 
            &parcoursarborescencefichiers($item);
        }
        # si l'item en question est un fichier, on appelle une autre procédure
        # qui traite les fichiers trouvés
        if (-f $item) {
            &traitement($item);
        # on affiche à l'écran le numéro du fichier ayant subi le traitement
        print $i++,"\n";
        }
    }
}

# traitement de l'information contenue dans les fichiers---------------------------------------
sub traitement {
    # récupération du nom de fichier à traiter
    my $fichier = shift;
    # ouverture du fichier en lecture
    open(FILEIN,"$fichier");
    # impression du nom du fichier dans le fichier de sortie
    print FILEOUT "<FICHIER><NOM>$fichier</NOM><CONTENU>";
    while (my $ligne = <FILEIN>){
        # remplacements pour résoudre les problèmes du codage et du format du fichier
        if ($ligne=~/<description>([^<]+)<\/description>/) {
            $des = $1;
            $des=~s/&\#38\;\#39\;/\'/g;
            $des=~s/&\#38\;\#34\;/<![CDATA ["]]>/g;
            $des=~s/&\#233\;/é/g;
            $des=~s/&\#234\;/ê/g;
            $des=~s/àª/ê/g;
            $des=~s/é/é/g;
            $des=~s/ô/ô/g;
            $des=~s/è/è/g;
            $des=~s/Ã/à/g;
            $des=~s/à§/ç/g;
            # impression du contenu du balise description traité 
            print  FILEOUT "$des";
        }
    }
    # fin du balise fichier
    print FILEOUT "</CONTENU></FICHIER>\n";
    close (FILEIN);
}