#/usr/bin/perl
<<DOC; 
Votre Nom : 
JANVIER 2005
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
 Le programme prend en entrée le nom du répertoire contenant les fichiers
 à traiter
 Le programme construit en sortie un fichier structuré contenant sur chaque
 ligne le nom du fichier et le résultat du filtrage :
<FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>du filtrage</CONTENU></FICHIER>
DOC
#
use Unicode::String qw(utf8);
use XML::RSS;
use XML::Entities;
#-----------------------------------------------------------
my $rep="$ARGV[0]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# on déclare les tableaux associatifs permettant de traiter la duplication des contenus
my %dicoTitre=();
my %dicoDescription=();

my $nom="";
my $fichier="";

my %liste_des_rubriques;
$liste_des_rubriques{UNE} = "0,2-3208,1-0,0\.xml";
$liste_des_rubriques{INTERNATIONAL} = "0,2-3210,1-0,0\.xml";
$liste_des_rubriques{EUROPE} = "0,2-3214,1-0,0\.xml";
$liste_des_rubriques{SOCIETE} = "0,2-3224,1-0,0\.xml";
$liste_des_rubriques{OPINION} = "0,2-3232,1-0,0\.xml";
$liste_des_rubriques{ECONOMIE} = "0,2-3234,1-0,0\.xml";
$liste_des_rubriques{MEDIA} = "0,2-3236,1-0,0\.xml";
$liste_des_rubriques{RDV} = "0,2-3238,1-0,0\.xml";
$liste_des_rubriques{SPORT} = "0,2-3242,1-0,0\.xml";
$liste_des_rubriques{ENVIRONNEMENT} = "0,2-3244,1-0,0\.xml";
$liste_des_rubriques{CULTURE} = "0,2-3246,1-0,0\.xml";
$liste_des_rubriques{LIVRES} = "0,2-3260,1-0,0\.xml";
$liste_des_rubriques{EXAMENS} = "0,2-3404,1-0,0\.xml";
$liste_des_rubriques{CINEMA} = "0,2-3476,1-0,0\.xml";
$liste_des_rubriques{VOYAGES} = "0,2-3546,1-0,0\.xml";
$liste_des_rubriques{TECHNOLOGIES} = "0,2-651865,1-0,0\.xml";

#----------------------------------------
#Ouverture des fichiers de sortie et traitement avec la sous-routine parcoursarborescencefichiers :
#----------------------------------------

foreach $nom (keys(%liste_des_rubriques)){
	my $output1="sortie_$nom.xml";
	if (!open (OUT1,">:encoding(UTF-8)","$output1")) { die "Pb a l'ouverture du fichier $output1"};
	print OUT1 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
	print OUT1 "<rubrique nom=\"$nom\">\n";
	close OUT1;

	my $output2="sortie_$nom.txt";
	if (!open (OUT2,">:encoding(UTF-8)","$output2")) { die "Pb a l'ouverture du fichier $output2"};
	print OUT2 "rubrique :", $nom, "\n";
	close OUT2;


	&parcoursarborescencefichiers($rep, $liste_des_rubriques{$nom}, $nom);	#recurse!
}

#----------------------------------------
#Fermeture des fichiers :
#----------------------------------------

foreach $nom (keys(%liste_des_rubriques)){
	my $output="sortie_$nom.xml";
	if (!open (OUT,">>:encoding(UTF-8)","$output")) { die "Pb a l'ouverture du fichier $output"};
	print OUT "</rubrique>";
	close OUT;
}

exit;


#----------------------------------------------

sub parcoursarborescencefichiers {
    my ($path, $nom_du_fichier_traite, $nom) = @_;
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (@files) {
		next if $file =~ /^\.\.?$/; 
		$file = $path."/".$file;
		
# Si $file correspond au nom d'un répertoire, on relance la sous-routine :
		if (-d $file) {
			&parcoursarborescencefichiers($file, $nom_du_fichier_traite, $nom);	#recurse!
		}

# Si $file est un fichier, on le traite :
		if (-f $file) {
			if ($file=~/$nom_du_fichier_traite$/) {
# On passe le fichier à la procédure @traitement fichier :				
				my ($titre,$description)=&traitementfichier($file);
				
				if (($titre ne "") and ($description ne "")) {
				   	my $output1="sortie_$nom.xml";
            		if (!open (OUT1,">>:encoding(UTF-8)","$output1")) { die "Pb a l'ouverture du fichier $output1"};
					print OUT1 "<item><titre>".$titre."</titre><description>".$description."</description></item>\n";
					close OUT1;
					
					my $output2="sortie_$nom.txt";
					if (!open (OUT2,">>:encoding(UTF-8)","$output2")) { die "Pb a l'ouverture du fichier $output2"};
					print OUT2 $titre."\n".$description."\n";
					close OUT2;
				}
			}
		}		
	}
} 
#----------------------------------------------
sub traitementfichier {
	my $file= shift(@_);
	open(FILE,$file);
	my $firstLine=<FILE>;
	if($firstLine=~/encoding="([^\"]+)"/) {$encodage=$1;}
	close(FILE);
	
	open(FILE,"<:encoding($encodage)",$file);
	my $texte="";
	print $file,"\n";
	
# On utilise la bibliothèque XLML::RSS pour extraire les titres et les descriptions :
	my $rss = new XML::RSS;
	$rss->parsefile($file);
	my $titre="";
	my $description="";
	foreach my $item (@{$rss->{'items'}}){
		$titre = $item->{'title'};
		$description = $item->{'description'};

# On utilise la bibliothèque XML::Entities pour décoder le texte extrait		
		$titre = XML::Entities::decode('all', $titre);
		$description = XML::Entities::decode('all', $description);
		
# Filtre pour savoir si on a déjà vu l'article traité :		
		if ((!(exists $dicoTitre{$titre})) and (!(exists $dicoDescription{$description}))){
			$dicoTitre{$titre}=1;
			$dicoDescription{$description}=1;
		}
		else {
		   $titre="";
		   $description="";
		}
	}
	close(FILE);
	return ($titre,$description);
}
#----------------------------------------------
