Module:Yesno
Modèle:Shared Template Warning Ce module propose une fonction cohérente pour transformer des valeurs ou chaines en un booléen.
Utilisation
[modifier ech wikicode]Le wikicode ne permet pas de saisir directement des valeurs booléennes, seulement des chaines type « oui » ou « non ». Ce module les évalue et détermine une valeur booléenne true
ou false
que Lua pourra utiliser. Il retourne nil
en l’absence de paramètre, pour permettre la distinction entre nil
et false
. Lorsque ce paramètre a une valeur imprévue, le module retourne la valeur par défaut ou nil
.
Syntaxe
[modifier ech wikicode]yesno(valeur, défaut, défautVide)
valeur
– est la valeur à tester.défaut
– valeur par défaut pour les valeurs qui ne sont assimilées ni à des booléens ni ànil
.défautVide
– si ce paramètre n'est pasnil
ce sera la valeur par défaut pour les chaines vides ou uniquement composées d'espaces, sauts de ligne…
Exemples
[modifier ech wikicode]Il faut commencer par charger le module. Il ne peut être appelé que depuis un autre module Lua, il ne peut pas être appelé directement par un modèle.
local yesno = require('Module:Yesno')
Certaines valeurs retournent toujours true
, d'autres valeurs retournent toujours false
. La valeur nil
retourne toujours nil
.
-- Ces valeurs retournent toujours true :
yesno('oui')
yesno('yes')
yesno('y')
yesno('true')
yesno('on')
yesno('1')
yesno(1)
yesno(true)
-- Ces valeurs retournent toujours false :
yesno('non')
yesno('no')
yesno('n')
yesno('false')
yesno('off')
yesno('0')
yesno(0)
yesno(false)
-- Une valeur nil retourne nil :
yesno(nil)
Les chaines sont converties en minuscules avant d'être évaluées :
-- Ces valeurs retournent toujours true :
yesno('Oui')
yesno('OUI')
yesno('oUi')
yesno('tRuE')
-- Ces valeurs retournent toujours false :
yesno('Non')
yesno('NON')
yesno('nOn')
yesno('fALsE')
Une valeur par défaut peut être spécifiée pour les valeurs autres que celles listées ci-dessus. Si aucune valeur par défaut n'est fournie le module retourne nil
pour ces valeurs.
-- Ces valeurs retournent nil :
yesno('foo')
yesno({})
yesno(5)
yesno(function() return 'Ceci est une fonction.' end)
-- Ces valeurs retournent true :
yesno('foo', true)
yesno({}, true)
yesno(5, true)
yesno(function() return 'This is a function.' end, true)
-- Ces valeurs retournent "bar" :
yesno('foo', 'bar')
yesno({}, 'bar')
yesno(5, 'bar')
yesno(function() return 'This is a function.' end, 'bar')
Une chaine vide est évaluée à la valeur du troisième paramètre s'il est défini, sinon à la valeur par défaut.
yesno('') -- Retourne nil.
yesno('', true) -- Retourne true.
yesno('', true, nil) -- Retourne true.
yesno('', true, false) -- Retourne false.
yesno('', 'foo', 'bar') -- Retourne 'bar'.
Attention, cette dernière fonctionnalité est différente du module présent sur en: qui n'a qu'une valeur par défaut.
Piège récurrent
[modifier ech wikicode]Lire la section « Standard solution: and/or » sur la page lua-users.org/wiki/TernaryOperator : les pseudo-ternaries avec "and/or" en Lua ont une particularité de fonctionnement, qui est souvent très problématique quand on utilise ce module.
Code illustrant le piège :
-- Assume module is invoked with « |trucmuche = false » parameter
local arg = frame.args['trucmuche']
-- XXX: Although arg is false, this code unexpectedly gives true!!
local trucmucheEnabled = yesno(arg) or true
Voir aussi
[modifier ech wikicode]-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default, emptyDefault)
-- If your wiki uses non-ascii characters for any of "yes", "no", etc., you
-- should replace "val:lower()" with "mw.ustring.lower(val)" in the
-- following line.
if type(val) == 'string' then val = val:lower() end
if val == nil then
return nil
elseif val == true
or val == 'yes'
or val == 'y'
or val == 'oui'
or val == 'o'
or val == 'true'
or val == 'on'
or tonumber(val) == 1
then
return true
elseif val == false
or val == 'no'
or val == 'n'
or val == 'non'
or val == 'false'
or val == 'off'
or tonumber(val) == 0
then
return false
elseif emptyDefault ~= nil and type(val) == 'string' and val:match( '^%s*$' ) then
return emptyDefault
else
return default
end
end