#/usr/bin/perl
<<DOC; 
Votre Nom : Laetitia&Juliette
JANVIER 2016
 usage : perl parcours-extraction-etiquetage.pl repertoire-a-parcourir rubrique
 Le programme prend en entrée le nom du répertoire contenant les fichiers
 à traiter
 Le programme 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

#-----------------------              SCRIPT PRINCIPAL                         ----------------------------------------------------------------------------------------------

#---------------------VARIABLES COMMUNES-----------------------------
my %dico; #création d'un dictionnaire
my $rep="$ARGV[0]"; #création de la variable rep prend le premier élément de la commande | racine de l'arborescence
my $rubrique ="$ARGV[1]"; #idem prend le second élément de la commande
$rep=~s/[\/]$//; #l'arborescence sans /
my $output1="rss_$rubrique.xml";
my $output2="profondeur_$rubrique.txt";



#-------- OUVERTURE ET TRAITEMENT DU PREMIER FICHIER SORTIE UN (1)-------------------------
if (!open (FILEOUT, ">:encoding(utf-8)", $output1)) { die "PB à l'ouverture du fichier $output1"};#création et début d'écriture dans le fichier rubrique.xml 
print FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Laetitia&Juliette</NOM>\n";
close (FILEOUT);

&parcoursarborescencefichiers1($rep); # traitement de la surface

open (FILEOUT,">>:encoding(utf-8)", $output1); #réouverture du fichier $rubrique.xml en concaténation
print FILEOUT "</PARCOURS>\n"; #fermeture de la balise PARCOURS 
close(FILEOUT); #fermeture du fichier



#-------- CREATION DU SECOND FICHIER SORTIE  DEUX (2) -------------------------
if (!open (FILEOUT2, ">:encoding(utf-8)", $output2)) { die "PB à l'ouverture du fichier $output2"};#création et début d'écriture dans le fichier rubrique.txt
close (FILEOUT2);
#--------- TRAITEMENT DES FICHIERS TXT AVEC LA DEUXIÈME FONCTION DE PARCOURS ET D'ÉTIQUETAGE ------------------------
&parcoursarborescencefichiers2($rep); # écriture dans profondeur_$rubrique.txt



#------------ SORTIE DU SCRIPT --------------------------------------

exit; #sortie du script


#------------------------DECLARATION DES FONCTIONS -----------------------------------------

#----------------------- DEBUT DE LA FONCTION PARCOURSARBORESCENCEFICHIERS UN (1) ---------------------
sub parcoursarborescencefichiers1 {
    print @_; #trouver le pourquoi du comment de cette histoire de chemin
    my $path = shift(@_); #shift() supprime le dernier élément du chemin
    opendir(DIR, $path) or die "L'ouverture de $path: $! a échoué \n"; #ouvrir le répertoire sinon dire échec dans l'invite de commande
    my @files = readdir(DIR); #création d'une liste contenant les éléments de dire
    closedir(DIR); #fermeture du répertoire
    #pour chaque fichier de ma liste de fichier
    foreach my $file (@files) {
		next if $file =~ /^\.\.?$/; #=~ permet de faire une recherche dans la variable
		$file = $path."/".$file; #on écrase file avec le chemin qui menent à file
		#si la variable $file correspond à un repertoire
		if (-d $file) {
			print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";#indiquer que l'on passe à l'analyse d'un nouveau répertoire
			&parcoursarborescencefichiers1($file); #réeffectuer le parcours de l'arborescence à partir de la variable $file
			print "<FIN REPERTOIRE> ==> ",$file,"\n"; #indiquer que l'on a finit avec le repertoire
		}
		#si la variable $file, si le chemin, correspond à un fichier
		if (-f $file) {
			# mettre tout le fichier sur une seule ligne
			if ($file=~/$rubrique.+\.xml$/){
				$codage = "utf-8";
				open (FIC, "<:encoding($codage)", $file); #ouverture en lecture du chemin $file
				open (OUT, ">:encoding($codage)","$rubrique.txt"); #ouverture et écriture dans rubrique.txt
				open (OUT2, ">:encoding($codage)","$rubrique.xml"); #création et écriture dans rubrique.xml
				my $texte=""; #création d'un scalaire vide
				#on met toutes les lignes du fichier sur une seule ligne
				while (my $ligne = <FIC>){
					chomp $ligne; #on enlève les retours à la ligne
					$ligne =~ s/\r//g; #en cas de fichiers macintosh, on enlève les retours à la ligne mac
					$texte = $texte.$ligne; #et on concatène la ligne avec le reste du texte
					}
			close FIC; #fermeture du fichier
			#début du filtrage
			$texte =~s/>\s+</></g; #remplacer les balises contenant un ou plusieurs espaces par rien du tout
			#tant que l'on trouve l'expression régulière ci dessous dans la variable texte
			while($texte =~m/<item><title>([^<]+?)<\/title><link>([^<]+?)<\/link><description>([^<]+?)<\/description>/g){
			my $titre = $1;
			my $description = $3; #voir si c'est $2 ou $3
			$titre=~s/&lt;.+?&gt;//g;#c'est quoi lt gt ? < >
			$titre.="."; #ajout d'un point 
			$titre=~s/\?\./\?/g; #enlèvement du point si point d'interrogation
			$description=~s/&lt;.+?&gt;//g; #remplacer les <> nommés &lt et &gt qui ne sont pas des balises avec leurs contenus tout type 
			$description=~s/\.;?[A-Z]//g;
			#s'il n'existe pas de clé titre dans le dico
			if (!(exists $dico{$titre})) {
				$dico{$titre} = 1; #instancier la valeur de titre à 1
				print OUT "TITRE : $titre\n";
				print OUT "DESCRIPTION : $description\n\n";
				#appel de la fonction etiquetage sur 
				my ($titretag,$descriptiontag) = &etiquetage1($titre,$description);
				print OUT2 "<item><title>$titretag</title><description>$descriptiontag</description></item>\n";
					}
				close OUT;
				close OUT2;
				#affichage dans l'invité de commande compteur i instancié directement (magie de perl)
				print "<",$i++,"> ==> ", $file,"\n";
				}
			}
		}
	}
}


#------------------DECLARATION DE LA FONCTION ETIQUETAGE UN (1) ---------------------------------------
sub etiquetage1 {
		my ($t,$d)=@_; #bosser la doc sur les variables de perl 
		open(TMP,">:encoding(utf-8)","titre.txt");
		print TMP $t; 
		close TMP;
		#etape1=on découpe en mot etape1bis=on assimile au français
		system("perl tokenise-utf8.pl titre.txt | ./tree-tagger -token -lemma -no-unknown french-utf8.par > titre_tag.txt");
		#etape2=on anote
		system("perl treetagger2xml-utf8.pl titre_tag.txt utf8");
		open(TMP2, "titre_tag.txt.xml");#on ouvre le contenu de titre_tag.txt.xml
		my $t_tag=""; #création d'une variable vide
		my $ligne = <TMP2>;#on y met le contenu de TMP2
		while (my $ligne = <TMP2>){
						chomp $ligne;#on enlève les retours à la ligne
						$t_tag .= $ligne;
						
					}
		close TMP2;
		open(TMP3,">:encoding(utf-8)","description.txt"); #création de titre.txt en écriture
		print TMP3 $d ;
		close TMP3;
		#etape1=on découpe en mot etape1bis=on assimile au français
		system("perl tokenise-utf8.pl description.txt | ./tree-tagger -token -lemma -no-unknown french-utf8.par > description_tag.txt"); # pour obtenir un perl plus complet /opt/ActivePerl-5.8/bin/perl
		#etape2=on anote
		system("perl treetagger2xml-utf8.pl description_tag.txt utf8"); #/opt/ActivePerl-5.8/bin/
		open(TMP4, "description_tag.txt.xml");#on ouvre le contenu de titre_tag.txt.xml
		my $d_tag=""; #création d'une variable vide
		my $ligne2 = <TMP4>;#on y met le contenu de TMP2
		while (my $ligne2 = <TMP4>){
						chomp $ligne2;
						$d_tag = $ligne2;
					}
		close TMP4;
		return ($t_tag,$d_tag);
	}
#------------------- DECLARATION DE LA DEUXIEME FONCTION -------------------------------------------------

sub parcoursarborescencefichiers2 {
    print @_; 
    my $path = shift(@_);
    opendir(DIR, $path) or die "L'ouverture de $path: $! a échoué \n";
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (@files) {
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file;
		#si la variable $file correspond à un repertoire
		if (-d $file) {
			print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";#indiquer que l'on passe à l'analyse d'un nouveau répertoire
			&parcoursarborescencefichiers2($file); #réeffectuer le parcours de l'arborescence à partir de la variable $file
			print "<FIN REPERTOIRE> ==> ",$file,"\n"; #indiquer que l'on a finit avec le repertoire
		}
		#si la variable $file, si le chemin, correspond à un fichier
		if (-f $file) {
			if ($file=~/$rubrique.+\.txt$/){
				$codage = "utf-8";
				open (FIC, "<:encoding($codage)", $file);
				open (OUT, ">:encoding($codage)","profondeur2_$rubrique.txt"); #ouverture et écriture dans profondeur2_$rubrique.txt
				my $texte=""; #création d'un scalaire vide
				while (my $ligne = <FIC>){
					if ($ligne=~m/<filename="PROF"/g){
						$ligne=<FIC>;
						until(($ligne=~/<article-nb>/) or (eof(FIC))){
							if ($ligne!~/^ *$/){
								print FILEOUT $ligne;
							}
							$ligne=<FIC>;
						}		
					}
				}
				close FIC; #fermeture du fichier
			my $article = $1;
			#s'il n'existe pas de clé titre dans le dico
			if (!(exists $dico{$article})) {
				$dico{$article} = 1; #instancier la valeur de titre à 1
				print OUT "ARTICLE : $article";
				my $articletag= &etiquetage2($article);
				#print OUT "<item><article>$articletag</article></item>\n";
					}
				close OUT;
				#close OUT2;

				print "<",$i++,"> ==> ", $file,"\n";
				}
			}
		}
	}

#---------------------------------------------------------------------
sub etiquetage2 {
		my $a=@_;
		open(TMP,">:encoding(utf-8)","article.txt");
		print TMP $a; 
		close TMP;
		system("perl tokenise-utf8.pl article.txt | ./tree-tagger -token -lemma -no-unknown french-utf8.par >> article_tag.txt");
		system("perl treetagger2xml-utf8.pl article_tag.txt utf8");
		open(TMP2, "article_tag.txt.xml");
		my $a_tag="";
		my $ligne = <TMP2>;
		while (my $ligne = <TMP2>){
			chomp $ligne;
			$a_tag .= $ligne;	
					}
		close TMP2;
		return $a_tag;
	}
