#/usr/bin/perl
#-----------------------------------------------------------
<<DOC; 
Yagmur Ozturk, Oscar Moreno 
usage : perl parcours-arborescence-fichiers repertoire-a-parcourir rubrique
DOC
#-----------------------------------------------------------
use XML::RSS;
use XML::RSS;
use Data::Dumper;
use Data::Dump qw(dump);
use strict;
use utf8;
#-----------------------------------------------------------
my $rep="$ARGV[0]";
my $rubrique="$ARGV[1]";
my $rss=new XML::RSS; # Création de l'objet XML::RSS
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
my $i=0;
my $nbItem=0;
my %doublons;
open(OUT, ">:encoding(utf-8)", "BAO2sortie-$rubrique-xmlrss.txt");
open(OUTXML, ">:encoding(utf-8)", "BAO2sortie-$rubrique-xmlrss.xml");
print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print OUTXML "<corpus2020>\n";

#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse!
close OUT;
print OUTXML "</corpus2020>\n";
close OUTXML;
system("rm TEST.txt TESTPOS.txt.pos");
print "Nb item : $nbItem \n";
exit;
#----------------------------------------------
&etiquetageTT;
&etiquetageUD;
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_);
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (@files) {
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file;
		if (-d $file) {
		    print "position :  $file \n";
			&parcoursarborescencefichiers($file);	#recurse!
		}
		if (-f $file) {
		    if ($file=~/$rubrique.+\.xml$/) {			
				print $i++," processing : ",$file,"\n"; # Affichage du nb et du nom du fichier traité
				&traitement_XMLRSS($file) # Procédure pour traiter le fils RSS
			}
		}
    }
}
#-----------------------------------------------------------
sub traitement_XMLRSS {
	my $file = shift(@_);
	eval {$rss->parsefile($file)};  
	if( $@ ) {
		$@ =~ s/at \/.*?$//s;
		print STDERR "\nERROR in '$file':\n$@\n";
	}

	else {
		foreach my $item (@{$rss->{'items'}}) {
	
			if (!(exists $doublons{$item->{'title'}})) {
				$doublons{$item->{'title'}}=$item->{'description'};
				$nbItem++;
				# On lance la procédure pour nettoyer les fils RSS
				(my $titre, my $description)=&nettoyage($item->{'title'},$item->{'description'});
				# Récuperation de la date de chaque item
				$item->{'link'} =~ m/\/(\d{4}\/\d{2}\/\d{2}).+?/;
				my $date = $1;
				# Remplissage de fichier XML. 
				print OUT "$titre\n";
				print OUT "$description\n";
				print OUT "\n";
				my ($titre_tokenise, $description_tokenise)=&tokenization($titre,$description);
				print OUTXML "<item date=\"$date\">\n<titre>\n$titre_tokenise</titre>\n<description>\n$description_tokenise</description>\n</item>\n";
			}
		}
	}
} 

#-----------------------------------------------------------

sub nettoyage {

my $titre = $_[0]; 
my $description = $_[1];

$titre = $titre . "." ;  #add dots at the end of titles (?)

$description =~s/&/et/g ;  #change et 
$titre =~s/&/et/g ;

$description=~s/^<;!\[CDATA\[//;  #clean some words 
$description=~s/\]\]&gt;$//;
$titre=~s/^<;!\[CDATA\[//;
$titre=~s/\]\]&gt;$//;

$description =~ s/&#38;#39;/'/g;   
$titre =~s/&#38;#39;/'/g;

$description =~s/&#38;#34;/"/g;
$titre =~s/&#38;#34;/"/g;

$description =~s/&lt;.+?&gt;//g ;  #get rid of balises 
$titre =~s/&lt;.+?&gt;//g ;

return $titre, $description;
}

#----------------------------------------------
sub tokenization {
	# Récuperation des arguments de la procédure
    my $titre = $_[0];
    my $description = $_[1];
	#-----------------tokenisation titre-----------------------------
	# Création d'un fichier intermédiere avec le titre pour tokenisé le contenu
	&ecrire_fichier("TEST.txt", $titre);
	# Lancement du tokenisateur de tree-tagger
    system ("perl -f ./distrib-treetagger/tokenise-utf8.pl TEST.txt > TESTPOS.txt.pos");
    my $titre_tokenise_xml = &lire_fichier("TESTPOS.txt.pos");
	#-----------------tokenisation description-----------------------------
	&ecrire_fichier("TEST.txt", $description);
    system ("perl -f ./distrib-treetagger/tokenise-utf8.pl TEST.txt > TESTPOS.txt.pos");
	my $description_tokenise_xml = &lire_fichier("TESTPOS.txt.pos");
	# On revoie les deux variables contenant le titre et la description tokenisés.
    return $titre_tokenise_xml, $description_tokenise_xml;
}

#----------------------------------------------
sub etiquetageTT {
	# Étiquetage des POS et lemmas du français avec TreeTagger depuis le répertoire ./treetagger-3.2
	# -f pour le français. Le modéle utilisé est destiné au français
    print "Tagging...\n";
    system("perl -f ./distrib-treetagger/tokenise-utf8.pl BAO2sortie-XMLRSS-xml_$rubrique.xml | ./distrib-treetagger/bin/tree-tagger ./distrib-treetagger/french-utf8.par -token -lemma -no-unknown -sgml > sortie-XMLRSS-xml-TT_$rubrique");
    # Lancement de duexième programme pour baliser chaque nouvelle étiquette ou élément.
	# Ce programme a été légèrement modifié pour l'adapter à ce travail
    print "Création d'un fichier XML étiqueté...\n";
	system("perl ./distrib-treetagger/treetagger2xml-utf8.pl BAO2sortie-XMLRSS-xml-TT_$rubrique utf8");
	# Nous changeons le html entities..
    my $text = &lire_fichier("BAO2sortie-XMLRSS-xml-TT_$rubrique.xml");
    $text =~ s/&/&amp;/g;
    &ecrire_fichier("BAO2sortie-XMLRSS-xml-TT_$rubrique.xml", $text);
    system("rm BAO2sortie-XMLRSS-xml_$rubrique.xml BAO2sortie-XMLRSS-xml-TT_$rubrique"); 
}
#-----------------------------------------------
sub etiquetageUD {
	# Étiquetage en dépendance avec UDpipe depuis le programme situé dans le répertoire ./udpipe-1.2.0-bin
	# Sortie : un fichier txt format CONLL. 
	# Utilisation de l'option --tokenizer=presegmented pour eviter la sur-segmentation
	system("./distrib-udpipe-1.2.0-bin/udpipe-1.2.0-bin/bin-osx/udpipe --tokenize --tokenizer=presegmented --tag --parse ./distrib-udpipe-1.2.0-bin/modeles/french-gsd-ud-2.5-191206.udpipe sortie-XMLRSS_$rubrique.txt > sortie-XMLRSS-udpipe_$rubrique.txt");
}
#--------------------------------------------------
sub lire_fichier {
    my ($filename) = @_;
    open my $in, '<:encoding(UTF-8)', $filename or die "Impossible d'ouvrir '$filename'$!";
    local $/ = undef;
    my $texte = <$in>;
    close $in;
    return $texte;
}
#--------------------------------------------------
sub ecrire_fichier {
    my ($filename, $texte) = @_;
    open my $out, '>:encoding(UTF-8)', $filename or die "Impossible d'ouvrir '$filename'$!";
    print $out $texte;
    close $out;
    return;
}