#!/usr/bin/perl

<<DOC;

prend en entree un fichier issu de treetagger (argument en position 0)
et un fichier de patrons morphosyntaxiques (argument en position 1);
le programme extrait des suites de tokens correspondant
aux patrons morpho-syntaxiques contenus dans le fichier de patrons;

exemples d utilisation avec les fichiers d exemples fournis :

perl trouve_terme.pl SORTIE-TREETAGGER.txt patrons-1.txt
perl trouve_terme.pl une-description-etiquetee-avec-treetagger.txt patrons-2.txt

DOC

#---------------------------------------------------
# debut du programme, ouverture en lecture du fichier passe en argument
#---------------------------------------------------
print "Bonjour\n";
open(FIC, $ARGV[0]);

# ouverture d un fichier de trace, destine a recevoir les
# informations de traitements
open(TRACE,">trace.txt");
#---------------------------------------------------
# debut du programme, choix du nom du fichier en sortie
#---------------------------------------------------
print "Choisis un nom de fichier pour contenir les termes extraits\n";
my $fic=<STDIN>;
#---------------------------------------------------
# initialisation des variables
#---------------------------------------------------
open(FIC1, ">$fic");
my $i=0;
my $j=0;
my $k=0;
my @token=();
#---------------------------------------------------
# lecture du fichier de sortie TREETAGGER
# creation de 3 tableaux contenant les mots, les lemmes et les categories
#---------------------------------------------------
while (<FIC>) {
    my $ligne=$_;
    my @liste=split(/\t/,$ligne);
    print TRACE "Lecture dans sortie treetagger :", @liste,"\n";
    push(@token, $liste[$i++]." ");
    push(@patron, "$liste[$i++]" ." ");
    push(@lemme, "$liste[$i++]" ." ");
    $i=0;
}
close(FIC);

#---------------------------------------------------
# on cree une liste vide destinee a recevoir les patrons
# presents dans le fichier lu a l etape precedente
# cette liste sera initialisee apres chaque construction
# de patron
#---------------------------------------------------
@sous_patron=();
#---------------------------------------------------
# creation de la liste des patrons lus dans le fichier
#  issu de treetagger
#---------------------------------------------------
while (defined($element_patron=shift(@patron))) {
    if ($element_patron !~ PUN && $element_patron !~ SENT) {
        push(@sous_patron, $element_patron);
        print TRACE "SOUS-PATRON en construction : ",@sous_patron,"\n";
        $j++;
        next;
    }
    print TRACE "SOUS-PATRON construit : ",@sous_patron,"\n";
    my @sous_token=@token[$k+1..$j-1];
    print TRACE "SOUS-TOKEN construit : ",@sous_token,"\n";
#   on va maintenant voir si le sous-patron construit est dans le
#   liste des patrons cherches (dans le fichier des patrons scrutes)
    &cherche_patron(@sous_patron);
    @sous_patron=();
    $k=$j;
    $j++;
}

close (FIC1);
close(TRACE);
#=============================================
# procedure de recherche des patrons
#=============================================

sub cherche_patron {
    print TRACE "RECHERCHE dans le fichier des patrons...\n";
    my @liste=@_;
    my $suite_de_patrons=join("",@liste);
    $z=0;
    $nb=0;
#   ouverture du fichier des patrons cherches
    open(FIC, "$ARGV[1]");
    while(<FIC>) {
        $ligne=$_;
        print TRACE "PATRON LU : $ligne";
        chomp $ligne;
        $nb=0;
        while ($ligne=~m/ /g) {$nb++};
        $nb++;
        while ($suite_de_patrons=~m/$ligne/g) {
            my $avant=substr ($suite_de_patrons, 0, pos($suite_de_patrons)-length($ligne));
            while ($avant=~m/ /g) {$z++};
            print TRACE "PATRON OK : @token[$k+$z+1..$k+$z+$nb]\n";
            print FIC1 "@token[$k+$z+1..$k+$z+$nb]\n";
            $z=0;
        }
    }
    close(FIC)
}