#/usr/bin/perl
<<DOC; 
Votre Nom : Nidia Hernandez - Xianfan Zhang
MARS 2016
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir rubrique
 Le programme prend en entrée le nom du répertoire contenant les fichiers à traiter
 Il extrait le contenu textuel (titre et description de chaque article) et il produit une  sortie xml étiquetée par Treetagger.
DOC
#-----------------------------------------------------------
my $rep="$ARGV[0]";
my $rubrique= "$ARGV[1]";
my %dico;
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
#---------------------------------------- initialisation flux de sortie
# Ce script ne produit pas de sortie txt (déjà fait en app2-surf.pl)
#my $output0="$rubrique-surface.txt";
#if (!open (FILEOUT,">$output0")) { die "Pb a l'ouverture du fichier $output0"};
#close(FILEOUT);
# sortie xml
my $output="$rubrique-surface-etiq.xml";
if (!open (FILEOUT,">$output")) { die "Pb a l'ouverture du fichier $output"};
#---------------------------------------- début fichier sortie xml
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Nidia Hernandez</NOM>\n";
print FILEOUT "<NOM>Xianfan Zhang</NOM>\n";
close(FILEOUT);
#----------------------------------------
# Lancement procédure de récursion
&parcoursarborescencefichiers($rep);	
#---------------------------------------- fin fichier sortie xml
open (FILEOUT, ">>:encoding(utf-8)", $output);
print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
exit;
#----------------------------------------------
sub parcoursarborescencefichiers { #SOUSPROGRAMME
    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 "<NOUVEAU REPERTOIRE> ==> ",$file,"\n"; 
			&parcoursarborescencefichiers($file);	
			print "<FIN REPERTOIRE> ==> ",$file,"\n";
		}
		if (-f $file) {
			#       TRAITEMENT à réaliser sur chaque fichier
			if ($file =~/$rubrique.+\.xml$/) { # si c'est xml, c'est la SURFACE
				print "<",$i++,"> ==> ",$file,"\n";
				$codage = "utf-8";
				open (FIC, "<:encoding($codage)", $file);
				#open (OUT, ">>:encoding($codage)", "$rubrique.txt");
				open (OUT2, ">>:encoding($codage)", $output);
				print OUT2 "<file id=\"$file\">\n";
				
				my $texte="";
				while (my $ligne = <FIC>) {
    				chomp $ligne;
    				$ligne =~ s/\r//g;
    				$texte = $texte . $ligne;
				}
				close FIC;
					$texte =~ s/>\s+</></g;
					while ($texte =~m/<item><title>([^<]+?)<\/title><link>(?:[^<]+?)<\/link><description>([^<]+?)<\/description>/g) {
        				my $titre = $1;
        				my $description = $2;
						$titre=~s/&lt;.+?&gt;//g; # Nettoyage titre
						$titre.="."; 
						$titre=~s/\?\.$/\?/; 
						$description=~s/&lt;.+?&gt;//g; # Nettoyage description 
						
        				if (!(exists $dico{$titre})) {
							$dico{$titre} = 1;
							#print OUT "$titre\n";
							#print OUT "$description\n\n"; 
							my ($titretag, $descriptiontag) = &etiquetage($titre, $description); # apres ça, les valeurs des variables $titre et $description sont deja etiquetées
							print OUT2 "<item>\n<title>$titretag</title>\n<description>$descriptiontag</description>\n</item>\n";
        				}
					}
					
				print OUT2 "</file>\n";
				#close OUT;
				close OUT2;
			}
		}
    }
}
#----------------------------------------------
# PROCEDURE D'ETIQUETAGE
sub etiquetage {
my ($t, $d) = @_; # Attribution des valeurs d'une liste a des variables

# traitement du titre
open(TMP, ">:encoding(utf8)", "titre.txt"); 
print TMP $t;
close TMP;
# Commande de tokenisation
system("perl tokenise-utf8.pl titre.txt | ./tree-tagger -token -lemma -no-unknown french-oral-utf-8.par  > titre_tag.txt");
# Commande d'etiquetage
system("perl treetagger2xml-utf8.pl titre_tag.txt utf8"); # resultat sur titre_tag.txt.xml
open(TMP2, "<:encoding(utf8)","titre_tag.txt.xml");
my $t_tag = "";
my $ligne= <TMP2>; # lecture 'pour rien' pour que la boucle lise a partir de la deuxieme ligne et comme ça on garde pas l'entete xml dans la variable de texte a etiqueter
while (my $ligne = <TMP2>) {
	chomp $ligne;
	$t_tag= $t_tag.$ligne;
	}
close TMP2;

# traitement de la description
open(TMP, ">:encoding(utf8)", "description.txt"); 
print TMP $d;
close TMP;
system("perl tokenise-utf8.pl description.txt | ./tree-tagger -token -lemma -no-unknown french-oral-utf-8.par > description_tag.txt");
# Commande d'etiquetage
system("perl treetagger2xml-utf8.pl description_tag.txt utf8");
open(TMP2, "<:encoding(utf8)","description_tag.txt.xml");
my $d_tag = "";
my $ligne= <TMP2>; 
while (my $ligne = <TMP2>) {
	chomp $ligne; 
	$d_tag= $d_tag.$ligne;
	}
close TMP2;

return($t_tag, $d_tag);
}
#----------------------------------------------
