#/usr/bin/perl
<<DOC; 
JANVIER 2019
Le programme prend en entrée le nom du répertoire contenant les fichiers et la rubrique à traiter.
perl programme.pl dossier_fichier/ 3208
DOC
#-----------------------------------------------------------

use utf8;
my $rep="$ARGV[0]";
my $rubrique="$ARGV[1]";
my %doublon;
#Crétion des fichiers de sortie pour chaque rubrique
open(FILEOUT1, ">:encoding(utf-8)", "sortie_$rubrique.txt");
open(FILEOUT2, ">:encoding(utf-8)", "sortie_$rubrique.xml");
print FILEOUT2 "<?xml version='1.0' encoding='UTF-8'?>\n";
print FILEOUT2 "<PARCOURS>\n";
print FILEOUT2 "<nom>Elias SELHAOUI</nom>\n";
print FILEOUT2 "<fichiers-rss rubrique='$rubrique'>\n";

open(TALISMANE, ">:encoding(utf-8)", "sortie-$rubrique-talismane.txt");

# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
#----------------------------------------
#Appel de la procédure afin de pouvoir parcourir tous les fichiers du répertoire
#Procédure qui est défini après
&parcoursarborescencefichiers($rep);

#fermeture des balises dans les fichiers XML de sortie
print FILEOUT2 "</fichiers-rss>\n";
print FILEOUT2 "</PARCOURS>\n";
close FILEOUT1;
close FILEOUT2;
close TALISMANE;
# on lance la récursion.... et elle se terminera après examen de toute l'arborescence
#----------------------------------------
exit;
#----------------------------------------------
#la procédure:
sub parcoursarborescencefichiers {
    my $path = shift(@_);#@_ contient les arguments passés au sous-programme en cours (sub)
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR); #readdir : fonction qui permet de lire le répertoire, renvoit une liste des ressources qu'il contient;
	#readdir c'est "l'équivalent" de l'affichage ls.
    closedir(DIR);
    foreach my $file (@files) {
        next if $file =~ /^\.\.?$/; #passe au prochain élément de la liste si l'élément sur lequel on est correspond à .(répertoire courant)
		#ou ..(répertoire parent)
		$file = $path."/".$file;#reconstruction du chemin relatif
		if (-d $file) {
			print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
			&parcoursarborescencefichiers($file);	#recurse
			print "<FIN REPERTOIRE> ==> ",$file,"\n";
		}
		if (-f $file) {
            if ($file=~ m/$rubrique.+\.xml$/ ) {
                print "\n<",$i++,"> ==> ",$file,"\n\n";
                #Traitement réalisé sur chaque fichier
                
                open(FILEIN, "<:encoding(utf-8)", $file);
                open(FILEOUT1, ">>:encoding(utf-8)", "sortie_$rubrique.txt");
                open(FILEOUT2, ">>:encoding(utf-8)", "sortie_$rubrique.xml");
				print FILEOUT2 "<date>$file</date>\n";
				
                my $texte="";
                while (my $ligne=<FILEIN>) { #Lecture ligne par ligne du fichier ouvert
                    chomp $ligne; #Suppression du retour à la ligne sur la ligne en cours
					$ligne =~ s/\r//g; #Suppression du retour chariot, sait-on jamais
                    $texte=$texte.$ligne; #Concaténation de la ligne lue dans la variable $texte.
                }
                close FILEIN;
                $texte =~ s/>  +</></g; #Suppression des possibles espaces
				
				#Substitution des entités HTML avec les caractères qui y correspondent
				$texte =~ s/\\xE9/é/g;
				$texte =~ s/\\xE/è/g;
				$texte =~ s/\\xE0/à/g;
				$texte =~ s/\\xEA/ê/g;
				
                my $num=1;
				
				my $pourtalismane = "";
				
                #Extraction des données textuels du titre et description
                while ($texte =~ /<item>.*?<title>([^<]*)<\/title>.*?<description>([^<]*)<\/description>.*?<\/item>/g){
                    my $title=$1;
                    my $description=$2;
                    
                    #On contrôle que le titre n'a pas encore été lu pour ne pas avoir plusieurs fois le même titre
                    if (!exists $doublon{"$title"})
                    {
                        $doublon{$title}=1;
                        my ($title_clean, $description_clean) = &nettoyage ($title, $description);
                        
						my $titre_clean_tal = $titre_clean;
						my $description_clean_tal = $description_clean;
						
						#On découpe les descriptions ligne par ligne en ajoutant une fin de ligne
						#après avoir rencontré l'un des signes de ponctuation de la liste ci-dessous pour Talismane
						$titre_clean_tal =~ s/([…\.\?\!]+)/$1\n\n/g;
						$description_clean_tal =~ s/([…\.\?\!]+)/$1\n\n/g;
						$titre_clean_tal =~ s/(\n)+ +/$1/g;
						$description_clean_tal =~ s/(\n)+ +/$1/g;
						
						
						$pourtalismane = $pourtalismane . $title_clean_tal . "\n\n" . $description_clean_tal . "\n\n";
						
                        #Impression des données textuelles extraites dans les fichiers de sortie
                        print FILEOUT1 "$title_clean\n";
                        print FILEOUT1 "$description_clean\n";
                        
						
						#Lancement du sous-programme TreeTagger
						my ($title_treetagger, $description_treetagger) = &etiquetage_treetagger($title_clean, $description_clean);
						
						print FILEOUT2 "<item numero='$num'>\n";
                        print FILEOUT2 "<titre>$title_treetagger</titre>\n";
                        print FILEOUT2 "<description>$description_treetagger</description>\n";
                        print FILEOUT2 "</item>\n";
                        
                        $num++;
                    }
                    
                }
				#Lancement du sous-programme Talismane
                #my $etiquetTa = &etiquetage_talismane($pourtalismane);
				print TALISMANE "##date: $file\n";
				print TALISMANE "$etiquetTa";
                
                
            }
		}
    }
}
#Nettoyage des entités et caractères bizarres
sub nettoyage {
    my $var1=shift(@_);
    my $var2=shift(@_);
	
    $var1 = $var1 . "." ;
	$var1 =~ s/&#38;#39;/'/g;
	$var2 =~ s/&#38;#39;/'/g;
	$var1 =~ s/&#38;#34;/"/g;
	$var2 =~ s/&#38;#34;/"/g;
	$var1 =~ s/&#233;/é/g;
	$var2 =~ s/&#233;/é/g;
	$var1 =~ s/&#234;/ê/g;
	$var2 =~ s/&#234;/ê/g;
	$var1 =~ s/Ã©/é/g;
	$var2 =~ s/Ã©/é/g;
	$var1=~s/&lt;.+?&gt;//g;
    $var2=~s/&lt;.+?&gt;//g;
	$var1 =~ s/è8/è/g;
	$var2 =~ s/è8/è/g;
	$var1 =~ s/è0/à/g;
	$var2 =~ s/è0/à/g;
	$var1 =~ s/è7/ç/g;
	$var2 =~ s/è7/ç/g;
	$var1 =~ s/èA/ê/g;
	$var2 =~ s/èA/ê/g;
	$var1 =~ s/è2/â/g;
	$var2 =~ s/è2/â/g;
	$var1 =~ s/èF/ï/g;
	$var2 =~ s/èF/ï/g;
	
    return $var1, $var2;
}

sub etiquetage_treetagger
{
	#dans le cours, on a écrit:
	#my $vartitre = $_[0];
	#my $vardesc = $_[1];
	
	my $vartitre = shift(@_);
	my $vardesc = shift(@_);
	
	my $titretagger;
	my $desctagger;
	
	
	open (TMP, ">:encoding(utf-8)", "temp.txt");
	print TMP $vartitre;
	close TMP;#fermer le fichier est obligatoire sinon problème
	
	#On lance à la suite TreeTagger et un programme perl qui permet de transformer la sortie tree-tagger sous forme de document XML
	system("perl tokenise-utf8.pl -f temp.txt | tree-tagger.exe french-oral-utf-8.par -token -lemma -no-unknown > temp_tag.txt");
	system("perl treetagger2xml-utf8.pl temp_tag.txt utf8");
	
	{
		local $/=undef;
		open(FIC1, "<:encoding(utf-8)", "temp_tag.txt.xml");
		$titretagger = <FIC1>;
		#On supprime l'en-tête XML qui est produit automatiquement par 'treetagger2xml-utf8.pl' pour n'en avoir qu'un
		$titretagger =~ s/<\?xml.+?>//;
		close FIC1;
	}		
	

	#Rebelote pour les descriptions
	open (TMP, ">:encoding(utf-8)", "temp.txt");
	print TMP $vardesc;
	close TMP;#fermer le fichier est obligatoire sinon problème
	
	system("perl tokenise-utf8.pl -f temp.txt | tree-tagger.exe french-oral-utf-8.par -token -lemma -no-unknown > temp_tag.txt");
	system("perl treetagger2xml-utf8.pl temp_tag.txt utf8");
	
	{
		local $/=undef;
		open(FIC1, "<:encoding(utf-8)", "temp_tag.txt.xml");
		$desctagger = <FIC1>;
		$desctagger =~ s/<\?xml.+?>//;
		close FIC1;
	}
	
	
	return $titretagger, $desctagger;
}

sub etiquetage_talismane
{
	my $var = shift(@_);
	open (TMP, ">:encoding(utf-8)", "bao1_test.txt");
	print TMP $var;
	close TMP;
	#Utilisation de Talismane sur les titres et descriptions du fil RSS
	system("java -Xmx1G -Dconfig.file=./TALISMANE/talismane-fr-5.0.4.conf -jar ./TALISMANE/talismane-core-5.1.2.jar --analyse --sessionId=fr --encoding=UTF8 --inFile=bao1_test.txt --outFile=bao1_test.tal");
	
	my $lefil;
	{
		local $/=undef;
		open(FIC1, "<:encoding(utf-8)", "bao1_test.tal");
		$lefil = <FIC1>;
		close FIC1;
	}
	return $lefil;
}