- <<DOC; 
- Uyên-To DOAN-RABIER 
- Ruixin HE 
- Mohamed Sofiane KERROUA 
-   
- BàO - LibXML 
-   
- En utilisant des expressions régulières et le module LibXML, produit en sortie des fichiers contenant les résumés de fils rss  
- contenus dans des fichiers xml dans une arborescence donnée. 
-   
- usage : bao1_libxml.pl nom_du_répertoire 
-   
- DOC 
-   
- #/usr/bin/perl 
- #use strict; 
- #use warnings; 
- use-  Unicode ::String qw(- utf8 );
 
- use XML::LibXML; 
-   
- #----------------------------------------------------------- 
- # Procédure principale 
- #----------------------------------------------------------- 
- #Les fichiers sont créés dans un répertoire "resultat" 
-   
- #----------------------------------------------------------- 
- # on initialise une variable $rep contenant le flux de sortie  
- my $rep="$ARGV[0]"; 
- # on s'assure que le nom du répertoire ne se termine pas par un "/" 
- $rep=~ s/[\/]$//; 
-   
- #----------------------------------------------------------- 
- # Initialisation d'un tableau de hash évitant la répétition du contenu des fils rss 
- my %tabcontenu = (); 
- &parcoursarborescencefichiers($rep);    #recurse! 
-   
- #----------------------------------------------------------- 
- $cheminrep ="./resultat"; 
- # On ouvre le répertoire "résultat" contenant les fichiers de sortie xml et txt 
- # On ajoute à chaque fichier xml la balise fermante </file> 
- # On convertit chaque fichier txt en iso-8859-1 et on le place dans le dossier cordial 
- opendir(- DIRS ,$cheminrep) or die "can't open $cheminrep: $!\n";
 
- foreach my $fichier(@files){ 
-     next if $fichier =~ /^\.\.?$/; 
-             # A chaque fichier xml crée en sortie on ajoute la balise fermante </file> 
-             if($fichier =~/\.xml$/){ 
-                 open(- OUT ,">>:encoding(utf-8)","./resultat/$fichier");
 
-             } 
- } 
-   
-   
- #----------------------------------------------------------- 
- # Procédure "parcoursarborescencefichiers" 
- # Parcours une arborescence et traite chaque fichier xml contenant des fils rss  
- # Donnée : un répértoire passé en paramètre par valeur 
- # Résultats : - le résultat du traitement au format txt 
- #             - le résultat du traitement au format xml 
- #             - le résultat du traitement au format xml avec un étiquetage réalisé tree-tagger 
- sub parcoursarborescencefichiers { 
- #----------------------------------------------------------- 
- # Récupération du répertoire et ouverture du répertoire 
-     opendir(- DIR , $path) or die "can't open $path: $!\n";
 
-      
- #----------------------------------------------------------- 
- # Traitement de chaques fichiers contenu dans le répertoire 
-     foreach my $file (@files) { 
-         next if $file =~ /^\.\.?$/; 
-         $file = $path."/".$file; 
- # Si on tombe sur un répertoire on relance la procédure 
-         if (-d $file) { 
-             &parcoursarborescencefichiers($file);   #recurse! 
-         } 
-          
- #-----------------------------------------------------------         
- # Traitement du fichier  
-         if (-f $file) { 
- # Si le fichier est un fichier xml et si ce fichier xml n'est pas un fichier ne contenant pas fils rss on le traite 
-             if(($file=~/\.xml$/) && ($file!~/\/fil.+\.xml$/) && ($file !~/0,2-3404,1-0,0\.xml$/)){ 
-   
- # Initialisation des différentes variables 
-             my $encodage = ""; 
-             my $encodagesortie="utf-8"; 
-             my $texte=""; 
-              
- #----------------------------------------------------------- 
- # Si le fichier est vide pas de traitement 
-             if(-z $file){ 
-                 print "$file est vide pas de traitement\n"; 
-             }else{ 
-              
- #----------------------------------------------------------- 
- # Détection de l'encodage du fichier 
-                 while (my $ligne=<FIC>) { 
-                     $ligne =~ s/\n//g; 
-                     if($ligne =~/(iso-8859-1|utf-8)/ig){ 
-                         $encodage = $1; 
-                     } 
-                 } 
-                  
- #----------------------------------------------------------- 
- # Détection de la
rubrique en mettant le texte sur une ligne, dans le cas ou il n'y a pas
de rubrique ou classe le fichier dans les non-classés    
         
-                 open(- FILE ,"<:encoding($encodage)", $file);
 
-                 my $texte=""; 
-                 while (my $ligne=<FILE>) { 
-                     $ligne =~ s/\n//g; 
-                     $ligne =~ s/\r//g; 
-                     $texte .= $ligne; 
-                      
-                 } 
-                  
-                 if($texte =~/<channel><title>([^<]+)<\/title>/ig){ 
-                     $rubrique = $1; 
-                     $rubrique=~ s/Le ?Monde.fr ?://; 
-                     $rubrique=~s/ ?- ?- Le  ?- Monde\ .- fr //;
 
-                     $rubrique=~ s/ //g; 
-                 } 
-                  
-                  
-                 if($rubrique eq ""){ 
-                     $rubrique = "NONCLASSE"; 
-                 } 
-                  
- #----------------------------------------------------------- 
- # Création des fichiers de sortie 
-                 open(- OUT1 ,">>:encoding(utf-8)","./resultat/$rubrique.txt");
 
-                 open(- OUT2 ,">>:encoding(utf-8)","./resultat/$rubrique.xml");
 
-   
- #----------------------------------------------------------- 
- # Ajout des entêtes et de la balise item dans le fichier de sortie xml 
-                 if(-z OUT2){ 
-                     print-  OUT2  "<?xml version=\"1.0\" encoding=\"$encodagesortie\" ?>\n";
 
-                     print-  OUT2  "<name>$ARGV[0]</name>\n";
 
-                 } 
-   
- #----------------------------------------------------------- 
- # Initialisation de la méthode du module xml::libxml                 
-                 my $input_file= $file; 
-                 my $parser = XML::LibXML->new(); 
-                 my $xp = $parser->parse_file($input_file); 
-   
- #----------------------------------------------------------- 
- # Détection de la
date à l'aide des méthodes du module xml::libxml, ajout de la date dans
le fichier de sortie xml           
   
-                 my $date = ""; 
-                 foreach my $noeud_date ( $xp->findnodes('//channel')->get_nodelist ) { 
-                     $date=$noeud_date->findnodes('//pubDate')->string_value; 
-                     if (uc($encodage) ne "UTF-8") {- utf8 ($date);}
 
-                 } 
-                 print-  OUT2  "<date>$date</date>\n";
 
-   
- #----------------------------------------------------------- 
- # Détection du titre
et du résumé du fils rss à l'aide des méthodes du module xml::libxml
               
-                 foreach my $noeud ( $xp->findnodes('//item')->get_nodelist ) { 
-                     my $titre=$noeud->findnodes('title')->string_value; 
-                     my $resume=$noeud->findnodes('description')->string_value; 
-                      
- #----------------------------------------------------------- 
- # Test sur le titre
du fil rss, si il est déjà contenu dans le tableau de hash on ne le
traite pas               
   
-                     my $test=$titre; 
-                     if(!exists $tabcontenu{$test}){ 
-                      
- #----------------------------------------------------------- 
- # Conversion du titre et du résumé en utf-8 si l'encodage du fichier en entrée ne l'est pas 
-                         if (uc($encodage) ne "UTF-8") {- utf8 ($titre);- utf8 ($resume);}
 
-                          
- #----------------------------------------------------------- 
- # Appel de la fonction "nettoietexte" avec comme paramétres le titre et le résumé 
-                         $titre=&nettoietexte($titre); 
-                         $resume=&nettoietexte($resume); 
-                          
- #----------------------------------------------------------- 
- # On ajoute dans les différents fichiers le titre et le résumé 
-                         print-  OUT1  "Titre : $titre \n";
 
-                         print-  OUT1  "Resume : $resume \n";
 
-                         print-  OUT2  "<item><title>$titre</title><abstract>$resume</abstract></item>\n";
 
-                            
- #----------------------------------------------------------- 
- # On ajoute dans le tableau de hash le titre du fil rss 
-                         $tabcontenu{$test}++; 
-                     } 
-                 } 
-   
- #-----------------------------------------------------------                 
- # Fermeture de la balise items dans le fichier xml, fermeture des fichiers 
-             } 
-         } 
-         } 
-     } 
- } 
-   
-   
- #----------------------------------------------------------- 
- # Fonction "nettoietexte" 
- # Nettoie un texte de ses entités xml 
- # Donnée : une chaîne de caractère contenant des entités xml 
- # Résultat : la chaîne de caractères nettoyée de ses entités xml 
- sub nettoietexte { 
-     $texte =~ s/</</g; 
-     $texte =~ s/>/>/g; 
-     $texte =~ s/<a href[^>]+>//g; 
-     $texte =~ s/<img[^>]+>//g; 
-     $texte =~ s/<\/a>//g; 
-     $texte =~ s/&#39;/'/g; 
-     $texte =~ s/&#34;/"/g; 
-     $texte =~ s/é/é/g; 
-     $texte =~ s/ê/ê/g; 
-     $texte =~ s/<[^>]+>//g; 
-     $texte =~ s/ / /g; 
- } # Fin "nettoietexte"