#!/usr/bin/perl
use utf8;
use strict;
binmode(STDOUT, ":encoding(UTF-8)");

# Utilisation du programme :
# perl bao1.pl fichier_fil_rss numero_rubrique
# exemple : perl bao1.pl 2021 3246

# -------------------------------------------------------------------------------

# RECUPERATION DES ARGUMENTS DONNES AU PROGRAMME
my $rep = "$ARGV[0]"; # nom de l'arborescence (2021)
my $RUBRIQUE = "$ARGV[1]"; # numéro de la rubrique à traiter (3246)
$rep=~ s/[\/]$//; # on s'assure que le nom du répertoire ne se termine par par un "/"

# OUVERTURE DES FICHIERS
open my $output_txt, ">:encoding(UTF-8)", "bao1_pl_$RUBRIQUE.txt"; # fichier résultat txt
open my $output_xml, ">:encoding(UTF-8)", "bao1_pl_$RUBRIQUE.xml"; # fichier résultat xml

# ECRITURE DANS LES FICHIERS ET EXECUTION DU PROGRAMME
print $output_xml "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus>\n"; # déclaration xml
my %titres = ();
&parcoursarborescencefichiers($rep); # exécution du programme
print $output_xml "</corpus>\n"; # structure xml

# FERMETURE DES FICHIERS
close $output_txt;
close $output_xml;

exit;

# -------------------------------------------------------------------------------

sub parcoursarborescencefichiers {
    my $path = shift(@_); # @_ contient les arguments de la fonction, ici le répertoire 2021
    opendir(DIR, $path) or die "can't open $path: $!\n"; # ouverture du répertoire
    my @files = readdir(DIR); # liste contenant les fichiers dans le répertoire
    closedir(DIR);
    foreach my $file (@files) { # pour chaque élément contenu dans le répertoire
        next if $file =~ /^\.\.?$/; # ne rien faire si c'est un fichier caché
        $file = $path."/".$file; # concaténation pour obtenir le chemin du fichier
        if (-d $file) { # si le fichier est un dossier
            print "On entre dans le REPERTOIRE : $file \n";
            &parcoursarborescencefichiers($file); # on relance la fonction avec ce dossier
            print "On sort du REPERTOIRE :  $file \n";
        }
        if (-f $file) { # si le fichier est un fichier
            if ($file =~ /$RUBRIQUE.+\.xml$/) { # si c'est un document xml
                print "Traitement du fichier $file\n";
                open my $input, "<:encoding(UTF-8)", $file; # ouverture du fichier
                undef $/; # $/ contient \n par défaut, on supprime pour lire le fichier d'une traite
                my $ligne=<$input>; # récupération du contenu du fichier
                close($input);
                while($ligne=~/<item><title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) { # recherche des éléments "titre" et "description"
                    my $titre=&nettoyage($1); # récupération du titre
					my $description=&nettoyage($2); # récupération de la description
                    if (!(exists $titres{$titre})) { # si le programme n'est pas encore passé par un article ayant ce titre
                        $titres{$titre}=$description; # on l'ajoute dans un dictionnaire
                        print $output_txt "$titre\n$description\n--------------------\n"; # écriture dans le fichier txt
                        print $output_xml "<item><titre>$titre</titre><description>$description</description></item>\n"; # écriture dans le fichier xml
                    }
                }
            }
        }
    }
}

sub nettoyage { # formatage des éléments "titre" et "description" trouvés dans chaque fichier
	my $texte=shift @_;
	$texte=~s/(^<!\[CDATA\[)|(\]\]>$)//g; # nettoyage des éléments xml inutiles
	$texte.="."; # pour rajouter un point à la fin
	$texte=~s/\.+$/\./; # pour ne garder qu'un seul point en fin de ligne
	return $texte;
}
