#!/usr/bin/perl
#--------------------------------------------------------------------
<<DOC;
Format d\'entree : un texte étiqueté et lemmatisé par treetagger + une liste de POS décrivant le patron (ex: DET NC ADJ)

perl programme.pl fichierTT DET NC ADJ

Format de sortie : la liste des occurrences du patron s\'affiche dans le fichier de sortie
DOC
#--------------------------------------------------------------------
use utf8;
binmode STDOUT,":utf8";
#--------------------------------------------------------------------
my $fileatraiter=shift @ARGV;
my $rubrique=shift @ARGV;
my @PATRON=@ARGV;
my $titre=join('_',@PATRON);
open my $input, "<:encoding(utf-8)",$fileatraiter;
my @LISTE=<$input>;
close($input);



# parcourir chqaue ligne du fichier, et rejetter la première ligne déjà lue
while (my $ligne=shift @LISTE) {
	# variable pour le groupe de formes qui correpond au patron
	my $terme="";
	# si la ligne contenue dans $ligne correspond au premier du patron $PATRON[0]
	# impoortant ! parfois l'annotation de type est par ex VER:pper, dans ce cas là le regex /$PATRON[0]/ seul ne suiffit pas
	if ($ligne=~/<element><data type="type">($PATRON[0]|$PATRON[0]:[^<]+?)<\/data><data type="lemma">[^<]+?<\/data><data type="string">([^<]+?)<\/data><\/element>/) {
		# récupérer cet premier élément qui correspond
		$terme=$terme.$2;
		my $longueur=1;
		my $indice=1;

		# alors il faut que je lise autant de ligne qu'il y a dans le patron et tester chaque terme du patron...
		# décalage d'1 entre l'index de liste et l'index de la liste $PATRON pour la comparaison, pour que on ne compare exactement le même nombre que la longeur de la liste $PATRONS d'éléments
		while (($LISTE[$indice-1]=~/<element><data type="type">($PATRON[$indice]|$PATRON[$indice]:[^<]+?)<\/data><data type="lemma">[^<]+?<\/data><data type="string">([^<]+?)<\/data><\/element>/) and ($indice <= $#PATRON)) {
			$indice++;
			# récupérer la forme de cet élément qui correspond à un élément de patron
			$terme.=" ".$2;
			$longueur++;
		}
		# un dernier contrôle pour vérifier si le nombre d'élement dans le groupe de formes 
		# qui est censé correspondre au patron égale au nombre d'élément dans la liste $PATRON
		# on enregistre le groupe de formes qui coresspond au patron dans la liste dicoPatron
		if ($longueur == $#PATRON + 1) {
			$dicoPatron{$terme}++;
			$nbTerme++;
		}
	}	
}

open my $fileResu,">:encoding(UTF-8)","$rubrique/$titre.txt";
print $fileResu "$nbTerme\téléments trouvés\n";
foreach my $patron (sort {$dicoPatron{$b} <=> $dicoPatron{$a} } keys %dicoPatron) {
	print $fileResu "$dicoPatron{$patron}\t$patron\n";
}
close($fileResu);