#/usr/bin/perl
<<DOC;
 Nom : Xiaoxia & Wenfei
 2019-2020-S2-Projet BaO-BaO1-regex
 Commande : perl BaO1-extraction-regex.pl repertoire-a-parcourir code-rubrique
 Moyen : On extrait des titres et des descriptions à l'aide des expressions régulières.
 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-regex-sortie-slurp_$rubrique.txt : un texte brut séparé 
		     par "------" tous les articles
           - BaO1-extraction-regex-sortiexml-slurp_$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 pour obtenir le temps
use Time::HiRes qw(gettimeofday tv_interval);
my $timepg = [gettimeofday];
# 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/[\/]$//;
# Préparer les fichiers (TXT et XML) de sortie où on met les résultats d'extraction
open(OUT,">:encoding(utf8)","BaO1-extraction-regex-sortie-slurp_$rubrique.txt");
open(OUTXML,">:encoding(utf8)","BaO1-extraction-regex-sortiexml-slurp_$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 ;

#----------------------------------------
# Faire appel au sous programme parcoursarborescencefichiers en prenant le répertoire comme argument
&parcoursarborescencefichiers($rep);	#recurse!

#----------------------------------------
# Fermer des fichers de sortie
close(OUT);
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) {
	    # 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);
		}
		# 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$/) {
				# Obtenir le contenu
				open(FIC,"<:encoding(utf8)",$file);
				$/ = undef ; # ou $/=""
				my $textelu=<FIC> ;
				close(FIC) ;
				# Utiliser les expressions régulières pour extraire le titre et la description de chaque article
				while ($textelu=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) {
					# Donner respectivement des contenus mémorisés par les crochets 
					my $titre=$1;
					my $description=$2;
					# si "$dico_des_titres" existe
					if ( exists $dico_des_titres{$titre} ) {}
					else { $dico_des_titres{$titre}=$description ;
						# nettoyage
						# une liste () commen entrée pour le sous programme et le rendre dans une liste
						($titre, $description)=&nettoyage($titre, $description) ;
						# sortie
						print OUT $titre,"\n";
						print OUT $description,"\n";
						print OUT "--------------------\n";
						print OUTXML "<item>\n";
						print OUTXML "<titre>$titre</titre>\n";
						print OUTXML "<description>$description</description>\n";
						print OUTXML "</item>\n";
					}
					# $i : compteur
					print "$file est le" , $i++ , "\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 ;
}