Ainsi, le code final pour la boîte à outils 2 est :
#!/usr/bin/perl
# Boîte à Outils 2
# Importation des bibliothèques
use XML::RSS;
use utf8;
use HTML::Entities;
# Initialisation des variables
#my $rss = XML::RSS->new(ErrorContext=>2);
#print $rss;
my $rep = "$ARGV[0]";
$rep =~ s/[\/]$//; # On s'assure que le nom du répertoire ne se termine pas par un "/"
my %tableCategories = (); # Tableau - Rubriques
my @tableArticles = (); # Table de hachage - Articles
my $i = 1; # Compteur d'articles lus pour debug
my $nom = "Anaïs Chanclu";
# Fonction de parcours d'arborescense de fichiers
sub scanFiles {
my $path = shift(@_);
opendir(dir, $path) or die "Je n'arrive pas à ouvrir $path : $!\n";
my @files = readdir(dir);
closedir(dir);
foreach my $file (@files) {
next if $file =~ /^\.\.?$/;
$file = $path . "/" .$file;
# Si file est un répertoire, la fonction est alors récursive
if (-d $file) {
&scanFiles($file); # Récursion
}
# Si file est un fichier, on traite le fichier
if (-f $file) {
if ($file =~ /\.xml$/) {
# Vérification de la validité du fichier d'entrée
my $rss = XML::RSS->new(ErrorContext=>2);
eval {
$rss -> parsefile($file);
};
if($@) {
$@ =~ s/at \/.*?$//s; # On enlève le numéro de la ligne en cas d'erreur
#print STDERR "\nErreur dans '$file':\n$@\n";
# Erreur dans le fichier de compte-rendu
open(cr,">>:encoding(utf8)", "feedback.cr");
print cr "\nErreur dans '$file':\n$@\n";
close(cr);
}
# Le fichier est bel et bien un fichier RSS, on poursuit !
else {
# On recupère l'encodage
open(fileItem, $file);
my $encoding = $rss -> {'encoding'};
close(fileItem);
# On recupère le titre du flux selon l'encodage pour avoir la catégorie
open(fileItem, "<:encoding($encoding)", $file);
my $category = $rss -> {'channel'} -> {'title'};
# On nettoie la catégorie
$category = lc($category);
$category =~ s/le monde.fr : //g;
$category =~ s/toute l'actualité sur le monde.fr//g;
$category =~ s/\s//g;
$category =~ s/[,.;:!]//g;
$category =~ s/[éêëè]/e/g;
$category =~ s/[âäà]/a/g;
$category =~ s/[îï]/i/g;
$category =~ s/[ôö]/o/g;
$category =~ s/[ûüù]/u/g;
$category =~ s/[ÿ]/y/g;
# On initialise les noms des fichiers de sortie
my $outputXml = "sortie-" . $category . ".xml";
my $outputTxt = "sortie-" . $category . ".txt";
my $outputTitle = "title-" . $category . ".tmp";
my $outputDesc = "desc-" . $category . ".tmp";
my $outCategory = "tag-" . $category . ".xml";
# On verifie que la categorie n'existe pas
if (!(existCategory($category,@tableCategories))) {
# si c'est le cas on l'ajoute
push(@tableCategories,$category);
# On crée un fichier XML vide
open(fileOutXml, ">:encoding(utf-8)", $outputXml) or die "Je n'ai pas réussi à ouvrir le fichier $outputXml !";
print fileOutXml "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print fileOutXml "<PARCOURS>\n";
close(fileOutXml);
# On crée un fichier txt vide
open(fileOutTxt, ">:encoding(utf-8)", $outputTxt) or die "Je n'ai pas réussi à ouvrir le fichier $outputTxt !";
close(fileOutTxt);
# Un fichier tagger XML de tous les articles de la categorie avec titre et description
open(Sortie, ">:encoding(utf-8)", $outCategory) or die "Je n'ai pas réussi à ouvrir le fichier $outCategory !";
print Sortie "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print Sortie "<PARCOURS>\n\t<NOM>$nom</NOM>\n\t<FILTRAGE>\n";
close(Sortie) ;
}
# On récupère le contenu désiré des articles
foreach my $item (@{$rss -> {'items'}}) {
my $tmpTitle = $item -> {'title'};
my $tmpDesc = $item -> {'description'};
# On ne garde que le nécessaire
$tmpDesc =~ s/<p.*?\/>//;
$tmpDesc =~ s/<a href[^>]+>//g;
$tmpDesc =~ s/<img[^>]+>//g;
$tmpDesc =~ s/<\/a>//g;
$tmpDesc =~ s/<[^>]+>//g;
$tmpDesc =~ s/ - Lisez l'intégralité de l'article pour plus d'information./"/g;
# On nettoie le titre et la description
$cleanTitle = decode_entities($tmpTitle);
$cleanDesc = decode_entities($tmpDesc);
# Fichier de compte-rendu
open(cr,">>:encoding(utf8)", "feedback.cr");
print cr "$i - $category - $cleanTitle \n";
close(cr);
# On verifie que l'article n'existe pas déjà
if ($tableArticles{$cleanTitle} ne $cleanDesc) {
# S'il n'existe pas, on l'ajoute
$tableArticles{$cleanTitle} .= $cleanDesc;
# On ajoute le titre et la description dans le fichier XML...
open(fileOutXml, ">>:encoding(utf-8)", $outputXml) or die "Je n'ai pas réussi à ouvrir le fichier $outputXml !";
print fileOutXml "<item>\n\t<titre>$cleanTitle</titre>\n\t<description>$cleanDesc</description>\n</item>\n";
close(fileOutXml);
# On prépare l'étiquetage du titre et on initialise outCategory
open(tmpFile, ">:encoding(utf-8)", "tmpTitle.txt");
print tmpFile $cleanTitle;
close(tmpFile);
open(Sortie, ">>:encoding(utf-8)", $outCategory) or die "Je n'ai pas réussi à ouvrir le fichier $outCategory !";
print Sortie "\t\t<item num=\"$i\">\n";
print Sortie "\t\t\t<article>\n";
close(Sortie) ;
# On prépare l'étiquetage de la description
open(tmpFile, ">:encoding(utf-8)", "tmpDesc.txt");
print tmpFile $cleanDesc;
close(tmpFile);
print $i. " - ".$category." - ".$cleanTitle ."\n";
# Étiquetage du titre
open(Sortie, ">>:encoding(utf-8)", $outCategory) or die "Je n'ai pas réussi à ouvrir le fichier $outCategory !";
print Sortie "\t\t\t\t<titre>\n" ;
close(Sortie) ;
system("perl ~/treetagger/tokenise-fr.pl tmpTitle.txt | ~/treetagger/bin/tree-tagger -lemma -token -no-unknown ~/treetagger/lib/french-utf8.par > $outputTitle");
system("perl ./tt2xml-art.pl $outputTitle") ;
my $res = $outputTitle . ".xml" ;
system("cat $res >> $outCategory") ;
open(Sortie, ">>:encoding(utf-8)", $outCategory) or die "Je n'ai pas réussi à ouvrir le fichier $outCategory !";
print Sortie "\t\t\t\t</titre>\n" ;
close(Sortie) ;
# Étiquetage de la description
open(Sortie, ">>:encoding(utf-8)", $outCategory) or die "Je n'ai pas réussi à ouvrir le fichier $outCategory !";
print Sortie "\t\t\t\t<description>\n" ;
close(Sortie) ;
system("perl ~/treetagger/tokenise-fr.pl tmpDesc.txt | ~/treetagger/bin/tree-tagger -lemma -token -no-unknown ~/treetagger/lib/french-utf8.par > $outputDesc");
system("perl ./tt2xml-art.pl $outputDesc") ;
my $res = $outputDesc . ".xml" ;
system("cat $res >> $outCategory") ;
open(Sortie, ">>:encoding(utf-8)", $outCategory) or die "Je n'ai pas réussi à ouvrir le fichier $outCategory !";
print Sortie "\t\t\t\t</description>\n" ;
close(Sortie) ;
# Nettoyage et fermeture des balises article et item
open(Sortie, ">>:encoding(utf-8)", $outCategory) or die "Je n'ai pas réussi à ouvrir le fichier $outCategory !";
print Sortie "\t\t\t</article>\n";
print Sortie "\t\t</item>\n";
close(Sortie) ;
system("rm tmpDesc.txt tmpTitle.txt *.tmp *.tmp.xml");
# ...ainsi que dans le fichier TXT
open(fileOutTxt, ">>:encoding(utf-8)", $outputTxt) or die "Je n'ai pas réussi à ouvrir le fichier $outputTxt !";
print fileOutTxt "§ " . $cleanTitle . "\n" . $cleanDesc ."\n\n";
close(fileOutTxt);
}
$i++; # compteur d'articles
}
close(fileItem);
}
}
}
}
}
# Fonction de recherche de categorie dans le tableau
sub existCategory {
my ($cat,@tab) = @_;
$res=0 ;
foreach my $c (@tab) {
if ($c eq $cat) {
$res=1;
last;
}
}
return $res;
}
# Fichier de compte-rendu
open(cr,">:encoding(utf8)", "feedback.cr");
print cr "Compte-rendu de traitement de script.pl\n";
close(cr);
# On parcourt les fichiers
&scanFiles($rep);
# Fin de traitement
foreach my $category (@tableCategories) {
# Fermeture des balises des fichiers de sortie par catégorie
my $outputXml = "sortie-" . $category . ".xml";
if (!open (fileOutXml,">>:encoding(utf-8)", $outputXml)) { die "Problème à l'ouverture du fichier $outputXml."};
print fileOutXml "</PARCOURS>\n";
close(fileOutXml);
# Fermeture des balises des fichiers de sortie par catégorie filtrée
my $outCategory = "tag-" . $category .".xml";
if (!open (Sortie,">>:encoding(utf-8)", $outCategory)) { die "Problème à l'ouverture du fichier $outCategory."};
print Sortie "\t</FILTRAGE>\n</PARCOURS>\n" ;
close(Sortie) ;
}
exit;
Et voilà ! Notre script est fini ! Il ne manque plus qu'à créer les graphes et les analyser grâce à la boîte à outils 4.