#======================================================
#                                          PROJET  NUAGE
#       Le programme du parcours de l'arborescence
#       Auteur: Zahir MAAFA
#       Derniere mise à jour: 25 mai 2006
#=====================================================       


#!/usr/bin/perl
use warnings;
use diagnostics;
use strict;


<<DOC;

Usage: perl  projet_n.pl   <nom-du-repertoire>  <chemin à Treetagger.exe>   <chemin à AltovaXSLT.exe>
 
Le programme prend en entrée le nom du répertoire contenant les fichiers à traiter
 et les chemins d'acces à treetagger.exe et AltovaXSLT.exe

et produit en sortie une arborescence des fichiers résultats des traitements

DOC

#==== LE  PROGRAMME  PRINCIPAL ======================

#=======================  declaration des variables

#=========================== caracteres spéciaux =========================
my $cs="ƒŒœµÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöùúûüýþÿŸ";
#=========================================================================

my $ctt=$ARGV[1];# chemin d'acces au dossier contenant Treetagger Windows
my $cpxsl=$ARGV[2];# chemin d'accés au processeur xslt
my $rep="$ARGV[0]";      # le repertoire en entrée
my $nbase;              # le niveau des repertoires à regrouper    
 
my $i=0;
$rep=~s/[\/]$//;     # supprimer le slash final
$ctt=~s/(.*)\/bin\/tree-tagger\.exe.*/$1/;
$ctt=~s/\/cygdrive\/c/c:/;

$cpxsl=~s/(.*)\/AltovaXSLT\.exe.*/$1/;
$cpxsl=~s/\/cygdrive\/c/c:/;


choix();   # fixer les Paramètres

 

#===================    le parcours de l'arbre
mkdir 'corpus_res';  
&parcoursarborescencefichiers($rep,'corpus_res');
# Génération des graphes
&gengraphe("corpus_res");
exit;


#=========== FIN DU PROGRAMME PRINCIPAL ===============
#======================================================
#   Choisir la maniere de regrouper les fichiers
#======================================================

sub choix
 {

  print "\n\n\n\n==============================================\n";
  print " \n                PROJET NUAGE                 \n";
  print "\n==============================================\n";
  print "\n Veuillez choisir un regroupement des fichiers:\n\n";
  print "\n1- regroupement par l'heure d'arrivée.         \n";
  print "\n2- regroupement par jour.         \n";
  print "\n3- regroupement par mois.         \n\n";
  $nbase=<STDIN>;
  $nbase--;

  }

#======================================================
# La procedure de parcours: parcoursarborescencefichier
#======================================================

sub parcoursarborescencefichiers {

#======== Déclaration des variables===========
    my $path = $_[0];
    my $pathr=$_[1];
    my $f;
    my $ligne;
    my $file1;
    my $file;
    my $i=0;
    my $DUMPFULL1="";   # le flux de sortie
#=============================================
     
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
 
    closedir(DIR);

    foreach my $file (@files) {

    next if $file =~ /^\.\.?$/;
# mettre le nom du repertoirre dans $file1

    $file1 = $path."/".$file;
            
    if (-d $file1) {     my $pathr1= $pathr;
                           if ( niveau($file1)> $nbase)
                              {
                                $pathr1= $pathr."/".$file;
                                  mkdir $pathr1;
                               }
                        &parcoursarborescencefichiers($file1,$pathr1);    #recurse!
                  }

    if (-f $file1) {    
                            $DUMPFULL1="";
                              

                      # lecture du contnu du fichier xml en entrée
                     #les fichiers à traiter commence par "0," ou par "AFP-stories"

                 if (($file=~/^0,.+xml/) or ($file=~/AFP-stories.*xml/))
                    {  
                         print $file."\n";
                       $i++;
                         
                            
                                
                               if (!open (FR,">".$pathr."/"."corpus_tag$i.txt"))
                                 { die "Pb a l'ouverture du corpus résultat"};
                            # Attention au codage   
                      if ($file1=~/AFP/)
                          {
                             open (FPUT,'<:encoding(utf8)',"$file1");
                           }
                       else
                         {
                           open (FPUT,'<:encoding(iso-8859-1)',"$file1");
                          }
                          $f='';
                          while (defined( $ligne=<FPUT>))
                         {
                          $ligne=~s/\n/ /;
                           $f=$f.$ligne;
                         }
                      # extraire les contenus des balises description
                       
                         while ($f=~s/<description>([^<]*)<\/description>//)
                       
                          {
                           $DUMPFULL1=$DUMPFULL1.$1." "; # séparer par un espace pour eviter de coller deux mots
                          }

                        while ($DUMPFULL1=~m/&#([0-9]+);/) {$DUMPFULL1=~s/&#([0-9]+);/chr($1)/ge;}
                             

                        $DUMPFULL1=~s/([^a-zA-Z0-9$cs])/\n$1\n/g;  # un mot par ligne
                          
                         $DUMPFULL1=~s/\s+/\n/g;
                         $DUMPFULL1=~s/\n\n+/\n/g;
                             
                        print FR $DUMPFULL1;


                                 
                          close(FPUT);
#  Étiquetage
 system("$ctt/bin/tree-tagger.exe -token -lemma -no-unknown $ctt/lib/french.par $pathr/corpus_tag$i.txt $pathr/corpus_tag_et$i.txt");
#  Recherche des noms et adjectifs
 system ("perl trouve_terme_mod.pl  $pathr/corpus_tag_et$i.txt patron-2.txt > $pathr/corpus_tag_res_ex$i.txt");      
                }   
                 
                }
    }
        if ($i>0)
        {
            regrouper("$pathr/corpus_tag","$pathr/corpus_T.txt");
 
            regrouper("$pathr/corpus_tag_et","$pathr/corpus_E.txt");
            rim("$pathr/corpus_tag_et","$pathr/corpus_IM.txt");   #     creation du fichier des fenetres
            regrouper("$pathr/corpus_tag_res_ex","$pathr/corpus_XT.txt");
            system ("/bin/rm.exe $pathr/corpus_tag*");
            
        }
}


#===================================================
# permet de regrouper les fichiers intermédiaires
#===================================================

sub regrouper


{

my $i=1;
my $fich=$_[0];

my $line;
open (RH,">>"." $_[1]");
 while (open(GR,"<"."$fich$i.txt"))
{
   while ( $line=<GR>)
     {
       print RH $line;


     }
     $i++;

close (GR);

}

close(RH);

}
#================================================
# Générer le fichier des fenêtres
#===============================================
sub rim
{
my $i=1;
my $fich=$_[0];

my $line;
 
 while (open(GR,"<"."$fich$i.txt "))

{

 system("perl fich_fenetres.pl $fich$i.txt $_[1]");
     
$i++;



close (GR);

}

}




#=========================================================
# à partir d'un dossier donné calcule le nombre  
# des sous dossiers à parcourir pour ateindre les fils XML
#==========================================================
sub niveau
{

my $pt;
my $jn;

my $in=0;
$pt=$_[0];
while ( -d  $pt)
{
  $in++;
    
     print "$pt"."\n";
     opendir(DIR, $pt) or die "can't open $pt: $!\n";
     my @fich = readdir(DIR);
    $jn=0;
    while ($fich[$jn]=~/^\..*/) {$jn++}
    $pt=$pt."/"."$fich[$jn]";
    closedir(DIR);
}

 return $in;

}

#=====================================================
#          
Génération des graphes de BO4 et de l’information mutuelle
#=====================================================
sub gengraphe {

#======== Déclaration des variables===========
    my $path = $_[0];
    
 
#=============================================
     
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
 
    closedir(DIR);

    foreach my $file (@files) {

    next if $file =~ /^\.\.?$/;
# mettre le nom du repertoire dans $file

    $file = $path."/".$file;
            
    if (-d $file) {   
                        &gengraphe($file);    
                  }

    if (-f $file) {    
                           
#  le graphe des listes NOM adjectif (BO4)
                 if  ($file=~/corpus_XT\.txt/)
                            {
                         system ("perl patron2graphm.pl  $file $path");  
                         system ("\'$cpxsl\'/AltovaXSLT.exe -xml $path/patron-graphml.xml -xsl GraphML2Pajek.xsl -out $path/corpus_P.net");
                         system ("/bin/unix2dos.exe $path/corpus_P.net");
                            
                              
                             }
               #=========   le gaphe de l'information mutuelle       
                   if  ($file=~/corpus_IM\.txt/)
                            {
                         system ("/bin/unix2dos.exe $file");
                         system ("perl FaitIndexDeFenetres.pl   $file > $path/fich.index.xml");  
                         system ("perl FaitCooccurrencesDansFenetre.pl $file  \'A|N\'  20 3 > $path/fcooc.xml ");
                         system ("perl CooccurrencesDansFenetre2IM.pl $path/fich.index.xml $path/fcooc.xml 5 > $path/fich_IM.xml ");
                         system ("perl IM2GraphML.pl  $path/fich_IM.xml 8 9.0 >$path/grIM.xml ");
                         system ("\'$cpxsl\'/AltovaXSLT.exe -xml $path/grIM.xml -xsl GraphML2Pajek1.xsl -out $path/corpus_IM.net");
                         system ("/bin/unix2dos.exe $path/corpus_IM.net");
                            
                              
                             }




 
                 
                       }
    }
      
}