#!/usr/bin/perl
# utilisation : perl bao3.pl corpus-titre-description.xml (fichier treetagger ou udpipe) patronqu'onsouhaite

use utf8;
binmode STDOUT,":utf8";

my $fichereatraiter=shift @ARGV; #on enlève le nom du fichier xml de la liste et on la met dans une variable
my @patron=@ARGV; #on met le patron dans un liste

open my $input, "<:encoding(utf-8)",$fichereatraiter; #on ouvre le fichier xml étiqueté à lire
my @liste=<$input>; #on envoit l'xml dans une liste
close($input); #on ferme le fichier xml

while (my $ligne=shift @liste) { #on va lire la liste en la vidant et on va parcourir la liste jusqu'à ce qu'elle soit vide
  my $terme=""; #variable qui contiendra les mots correspondant au patron cherché
  if ($ligne=~/<element><data type="type">$patron[0]<\/data><data type="lemma">[^<]+?<\/data><data type="string">([^<]+?)<\/data><\/element>/) { #on vérifie que la ligne = $patron[0] (le premier élément du patron) et si c'est bon alors on lit autant de lignes qu'il y a d'éléments dans le patron
    $terme=$terme.$1; #je stocke le mot gardé comme variable entre () que je récupère de ma ligne (qui a été extraite de ma liste)
    my $longueur=1; #variable qui permettra le contrôle de la longueur du patron
    my $indice=1; #permet de gérer la "boucle"
    while (($liste[$indice-1]=~/<element><data type="type">($patron[$indice])<\/data><data type="lemma">[^<]+?<\/data><data type="string">([^<]+?)<\/data><\/element>/) and ($indice <= $#patron)) { #indice-1 car la ligne qu'on extrait a indice 1 mais la ligne d'avant a indice 0 car est dans la liste
			$indice++; #on avance dans la liste
			$terme.=" ".$2; #j'ajoute le nouveau mot qui correspond au patron dans la variable
			$longueur++; #on avance dans le patron
		}
		if ($longueur == $#patron + 1) { #si la longueur est égale à la longueur du patron
			$dicoPatron{$terme}++; #on ajoute la variable contenant les mots qui correspondent au patron dans un dictionnaire
			$nbTerme++; #on ajoute +1 au nombre de patrons trouvés
		} 
  }
}
open my $resume,">:encoding(UTF-8)","resume.txt"; #on créé un fichier qui contiendra le résultat final
print $resume "$nbTerme éléments trouvés\n\n"; #on affiche dans le fichier le nombre de patrons trouvés
foreach my $patron (sort {$dicoPatron{$b} <=> $dicoPatron{$a} } keys %dicoPatron) { #pour chaque élément du dictionnaire j'affiche le patron dans mon fichier
	print $resume "$dicoPatron{$patron}\t$patron\n";
}
close($resume); #on ferme le fichier final