<<DOC;
Uyên-To DOAN-RABIER
Ruixin HE
Mohamed Sofiane KERROUA
BàO - Expression régulière
En utilisant uniquement des expressions régulières, 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_regexp.pl nom_du_répertoire
DOC
#/usr/bin/perl
#use strict;
#use warnings;
use Unicode
::String qw(utf8
);
#-----------------------------------------------------------
# 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 chaque fichier 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 $rubrique="";
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);
while (my $ligne=<FILE>){
$ligne =~ s/\n//g;
$texte .= $ligne;
}
if ($texte=~/<channel><title>([^<]+)<\/title>/){
$rubrique = $1;
$rubrique=~ s/Le ?Monde.fr ?://;
$rubrique=~ s/ ?- ?Le ?Monde.fr//;
$rubrique=~ s/es$/e/i;
$rubrique=~ s/ //g;
}
if($rubrique eq ""){
$rubrique = "non-classe";
}
#-----------------------------------------------------------
# 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 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";
}
#-----------------------------------------------------------
# Suppression des
espaces inutiles, détection de la date du fichier
$texte =~ s/> *</></g;
$texte=~/<pubDate>([^<]+)<\/pubDate>/;
my $date=$1;
#-----------------------------------------------------------
# Conversion de la date en utf-8 si l'encodage du fichier en entrée ne l'est pas
if (uc($encodage) ne "UTF-8") {utf8
($date);}
#-----------------------------------------------------------
# Ajoute de la date et de la balise ouvrante items dans le fichier de sortie xml
print OUT2
"<date>".$date."</date>\n";
#-----------------------------------------------------------
# Détection du titre et du résumé du fils rss
while ($texte =~ /<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/g) {
my $titre=$1;
my $resume=$2;
#-----------------------------------------------------------
# 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 les fichiers xml, fermeture des fichiers
}
}
}
}
} # Fin "parcoursarborescencefichiers"
#-----------------------------------------------------------
# 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"