#!/usr/bin/perl

# 				   _     _  _  				#
# 				  |_) _./ \ _) 				#
# 				  |_)(_|\_/ _) 				#
# 											#


# usage : perl bao3_rb.pl fichier_tag fichier_motif
# on appelle les bibliothèques
use XML::XPath;
use File::Copy;
use File::Path;if($#ARGV!=1){print "### ATTENTION ### usage : perl $0 fichier_tag fichier_motif ###\n";exit;}

my $tag_file= shift @ARGV;
my $patterns_file = shift @ARGV;

my @patterns;
my $nb_patterns=0;
my $nb_tokens=0;
#
#----8<---dossier pour les résultats-----------8<-----------------

mkpath("./patternResults/");
open(PATTERNSFILE, $patterns_file) or die "can't open $patterns_file: $!\n";


#--lecture du fichier .txt contenant les motifs, un motif par ligne-
while ($ligne = <PATTERNSFILE>) {
	chomp($ligne);
	$nb_patterns = push(@patterns,$ligne);
}
#--création de l'objet XML::XPath pour explorer le fichier de sortie tree-tagger XML--
my $xp = XML::XPath->new( filename => $tag_file ) or die "Problème";

#--recherche des motifs dans le fichier de sortie treetagger xml----
foreach my $pattern (@patterns){
	my $match_file = "res_extract-".join('_', @tokens).".txt";
	open(MATCHFILE, ">$match_file") or die "can't open $match_file: $!\n";
	&extract_pattern(@tokens);
	close(MATCHFILE);
	move($match_file,"./patternResults/");

}
#---------8<---------extraction d'un motif------------8<------------

sub extract_pattern{
	@tokenz=@_;
	# la fonction shift coupe le premier élement d'un tableau et le revoie en résultat
	$first_token=shift @tokenz;
	chomp($first_token);
	$search_path="//element/data[1][contains(text(),\"$first_token\")]";
	foreach my $token (@tokenz){# construction  recursive du chemin xpath correspondant au motif recherché
		chomp($token);
		$search_path.="/ancestor::element/following-sibling::element[1]/data[1][contains(text(),\"$token\")]";
	}
	
	foreach my $noeud ( $xp->find($search_path)->get_nodelist ) {
		my @matching_tokens;
		$noeud_tmp=$noeud->getParentNode;
		$i=0;
		foreach (@tokens){
			$i++;
			# on récupère la forme
			$motif=$noeud_tmp->getChildNode(3)->string_value;
			# unshift(@matching_tokens,$motif) ajoute au début du tableau @matching_tokens un élément dont la valeur est le contenu de la variable $motif
			$nb_tokens=unshift(@matching_tokens,$motif);
			$motif="";
			# on remonte recursivement pour extraire la forme
			@noeudtmp=$xp->find("./preceding-sibling::element[1]",$noeud_tmp)->get_nodelist;
			$noeud_tmp=shift(@noeudtmp);
		}
		# écriture des résultats dans un fichier en utilisant la fonction join, pratique !
		print MATCHFILE join(' ', @matching_tokens)."\n";
	}
}