#/usr/bin/perl
<<DOC;
PROJET ENCADRÉ 2:
PACHECO Léo & TINARRAGE Valentin 
JANVIER 2018
 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 XML::RSS;
use Unicode::String; #qw(utf8);
#-----------------------------------------------------------
my $rep="$ARGV[0]"; # récupération de la racine de l'arborescence
my $rubrique="$ARGV[1]"; # récupération du nom de la rubrique.
$rep =~ s/[\/]$//; # on s'assure que le nom du répertoire ne se termine pas par un "/"
my %doublon = {};
my $output1="SORTIE.xml";

# création d'un tableau de hash afin de faire correspondre les rubriques avec leur nom correspondant.
my %nomsRubrique = ("une"=>"3208","internationnal"=>"3210","europe"=>"3214","société"=>"3224","idées"=>"3232","economie"=>"3234","médias"=>"3236","vous"=>"3238","sport"=>"3242","planète"=>"3244","culture"=>"3246","livres"=>"3260","cinéma"=>"3476","voyage"=>"3546","technologies"=>"651865","politique"=>"823353","sciences"=>"env_sciences");

if (exists $nomsRubrique{$rubrique}) # si la rubrique est reconnue alors on commence à écrire dans les fichiers de sortie:
{   
    #initialisation / écriture fichier OUT TXT puis XML
    open(OUT, ">:encoding(utf-8)","./OUTPUTS/sortie-$rubrique.txt");
    open(OUTXML, ">:encoding(utf-8)","./OUTPUTS/sortie-$rubrique.xml");
    print OUTXML "<?xml version=\'1.0\' encoding=\'UTF-8\'?>\n"; # écriture en tête XML
    print OUTXML "<racine>\n"; # écriture élément racine ouverture XML

    &parcoursArborescenceFichiers($rep);

    close OUT;
    print OUTXML "</racine>\n"; # écriture élément racine fermeture XML
    close OUTXML;
}
else #sinon on indique que la rurbique est inconnue.
{
    print "rubrique inconnue\n";
}

exit;
#-----------------------------------------------------------
#fonctions:

#va parcourir l'arborsecence passée en argv[0]
sub parcoursArborescenceFichiers 
{
    my $path = shift(@_); #récupération du chemin
    opendir(DIR, $path) or die "can't open $path: $!\n";   #ouverture répertoire (équivalent de ls)
    my @files = readdir(DIR);   #récupération contenu répertoire, readdir est associée à opendir. renvoie liste des ressources du répertoire (résultat de ls -l)
    closedir(DIR);
    foreach $file (@files) 
    {     #pour chacun des éléments dans le répetoire, on vérifie si c'est un dossier ou un fichier
	    next if $file =~ /^\.\.?$/; #si on obtient . ou .., on ne fait rien, on passe à l'élément suivant pour ne pas boucler ou remonter dans l'arbo. attention les fichiers cachés commencent par un '.'
	    $file = $path."/".$file; #écriture du chemin complet de l'élément, on recréer une var qui prend le nom du rep dans lequel on est entré suivit du nom de la ressource qu'on veut examiner (à partir de la racine). On peut intéroger si cette ressource est un dossier ou un fichier (commandes suivantes).
	    if (-d $file) 
        {
            print "on entre dans: $file \n"; # juste histoire d'afficher le répertoire dans lequel on entre
	        &parcoursArborescenceFichiers($file);	#Si l'élément est un dossier, on reclance les étapes ci-dessus. ici file est le nouveau répertoire.
	    }
        
	    if (-f $file) #si l'élément est un fichier, on lance le traitement de filtrage.
        {
            if ($file=~/$nomsRubrique{$rubrique}.*\.xml$/) # de plus, on teste si notre fichier correspond à la rubrique passé en argument 2, si oui on lance les traitements.
            {
                &extractTitleAndDesc($file); #TRAITEMENT à réaliser sur chaque fichier
            }
	    }
	}
}

#fonction qui extrait les titres et descriptions. 1 argument en in et 2 en out.
sub extractTitleAndDesc
{
    my $rss=new XML::RSS;
    eval {$rss->parsefile($file);};
    if ($@) 
    {
        $@ =~ s/at \/.*?$//s;
        print STDERR "\nERROR in '$file':\n$@\n";
    }
    else 
    {
        foreach my $item (@{$rss->{'items'}}) 
        {
            my $description=$item->{'description'};
            my $titre=$item->{'title'};
            my ($titreClean,$descriptionClean) = &nettoyage($titre,$description);
            if (exists $doublon{$titreClean})
            {
                $doublon{$titreClean}++;
            }
            else
            {
                $doublons{$titreClean} =1;
                print OUT "$titreClean\n";
                print OUT "$descriptionClean\n\n";
                print OUTXML "<article>\n";
                print OUTXML "<titre>$titreClean</titre>\n";
                print OUTXML "<description>$descriptionClean</description>\n";
                print OUTXML "</article>\n";
            }
        }
    }
    return ($titreClean,$descriptionClean);
}
#fonction qui nettooie les titres et descriptions. prends 2 arguments et en retourne deux aussi.
sub nettoyage ($$)
{
    my $titre =shift;
    $titre =~ s/&lt;/</g;
    $titre =~ s/&gt;/>/g;
    $titre =~ s/<a href[^>]+>//g;
    $titre =~ s/<img[^>]+>//g;
    $titre =~ s/<\/a>//g;
    $titre =~ s/&#38;#39;/'/g;
    $titre =~ s/&#38;#34;/"/g;
    $titre =~ s/<[^>]+>//g;
    $titre =~ s/&amp;/&/g;

    my $desc =shift;
    $desc =~ s/&lt;/</g;
    $desc =~ s/&gt;/>/g;
    $desc =~ s/<a href[^>]+>//g;
    $desc =~ s/<img[^>]+>//g;
    $desc =~ s/<\/a>//g;
    $desc =~ s/&#38;#39;/'/g;
    $desc =~ s/&#38;#34;/"/g;
    $desc =~ s/<[^>]+>//g;
    $titre =~ s/&amp;/&/g;
    
    return ($titre,$desc);
}