#ce script utilisera la bibliothéque XML::RSS
use XML::RSS;

#-----------------------------------------------------------
#déclarations des variables d'arguments 
#$rep = le nom du répertoire dans lequel on va aller chercher les fichiers à traiter
my $rep="$ARGV[0]";
my $rss=new XML::RSS;
#la rubrique qu'on va traiter 
my $rubrique="$ARGV[1]";
#tableau qu'on utilise pour vérifier que les données stockées étaient déjà récupérées (1 seule fois seulement)
my %redondant;


#création du fichier TXT et du fichier XML en sortie 
open(TXT,">:encoding(utf-8)","lemonde_rss$rubrique.txt");
open(XML,">:encoding(utf-8)","lemonde_rss$rubrique.xml");

#ecriture du début du fichier XML  
print XML "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
print XML "<Document>\n";
print XML "<NOM>Ponchard Clara</NOM>\n"; 
print XML "<NOM>Missud Alice</NOM>\n"; 
print XML "<Extraction>\n\n";
#-----------------------------------------------------------

# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;

#----------------------------------------
# on lance la récursion.... et elle se terminera après examen de toute l'arborescence
&parcoursarborescencefichiers($rep);
#----------------------------------------
#on referme les balises d'en tête
print XML "</Extraction>";
print XML "</Document>\n";
#on ferme nos deux fichiers de sortie 
close XML;
close TXT;

exit;
#-----------------------------------
#definition de la fonction de parcours et de filtrage avec le module XML::RSS
sub parcoursarborescencefichiers {
	#declaration de la variable path, shift va supprimer le premier élément du tableau @_ et le renvoyer 
	my $path = shift(@_);
	#la fonction opendir prend deux arguments
	opendir(DIR, $path) or die "can't open $path: $!\n";
	#fonction readdir va rassembler dans ce tableau tous les fichiers/répertoires contenus dans le répertoire principal
	my @files = readdir(DIR);
    closedir(DIR);
    #pour chaque fichier parmi tous les fichiers
	foreach my $file (@files) {
		#passe au suivant si l'élément sur lequel on est, est un chemin 
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file;
		#- d appliqué a un objet sera vrai si c'est un repertoire 
		if (-d $file) {
			print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
			#on relance le parcours de repertoire
			&parcoursarborescencefichiers($file);	
			print "<FIN REPERTOIRE> ==> ",$file,"\n";
		}
		#on arrive sur fichie
		if (-f $file) {
			if ($file=~m/$rubrique.+\.xml$/){ #m=match si l'extension est xml
				print "<",$i++,"> ==> ",$file,"\n";
				
				
				eval {$rss->parsefile($file); };
				if( $@ ) {
					$@ =~ s/at \/.*?$//s;     
					print STDERR "\nERROR in '$file':\n$@\n";
				}
				else {
					foreach my $item (@{$rss->{'items'}}) {
						my $description=$item->{'description'};
						my $titre=$item->{'title'};
						
						if (!(exists $redondant{$titre})) {
							$redondant{$titre}=1;
							my ($titre_propre_rss,$description_propre_rss) = &nettoyage($titre,$description);
							print TXT "$titre_propre_rss\n";
							print TXT "$description_propre_rss\n\n";

					
							$compteurItem++;
							my ($titre_etiq_rss,$description_etiq_rss) = &etiquetage($titre_propre_rss,$description_propre_rss);
							print XML "<item number=\"$compteurItem\">\n<titre>\n$titre_etiq_rss</titre>\n\n<description>\n$description_etiq_rss</description>\n</item>\n";
						}
					}
				}	
				
			}
		}
		
		
	}

}


#----------------------------------------------

sub nettoyage {

	#on vide la liste des arguments
	my $var1=shift @_;
	my $var2=shift @_;
	
	#on rajoute un point à la fin de chaque titre 
	$var1.=".";
	#on remplace le & par la forme et 
    $var1=~s/&amp;/et/g;
    $var1=~s/amp;/et/g;
    $var1=~s/&/et/g;
    $var1 =~ s/&lt;.+?&gt;//g;
    $var2=~s/&amp;/et/g;
    $var2=~s/amp;/et/g;
    $var2=~s/&/et/g;
    $var2 =~ s/&lt;.+?&gt;//g;

	
	return $var1,$var2;

}

#-----------------------------------------------

sub etiquetage {

	#on vide le tableau avec ce qui était passé en argument 
	my $var1=shift @_;
	my $var2=shift @_;
	
	#on crée un fichier pour le titre 
	open(OUT3,">:encoding(utf-8)","titre_tmp_rss.txt");
	#ecriture du texte 
	print OUT3 $var1;
	close OUT3;
	#lancement de la commande SYSTEM qui permet de lancer une commande sur le système d'exploitation qu'on utilise
	#appel du programme qui fait l'etiquetage 
	system("perl tokenise-utf8.pl titre_tmp_rss.txt | ./tree-tagger.exe -lemma -token -no-unknown french-oral-utf-8.par > titre_tmp_etiq_rss.txt");
	#lancement du programme qui fait le balisage XML 
	system("./treetagger2xml-utf8-macosx titre_tmp_etiq_rss.txt utf8");
	#$/ est une variable de perl qui a pour valeur \n --> à partir de maintenant on ne lit plus le fichier ligne par ligne mais globalement 
	$/=undef; 

	# Ouverture du fichier créé (celui avec les balises XML) pour extraire ces données et les 
	# transformer dans une chaîne de caractères pour les mettre par la suite dans le fichier globale
	open(FILEIN2,"<:encoding(utf8)","titre_tmp_etiq_rss.txt.xml");
	my $titre_retour=<FILEIN2>;
	$titre_retour =~s/<\?xml version="1\.0" encoding="utf-8" standalone="no"\?>\r?\n?//;
	
	#on crée un fichier pour la description 
	open(OUT4,">:encoding(utf-8)","description_tmp_rss.txt");
	#ecriture du texte 
	print OUT4 $var2;
	close OUT4;
	system("perl tokenise-utf8.pl description_tmp_rss.txt | ./tree-tagger.exe -lemma -token -no-unknown french-oral-utf-8.par > description_tmp_etiq_rss.txt");
	system("p./treetagger2xml-utf8-macosx description_tmp_etiq_rss.txt utf8");
	$/=undef;
	open(FILEIN3,"<:encoding(utf8)","description_tmp_etiq_rss.txt.xml");
	my $description_retour=<FILEIN3>;
	$description_retour =~s/<\?xml version="1\.0" encoding="utf-8" standalone="no"\?>\r?\n?//;
	$/="\n"; 
	# Renvoie des données au programme principal
	# Renvoie le titre étiqueté et balisé, ainsi que la description étiquetée et balisée
	return $titre_retour,$description_retour;
	
	
	
	


}
