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
