#/usr/bin/perl
<<DOC; 
Votre Nom : Nidia Hernandez - Xianfan Zhang
MAI 2016
 usage : perl parcours-surface repertoire-a-parcourir rubrique
 Le programme prend en entrée le nom du répertoire contenant les fichiers à traiter
 Il construit en sortie un fichier structuré contenant sur chaque
 ligne le nom du fichier et le résultat du filtrage :
<FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>du filtrage</CONTENU></FICHIER>
DOC
#----------------------------------------
my $rep="$ARGV[0]"; # $rep = repertoire-a-parcourir
my $rubrique= "$ARGV[1]"; # rubrique a traiter
my %dico; #pour eviter des doublons
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
#---------------------------------------- initialisation flux de sortie 
# sortie txt
#my $output0="$rubrique-profondeur.txt";
#if (!open (FILEOUT,">$output0")) { die "Pb a l'ouverture du fichier $output0"};
#close(FILEOUT);
# sortie xml
my $output1="$rubrique-profondeur-etiq.xml";
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
#---------------------------------------- début fichier 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
&parcoursarborescence($rep);	
#---------------------------------------- fin fichier xml
open (FILEOUT,">>:encoding(utf-8)", $output1);
print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
exit;

#-----------------------------------------------------------------------------------------------
# SOUS-PROGRAMME
sub parcoursarborescence { 
	my $dossier = shift(@_); #on recupere les arguments passes en procedure
    opendir(DOSSIER, $dossier) or die "can't open $dossier: $!\n"; # erreur si c'est un fichier au lieu d'un dossier
    my @files = readdir(DOSSIER); # liste des fichiers contenus dans le dossier
    closedir(DOSSIER);
	# pour chaque élément de la liste de fichiers du dossier
	foreach my $file (@files) {   
		next if $file =~ /^\.\.?$/; # passer au suivant s'il y a des éléments cachés
		next if $file =~ /^fil/;
		$file = $dossier."/".$file; # on reconstruit le chemin absolu du fichier
		# -d permet de savoir si l'objet est un répertoire (directory) ou pas // si c'est le cas on regarde son contenu 
		if (-d $file) {  
			print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
			&parcoursarborescence($file);	#Recursion
			print "<FIN REPERTOIRE> ==> ",$file,"\n";
		}
		# -f permet de savoir si l'objet est un fichier (file) ou pas
		if (-f $file) { 
			# TRAITEMENT à realiser sur chaque fichier
			# Si c'est txt, c'est la PROFONDEUR
			if ($file =~/$rubrique.+\.txt$/) {
				print "<",$i++,"> ==> ",$file,"\n"; # affichage pour vérifier en ligne de commande qu'on traite bien les bons fichiers
				$codage = "utf-8";
				open (FIC, "<:encoding($codage)", $file); # ouverture fichier à traiter
				#open (OUT, ">>:encoding($codage)", $output0); # ouverture fichier sortie txt
				open (OUT2, ">>:encoding($codage)", $output1); # ouverture fichier sortie xml
				print OUT2 "<file id=\"$file\">\n";
				#ramener tout le flux textuel de FIC sur une seule ligne
				my $texte="";
				while (my $ligne = <FIC>) { # lecture du fichier ligne par ligne 
					# NETTOYAGE
					chomp $ligne; 
					next if $ligne=~ s/\r//g;
					next if $ligne=~ /^<filname="SURF.*/; # On supprime cette ligne parce qu'elle répète la description déjà traitée dans la surface
					next if $ligne=~ /<[^>]*>/;
					next if $ligne=~ /^Le Monde/;
					next if $ligne=~ /.+Mis.+jour le/;
					next if $ligne=~ /^(Le)?[0-3][0-9]\.[01][0-9]\.201[56] . [012][0-9]h[0-5][0-9]/;
					$ligne=~ s/\xA4//g; # caractère currency 
					next if $ligne=~ /.*\|.*/;
					next if $ligne=~ /^\s*$/;
					$ligne=~ s/\s{3,30}//g;
					next if $ligne=~ /^Suivre( ce journaliste sur [Tt]witter)?/;
					next if $ligne=~ /^Aller sur la page de ce journaliste/;
					next if $ligne=~ /^Journaliste au Monde/;
					next if $ligne=~ /^Cr.dits :.*(AFP|REUTERS)/;
					next if $ligne=~ /^Lire (\(?.dition abonn.e?\)?|le diaporama|d.crytage|l.analyse)/;
					next if $ligne=~ /^(Mettre en pause|Rejouer|›?Acc.dez au portfolio)/;
					next if $ligne=~/^Lire aussi .*:/;
					next if $ligne=~/=\"http:\/\//;
					next if $ligne=~ /^Image (pr.c.dente|suivante)/;
					next if $ligne=~ /^(width=|src=|alt=)/;
					next if $ligne=~/^(require|var i|portfolio|tabindex=|itemprop=|datetime=)/;
					next if $ligne=~/data-(title=|layout=|action=|show-|tym|slide-|adformat|picture|module|wrapper|interval|is-)/;
					next if $ligne=~/lmd\.onload/;
					next if $ligne=~/#graphe_|#container_/;
				
					$ligne= $ligne .".";#point final pour les titres
			    	
			    	$texte = $texte . "$ligne\n";
			    	
				}
				close FIC;
					#NETTOYAGE SUPPLÉMENTAIRE
					$texte=~s/\{[^\}]*\}\)?;?//g;
					$texte=~s/\(function\(window\).+\(window//g;
					$texte=~s/\.\.\n/./g;
					$texte=~s/…\.\n/./g;
					$texte=~s/\. \.\n/./g;
					$texte=~s/\?\.\n/./g;
					$texte=~s/Lire aussi\..+\.//g;
					#$texte=~s/:\.\n/./g;
					$texte=~s/\}\);\.//g;
					$texte=~s/\);\.//g;
					$texte=~s/\},\.//g;
			        
			        if (!(exists $dico{$texte})) {
						$dico{$texte} = 1;
						#procedure etiquetage ici
						my $textetag = &etiquetage($texte);
						#print OUT "$texte\n";
						print OUT2 "<contenu>$textetag</contenu>\n";   	
			        }
					#close OUT;
					close OUT2;
			
			}
		}
	}
}

#----------------------------------------------
# PROCEDURE D'ETIQUETAGE
sub etiquetage {
my ($tpf) = @_; # Attribution des valeurs d'une liste a des variables

open(TMP, ">:encoding(utf8)", "texteprof.txt"); 
print TMP $tpf;
close TMP;
# Commande de tokenisation
system("perl tokenise-utf8.pl texteprof.txt | ./tree-tagger -token -lemma -no-unknown french-oral-utf-8.par  > texteprof_tag.txt");
# Commande d'etiquetage
system("perl treetagger2xml-utf8.pl texteprof_tag.txt utf8"); 
open(TMP2, "<:encoding(utf8)","texteprof_tag.txt.xml");
my $tpf_tag = "";
my $ligne= <TMP2>;
while (my $ligne = <TMP2>) {
	chomp $ligne;
	$tpf_tag= $tpf_tag.$ligne;
	}
close TMP2;

return($tpf_tag);
}
#----------------------------------------------