Module:Outils
Révision datée du 25 octobre 2017 à 02:04 par Modèle>Od1n (micro optim : une seule exécution de Outils.trim pour le cas "string non vide" (assez fréquent), surcoût d'une assignation variable pour les autres cas, le tradeoff semble intéressant)
La documentation pour ce module peut être créée à Module:Outils/doc
local Outils = { }
--[[
trim nettoie un paramètre non nommé (supprime les espaces et retours ligne au début et à la fin)
retourne nil si le texte est vide ou n'est pas du texte. Les nombres ne sont PAS considérés
comme du texte.
]]
function Outils.trim( texte )
if type( texte ) == 'string' and texte~= '' then
texte = texte:gsub( '^%s*(%S?.-)%s*$', '%1' )
if texte ~= '' then
return texte
end
end
return nil
end
-- erreur génère un message d'erreur
function Outils.erreur( texte )
local message = Outils.trim( texte ) or "''erreur : raison non précisée''"
return '<span class="error">' .. message .. "</span>"
end
--[[
validTextArg renvoit le premier paramètre chaine non vide
Paramètre :
1 - tableau contenant tous paramètres
2, ... - les noms des paramètres qui doivent êtres testés.
]]
function Outils.validTextArg( args, name, ... )
local texte = Outils.trim( args[name] )
if texte then
return texte
end
if select( '#', ... ) > 0 then
return Outils.validTextArg( args, ... )
end
return nil
end
--[[
notEmpty renvoie le premier paramètre non vide ou nul.
Paramètre :
1, ... - les variables qui doivent êtres testés.
]]
function Outils.notEmpty( var, ... )
local string = Outils.trim( var )
if string then
return string
end
local tvar = type( var )
if tvar == 'table' then
local nextFunc = pairs( var ) -- n'utilise pas next car non défini par mw.loadData
if nextFunc( var ) ~= nil then
return var
end
elseif var == true or ( tvar == 'number' and var ~= 0 ) or tvar == 'function' then
return var
end
if select( '#', ... ) > 0 then
return Outils.notEmpty( ... )
end
end
--[[
extractArgs permet de récupérer les arguements du modèle,
ou la table transmise à la fonction par une autre fonction d'un module
Paramètres :
1 - un objet frame ou une table contenant les paramètre
2, ... - une liste de nom de paramètre pour déterminé si les paramètres sont transmis
par #invoke. Le premier paramètre de frame sera systématiquement testé.
]]
function Outils.extractArgs ( frame, ... )
if type( frame ) == 'table' then
if type( frame.getParent ) == 'function' then
if Outils.notEmpty( frame.args.invokeArgsOnly ) then
return frame.args
else
local args = frame:getParent().args;
for k,v in pairs( frame.args ) do
args[k] = v;
end
return args
end
else
return frame
end
else
return { frame, ... }
end
end
--[[
abr génère une abréviation (discrète par défaut)
paramètres :
1 = abréviation,
2 = texte,
3 = langue,
nbsp = '-' pour une espace insécable avant l'abréviation, '+' pour l'avoir après.
visible = true pour une abréviation non discrète
]]
function Outils.abr( frame, ... )
local args = Outils.extractArgs( frame, ... )
if args[2] == nil then
return args[1] or ''
-- retoune l'abréviation ou au minimum une chaine vide s'il n'y a pas de texte
end
local wikiText = { '<abbr' }
if not args.visible then
table.insert( wikiText, ' class="abbr"' )
end
table.insert( wikiText, ' title="' .. args[2] .. '"' )
if args[3] then
table.insert( wikiText, ' lang="' .. args[3] .. '"' )
end
table.insert( wikiText, '>' .. args[1] .. '</abbr>' )
if args.nbsp == '-' then
table.insert( wikiText, 1, ' ' )
elseif args.nbsp == '+' then
table.insert( wikiText, ' ' )
end
return table.concat( wikiText )
end
return Outils