#/usr/bin/perl
<<DOC; 
Votre Nom : BOSC - Ma - Yan
JANVIER 2005
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
 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
#
use Unicode::String qw(utf8);
use XML::RSS;
use XML::Entities;
#-----------------------------------------------------------
my $rep="$ARGV[0]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# on déclare les tableaux associatifs permettant de traiter la duplication des contenus
my %dicoTitre=();
my %dicoDescription=();
my $nom="";
my $fichier="";

my %liste_des_rubriques;
$liste_des_rubriques{'0,2-3208,1-0,0.xml'} = 'UNE';
$liste_des_rubriques{'0,2-3210,1-0,0.xml'} = 'INTERNATIONAL';
$liste_des_rubriques{'0,2-3214,1-0,0.xml'} = 'EUROPE';
$liste_des_rubriques{'0,2-3224,1-0,0.xml'} = 'SOCIETE';
$liste_des_rubriques{'0,2-3232,1-0,0.xml'} = 'OPINION';
$liste_des_rubriques{'0,2-3234,1-0,0.xml'} = 'ECONOMIE';
$liste_des_rubriques{'0,2-3236,1-0,0.xml'} = 'MEDIA';
$liste_des_rubriques{'0,2-3238,1-0,0.xml'} = 'RDV';
$liste_des_rubriques{'0,2-3242,1-0,0.xml'} = 'SPORT';
$liste_des_rubriques{'0,2-3244,1-0,0.xml'} = 'ENVIRONNEMENT';
$liste_des_rubriques{'0,2-3246,1-0,0.xml'} = 'CULTURE';
$liste_des_rubriques{'0,2-3260,1-0,0.xml'} = 'LIVRES';
$liste_des_rubriques{'0,2-3404,1-0,0.xml'} = 'EXAMENS';
$liste_des_rubriques{'0,2-3476,1-0,0.xml'} = 'CINEMA';
$liste_des_rubriques{'0,2-3546,1-0,0.xml'} = 'VOYAGES';
$liste_des_rubriques{'0,2-651865,1-0,0.xml'} = 'TECHNOLOGIES';
$liste_des_rubriques{'0,57-0,64-823353,0.xml'} = 'POLITIQUE';

#----------------------------------------
#Ouverture des fichiers de sortie et traitement avec la sous-routine parcoursarborescencefichiers :
#----------------------------------------

foreach my $nom (keys(%liste_des_rubriques)){
	my $output1="SORTIE/sortie_".$liste_des_rubriques{$nom}.".xml";
	if (!open (OUT1,">:encoding(UTF-8)","$output1")) { die "Pb a l'ouverture du fichier $output1"};
	print OUT1 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
	print OUT1 "<rubrique nom=\"".$liste_des_rubriques{$nom}."\">\n";
	close OUT1;

	my $output2="SORTIE/sortie_tree-tagger_".$liste_des_rubriques{$nom}.".xml";
	if (!open (OUT2,">:encoding(UTF-8)","$output2")) { die "Pb a l'ouverture du fichier $output2"};
	print OUT2 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
	print OUT2 "<rubrique nom=\"".$liste_des_rubriques{$nom}."\">\n";
	close OUT2;
	
	# Ouverture d'un fichier d'output au format txt. On n'Žcrit rien dedans, on veut juste Žcraser le fichier prŽcŽdent pour pouvoir ensuite travailler sur le fichier en concatŽnation dans la boucle du sous-programme parcoursarborescence
	my $output3="SORTIE/sortie_$liste_des_rubriques{$nom}.txt";
	if (!open (OUT3,">:encoding(UTF-8)","$output3")) { die "Pb a l'ouverture du fichier $output3"};
	close OUT3;

	&parcoursarborescencefichiers($rep, $nom, $liste_des_rubriques{$nom});	#recurse!
}

#----------------------------------------
#Fermeture des fichiers et conversion du fichier txt en iso latin 9 :
#----------------------------------------

foreach my $nom (keys(%liste_des_rubriques)){
	my $output1="SORTIE/sortie_".$liste_des_rubriques{$nom}.".xml";
	if (!open (OUT1,">>:encoding(UTF-8)","$output1")) { die "Pb a l'ouverture du fichier $output1"};
	print OUT1 "</rubrique>";
	close OUT1;

	my $output2="SORTIE/sortie_tree-tagger_".$liste_des_rubriques{$nom}.".xml";
	if (!open (OUT2,">>:encoding(UTF-8)","$output2")) { die "Pb a l'ouverture du fichier $output2"};
	print OUT2 "</rubrique>";
	close OUT2;

	system ("iconv -f UTF-8 -t ISO8859-15 SORTIE/sortie_".$liste_des_rubriques{$nom}.".txt > SORTIE/sortie_iso_".$liste_des_rubriques{$nom}.".txt");	
}

exit;


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

sub parcoursarborescencefichiers {
    my ($path, $nom_du_fichier_traite, $nom) = @_; #path= dossier ; nom_du_fichier_traite = numŽros ; nom = Lettres
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (@files) {
		next if $file =~ /^\.\.?$/;
		my $filetmp=$file;
		$file = $path."/".$file;

# Si $file correspond au nom d'un répertoire, on relance la sous-routine :
		if (-d $file) {
			&parcoursarborescencefichiers($file, $nom_du_fichier_traite, $nom);	#recurse!
		}
		
# Si $file est un fichier, on le traite :		
		if (-f $file) {
			if ($file=~/$nom_du_fichier_traite$/) {						
# On passe le fichier à la procédure @traitement fichier :						
			&traitementfichier($file);				
			}
			
		}		
	}
}
#----------------------------------------------
sub traitementfichier {
	my $file= shift(@_);
	open(FILE,$file);
	my $firstLine=<FILE>;
	if($firstLine=~/encoding='([^\']+)'/) {$encodage=$1;}
	close(FILE);
	
	open(FILE,"<:encoding($encodage)",$file);
	my $texte="";
	print $file,"\n";
	
# On utilise la bibliothèque XLML::RSS pour extraire les titres et les descriptions :	
	my $rss = new XML::RSS;
	$rss->parsefile($file);
	my $titre="";
	my $description="";
	my $titre2="";
	my $description2="";
	foreach my $item (@{$rss->{'items'}}){
		$titre = $item->{'title'};
		$description = $item->{'description'};
							
		$titre = $titre.".";

# On utilise la bibliothèque XML::Entities pour décoder le texte extrait				
		$titre = XML::Entities::decode('all', $titre);
							
		$description = XML::Entities::decode('all', $description);
		$description=~ s/<.+?>//g;
		
# Filtre pour savoir si on a déjà vu l'article traité :				
		if ((!(exists $dicoTitre{$titre})) and (!(exists $dicoDescription{$description}))){
			$dicoTitre{$titre}=1;
			$dicoDescription{$description}=1;
			
			($titre2,$description2)=&etiquetageXML($titre,$description);
		}
		else {
		   $titre="";
		   $description="";
		}
		
# Dans le script BAO1, nous avions laissé l'impression du résultat de l'extraction dans la procédure parcoursarborescencefichier. Ceci ne nous permettait pas de récupérer tous les articles.
		if (($titre ne "") and ($description ne "")) {
		
			foreach my $nom (keys(%liste_des_rubriques)){
				if ($file =~/$nom$/){
					my $output1="SORTIE/sortie_".$liste_des_rubriques{$nom}.".xml";
					if (!open (OUT1,">>:encoding(UTF-8)","$output1")) { die "Pb a l'ouverture du fichier $output1"};
					print OUT1 "<item><titre>".$titre. "</titre><description>".$description."</description></item>\n";
					close OUT1;
					
				   	my $output2="SORTIE/sortie_tree-tagger_".$liste_des_rubriques{$nom}.".xml";
            		if (!open (OUT2,">>:encoding(UTF-8)","$output2")) { die "Pb a l'ouverture du fichier $output2"};
					print OUT2 "<item><titre>".$titre2. "</titre><description>".$description2."</description></item>\n";
					close OUT2;

					my $output3="SORTIE/sortie_".$liste_des_rubriques{$nom}.".txt";
					if (!open (OUT3,">>:encoding(UTF-8)","$output3")) { die "Pb a l'ouverture du fichier $output3"};
					print OUT3 $titre."\n".$description."\n";
					close OUT3;
				}
			}		
		}
	}
	
	close(FILE);

}

#----------------------------------------------
sub etiquetageXML {
	my($tit, $descr) = @_;

# On fait appel à une commande système pour lancer tree-tagger :	
	system ("echo \"$tit\" | perl PROGRAMMES/tree-tagger_MAC/tagger-scripts/cmd/tokenize.pl | PROGRAMMES/tree-tagger_MAC/bin/tree-tagger -lemma -token -no-unknown PROGRAMMES/tree-tagger_MAC/lib/french-utf8.par >tit.tag");

# On passe le fichier de sortie de tree-tagger à la sous-routine treetagger2xml pour le convertir en XML :
	&treetagger2xml("tit.tag");
	system ("echo \"$descr\" | perl PROGRAMMES/tree-tagger_MAC/tagger-scripts/cmd/tokenize.pl | PROGRAMMES/tree-tagger_MAC/bin/tree-tagger -lemma -token -no-unknown PROGRAMMES/tree-tagger_MAC/lib/french-utf8.par >descr.tag");
	&treetagger2xml("descr.tag");

# On récupère les données sur le fichier produit par la routine treetagger2xml :
	open (TIT,"<:encoding(UTF-8)", "tit.tag.xml") or die "pb à l'ouverture de tit.tag.xml";
	open (DESCR,"<:encoding(UTF-8)", "descr.tag.xml") or die "pb à l'ouverture de descr.tag.xml";
	
	my $tit2="";
	my $descr2="";
	
	while(my $ligne=<TIT>){
		$tit2 = $tit2."\n".$ligne
	}
	while (my $ligne=<DESCR>){
		$descr2 = $descr2."\n".$ligne;
	}
	
	close (TIT);
	close (DESCR);
	
	return ($tit2, $descr2);
}

#----------------------------------------------
sub treetagger2xml {
	$FichierEntree= "";
	$FichierEntree= shift @_;
	&ouvre;
	&traitement;
	&ferme;
	
	# - - - - - - - - - - - - - -
	# Récupération des arguments et ouverture des tampons
	sub ouvre {
    
    	open(ENTREE,$FichierEntree) or die "pb ˆ l'ouverture de $FichierEntree dans la sous routine treetagger2xml, sous fonction ouvre" ;
    	$FichierSortie = $FichierEntree . ".xml";
    	open(SORTIE,">$FichierSortie") or die "pb ˆ l'ouverture de $FichierSortie dans la sous routine treetagger2xml, sous fonction ouvre" ;
	}

	# - - - - - - - - - - - - - -
	# Traitement
	sub traitement {
    	while ($Ligne = <ENTREE>) {
			if ($Ligne!~/\ô\¯\:\\ô\¯\:\\/) {
			# Remplacement des guillemets par <![CDATA["]]> (évite erreur d'interprétation XML)
	    		$Ligne=~s/\"/<![CDATA[\"]]>/g;
		    	$Ligne=~s/([^\t]*)\t([^\t]*)\t(.*)/<element>\n <data type=\"type\">$2<\/data>\n <data type=\"lemma\">$3<\/data>\n <data type=\"string\">$1<\/data>\n<\/element>/;
	  			print SORTIE $Ligne;
			}
    	}
	}
	# - - - - - - - - - - - - - -
	# Fermeture des tampons
	sub ferme {
    	close(ENTREE);
	    close(SORTIE);
	}
}