#!/usr/bin/perl

#script avec une expression  régulière + tree tagger
#es scriptum filtrage exp reg nettoyage encodages differents pour chaque sortie
#articles numérotés, nettoyage à la main
#traite les doublons

use Encode 'decode';
use open ":encoding(utf-8)";
use warnings;
use Unicode::String qw(utf8);
use HTML::Entities;
<<DOC; 
Votre Nom : Corina, Satenik
JANVIER 2013
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

###################################################################"
my $rep="$ARGV[0]";   #on donne un répertoire comme argument
# on s'assure que le nom du repertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;

##############################################################
#tableau associatif contenant les noms des rubriques et leurs codes
my %rubrique = (
 # "0,2-3208,1-0,0" => "ALAUNE",
  "0,2-3210,1-0,0" => "INTERNATIONAL",
  "0,2-3214,1-0,0" => "EUROPE",
  "0,2-3224,1-0,0" =>"SOCIETE",
  "0,2-3232,1-0,0" =>"IDEES",
  "0,2-3234,1-0,0" =>"ECONOMIE",
  "0,2-3236,1-0,0" =>"MEDIAS",
  "0,2-3238,1-0,0" =>"VOUS",
  "0,2-3242,1-0,0" =>"SPORT",
  "0,2-3244,1-0,0" =>"PLANETE",
  "0,2-3246,1-0,0" =>"CULTURE",
  "0,2-3260,1-0,0" =>"LIVRES",
  "0,2-3404,1-0,0" =>"ALAUNE",
  "0,2-3476,1-0,0" =>"CINEMA",
  "0,2-3546,1-0,0" =>"VOYAGE",
  "0,2-651865,1-0,0" =>"TECHNOLOGIES",
  "0,57-0,64-823353,0" =>"POLITIQUE",
);


#initialisation des tableaux associatifs 
my %dicoTitres=(); #initialisation
my %dicoDescriptions=(); #initialisation
#####################################################################
#préparation des fichiers de sortie .xml et .txt
while (($code,$nom)=each(%rubrique))
{
  my $outRubriqueXml="sortie_".$nom.".xml";
  if (!open (OUTXML,">:encoding(UTF-8)","$outRubriqueXml")) {die "Pb a l'ouverture du fichier $outRubriqueXml"};
  print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
  print OUTXML "<rubrique nom=\"".$nom."\">\n";
  close OUTXML;

  my $outRubriqueTxt="sortie_".$nom.".txt";
  if (!open(OUTTXT,">:encoding(ISO-8859-1)","$outRubriqueTxt")) {die "Pb a l'ouverture du fichier $outRubriqueTxt"}
  print OUTTXT "Rubrique : ".$nom."\n";
  close OUTTXT;
} #fin while 

#################################################################################
&parcoursarborescencefichiers($rep);	#recurse! 
#################################################################################
 #on complète le traitement en fermant les balises dans les fichiers xml 
  while (($code,$nom) = each(%rubrique))
    {
      my $outRubriqueXml ="sortie_".$nom.".xml";

      if (!open (OUTXML,">>:encoding(UTF-8)","$outRubriqueXml")) { die "pb a l'ouverture du fichier $outRubriqueXml" };
      print OUTXML "<\/rubrique>\n";
      close OUTXML;
    } #  fin while

#############################################################################################"
sub parcoursarborescencefichiers {
    my $path = shift(@_);  #@_ un  tableau qui stocke les arguments passés à 1 procédure
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR); #bacec 2008
    closedir(DIR);
    foreach my $file (@files) {
	next if $file =~ /^\.\.?$/; #stegh inch a anum?
	$file = $path."/".$file; #2008/
	if (-d $file) { #si c'est un directory, rebelote
	    &parcoursarborescencefichiers($file);	#recurse!
	}
	if (-f $file) { #si c'est un file, voir si c'est .txt ou .xml
		if ($file=~/(0,\d+-(0,)*\d{2,}(,1)*-\d+,0)\.xml$/) 
		{ #si fichier xml
			print $file;
			$er=$1;
			
			open(XMLIN, $file); 
			my $contenuxml=""; #initialisation variable texte
			while (my $ligne=<XMLIN>) #traite le fichier xml
				{
					$ligne=~s/\n//g; #retire les  retours à la ligne s'il y en a
					$ligne=~s/\r//g;
					$contenuxml.=$ligne; #concatène le tout
					$contenuxml=~s/> *</></g;#retire les blancs entre les chevrons
				}
			while ($contenuxml=~/<item><title>([^<]+)<\/title>.+?<description>([^<]+)<\/description>/g)	
				{
					my $titre=$1;
					 $titre=&nettoieText($titre);
					 my $description=$2;
					 $description=&nettoieText($description);	
#utf-8 pour les sorties xml					  
# 					utf8($titre);
# 					utf8($description);
			if (!(exists $dicoTitres{$titre}) and (!(exists $dicoDescriptions{$description})))
			 {
			    $dicoTitres{$titre}=1;
			    $dicoDescriptions{$description}=1;
	
			if(exists $rubrique{$er})
			  {
			     my $outRubriqueXml="sortie_".$rubrique{$er}.".xml";
			     
			if (!open (OUTXML,">>:encoding(UTF-8)","$outRubriqueXml")) { die "Pb a l'ouverture du fichier $outRubriqueXml"};
		   
			  print OUTXML "<item><titre>".$titre."</titre><description>".$description."</description></item>\n";
#iso-8859-1 pour les sorties txt		     
			$titreiso=decode("iso-8859-1",$titre);
			$descriptioniso=decode("iso-8859-1",$description);
	
			my $outRubriqueTxt="sortie_".$rubrique{$er}.".txt";
			if(!open(OUTTXT,">>:encoding(ISO-8859-1)","$outRubriqueTxt")) {die "pb a l'ouverture du fichier $outRubriqueTxt" };
	
			print OUTTXT " Titre : ".$titreiso."\n"."Description : ".$descriptioniso."\n";
#étiquetage avec Tree Tagger		    
			my $outTagger="sortie_".$rubrique{$er}."_tagged";
		 
			system("echo \"$titre\" | ./TreeTagger/cmd/tree-tagger-french-utf8  >> $outTagger"); #sortie txt par rubrique
			system("perl ./TreeTagger/cmd/treetagger2xml-utf8.pl $outTagger utf-8");  #sortie xml par rubrique
		    
		    
		    }
		    }
		    else {
		    if(exists $rubrique{$er})
			  {
			     my $outRubriqueXml="sortie_".$rubrique{$er}.".xml";
			     
			if (!open (OUTXML,">>:encoding(UTF-8)","$outRubriqueXml")) { die "Pb a l'ouverture du fichier $outRubriqueXml"};
		    
		    print OUTXML "<item><titre>-</titre><description>-</description></item>\n";
		    }
		    }
			close OUTTXT;
			close OUTXML;	
			close OUTTAGGER;
				  
				
				
				
			    } #fin while	
		  } #fin if fichier xml	
		}#fin si c'est un fichier
	} # fin foreach
}#fin parcours
#----------------------------------------------
sub nettoieText {
    my $texte=shift; 
    $texte=HTML::Entities::decode($texte);
    $texte =~ s/&#(\d+);/chr($1)/ge;
    $texte =~s/&/&amp;/g;
    $texte =~ s/<a href[^>]+>//g;
    $texte =~ s/<img[^>]+>//g;
    $texte =~s/<(.+?)>//g;
  #  $texte =~s/[ ]+//g;
    $texte =~ s/<[^>]+>//g;
    $texte =~ s/<\/a>//g;
   #trop de points à la ligne	
    #$texte.=".";
   	return $texte;
	}#fin nettoietexte


