Boîte à Outils 2

Code final

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.