#/usr/bin/perl -w
#positionnement
# cd /cygdrive/D/MASTER-TAL/BAO_ga/

#lancement
#perl bao1_et_2_3.pl arbo-fils

#En-tête

#----------------------------------------------------------- 
#PREPARATIFS
system("rm ./all_extractions.txt 2>/dev/null");	#supprime le fichier temporaire des contextes extraits
system("rm ./all_tokens.txt 2>/dev/null");

my $rep="$ARGV[0]"; 					#rep contient le nom du répértoire, passé en argument
$rep=~ s/[\/]$//; 						#test du nom du répertoire -> sans "/" à la fin; si oui - substitution avec rien
my $DUMPFULL1=""; 						#initialisation de la variable contenant le flux de sortie
my $file=""; 							#le fichier en lecture
my $output1="Sortie_Bao_1et2.xml";				# test et ouverture du fichier de sortie
my $output2="Sortie_Bao2_Treetagger2XML.xml";

if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
if (!open (FILEOUTXML,">$output2")) { die "Pb a l'ouverture du fichier $output1"};

#ecriture dans la sortie $output2 réalisée avec treetagger
print FILEOUTXML "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
print FILEOUTXML "<PARCOURS>\n";
print FILEOUTXML "<ETAPE>Sortie Bao2: texte étiqueté avec Treetagger</ETAPE>\n";
print FILEOUTXML "<NOM>Ginka YANKOVA</NOM>\n";
close (FILEOUTXML);

#----------------------------------------
# RECURSION du parcours de l’arbre des fils
&parcoursarborescencefichiers($rep);
		
#----------------------------------------
# FORMATAGE du XML:mon nom et la variable contenant le filtrage
print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<ETAPE>Sortie Bao1: texte extrait des fils RSS</ETAPE>\n";
print FILEOUT "<NOM>Ginka YANKOVA</NOM>\n";
print FILEOUT "<FILTRAGE>".$DUMPFULL1. "</FILTRAGE>\n";
print FILEOUT "</PARCOURS>\n";

#rajout de fermeture de la dernière balise dans le fichier de sortie du treetagger
open (FILEOUTXML,"+>>$output2");
print FILEOUTXML "</PARCOURS>\n"; # finaliser le xml intermédiaire avant d'obtenir la sortie du treetagger
close(FILEOUTXML);

system("rm ./tmp_token.txt 2>/dev/null");
system("rm ./tmp.txt 2>/dev/null");
system("rm ./Sortie_Bao2_Treetagger2XML.txt 2>/dev/null");
system("rm ./tmp_etiquete.txt 2>/dev/null");
system("rm ./tmp_etiquete.txt.xml 2>/dev/null");
#system("rm ./all_tokens.txt 2>/dev/null");
exit;

#----------------------------------------
#mon sous-programme de nettoyage du texte
sub nettoyage { 
my $sale_phrase=shift(@_); # récupère le texte passé en argument
		###nettoyage du texte extrait
		$sale_phrase=~s/&amp;trade;/™/g;
		$sale_phrase=~s/&amp;quot;/"/g;
		$sale_phrase=~s/&amp;copy;/©/g;
		$sale_phrase=~s/&amp;reg;/®/g;
		$sale_phrase=~s/&amp;Agrave;/À/g;
		$sale_phrase=~s/&amp;Aacute;/Á/g;
		$sale_phrase=~s/&amp;Acirc;/Â/g;
		$sale_phrase=~s/&amp;Atilde;/Ã/g;
		$sale_phrase=~s/&amp;Auml;/Ä/g;
		$sale_phrase=~s/&amp;Aring;/Å/g;
		$sale_phrase=~s/&amp;AElig;/Æ/g;
		$sale_phrase=~s/&amp;Ccedil;/Ç/g;
		$sale_phrase=~s/&amp;Egrave;/È/g;
		$sale_phrase=~s/&amp;Eacute;/É/g;
		$sale_phrase=~s/&amp;Ecirc;/Ê/g;
		$sale_phrase=~s/&amp;Euml;/Ë/g;
		$sale_phrase=~s/&amp;Igrave;/Ì/g;
		$sale_phrase=~s/&amp;Iacute;/Í/g;
		$sale_phrase=~s/&amp;Icirc;/Î/g;
		$sale_phrase=~s/&amp;Iuml;/Ï/g;
		$sale_phrase=~s/&amp;ETH/Ð/g;
		$sale_phrase=~s/&amp;Ntilde;/Ñ/g;
		$sale_phrase=~s/&amp;Ograve;/Ò/g;
		$sale_phrase=~s/&amp;Oacute;/Ó/g;
		$sale_phrase=~s/&amp;Ocirc;/Ô/g;
		$sale_phrase=~s/&amp;Otilde;/Õ/g;
		$sale_phrase=~s/&amp;Ouml;/Ö/g;
		$sale_phrase=~s/&amp;Oslash;/Ø/g;
		$sale_phrase=~s/&amp;Ugrave;/Ù/g;
		$sale_phrase=~s/&amp;Uacute;/Ú/g;
		$sale_phrase=~s/&amp;Ucirc;/Û/g;
		$sale_phrase=~s/&amp;Uuml;/Ü/g;
		$sale_phrase=~s/&amp;Yacute;/Ý/g;
		$sale_phrase=~s/&amp;THORN;/Þ/g;
		$sale_phrase=~s/&amp;szlig;/ß/g;
		$sale_phrase=~s/&amp;agrave;/à/g;
		$sale_phrase=~s/&amp;aacute;/á/g;
		$sale_phrase=~s/&amp;acirc;/â/g;
		$sale_phrase=~s/&amp;atilde;/ã/g;
		$sale_phrase=~s/&amp;auml;/ä/g;
		$sale_phrase=~s/&amp;aring;/å/g;
		$sale_phrase=~s/&amp;aelig;/æ/g;
		$sale_phrase=~s/&amp;ccedil;/ç/g;
		$sale_phrase=~s/&amp;egrave;/è/g;
		$sale_phrase=~s/&amp;eacute;/é/g;
		$sale_phrase=~s/&amp;ecirc;/ê/g;
		$sale_phrase=~s/&amp;euml;/ë/g;
		$sale_phrase=~s/&amp;igrave;/ì/g;
		$sale_phrase=~s/&amp;iacute;/í/g;
		$sale_phrase=~s/&amp;icirc;/î/g;
		$sale_phrase=~s/&amp;iuml;/ï/g;
		$sale_phrase=~s/&amp;eth;/ð/g;
		$sale_phrase=~s/&amp;ntilde;/ñ/g;
		$sale_phrase=~s/&amp;ograve;/ò/g;
		$sale_phrase=~s/&amp;oacute;/ó/g;
		$sale_phrase=~s/&amp;ocirc;/ô/g;
		$sale_phrase=~s/&amp;otilde;/õ/g;
		$sale_phrase=~s/&amp;ouml;/ö/g;
		$sale_phrase=~s/&amp;oslash;/ø/g;
		$sale_phrase=~s/&amp;ugrave;/ù/g;
		$sale_phrase=~s/&amp;uacute;/ú/g;
		$sale_phrase=~s/&amp;ucirc;/û/g;
		$sale_phrase=~s/&amp;uuml;/ü/g;
		$sale_phrase=~s/&amp;yacute;/ý/g;
		$sale_phrase=~s/&amp;thorn;/þ/g;
		$sale_phrase=~s/&amp;yuml;/ÿ/g;
		$sale_phrase=~s/&amp;iexcl;/¡/g;
		$sale_phrase=~s/&amp;cent;/¢/g;
		$sale_phrase=~s/&amp;pound;/£/g;
		$sale_phrase=~s/&amp;curren;/¤/g;
		$sale_phrase=~s/&amp;yen;/¥/g;
		$sale_phrase=~s/&amp;brvbar;/¦/g;
		$sale_phrase=~s/&amp;sect;/§/g;
		$sale_phrase=~s/&amp;uml;/¨/g;
		$sale_phrase=~s/&amp;ordf;/ª/g;
		$sale_phrase=~s/&amp;laquo;/¬/g;
		$sale_phrase=~s/&amp;macr;/¯/g;
		$sale_phrase=~s/&amp;deg;/°/g;
		$sale_phrase=~s/&amp;plusmn;/±/g;
		$sale_phrase=~s/&amp;sup2/²/g;
		$sale_phrase=~s/&amp;sup3;/³/g;
		$sale_phrase=~s/&amp;acute;/´/g;
		$sale_phrase=~s/&amp;micro;/µ/g;
		$sale_phrase=~s/&amp;middot;/·/g;
		$sale_phrase=~s/&amp;cedil;/¸/g;
		$sale_phrase=~s/&amp;sup1;/¹/g;
		$sale_phrase=~s/&amp;ordm;/º/g;
		$sale_phrase=~s/&amp;raquo;/»/g;
		$sale_phrase=~s/&amp;frac14;/¼/g;
		$sale_phrase=~s/&amp;frac12;/½/g;
		$sale_phrase=~s/&amp;frac34;/¾/g;
		$sale_phrase=~s/&amp;iquest;/¿/g;
		$sale_phrase=~s/&amp;times;/×/g;
		$sale_phrase=~s/&amp;divide;/÷/g;
		$sale_phrase=~s/&amp;euro;/€/g;
		
		$sale_phrase=~s/&lt;img([^<]+)&gt//g;	
		$sale_phrase=~s/à¹/ù/g; #ne le remplace toujours pas
		$sale_phrase=~s/&amp;#156;/oe/g;
		$sale_phrase=~s/&amp;#150;/à/g;
		$sale_phrase=~s/&#38;#39;/\'/g;
		$sale_phrase=~s/&#38;#34;/\"/g;
		$sale_phrase=~s/&#233;/é/g;
		$sale_phrase=~s/&#234;/ê/g;
		$sale_phrase=~s/&lt;/\</g;
		$sale_phrase=~s/&gt;/\</g;
		$sale_phrase=~s/Ã©/é/g;
		$sale_phrase=~s/Ã¨/è/g;
		$sale_phrase=~s/Ã§/ç/g;
		$sale_phrase=~s/Ã´/ô/g;
		$sale_phrase=~s/Ã/à/g;
		$sale_phrase=~s/'"/\<'/g;
		$sale_phrase=~s/àª/ê/g;
		$sale_phrase=~s/à«/ë/g;
		$sale_phrase=~s/à³/o/g;
		$sale_phrase=~s/<'/'/g;
		$sale_phrase=~s/à¯/ï/g;
		$sale_phrase=~s/à®/î/g;
		$sale_phrase=~s/à¢/â/g;
		$sale_phrase=~s/à¤/ä/g;
		$sale_phrase=~s/à¶/ö/g;
		$sale_phrase=~s/Âœ/oe/g; #œ
		$sale_phrase=~s/.;/./g;
		### fin du nettoyage du texte extrait
	return($sale_phrase);
};		
#----------------------------------------------
#SOUS PROGRAMME avec un argument comme entrée
sub parcoursarborescencefichiers {
		
	my $path = shift(@_); 						# #path s'associe au premier argument
	opendir(DIR, $path) or die "can't open $path: $!\n"; # test d'ouverture
	my @files = readdir(DIR); 					# @files est une liste des fichiers 
	closedir(DIR);
				
	#----------------------------------------
	#pour chacun des fichiers de la liste, vérifie si c'est un fichier ou un répertoire:
	foreach $file (@files) {
		
		next if $file =~ /^\.\.?$/;			#c'est un fichier, donc continue à la suivante iteration
		$file = $path."/".$file; 			#$file n'est pas un fichier, alorsvréécrit le chemin de l'élément
				
		if (-d $file) {   					#c'est un répertoire, alors récursion
			&parcoursarborescencefichiers($file); 	
		}#if
				
		#-------------------------------------
		#FILTREUR
		if (-f $file) {
						
			if ($file=~/0,2-3208,1-0,0\.xml/){  #travaille sur les XML, rubrique "A la Une"

				#$tableau_nomfichier[i]=$file;	#garde le nom du fils RSS pour la sortie du treetagger en format xml 
				my $recup_XML="";				#extraction pour sortie en XML
				my $recup_token="";				#extraction pour tokeniser et tree-taggerer				
				open(FILEINPUT,"$file");  		#ouverture en lecture du fichier
				print $file, "\n";				#affichage sur ecran
				my $rubrique_lu=0;				#condition de sortie de la boucle de lecture du nom de la rubrique
				my $description_lu=0;			#flag de lecture de description sur plusieurs lignes
				$arriere_lu="";					#avant dernière ligne lue
				open(FILETMP, ">tmp.txt");		#ecrase le tmp.txt et le prépare à conserver le context extrait d'un fichier XML 
				$DUMPFULL1.="\n<fichier>";
				$DUMPFULL1.="\n<nom_fichier>$file</nom_fichier>";

				#boucle 1
				##lecture du nom de la rubrique:
				while (($rubrique_lu==0)
						&&
						($ligne=<FILEINPUT>)){   #tant que le nom de rubrique n'est pas lu, fait:		
					if((($arriere_lu=~/<channel>/)
						||($ligne=~/<channel><title>/)) # si tout est écrit sur une ligne
						&&
						($ligne=~/<title>Le Monde\.fr :([^<]+)<\/title>/)){
						$recup_XML=nettoyage($1); #pour sortie en fichier XML
						$recup_token=" ".$recup_XML;	#pour sortie en fichier texte brut
						print FILETMP $recup_token, "\n";   # écriture de l'extraction dans le fichier temporaire
						$recup_XML="\n<nom_rubrique>".$recup_XML."</nom_rubrique>";
						$DUMPFULL1.=$recup_XML; 
						$rubrique_lu=1;				  #le nom de rubrique est lu, on s'arrête
					};##if	
				$arriere_lu=$ligne;
				};#while
				
				#boucle 2
				#lecture des titres et des descriptions
				while ($ligne=<FILEINPUT>){   #pour chaque ligne existante du fichier courant, boucle:	
					$description_lu=0; 			#pour pouvoir lire une description multiligne
					
					## si c'est un titre d'article:
					if ((($arriere_lu=~/<item>/)
						||($ligne=~/<item><title>/))
						&&
						($ligne=~/<title>([^<]+)<\/title>/)){	#s'il s'agit du titre d'un article
							$recup_XML=nettoyage($1);	#pour sortie en fichier XML
							$recup_token=$recup_XML;	#pour sortie en fichier texte brut
							print FILETMP $recup_token, "\n";   # écriture de l'extraction dans le fichier temporaire
							$recup_XML="\n<titre>".$recup_XML."</titre>";
							$DUMPFULL1.=$recup_XML;
							#continue;
					};##if
					
					##si c'est la description d'un article,si la ligne est significative:
					if(($ligne!~/Toute *l.*actualit.* *au *moment *de *la *connexion/) 
						&&
						($ligne!~/Retrouvez *l.*ensemble *des/) 
						&& 
						($ligne!~/Lisez *l.*int.*gralit.* *de *l.*article *pour *plus *d.*information./)){ 
						##si la description est écrite sur une ligne, sans marque de fin de ligne:
						if ($ligne=~ /<description>([^<]+)<\/description>/){
							$recup_XML=nettoyage($1);
							$recup_token=$recup_XML;	#pour sortie en fichier texte brut
							print FILETMP $recup_token, "\n";   # écriture de l'extraction dans le fichier temporaire						
							$recup_XML="\n<contenu>".$recup_XML."</contenu>";
							$DUMPFULL1.=$recup_XML;
							$description_lu=1;
						}##if
						##si la description est écrite sur plusieurs lignes avec marque de nouvelle ligne:
						else {
							
							if ($ligne=~ /<description>([^<]+)/) {
								$ligne=$1;				#enlève le début "<description>
								while ($description_lu==0){
									$ligne.=<FILEINPUT>; #la balise fermante de </description> n'étant pas encore lue:
									if ($ligne=~/([^<]+)<\/description>/){
										$recup_XML=nettoyage($1);
										$recup_token=$recup_XML;	#pour sortie en fichier texte brut
										print FILETMP $recup_token, "\n";   # écriture de l'extraction dans le fichier temporaire						
										$recup_XML="\n<contenu>".$recup_XML."</contenu>";
										$DUMPFULL1.=$recup_XML;
										$description_lu=1; #sort de la boucle et continue à lire la description suivante
									};#if
								$recup_token=$recup_XML;	#pour sortie en fichier texte brut
								};#while
							};#if			
						};#else
					};##if			
					$arriere_lu=$ligne;	
				}; #while
				
				$DUMPFULL1.="\n</fichier>";
				close(FILETMP);
				close (FILEINPUT);
				
				##lancement d'un traitement externe dans un script perl pour faire un mot par ligne (token)
					#concaténation de chaque extraction terminée
					#tmp.txt- l'extraction du fichier XML traité dernièrement; à concaténer dans all_extractions.txt et premier paramètre de tokenise-fr.pl
					#all_extractions.txt- tous les extractions des fils RSS traités
					#all_tokens.txt	- texte=un mot/ligne; deuxième paramètre du tree-tagger.pl
					#tmp_token.txt - le texte d'un fichier traité - un mot par ligne
				system(	"perl ./Treetagger/cmd/tokenise-fr.pl tmp.txt > tmp_token.txt");
				system ("cat tmp.txt >> all_extractions.txt"); #concaténer tous les fichier tmp.txt de la sortie dans all_extractions.txt	
				system ("cat tmp_token.txt >> all_tokens.txt"); #concaténer tous les fichier tmp.txt de la sortie dans all_extractions.txt	
				
				#exécution de l'étiquetage en ligne de commande externe
					#Sortie_etiquetee.txt 	- le texte étiqueté
					#tmp_etiquete.txt.xml - la sortie en XML d'un fichier traité
					#tree-tagger parametres fichier_mot_par_ligne fichier_sortie
			
				system ("./Treetagger/bin/tree-tagger.exe ./Treetagger/lib/french.par -lemma -token -no-unknown tmp_token.txt tmp_etiquete.txt");			
				system ("cat tmp_etiquete.txt >> Sortie_etiquetee.txt"); #préparer Sortie_etiquetee.txt
				#convertissement de txt en xml de la sortie étiquetée
				system ("perl ./Treetagger/cmd/treetagger2xml.pl tmp_etiquete.txt");# 
				open(FILEOUTXML,">>Sortie_Bao2_Treetagger2XML.xml");
				print FILEOUTXML "\n<document>\n<fichier_nom>$file</fichier_nom>\n"; 
				close (FILEOUTXML);
				
				system ("cat tmp_etiquete.txt.xml >> Sortie_Bao2_Treetagger2XML.xml");#servira à construire le fichier xml de la sortie du treetagger		
			}#if

		}#if file
	}#foreach $file

}#fin sous-programme	

