#!/usr/bin/perl
<<DOC; 
 Nom : Xiaoxia & Wenfei
 2019-2020-S2-Projet BaO-BaO1-rss
 Commande : perl BaO1-extration-regex.pl repertoire-a-parcourir code-rubrique
 Moyen : On extrait des titres et des descriptions à l'aide du module XML::RSS.
 Entrée : Le programme prend en entrée le nom du répertoire contenant les fichiers à traiter.
 Sortie : Le programme construit en sortie deux fichiers :
		   - BaO1-extraction-xmlrss-sortie_$rubrique.txt : un texte brut séparé 
		     par "------" tous les articles
           - BaO1-extraction-xmlrss-sortiexml_$rubrique.xml : un fichier structuré
		     contenant les noms des articles et leur description sous la structure arborescente
			 ci-dessous :
             <corpus2019><item><titre>titre du l'article</titre><description>description de cet l'article</description></item></corpus2019>
 Fonction supplémentaire : À la fin de la programme, il nous affiche le temps de calcul.

DOC
#-----------------------------------------------------------
# Introduire le module XML::RSS
use XML::RSS;
# Introduire le module pour obtenir le temps
use Time::HiRes qw(gettimeofday tv_interval);

# Récupérer le nom du répertoire, soit 2019 ici
my $rep="$ARGV[0]";
# Récupérer le code de rubrique
my $rubrique = "$ARGV[1]";
# Assurer que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# Indicateur pour voir clairement le déroulement du programme
my $i=0;
# Préparer les fichier (TXT et XML) de sortie où on met les résultats d'extraction
open(OUTTXT,">:encoding(utf8)","BaO1-extraction-xmlrss-sortie_$rubrique.txt");
open(OUTXML,">:encoding(utf8)","BaO1-extraction-xmlrss-sortiexml_$rubrique.xml");
print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print OUTXML "<corpus2019>\n";

# Mémoriser des titres et des descriptions rencontrés en table de hashage
my %dico_des_titres ;

#----------------------------------------
#recurse!
&parcoursarborescencefichiers($rep);

#----------------------------------------
# Fermer des fichers de sortie
close OUTTXT;
print OUTXML "</corpus2019>\n";
close OUTXML;

#----------------------------------------
# Afficher le temps de calcul
print "\n\nScript execution time: " . tv_interval($timepg) . " seconds.\n";

#----------------------------------------
# Sortir de la programme
exit;

#----------------------------------------------
# Le sous programme parcoursarborescencefichiers
sub parcoursarborescencefichiers {
    # Récupérer le répertoire (mois)
    my $path = shift(@_);
    # Stocker le contenu du répertoire
    opendir(DIR, $path) or die "can't open $path: $!\n";
	# readdir : lire le répertoire et le résultat donné est une liste
    my @files = readdir(DIR);
    closedir(DIR);
    # Parcourir la liste (les fichiers dans le répertoire)
    foreach my $file (@files) { # on examine la liste
	    # si le nom est . ou .., passer à la suite
		next if $file =~ /^\.\.?$/;
		# Reconstruire le chemin pour accéder le répertoire fils
		$file = $path."/".$file;
		# si c'est un répertoire
		if (-d $file) {
			# recurse!
			&parcoursarborescencefichiers($file);	#recurse!
		}
		# si c'est un fichier
		if (-f $file) {
			# TRAITEMENT à réaliser sur chaque fichier
			# si le nom de fichier contient l'identifiant de rubrique
			if($file =~/$rubrique.+\.xml$/) {
				# Voir le déroulement
				print $i++," : $file \n";
				# Utiliser le module XML::RSS
				my $rss=new XML::RSS;
				# Vérifier s'il y a des erreurs
				eval {$rss->parsefile($file); };
				if( $@ ) {
					# remove module line number
					$@ =~ s/at \/.*?$//s;
					print STDERR "\nERROR in '$file':\n$@\n";
				} 
				else {
					# Parcourir les balise "item"
					foreach my $item (@{$rss->{'items'}}) {
						# Donner les contenus de la balise "description" à la variable "$description"
						my $description=$item->{'description'};
						# Donner les contenus de la balise "titre" à la variable "$titre"
						my $titre=$item->{'title'};
						# une liste () commen entrée pour le sous programme et le rendre dans une liste
						my ($titrenet,$descriptionnet) = &nettoyage($titre,$description);
						# si "$dico_des_titres" existe
						if (exists $dico_des_titres{$titrenet}) {
							# incrémentation
							$dico_des_titres{$titrenet}++;
						}
						else {
							# sortie immédiate
							$dico_des_titres{$titrenet}=1;
							# sortie
							print OUTTXT "$titrenet\n";
							print OUTTXT "$descriptionnet\n";
							print OUTTXT "--------------------\n";
							print OUTXML "<item>\n";
							print OUTXML "<titre>$titrenet</titre>\n";
							print OUTXML "<description>$descriptionnet</description>\n";
							print OUTXML "</item>\n";
						}
					}
				}
			}
		}
    }
}

#----------------------------------------------
# Le sous programme nettoyage
sub nettoyage {
	# donner la valeur du 1er élément de l'entrée à la variable "titre"
	my $titre = $_[0] ;
	# donner la valeur du 2nd élément de l'entrée à la variable "description"
	my $description = $_[1] ;
	# Remplacement
    $description=~s/&lt;.+?&gt;//g;
    $description=~s/&#38;#39;/'/g;
    $description=~s/&#38;#34;/"/g;
    $description=~s/&amp;/&/g;
    $description=~s/^<!\[CDATA\[//;
    $description=~s/\]\]>$//;
    $titre=~s/&lt;.+?&gt;//g;
    $titre=~s/&#38;#39;/'/g;
    $titre=~s/&#38;#34;/"/g;
    $titre=~s/&amp;/&/g;
    $titre=~s/^<!\[CDATA\[//;
    $titre=~s/\]\]>$//;
	# Ajouter . pour marquer la fin de discours (titre)
	$titre=~s/$/\./g; # $ : fin de ligne
	# Renvoyer les résultats
	return $titre, $description ;
}