Creole2Template

Un article de EoleWiki.

| CrEole2 | CreoleSyntaxeXML | Creole2Template |

Sommaire

Langage de Template

utilisation des variables du dictionnaire creole

définition des variables de template

les variables du dictionnaire créole sont accessibles en les préfixant par un %%.

exemple :

Dans le dictionnaire creole, si adresse_ip_eth0 vaut 192.168.170.1, dans le template source:

 bla bla bla %%adresse_ip_eth0 bla bla bla

donnera la sortie suivante :

 bla bla bla 192.168.170.1 bla bla bla


comportement des variables

si une variable existe dans le template cible mais qu'elle n'est définie dans aucun dictionnaire créole, alors le processus d'instanciation est stoppé. Néamoins, si dans le template la précaution suivante est prise :

 %if %%is_defined('adresse_ip_eth0')
   hello 
 %end if

donnera comme résultat :

  hello

uniquement si adresse_ip_eth0 existe dans le dictionnaire creole

alors l'instanciation ne s'arrêtera pas et le block ne sera pas traité.

si une variable qui n'existe pas est dans un block qui n'est pas traité, alors ce n'est pas important :

 %if 0==1
 bla %%undefined bla bla
 %end if

(et ça donnera comme résultat un bloc vide)

il est aussi possible d'utiliser la notation indexée (entre crochets). Si dans le dictionnaire créole une variable est de type mutiple, par exemple ip_adresse_eth0 = ['1.1.1.1', '2.2.2.2', '3.3.3.3'] alors dans le template :

 bla bla %%ip_adresse_eth0[2] bla bla

donnera comme résultat

 bla bla 3.3.3.3 bla bla 

remarque : n'utiliser cette notation indicées que dans le cas où une variable est multi-valuée (ici, elle a au moins trois valeurs)

description du mini-langage de template

Creole fournit un mini-langage de template afin de gérer les lignes optionnelles et de donner la possibilité de réaliser des inclusions répétées.


Les instructions reconnues sont les suivantes, il ne peut y avoir d'autres instruction sur la même ligne :

  • La condition %if ... %else if ... %else ... %end if

syntaxe :

   %if EXPRESSION
   |code if
   %else
   |code else
   %end if

exemple :

 %if %%size == '1500'
 c'est grand
 %else 
 c'est petit
 %end if

si dans le dictionnaire créole la variable size vaut 1500, alors le résultat sera

 c'est grand

exemple2 :

Les opérateurs à utiliser sont ceux du langage python.

 %if %%toto == 'yes' and ( %%titi != "" or %%tata not in ['a','b','c'] )


  • La boucle %for ... %end for

syntaxe :

 %for %%i in EXPRESSION
   hello %%i
 %end for

exemple :

 %for %%i in range(4)
   compte %%i
 %end for

donnera comme résultat :

 compte 0
 compte 1
 compte 2
 compte 3

L'indentation du code n'est ici que pour la lisibilité (attention, une ligne indentee restera indentee dans le fichier final)

utilisation d'une variable de dictionnaire dans le for

si une variable créole est multivaluée, alors elle est utilisable dans une boucle for. si ip_adresse_eth0 = ['0.0.0.', '1.1.1.1', '2.2.2.2'] alors il est possible d'écrire :


 %for %%ip in %%ip_adresse_eth0
   %%ip
 %end for

et la sortie sera :

 0.0.0.
 1.1.1.1
 2.2.2.2

il est possible aussi d'accéder à l'index (la postion dans la liste) de la variable en cours de boucle

 %for %%ip in %%ip_adresse_eth0
   l'index de : %%ip est : %%ip.index
 %end for
 l'index de : 0.0.0.  est : 0
 l'index de : 1.1.1.1 est : 1 
 l'index de : 2.2.2.2 est : 2

si une variable créole est une variable maitre alors il est possible de faire appel à ses variables esclaves. par exemple, si network et netmask sont dépendantes de ip_adresse_eth0, alors il est possible d'appeler ces variables en notation objet, par exemple :

dans le dictionnaire créole figurent les variables suivantes. ip_adresse_eth0 est la variable maitre (les deux autres dépendent de la première)

ip_adresse_eth0 = ['0.0.0.0', '1.1.1.1', '2.2.2.2'] network = ['0.0.0', '1.1.1', '2.2.2'] netmask = ['0.0', '1.1', '2.2']


 %for %%ip in %%ip_adresse_eth0
   %%ip, %%ip.network, %%ip.netmask
 %end for

donnera comme résultat :

 0.0.0.0, 0.0.0, 0.0
 1.1.1.1, 1.1.1, 1.1
 2.2.2.2, 2.2.2, 2.2
  • while

syntaxe :

 %while EXPR
 contenu
 %end while

exemple :

 %while %someCondition('arg1', %%arg2)
 The condition is true.
 %end while
  • repeat

syntaxe :

%repeat EXPR
%end repeat


  • unless
%unless EXPR
%end unless

peut-être utile si une variable est dans le dictionnaire créole pour ne pas executer une action :

 %unless %%alive
 do this
 %end unless
inclusions statiques

il est possible d'inclure des fichiers

 %include "includeFileName.txt"

ou bien à partir du nom long du fichier à inclure :

 %include source=%%myParseText
instructions spéciales
  • if sur une seule ligne

l'instruction if sur une seule ligne :

 %if EXPR1 then "chaine 1" else "chaine 2"
  • effacement des retours chariots
 %slurp

exemple :

%for %%i in range(15)
%%i - %slurp
%end for

écrira :

1-2-3-4-5-6... sur une seule ligne (gobe les retours chariots)

remarquons que dans ce cas là, slurp n'est pas nécessaire et il est possible d'écrire le end sans sauter de ligne :

 %for %%i in range(15)
 %%i - %end for

exemple 2 :

%if %%dns_nameservers != ['']
dns_nameservers %slurp
%for %%name_server in %%dns_nameservers
%%name_server %slurp
%end for
%end if
#

génerera :

dns_nameserver toto titi
#
  • echo (à utiliser avec parcimonie)

une autre manière d'écrire ceci aurait consisté à appeler une méthode python directement à l'aide de l'instruction echo:


 %echo '-'.join(range(15)

cependant, il est fortement déconseillé d'insérer du code dans le template cible, étant donné que des instructions de traitement peuvent être effectuée à la validation des variables du dictionnaire créole.

Si vous voulez que le dernier caractère soit un ";" au lieu d'un "," voici une astuce pratique :

%for %%i in range(len(%%adresse_ip_dns)-1)
%%adresse_ip_dns[%%i], %slurp
%end for
%%adresse_ip_dns[len(%%adresse_ip_dns)-1] ;

ça va générer

 ip1, ip2, ip3, ip4;


Cas particuliers

  • On veut générer :
 \\ma_machine\partage

avec la variable %%machine qui vaut "ma_machine". \\%%machine\partage ne fonctionne pas car les antislashes annulent la variable.
Une des solutions possibles est la suivante :

  %echo "\\\\"
  %%{machine}\partage
  • On veut générer :
 %%NetUse%%

On ne peut pas l'écrire tel quel car Creole croira que "NetUse" est une variable Eole.
Une des solutions possibles est la suivante :

 %echo "%%NetUse%%\n"



Utilisation de fonctions prédéfinies dans les templates

Il est possible d'accéder à des fonctions prédéfinies, provenant du module : eosfunc.py.
Elles peuvent être utilisées dans un template de la manière suivante (exemple) :

   blabla %%fonction_predefinie(%%variable) blabla


Ajout de fonctions personnalisées

Il est possible d'ajouter des librairies de fonctions personnalisées dans :
/usr/share/creole/funcs

Les librairies doivent posséder l'extension .py et contenir des fonctions python, exemple :

  def to_iso(data):
       """ encode une chaine en iso"""
       try:
           return unicode(data, "UTF-8").encode("ISO-8859-1")
       except:
           return data

Remarque:

Si vous devez importez des librairies python dans un fichier de fonctions personnalisées, ne les importez pas en début de fichier Les import doivent être faits dans la fonction de calcul elle même. Par exemple:

def wpkg_user_pass (user):
    try:
        from creole import parsedico
        dico = parsedico.parse_dico()
    except:
        print "Erreur lors du chargement du dictionnaire"
        sys.exit()

    return user+dico['numero_etab']

utilitaires

utilitaire de conversion

pour ceux qui avaient déjà commencé leur activités de templating pour créole 2 (donc avec une autre notation), un utilitaire de conversion est mis à disposition. Il est dans la lib creole creole2cheetah.py

usage :

 cd creole
 [creole] ./creole2cheetah.py [nom du fichier source] > [nom du fichier destination]

pour plus de détails, consulter la documentation technique dans le répertoire doc du projet

utilitaire de test de template
 usage::
   creolecat.py -x <path>/eole.xml -i <path>/zephir.eol -o <path>/resultat.txt testtemplate.tmpl

testtemplate est le fichier à instancier

se référer à la doc technique pour plus de détails