#/usr/bin/perl
<<DOC; 
GREZDA Bertisa 		   -- 21801648
GERVAIS d'ALDIN Thomas -- 21103028
TRIEU Thi Theu 		   -- 21703607

AVRIL 2021

usage: perl Ba0_1.pl repertoire rubrique

Le programme prend en entrée 2 arguments :

 1 / le nom du répertoire à parcourir qui contient les fichiers que l'on veut extraire
 2 / la référence à la rubrique qu'il faut extraire dans l'arboresence 

Le programme produit en sorie :

 1 / Un fichier au format txt contenant les titres et les descriptions de chaque article de la rubrique désignée
 2 / Un fichier au format xml contenant les titres et les descriptions de chaque article de la rubrique désignée

 Exemple d'utilisation: 
	$ perl BaO_1.pl arborescence-filsdumonde-2020-tljours-19h/2020 3028

DOC

#-----------------------------------------------------------
# Déclaration des deux arguments du programme
my $rep="$ARGV[0]";
my $rubrique ="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;

# On déclare et on
open(OUT,">:encoding(utf8)","sortie-txt_$rubrique.txt");
open(OUTXML,">:encoding(utf8)","sortie-xml_$rubrique.xml");

#on met la première ligne dans chaque fichier
print OUTXML "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print OUTXML "<corpus2020>\n";

# création d'un dictionnaire vide destiné à contenir les titres
my %dico_des_titres=();

#----------------------------------------
# On applique la fonction 'parcoursarborescencefichiers' sur le dossier donné en argument
&parcoursarborescencefichiers($rep);	#recurse!

#----------------------------------------

close OUT;
close OUTXML;
exit;

#---------------FONCTIONS-----------------


sub parcoursarborescencefichiers {
    my $path = shift(@_);
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR); #on ouvre les fichiers pour les stocker dans la variable puis on les ferme
    foreach my $file (@files) {
		next if $file =~ /^\.\.?$/; #on verifie que $file n'est pas un répertoire caché
		$file = $path."/".$file;
		if (-d $file) { #si $file est un répertoire on rappelle la fonction
	    	&parcoursarborescencefichiers($file);	#recurse!
		}
		if (-f $file) { #si $file est un fichier on lance le traitement 
			# On va cherche les fichiers xml
	    	if ($file =~/$rubrique.+xml$/) {
	    		# On affiche sur la sortie un message indiquant le traitement de chaque fichier
				print $i++," Traitement de : ",$file,"\n";
				# On crée ouvre le fichier le question
				open(FIC,"<:encoding(utf8)",$file);
				$/=undef;
				# On stocke son contenu dans une variable    
				my $textelu=<FIC>;
				close FIC; #on recupère le contenu des fichiers
				my $compteur=1;  #compteur qui permet de numéroter les items
				# On parcourt ce qu'on veut extraire dans le texte
				while ($textelu=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg) {
		    		my $titre=$1;
		    		my $description=$2;
		    		if (!(exists $dico_des_titres{$titre})) { #on vérifie que le titre n'a pas encore été lu pour éviter les doublons
						$dico_des_titres{$titre}=$description ; 
			
						# on appelle le sous-programme de nettoyage sur nos données
						($titre,$description)=&nettoyage($titre,$description);
			
						# on écrit les résultats en sorties
						print OUT $titre,"\n";
						print OUT $description,"\n";
						print OUT "--------------------\n";
						print OUTXML "<item numero='$compteur'>\n";
						print OUTXML "<titre>$titre</titre>\n";
						print OUTXML "<description>$description</description>\n";
						print OUTXML "</item>\n";
						$compteur++;
		    		}
				}
	    	}
		}
	}
}


#----------------------------------------------
# Un sous programme de nettoyage de chaînes
sub nettoyage {
    my $titre = $_[0];
    my $description = $_[1];
	$titre=~s/^<!\[CDATA\[//;
	$titre=~s/\]\]>$//;
	$titre=~s/&lt;.+?&gt;//g;
    $titre=~s/&#38;#39;/'/g;
    $titre=~s/&#38;#34;/"/g;
    $titre=~s/$/\./g;
	$description=~s/^<!\[CDATA\[//;
	$description=~s/\]\]>$//;
    $description=~s/&lt;.+?&gt;//g;
    $description=~s/&#38;#39;/'/g;
    $description=~s/&#38;#34;/"/g;
    return $titre,$description;
}