#/usr/bin/perl



<<DOC;

Noelie BOTTERO & Yimina
Yimina & Noélie BOTTERO
Projet encadré 2 2020-2021
Pour lancer le programme : perl BAO2_xmlrss.pl repertoire-a-parcourir num-rubrique
 Le programme prend en entrée le nom du répertoire contenant les fichiers
 à traiter et le nom de la rubrique à traiter parmi ces fichiers
 Ce programme permet d'extraire les titres et les descriptions d'articles issus de fil RSS du Monde
 Ensuite, les données sont tokenisées, lemmatisées, et des relations morpho-syntaxiques sont ajoutées
 par deux traitements : UDpipe et Tree Tagger
 
 Version 2 = XML::RSS

DOC

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

<<DOC;
Utilisation de la bibliothèque XML:RSS
Le fichier perl est encodé en utf-8 ainsi que les fichiers d'entrée et de sortie
DOC

use XML::RSS; 
use utf8;
use open ':utf8';
use Timer::Simple ();
binmode(STDIN,":utf8");
binmode(STDOUT,":utf8");

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



<<DOC;
Récupération du nom du répertoire en argument, puis du numéro de la rubrique
Ouverture de deux fichiers de sortie : un en XML et l'autre en TXT
Insertion de la déclaration XML dans le fichier de sortie XML
DOC

my $rep="$ARGV[0]"; 
my $rubrique="$ARGV[1]"; 
my $rss=new XML::RSS; 
$rep=~ s/[\/]$//; 


open my $output, ">:encoding(UTF-8)","BAO2_XMLRSS_$rubrique.txt";
open my $outxml, ">:encoding(UTF-8)","BAO2_XMLRSS_$rubrique.xml";
print $outxml "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print $outxml "<corpus2020>\n";
my %dico_des_titres; 
my $numberItem=0;
my $nbFile=0;

my $time = Timer::Simple->new();
#------------------------------------------------------------------

<<DOC;
Initialisation d'un compteur d'items
Création d'une balise "corpus2020" qui contiendra comme id la valeur du nom de la rubrique
Appel de la fonction de récursivité
Fermeture de la balise extraction et des fichiers de sortie
DOC


&parcoursarborescencefichiers($rep); #recurse!
print $outxml "</corpus2020>\n";
close $output;
close $outxml;
print "Nb item : $numberItem \n";

# etiqueter le fichier xml avec treetagger et ecrire le resultat en xml

&treetagger;
&udpipe;
#&etiquetagetreetagger;
print "temps d'exécution: $time\n";
exit;

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


# Fonction qui parcourt l'arborescence de fichiers par récursivité

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 "On entre dans ==> ",$file,"\n";
			&parcoursarborescencefichiers($file); 
			print "On sort de ==> ",$file,"\n";
		}
		if (-f $file) { 
			if ($file =~/$rubrique.+xml$/){ 
				print "<",$numberItem++,"> ==> ",$file,"\n";
				eval {$rss->parsefile($file); };
				if( $@ ) {
					$@ =~ s/at \/.*?$//s;      
					print STDERR "\nERROR in '$file':\n$@\n";
				} 
				else {
					print $outxml "<fichier>\n";
					foreach my $item (@{$rss->{'items'}}) {
					my $description=$item->{'description'};
					my $title=$item->{'title'};
					$title=~s/<[^>]+>//g;
					$description=~s/<[^>]+>//g;
					$nbFile++; 
					if (!(exists ($dico_des_titres{$title}))) {
						$dico_des_titres{$title}=1;
						my($titre_nettoye,$description_nettoye) = &nettoyage1($title,$description);
						my($titre_nettoye_XML,$description_nettoye_XML) = &nettoyage2($title,$description);
						print $output "$titre_nettoye\n$description_nettoye\n--------------------\n";
						print $outxml "\t<item>\n\t\t<titre>$titre_nettoye_XML</titre>\n\t\t<description>$description_nettoye_XML</description>\n\t</item>\n";
					}
					}
					print $outxml "</fichier>\n";
				}			
			}	
		}
	}
}

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

# Procédure de nettoyage préliminaire des fichiers txt avant le traitement du contenu textuel
sub nettoyage1 { 
	my ($titre,$description)=@_;
	$description=~s/^<!\[CDATA\[//;
	$description=~s/\]\]>//; 
	$description=~s/&lt;.+?&gt;//g; 
	$description=~s/&#38;#39;/'/g;
	$description=~s/&#38;#34;/"/g;
	$description=~s/&amp;/&/g; 
	$description=~s/([^\.])$/$1./g;
	$titre=~s/^<!\[CDATA\[//g;
	$titre=~s/\]\]>//; 
	$titre=~s/&lt;.+?&gt;//g; 
	$titre=~s/&#38;#39;/'/g; 
	$titre=~s/&#38;#34;/"/g; 
	$titre=~s/&amp;/&/g; 
	$titre=~s/([^\.])$/$1./g; 
	return $titre,$description;
}

# Procédure de nettoyage préliminaire des fichiers xml avant le traitement du contenu textuel

sub nettoyage2 { 
	my ($titre,$description)=@_;
	$description=~s/^<!\[CDATA\[//;
	$description=~s/\]\]>//; 
	$description=~s/&lt;.+?&gt;//g; 
	$description=~s/&#38;#39;/'/g; 
	$description=~s/&#38;#34;/"/g;
	$description=~s/&(?!amp;)/&amp;$1/g; 
	$description=~s/([^\.])$/$1./g;
	$titre=~s/^<!\[CDATA\[//g;
	$titre=~s/\]\]>//; 
	$titre=~s/&lt;.+?&gt;//g; 
	$titre=~s/&#38;#39;/'/g; 
	$titre=~s/&#38;#34;/"/g; 
	$titre=~s/&(?!amp;)/&amp;$1/g;
	$titre=~s/([^\.])$/$1./g; 
	return $titre,$description;
}

#------------------------------------------------
sub treetagger
{
	system "perl tokenise-utf8.pl -f BAO2_XMLRSS_$rubrique.xml | ./tree-tagger french-utf8.par  -token -lemma -no-unknown -sgml  > sortie-treetagger-$rubrique.txt";
	system "perl treetagger2xml-utf8.pl sortie-treetagger-$rubrique.txt utf-8";
}


#------------------------------------------------
sub udpipe
{
	system "../distrib-udpipe-1.2.0-bin/udpipe-1.2.0-bin/bin-linux64/./udpipe --tokenize --tokenizer=presegmented --tag --parse ../distrib-udpipe-1.2.0-bin/modeles/french-sequoia-ud-2.5-191206.udpipe BAO2_XMLRSS_$rubrique.txt > sortie-udpipe-$rubrique.txt";
}

sub tokenisationpourtreetagger
{
	# arguments geres par la liste @_
	my $titre=$_[0];
	my $description=$_[1];

	open my $tmpfile, ">:encoding(utf-8)", "tmpfile.txt";
	print $tmpfile $titre;
	close $tmpfile;
	# on veut lancer le pg tokenizer sur les donnees envoyees a la procedure
	system "perl tokenise-utf8.pl -f tmpfile.txt > toktitre.txt";
	# renvoyer le contenu du fichier titre et celui de description dans le pg principal 
	$/=undef;
	open $tmpfile, "<:encoding(utf-8)", "toktitre.txt";
	my $contenutitre=<$tmpfile>;
	close $tmpfile;
	
	#-----------------------------------------------------------------------
	open my $tmpfile, ">:encoding(utf-8)", "tmpfile.txt";
	print $tmpfile $description;
	close $tmpfile;
	system "perl tokenise-utf8.pl -f tmpfile.txt > tokdescription.txt ";
	# renvoyer le contenu du fichier titre et celui de description dans le pg principal 
	$/=undef;
	open my $tmpfile, "<:encoding(utf-8)", "tokdescription.txt";
	my $contenudescription=<$tmpfile>;
	close $tmpfile;

	return $contenutitre, $contenudescription;

}

sub etiquetagetreetagger
{
	system "cat sortiexml-$rubrique.xml | ./tree-tagger french-utf8.par  -token -lemma -no-unknown -sgml  > sortiexml2-$rubrique.xml";
	system "perl treetagger2xml-utf8.pl sortiexml2-$rubrique.xml utf-8";
}
