#!/usr/bin/perl
<<DOC;
Objectif :
– Vous devez construire un programme qui parcourt une arborescence de fichiers et applique un traitement d’étiquetage
sur chacun des fichiers rencontrés au moment du parcours
– En sortie, le programme doit construire un fichier structuré (XML) contenant une trace du traitement réalisé sur les fichiers
– Application :
! Ressources fournies :
– Une arborescence de fils RSS
! Les 2 transparents suivants montrent l ’allure de l’arborescence et le
contenu des fils
– Un squelette minimal du programme de parcours
– Traitement :
! étiqueter les contenus textuels des balises DESCRIPTION et TITLE (i.e. votre programme de filtrage construit précédemment)
! IMPORTANT : on « conservera » aussi le titre de la « rubrique » du fil (balise title sous channel cf présentation du corpus)
DOC

#ce fichier en tête peut evider Wide character
use utf8;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');

#-------------------------------------------------------------------------
#Etape 1: je veux recuperer tous les fichier dans le repertoire 
#-------------------------------------------------------------------------
my $repertoire = "2016"; #l'adresse de repertoire
my $rubrique = "$ARGV[0]"; 
%dico; #hash
#cree les fichiers pour stoker le texte: output.txt & output.xml
open (OUTPUT, ">:encoding(utf8)", "$rubrique.txt") or die "NE PEUT PAS OUVIRE LE FICHIER !";
open (OUTPUT1, ">:encoding(utf8)", "$rubrique.xml") or die "NE PEUT PAS OUVIRE LE FICHIER !";

print OUTPUT1 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print OUTPUT1 "<PARCOURS>\n";
print OUTPUT1 "<NOM>Yuran ZHAO et Mingqiang WANG</NOM>\n";
print OUTPUT1 "<ETIQUETAGE>\n";

close OUTPUT;
close OUTPUT1;

&parcours($repertoire); #appeller la fonction qui recupeter tous les fichies qu'on a besoin dans un repertoire arborescence et les traiter

open (OUTPUT, ">>:encoding(utf8)", "$rubrique.txt") or die "NE PEUT PAS OUVIRE LE FICHIER !";
open (OUTPUT1, ">>:encoding(utf8)", "$rubrique.xml") or die "NE PEUT PAS OUVIRE LE FICHIER !";
print OUTPUT1 "</ETIQUETAGE>\n";
print OUTPUT1 "</PARCOURS>\n";
close (OUTPUT);
close (OUTPUT1);


sub parcours
{
  my $path = shift(@_); #shift ==> retourne le premier element d'une liste
                        # @_ ===> une liste
  #je veux ouvrir la liste de mon repertoire
  opendir(DIR, $path) or die "NE PEUT PAS OUVIRE LE REPERTOIRE !";
  #je veux le lire
  my @files = readdir(DIR);
  closedir(DIR);
  foreach my $file (@files)
  {
    #my @fichier = (@_);
    next if $file =~ /^\.\.?$/; #j'ignore le cas : nom de fichier est . ou ..
                                # avec "=~" on peut lire un variable qui contient une expression reguliere
    #next if $file =~ /^\._/;
    #next if $file =~ /^fil/;
    $file = $path."/".$file;
    #$fichier = $file;
    if (-d $file) #-d ==> test si $file a un repertoire (qui a une liste)
    {
      print "<NOUVEAU REPERTOIRE> ========> ",$file,"\n";
      &parcours($file); #recurse!
      print "<FIN REPERTOIRE> =========> ",$file,"\n";      
    }#if
    #-----------------------------------------------------------------------------------------
    #Etape 2: je veux traiter tous les fichiers que on a trouvé : filtrage et nettoyer
    #-----------------------------------------------------------------------------------------
    if (-f $file)  #-f ==>verifier si $file est un fichier normal
    {
      #je veux travaille sur uniquement les fichier xml 
      if ($file =~ /$rubrique.+\.xml/)
      {
        #je ouvert ce fichier
        print "$file\n";
        open (INPUT, "<:encoding(utf8)", $file);
         #je cree un variable vide pour stoker le contenu
        open (OUTPUT, ">>:encoding(utf8)", "$rubrique.txt") or die "NE PEUT PAS OUVIRE LE FICHIER !";
        open (OUTPUT1, ">>:encoding(utf8)", "$rubrique.xml") or die "NE PEUT PAS OUVIRE LE FICHIER !";
        my $texte = "";
        while (my $ligne =<INPUT>) #filtrage
        {
          chomp $ligne; #supprime le retour de ligne
          $ligne =~s/\r//g; #enleve tous les "\r" 
          $texte = $texte.$ligne;

        }#while
        close INPUT;
        #je ne veux pas l'espace entre les chevrons
        $texte =~ s/> +</></g;
        print "$texte\n";
        # sortir la partie "title" et "description"        
        while ($texte =~ m/<item><link>(?:[^<]+?)<\/link><title>([^<]+?)<\/title><description>([^<]+?)<\/description>/g)
        {
          my $title = $2;
          print "$title\n";
          my $description = $3;
          #-----------------------------------------------------------------------------------
          # nettoyage
          #-----------------------------------------------------------------------------------
          $description =~ s/&lt;.+?&gt;//g;
          $title =~ s/&amp//g;
          $description =~ s/xE[0-9]//g;
          #------------------------------------------------------------------------------------
          if (!(exists $dico{$title})) 
          {
            my ($xmltitle,$xmldescription) = &etiquette($title,$description); #appelle fonction etiquette
            $dico{$title} = 1; #la valeur correspondant à la clef $titre est 1
            print OUTPUT "$file\n";        
            print OUTPUT "$title\n"; #j'ajoute un symbole "$" pour noter la fin du title
            print OUTPUT "$description\n";
            print OUTPUT1 "<name> $file <\/name>\n";
            print OUTPUT1 "<item><title>$xmltitle<\/title><description>$xmldescription<\/description><\/itme>";      
          }#if
        }#while
        close OUTPUT;
        close OUTPUT1;
      }#if
    }#if
  }#fin de foreach
   # traitement du fichier est fini ! 
} #fin de parcours

#------------------------------------------------------------------------------------------------------------------
# Etape 3: etiquette : applique un traitement d’étiquetage sur chacun des fichiers rencontrés au moment du parcours
#------------------------------------------------------------------------------------------------------------------
sub etiquette
{
  my $var1 = shift(@_); #$_[0]
  my $var2 = shift(@_); #$_[1]
  open (my $f1, ">:encoding(utf8)", "title.txt") or die "NE PEUT PAS OUVIRE LE FICHIER !"; #>> ==> ajouter
  open (my $f2, ">:encoding(utf8)", "description.txt") or die "NE PEUT PAS OUVIRE LE FICHIER !";
  print $f1 "$var1\n"; #ecrit dans title.txt $var1 qui a la valeur de $title
  print $f2 "$var2\n"; #ecrit dans description.txt $var2 qui a la valeur de $description 
  close $f1;
  close $f2;
  #on veut lancer une commande hors la programme perl:
  system("perl tokenise-utf8.pl title.txt | ./tree-tagger -token -lemma -no-unknown french-utf8.par > title_etiquette.txt"); 
  #Tree-tagger [opt°] <input> <output>
  system("perl treetagger2xml-utf8.pl title_etiquette.txt utf8"); #résultat est contenu dans title_tag.txt.xml
  open ($f1, "<:encoding(utf8)", "title_etiquette.txt.xml") or die "NE PEUT PAS OUVIRE LE FICHIER !";
  my $title_tag = "";
  my $ligne = <$f1>;
  while (my $ligne = <$f1>) 
  {
    $title_tag = $title_tag . $ligne;
  }#while
  close $f1;
  system("perl tokenise-utf8.pl description.txt | ./tree-tagger -token -lemma -no-unknown french-utf8.par > des_etiquette.txt");
  system("perl treetagger2xml-utf8.pl des_etiquette.txt utf8");  #résultat est contenu dans description_tag.txt.xml
  open (my $f2, "<:encoding(utf8)", "des_etiquette.txt.xml") or die "NE PEUT PAS OUVIRE LE FICHIER !";
  my $description_tag = "";
  my $ligne = <$f2>;
  while (my $ligne = <$f2>) 
  {
    $description_tag = $description_tag . $ligne;
  }#while
  close $f2;
  return ($title_tag, $description_tag);     # envoyer deux valeur qui contiennent le contenue de title
} # fin de etiquette




