#/usr/bin/perl
use utf8;

#--------------------------------------------------------------------------------------------------------------------------------------------------------
# SEGHIER Marina
# BAO1 "extraction du texte" : parcourir toute l'arborescence et extraire les contenus textuels de tous les fils (classement des textes extraits par rubrique)
#--------------------------------------------------------------------------------------------------------------------------------------------------------

# Pour lancer le script : perl bao1.pl 2021

#-----------------------------------------------------------
my $input="$ARGV[0]"; # on stocke dans la variable input le script (1er argument de la commande)
my $rubrique="$ARGV[1]"; # on stocke dans la variable rubrique le dossier (2e argument de la commande)
$input=~ s/[\/]$//; # on s'assure que le nom du dossier ne se termine pas par un /

# on ouvre 2 fichiers en sortie (1 txt et 1 xml) en encodant en UTF-8
open my $output_txt, ">:encoding(utf8)","corpus_$rubrique.txt";
open my $output_xml, ">:encoding(utf8)","corpus_$rubrique.xml";

# on écrit dans le fichier xml les 1ères balises
print $output_xml "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
print $output_xml "<corpus>\n";

# on crée un dictionnaire vide qui va contenir les titres
my %dico_titres=();

#----------------------------------------
&parcoursarborescencefichiers($input);	# on appelle la fonction parcoursarborescencefichiers

#----------------------------------------
# on écrit la dernière balise fermante dans le fichier xml
print $output_xml "</corpus>\n";

# on ferme le script et les fichiers
close $input;
close $output_txt;
close $output_xml;

#---------------*FONCTIONS*-----------------#

# 1) parcoursarborescencefichiers :

sub parcoursarborescencefichiers {
    my $chemin = shift(@_); # on crée la variable chemin
    opendir(DIR, $chemin) or die "Impossible d'ouvrir : $chemin .\n"; # on ouvre le chemin avec la fonction opendir
    my @fichiers = readdir(DIR);  # on ouvre les fichiers avec la fonction readdir et on les stocke dans l'array fichiers
    closedir(DIR); # et on ferme le chemin
    foreach my $fichier (@fichiers) { # boucle pour chaque fichier
		next if $fichier =~ /^\.\.?$/; # on vérifie que fichier existe bien
		$fichier = $chemin."/".$fichier; # le fichier c'est donc celui au bout du chemin haha (feuille)
		if (-d $fichier) { # test si le fichier est un répertoire (option -d)
	    	&parcoursarborescencefichiers($fichier);	# on rappelle la fonction pour y rechercher encore des fichiers
		}
		if (-f $fichier) { # test si fichier est un fichier (option -f)
	    	if ($fichier =~/$rubrique.+xml$/) { # on lance le traitement sur les fichiers qui ont l'extension xml
				print $i++," : Traitement de --> ",$fichier,"\n"; # on incrémente un compteur pour décompter les fichiers pour suivre le traitement (utile quand ce sera plus sur le corpus test)
				open my $contenu,"<:encoding(utf8)",$fichier; # on ouvre le fichier et on stocke le contenu dans la variable éponyme
				$/=undef; # par défaut cette variable contient \n
				my $texte=<$contenu>; # on définit la variable texte et contient le contenu (!)
				close $contenu; # on ferme le contenu
				while ($texte=~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/gs) { # boucle tant que où on va écrire tout ça dans le fichier xml 
		    		my $titre=$1; # titre correspond au 1er (.+?) ci-dessus
		    		my $description=$2; # description correspond au 2e (.+?) ci-dessus
		    		if (!(exists $dico_titres{$titre})) { # si le titre n'existe pas encore dans le dico alors on l'écrit (sinon non --> évite les doublons)
						$dico_titres{$titre}=$description ; # alors on le rajoute au dico avec sa description
			
						# on lance la fonction nettoyage sur tous les titres et les descriptions
						($titre,$description)=&nettoyage($titre,$description);
			
						# on écrit le résultat dans les fichiers en sorties
						print $output_txt $titre,"\n"; # on écrit le titre dans le fichier txt
						print $output_txt $description,"\n\n"; # on écrit la description dans le fichier txt
						print $output_xml "<item><titre>\n$titre\n</titre><description>\n$description\n</description></item>\n"; # on écrit les titres et les descriptions dans le fichier xml

		    		}
				}
	    	}
		}
	}
}

#----------------------------------------------

# 2) nettoyage :

sub nettoyage {
    my $titre = $_[0]; # sera le 1er argument de la fonction quand on l'appelera
    my $description = $_[1]; # sera le 2e argument de la fonction quand on l'appelera
    # là on enlève toutes les choses indésirables pour ne garder que le texte
	$titre=~s/^<!\[CDATA\[//;
	$titre=~s/\]\]>$//;
	$titre=~s/$/\./g;
	$titre=~s/&#38;#39;/'/g;
    $titre=~s/&#38;#34;/"/g;
	$titre=~s/&lt;.+?&gt;//g;
	$description=~s/^<!\[CDATA\[//;
	$description=~s/\]\]>$//;
    $description=~s/&#38;#39;/'/g;
    $description=~s/&#38;#34;/"/g;
    $description=~s/&lt;.+?&gt;//g;
    return $titre,$description; # et on retourne le résultat (titres et descriptions)
}