#/usr/bin/perl
#On utilise une bibliothèque permettant de convertir les données textuelles en utf-8
use Unicode::String qw(utf8);
#################
# DOCUMENTATION #
#################
<<DOC
Ilaria Tiddi & Julie Sauvage & Kelly Masclef

FÉVRIER 2011

                usage : perl scriptarborescence.pl repertoire-a-parcourir
Le programme prend en entree le nom du repertoire contenant les fichiers à traiter

Le programme demande à l'utilisateur quelle rubrique traiter, seule la rubrique choisie sera traitée.

Le programme construit en sortie plusieurs types de fichiers:
*Le programme construit en sortie un fichier XML structuré comme ci-dessous:
<FICHIERS>
    <FICHIER>
        <NOM>du fichier</NOM>
        <DATE>date</DATE>
        <ARTICLES rub="numéro de la rubrique">
            <ARTICLE num="numéro de l'article">
                <TITRE>Titre de l'article</TITRE>
                <RESUME>Résumé de l'article</RESUME>
            </ARTICLE>
        </ARTICLES>
    </FICHIER>
    <FICHIER>
        ...
    </FICHIER>
</FICHIERS>

*Le programme construit en sortie un fichier TXT structuré comme ci-dessous:
TITRE: titre de l'article
RESUME: Résumé de l'article

DOC

#-----------------------------------------------------------
########################
# Travail préparatoire #
########################
#-----------------------------------CHOIX DE LA RUBRIQUE-----------------------------------
#On demande à l'utilisateur quelle est a rubrique à traiter
print "Quelle rubrique voulez-vous traiter?\n
Tapez sur le numero de la rubrique désirée:\n
\e[1;32;40m1.\e[0m\t\e[1;33;40mA la une\e[0m\t\e[1;32;40m6.\e[0m\t\e[1;33;40mMedias\e[0m\t\t\e[1;32;40m11.\e[0m\t\e[1;33;40mLivres\e[0m\n\e[1;32;40m2.\e[0m\t\e[1;33;40mInternational\e[0m\t\e[1;32;40m7.\e[0m\t\e[1;33;40mRendez-vous\e[0m\t\e[1;32;40m12.\e[0m\t\e[1;33;40mExamens\e[0m\n\e[1;32;40m3.\e[0m\t\e[1;33;40mEurope\e[0m\t\t\e[1;32;40m8.\e[0m\t\e[1;33;40mSports\e[0m\t\t\e[1;32;40m13.\e[0m\t\e[1;33;40mCinema\e[0m\n\e[1;32;40m4.\e[0m\t\e[1;33;40mSociété\e[0m\t\t\e[1;32;40m9.\e[0m\t\e[1;33;40mPlanete\e[0m\t\t\e[1;32;40m14.\e[0m\t\e[1;33;40mVoyages\e[0m\n\e[1;32;40m5.\e[0m\t\e[1;33;40mOpinions\e[0m\t\e[1;32;40m10.\e[0m\t\e[1;33;40mCulture\e[0m\t\t\e[1;32;40m15.\e[0m\t\e[1;33;40mTechnologies\e[0m\n";

# on initialise une variable $rub contenant le numéro de la rubrique récupérée via l'entrée standard
$rub =<STDIN>;
#On enlève le retour chariot
chomp($rub); #à noter que chop($rub) enlèverait aussi le retour chariot, cependant chop enlève le dernier élément quel qu'il soit alors que chomp enlève seulement le retour chariot
# on initialise une variable $numRub qui va contenir le numéro de la rubrique
my $numRub="";
#La requête est associée à une rubrique
if ($rub eq 1) {$numRub="3208";$nomRub="A_la_une";}
elsif ($rub eq 2) {$numRub="3210";$nomRub="International";}
elsif ($rub eq 3) {$numRub="3214";$nomRub="Europe";}
elsif ($rub eq 5) {$numRub="3224";$nomRub="Opinions";}
elsif ($rub eq 4) {$numRub="3232";$nomRub="Societe";}
elsif ($rub eq 6) {$numRub="3236";$nomRub="Medias";}
elsif ($rub eq 7) {$numRub="3238";$nomRub="Rendez-vous";}
elsif ($rub eq 8) {$numRub="3242";$nomRub="Sports";}
elsif ($rub eq 9) {$numRub="3244";$nomRub="Planete";}
elsif ($rub eq 10) {$numRub="3246";$nomRub="Culture";}
elsif ($rub eq 11) {$numRub="3260";$nomRub="Livres";}
elsif ($rub eq 12) {$numRub="3404";$nomRub="Examens";}
elsif ($rub eq 13) {$numRub="3476";$nomRub="Cinema";}
elsif ($rub eq 14) {$numRub="3546";$nomRub="Voyage";}
elsif ($rub eq 15) {$numRub="651865";$nomRub="Technologies";}
else {print "Je n'ai pas compris votre requête\n";}
#------------------------------------------------------------------------------------------
#--------------------------------------TRAITEMENT DU RÉPERTOIRE----------------------------
#Le répertoire est celui précisé en premier argument
my $rep="$ARGV[0]";
# on s'assure que le nom du repertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
#------------------------------------------------------------------------------------------
#---------------------------------------CRɉATION DES FICHIERS EN SORTIE--------------------
#On crée un fichier pour chaque sortie différente (TXT, XML)
if (!open (FILEOUTXML,">:encoding(utf-8)","SORTIE-$nomRub.xml")) { die "Problème à l'ouverture du fichier SORTIE-$nomRub.xml"};
#On encode en iso-8859-1 la sortie TXT afin de pouvoir faire le traitement avec Cordial qui ne prend pas l'UTF-8
if (!open (FILEOUTTXT,">:encoding(iso-8859-1)","SORTIE-$nomRub.txt")) { die "Problème à l'ouverture du fichier SORTIE-$nomRub.txt"};
#On écrit l'entête du fichier XML ainsi que l'élément racine
print FILEOUTXML "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!DOCTYPE FICHIERS SYSTEM \"filrss.dtd\">\n<?xml-stylesheet type=\"text/xsl\" href=\"xslprova.xsl\"?>\n<FICHIERS>\n";
#------------------------------------------------------------------------------------------
###########################
# Traitement des fils RSS #
###########################
#------------------LANCEMENT DE LA PROCÉDURE DE PARCOURS SUR LE RɉPERTOIRE-----------------
&parcoursarborescencefichiers($rep);
#On ferme l'élément racine
print FILEOUTXML "</FICHIERS>\n";
#On ferme le fichier en sortie
close(FILEOUTXML);
exit;
#------------------------------------------------------------------------------------------
#------------------LANCEMENT DE TREETAGGER-------------------------------------------------
#&etiqtreetagger($SORTIETREE);
#exit;
#------------------------------------------------------------------------------------------
###########################
#        Procédures       #
###########################
#--------------------------PARCOURS DE L'ARBORESCENCE--------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_); #vide la premiere ligne du tableau: "_" contient 2008
    opendir(DIR$pathor die "Je ne peut pas ouvrir $path: $!\n"# on definit un pointeur de repertoire
    #die permet de sortir: comme exit
    my @files = readdir(DIR); #lire le contenu du repertoire et utilise le poiteur du repertoire
    # renvoie une liste des elements constitutifs des elements du repertoire= @files  
    closedir(DIR);

    foreach my $file (@files) {
    #chaque element de la liste:un traitement different
        next if $file =~ /^\.\.?$/;# passer au suivant si le fichier n'existe pas
        $file = $path."/".$file#heritage du chemin pere
        if (-d $file) { #appliquer la fonction si la ressource est un repertoire/un fichier: -d (applique àun repertoire), -f (un fichier)
            &parcoursarborescencefichiers($file);   #recurse!
        }
        
        #On stocke dans la variable $name, le chemin+le nom du fichier
        $name="$path/0,2-$numRub,1-0,0\.xml";

        #On récupère le fichier correspondant à la bonne rubrique et qui finit par .xml
        if ((-f $file) && ($file =~ /0,2-$numRub,1-0,0\.xml$/)) {
            #On affiche le fichier + compteur sur la console
            print "$file : \e[1;31;40m",$i++,"\e[0m\n";
            #On ouvre le fichier traité qui pointe sur FILE
            open(FILE,$file);
            #-----------on récupère l'encodage du fichier----------
            while (my $ligne=<FILE>) {
                #On pourrait se servir de la fonction file -i mais celle-ci ne fonctionne pas à tous les coups
                #On récupère donc l'encodage via une expression régulière
                #L'encodage se trouve entre "" ou ' ' 
                if ($ligne =~ /encoding=["|'](.*?)['|"]\?/){
                    $encodage=$1;
                    #On affiche l'encodage
                    print "\e[1;34;40m$encodage\e[0m\n";
                }
            }
            #On ferme le fichier
            close(FILE);
            #------------------------------------------------------
            #On ouvre le fichier cette fois en précisant l'encodage récupéré pour l'ouverture
            open(FILE,"<:encoding($encodage)"$file);
            #Tant qu'il y a des lignes dans le fichier {instructions}
            while (my $ligne=<FILE>) {
                #On formate le flux textuel afin que tous les fils soient sur une seule ligne et non plusieurs
                $ligne =~ s/\n//g;
                #On concatène le tout dans une variable $texte
                $texte .= $ligne;
            }
            #On initialise un compteur qui va nous permettre d'attribuer un numéro pour chaque article
            $i=0;
            
            #On formate le texte
            $texte =~ s/> *</></g;
            
            #On récupère la date
            $texte=~/<pubDate>([^<]+)<\/pubDate>/;
            #On stocke la date dans une variable $date
            my $date=$1;
            
            #On supprome les balises CDATA
            $texte =~ s/<!\[CDATA\[//g;
            $texte =~ s/\]\]>//g;
            
            if (uc($encodagene "UTF-8") {utf8($date);}
            #On écrit dans le fichier en sortie le début du contenu XML
            print FILEOUTXML "<FICHIER>\n";
            print FILEOUTXML "<NOM>$name</NOM>\n";
            print FILEOUTXML "<DATE>".$date."</DATE>\n";
            print FILEOUTXML "<ARTICLES rub=\"$nomRub\">\n";

            
#--------------------------FILTRAGE DU TEXTE-----------------------------------------------
            #Tant que $texte contient l'expression {INSTRUCTIONS}
            while ($texte =~ /<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/g) {
                #On récupère le titre et le résumé de l'item
                my $titre=$1;
                my $resume=$2;
                if (uc($encodagene "UTF-8") {utf8($titre);utf8($resume);}
                #On nettoie le titre et le résumé grâce à la procédure nettoietexte
                $titre = &nettoietexte($titre);
                $resume = &nettoietexte($resume);
                
                #Si la clef du titre n'existe pas et si le titre ne contient rien {INSTRUCTIONS}
                if ((!(exists($LISTEXML{$titre})))&&($titre ne "")) {
                    #On incrémente le compteur
                    $i++;
                    #On écrit les sorties nécessaires dans les fichiers
                    #On met sur une ligne chaque article avec son titre précédé d'un mot qui ne pourra pas être décomposé par Cordial
                    #Sur la même ligne on met le résumé précédé lui aussi d'un mot ne pouvant être analysé
                    print FILEOUTTXT "ARTICLERSS $titre $resume\n";
                    #On écrit la sortie XML au bon format
                    print FILEOUTXML "<ARTICLE num=\"$i\"><TITRE>$titre</TITRE><RESUME>$resume</RESUME></ARTICLE>\n";

                    #On définit à 1 la valeur de la clef de $titre
                    $LISTEXML{$titre}=1;
                }
            }
            #On ferme les dernières balises dans le fichier XML en sortie
            print FILEOUTXML "</ARTICLES>\n</FICHIER>\n";
        }
    }
}
#------------------------------------------------------------------------------------------         
#-------------------------NETTOYAGE DU TEXTE-----------------------------------------------
#Ici on a nettoyer le texte
sub nettoietexte {
    my $texte=shift;
    $texte =~ s/</</g#On remplace &lt par l'élément correspondant
    $texte =~ s/>/>/g;
    $texte =~ s/<a href[^>]+>//g;
    $texte =~ s/<img[^>]+>//g;
    $texte =~ s/<\/a>//g;
    $texte =~ s/&#39;/'/g;
    $texte =~ s/&/&/g;
    $texte =~ s/&#39;/'/g;
    $texte =~ s/'/'/g;
    $texte =~ s/&#34;/"/g;
    $texte =~ s/&#34;/"/g;
    $texte =~ s/"/"/g;
    $texte =~ s/[/[/g;
    $texte =~ s/]/]/g;
    #$texte =~ s/í/'/g;
    $texte =~ s/<[^>]+>//g#On supprime les balises fermantes
    $texte =~ s/ //g#On supprime les blancs
    return $texte;
}