#!usr/bin/perl -w



<<DOC;
	Mode d'emploi : perl def_patron_mixte.pl
		- saisir le nombre de formes grammaticales qui vont constituer votre patron
		- saisir l'intitulé des formes grammaticales constitant votre patron
		- saisir le nom d'un fichier dont vous souhaitez obtenir la liste des formes correspondantes à votre patron
	Le programme crée un fichier XML sur la rubrique choisie ainsi que la feuille de style qui lui est associée permettant d'afficher la liste des formes correspondant au patron
	Le programme appelle automatiquement le programme 'term-utf8.pl' qui va se charger de créer un fichier texte contenant la liste des formes correspondant au patron
DOC

# création du répertoire 'boîte à outils 3' où l'on va stocker les fichiers textes contenant les patrons via l'étiquetage de Tree Tagger et via les feuilles de styles XSLT
system("mkdir bao3-1 bao3-1/fichiers_xml_XSLT bao3-1/fichiers_txt_TT");


my $texte_xslt="";
print "Veuillez saisir le nombre de modèles constituant votre patron syntaxique puis appuyez sur la touche 'Entrée':\n";
# récupération d'un nombre sur l'entrée standard
my $nombre_modele=<STDIN>;
# suppression des sauts de ligne
$nombre_modele=~s/[\r\n]+//g;
# si l'utilisateur n'a pas rentré de nombre alors recommencer la procédure
while ($nombre_modele!~/[1-9]+/) {
    print "Vous devez entrer un nombre :\n";
    $nombre_modele=<STDIN>;
    $nombre_modele=~s/[\r\n]+//g;
}

# l'utilisateur va définir un patron
print "Saisissez vos $nombre_modele modèles pour votre patron :\n";
my $patron="patron_";
# sélection des formes grammaticales constituant le patron
for ($i=1;$i<=$nombre_modele;$i++) {
    print "Modèle $i :\n";
	# récupération sur l'entrée standard des formes grammaticales
    $modele{$i}=<STDIN>;
	# suppression des sauts de ligne pour faire correspondre avec l'expression régulière (plus bas)
    $modele{$i}=~s/[\r\n]+//g;
	# si la forme grammaticale sélectionnée n'est pas correcte, recommencer la procédure
    while ($modele{$i}!~/NOM|ADJ|PRP|VER|PRO|DET|NAM|PUN|NUM/) {
        print "Modèles disponibles :\nNOM\nADJ\nPRP\nVER\nPRO\nDET\nNAM\nPUN\nVotre choix :\n";
        $modele{$i}=<STDIN>;
        $modele{$i}=~s/[\r\n]+//g;
    }
    $patron.=$modele{$i}."_";
	if ($i==1) {
		$texte_xslt.="<xsl:if test=\"child::data[\@type='type'][contains(text(),'$modele{$i}')]\">\n
        <xsl:variable name=\"cat$i\">\n
          <xsl:value-of select=\"child::data[last()]\" />\n
        </xsl:variable>\n";
	}
	else {
		my $j=$i-1;
		$texte_xslt.="<xsl:if test=\"following-sibling::element[$j][data[\@type='type'][contains(text(),'$modele{$i}')]]\">\n
           <xsl:variable name=\"cat$i\">\n
             <xsl:value-of select=\"following-sibling::element[$j]/data[last()]\" />\n
          </xsl:variable>\n";
	}
}

# création d'un fichier XSLT pour créer un liste de patron à partir d'un document XML étiqueté via Tree Tagger
open (XSLT, ">:encoding(utf-8)", "bao3-1/fichiers_xml_XSLT/$patron.xsl");
# on inscrit dans le fichier les informations de déclarations de fichier xsl
print XSLT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n
<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n
  <xsl:template match=\"/\">\n
  <html>\n
  <head></head>\n
  <body>\n
    <xsl:for-each select=\"//element\">\n";
	# on imprime dans le fichier les requêtes XPATH via le balisage XSLT pour récupérer les patrons
	print XSLT "$texte_xslt\n";
# impression de la liste des patrons via la feuille de style XSL
for ($i=1;$i<=$nombre_modele;$i++) {
	print XSLT "<xsl:copy-of select=\"\$cat$i\" /><xsl:text> </xsl:text>\n";
}
print XSLT "<br />\n";
# fermeture des balises 'if' selon le nombre de formes grammaticales définies dans le patron
for ($i=2;$i<=$nombre_modele;$i++) {
	print XSLT "</xsl:if>\n";
}
# fermeture des balises du fichier XSLT
print XSLT "</xsl:if>\n
		</xsl:for-each>\n
    </body>\n
    </html>\n
  </xsl:template>\n
</xsl:stylesheet>";
# fermeture du fichier
close (XSLT);

# récupération dans une liste des fichiers XML correspondant aux rubriques
@liste_fichiers_xml=`ls bao2-1/fichiers_xml/*.xml`;
foreach $fichier (@liste_fichiers_xml) {
    $fichier=~s/[\r\n]+//g;
	$fichier_xml_nom_fichier=$fichier;
	$fichier_xml_nom_fichier=~s/.+?\/.+?\/(.+?)\.xml//;
	$fichier_xml_nom_fichier=$1;
	# création d'une variable qui contiendra : le type de patron et le nom de la rubrique
	my $xml=$patron.$fichier_xml_nom_fichier;
	# ouverture en lecture d'un document XML étiqueté avec Tree Tagger
	open (XML, "<:encoding(utf-8)", "bao2-1/fichiers_xml/$fichier_xml_nom_fichier.xml");
	# copie de ce document XML dans un répertoire différent
	open (XML1, ">:encoding(utf-8)", "bao3-1/fichiers_xml_XSLT/$xml.xml");
	my $l=0;
	# on insère dans cette copie la ligne de déclaration d'une feuille de style XSLT associée au document XML
	while (my $ligne=<XML>) {
		if ($l==0) {
			$ligne_xsl=$ligne."\n<?xml-stylesheet type=\"application\/xml\" href=\"$patron.xsl\" ?>\n";
			$l=1;
		}
		else {
			$ligne_xsl.=$ligne;
		}
	}
	# impression du résultat dans la copie du document XML
	print XML1 $ligne_xsl;
	close (XML);
	close (XML1);
}
