« Initiation au Lua avec Scribunto/Gestion de l'environnement » : différence entre les versions

Contenu supprimé Contenu ajouté
rédaction
Ligne 310 :
== Priorité de l'interpréteur ==
 
En général, l'endroit le plus adéquat d'pour appeler un module est de la faire à partie d'un modèle. Ceci est fortement conseillé pour éviter de surcharger l'espace principal avec la commande '''#invoke'''. Par conséquent, le plus souvent, les modèles appelleront les modules. Quelquefois, on risque de devoir faire le contraire. C'est à dire d'appeler un modèle dans un module. Que ce passe t'il alors.? Nous allons tester cette opération en prenant un exemple. Essayons d'écrire un module qui aurait pour fonction d'encadrer un texte en faisant appel au [[modèle:Encadre]]. Dans un [[module:Cadre]], nous serions tenté d'écrire une fonction '''p.cadre1''' ainsi :
 
<syntaxhighlight lang="lua">
 
local p = {}
'''<nowiki>{{#invoke:Cadre|cadre1|Coucou! je suis dans un cadre}}</nowiki>''' nous donne : {{#invoke:Cadre|cadre1|Coucou! je suis dans un cadre}}
 
function p.cadre1(frame)
Et là, avec un grand désarroi, nous constatons que cela ne marche pas. Que c'est-il passé? En fait l'interpréteur de mediawiki évalue les modèles avant d'avoir les retours des modules. Et, par conséquent, quand le module Cadre nous ramène <nowiki>{{Encadre|contenu=Coucou! je suis dans un cadre}}</nowiki>, il est déjà trop tard!
return "{{Encadre|contenu="..frame.args[1].."}}"
end
 
return p
Heureusement, la situation n'est pas désespéré car nous disposons, dans notre lua avec scribunto, d'une fonction préprogrammée '''frame:preprocess''' qui va évaluer les modèles avant que ceci ne soit retourné. Pour expérimenter cela, nous allons donc écrire, dans le [[module:Cadre]], une nouvelle fonction '''p.cadre2''', ainsi :
 
</syntaxhighlight>
 
 
'''<nowiki>{{#invoke:Cadre|cadre2|Coucou! je suis dans un cadre}}</nowiki>''' nous donne : {{#invoke:Cadre|cadre2|Coucou! je suis dans un cadre}}
'''<nowiki>{{#invoke:Cadre|cadre1|Coucou!, je suis dans un cadre!}}</nowiki>''' nous donne alors : {{#invoke:Cadre|cadre1|Coucou!, je suis dans un cadre!}}
 
 
Et là, avec un grand désarroi, nous constatons que cela ne marche pas. Que c'est-il passé? En fait l'interpréteur de mediawiki évalue les modèles avant d'avoir les retours des modules. Et, par conséquent, quand le module Cadre nous ramène <nowiki>{{Encadre|contenu=Coucou!, je suis dans un cadre!}}</nowiki>, il est déjà trop tard!
 
Heureusement, la situation n'est pas désespéré car nous disposons, dans notre lua avec scribunto, d'une fonction préprogrammée '''frame:preprocess''' qui va évaluer les modèles avant que ceci ne soit retournéretournés. Pour expérimenter cela, nous allons donc écrire, dans le [[module:Cadre]], une nouvelle fonction '''p.cadre2''', ainsi :
 
<syntaxhighlight lang="lua">
 
local p = {}
 
function p.cadre2(frame)
return frame:preprocess("{{Encadre|contenu="..frame.args[1].."}}")
end
 
return p
 
</syntaxhighlight>
 
 
'''<nowiki>{{#invoke:Cadre|cadre2|Coucou!, je suis dans un cadre!}}</nowiki>''' nous donne enfin : {{#invoke:Cadre|cadre2|Coucou!, je suis dans un cadre!}}
 
Et là, ça marche, youpi !