#/usr/bin/perl

use Unicode::String qw(utf8);
use XML::RSS;
#-----------------------------------------------------------
my $rep="$ARGV[0]";
#s'assurer que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
#declarer les tableaux associatifs permettant de traiter la duplication des contenus
my %dicoTitre=();
my %dicoDescription=();
my %dictionnairesdesrubriques=();
#----------------------------------------
#recuperer les rubriques
&parcoursarborescencefichierspourrepererlesrubriques($rep);
#----------------------------------------
#creer une liste avec les noms des rubriques
my @liste_rubriques = keys(%dictionnairesdesrubriques);
#pour chaque nom de la liste des rubriques
foreach my $rub (@liste_rubriques) {
    print $rub,"\n";
    #----------------------------------------
    #ouvrir le fichier de sortie avec le nom de la rubrique
    my $output1="SORTIE-".$rub.".xml";
    my $output2="SORTIE-".$rub.".txt";
    #si l'ouverture du fichier se passe mal le programme s'arrete et m'envoie un message    
    if (!open (FILEOUT1,">:encoding(utf-8)", $output1)) { die "Pb a l'ouverture du fichier $output1"};
    if (!open (FILEOUT2,">:encoding(utf-8)", $output2)) { die "Pb a l'ouverture du fichier $output2"};
    #formater la sortie pour creer un fichier xml avec entete
    print FILEOUT1 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
    print FILEOUT1 "<file>\n";
	print FILEOUT1 "<items>\n";
    close(FILEOUT1);
    close(FILEOUT2);
}
#----------------------------------------
&parcoursarborescencefichiers($rep);
#----------------------------------------
#pour chaque nom de la liste des rubriques
foreach my $rub (@liste_rubriques) {
    #ouvrir le fichier de sortie avec le nom de la rubrique
    my $output1="SORTIE-".$rub.".xml";
    #si l'ouverture du fichier se passe mal le programme s'arrete et m'envoie un message
    if (!open (FILEOUT1,">>:encoding(utf-8)", $output1)) { die "Pb a l'ouverture du fichier $output1"};
    print FILEOUT1 "</items>\n</file>\n";
    close(FILEOUT1);
}
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_);
    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;
		if (-d $file) {
			&parcoursarborescencefichiers($file);
		}
		if (-f $file) {
			if (($file=~/\.xml$/) && ($file!~/\/fil.+\.xml$/)) {
				open(FILE, $file);
				print "Traitement de :\n$file\n";
				#initialiser une variable pour recuperer le contenu du fichier
				my $texte="";
				#lire ligne par ligne le fichier
				while (my $ligne=<FILE>) {
					$ligne =~ s/\n//g;
					$texte .= $ligne;
				}
				close(FILE);
				$texte=~s/> *</></g;
				#rechercher la rubrique
				$texte=~/<title>([^<]+)<\/title>/;
				my $rub=$1;
				$rub=~s/é/e/gi;
				$rub=~s/è/e/gi;
				$rub=~s/ê/e/gi;
				$rub=~s/à/a/gi;
				$rub=~ s/Le ?Monde.fr ?://;
		        $rub=~ s/ //g;
		        $rub=uc($rub);
				print $rub,"\n";
				#----------------------------------------
				#ouvrir le fichier de sortie
				my $output1="SORTIE-".$rub.".xml";
				my $output2="SORTIE-".$rub.".txt";
				#si l'ouverture du fichier se passe mal le programme s'arrete et m'envoie un message
				if (!open (FILEOUT1,">>:encoding(utf-8)", $output1)) { die "Pb a l'ouverture du fichier $output1"};
				if (!open (FILEOUT2,">>:encoding(utf-8)", $output2)) { die "Pb a l'ouverture du fichier $output2"};
				#----------------------------------------
				#extraction du contenu des balises title et description (titre et resume)
				my $rss = new XML::RSS;
				$rss->parsefile($file);
				foreach my $item (@{$rss->{'items'}}) {
				    my $titre=$item->{'title'};
				    my $description=$item->{'description'};	
					if ((!(exists $dicoTitre{$titre})) and (!(exists $dicoDescription{$description}))){
						$dicoTitre{$titre}=1;
						$dicoDescription{$description}=1;
						#faire le nettoyage
						$titre=&nettoietexte($titre);
						$description=&nettoietexte($description);
						$texteXML.="<item><titre>".$titre."</titre><description>".$description."</description></item>\n";
						$texteTXT.="§ $titre\n";
						$texteTXT.="$description\n";
						print FILEOUT1 $texteXML;
						print FILEOUT2 $texteTXT;
						close FILEOUT1;
						close FILEOUT2;
					}
				}
			}
		}
    }
}
#----------------------------------------------
sub nettoietexte {
    my $texte=shift;
    #rechercher/remplacer les entites
    $texte =~ s/&lt;/</g;
    $texte =~ s/&gt;/>/g;
    $texte =~ s/<a href[^>]+>//g;
    $texte =~ s/<img[^>]+>//g;
    $texte =~ s/<\/a>//g;
    $texte =~ s/&#38;#39;/'/g;
    $texte =~ s/&#38;#34;/"/g;
    $texte =~ s/&#233;/é/g;
    $texte =~ s/&#234;/ê/g;
    $texte =~ s/<[^>]+>//g;
    $texte =~ s/&nbsp;/ /g;
    $texte =~ s/&#39;/'/g;
    $texte =~ s/&#34;/"/g;
    $texte =~ s/&amp;#39;/'/g;
    $texte =~ s/&amp;#34;/"/g;
	$texte =~ s/ & / and /g;
    return $texte;
}
#----------------------------------------------------
sub parcoursarborescencefichierspourrepererlesrubriques {
    my $path = shift(@_);
    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;
		#lancer de nouveau la procedure a chaque fois qu'on trouve un repertoire
		if (-d $file) {
			&parcoursarborescencefichierspourrepererlesrubriques($file);
		}
		#si $file est un fichier (sinon on ne rentre pas dans la boucle)
		if (-f $file) {
			if (($file=~/\.xml$/) && ($file!~/\/fil.+\.xml$/)) {
				open(FILE, $file);
				print "Traitement de :\n$file\n";
				#initialiser une variable pour recuperer le contenu du fichier
				my $texte="";
				#lire ligne par ligne le fichier
				while (my $ligne=<FILE>) {
					$ligne =~ s/\n//g;
					$texte .= $ligne;
				}
				close(FILE);
				$texte=~s/> *</></g;
				#rechercher la rubrique
				$texte=~/<title>([^<]+)<\/title>/;
				my $rub=$1;
				$rub=~s/é/e/gi;
				$rub=~s/è/e/gi;
				$rub=~s/ê/e/gi;
				$rub=~s/à/a/gi;
				$rub=~ s/Le ?Monde.fr ?://;
		        $rub=~ s/ //g;
		        $rub=uc($rub);
				$dictionnairesdesrubriques{$rub}++;
			}
		}
	}
}