Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.
Version datée du 12 septembre 2013 à 21:39 par Modèle>Zebulon84 (extractArgs : correction bug)

La documentation pour ce module peut être créée à Module:Outils/doc

local mw = mw or require 'mw'  -- pour debugage sous ecllipse

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
        return mw.text.trim( texte )
    end
end

-- erreur génère une erreur
function Outils.erreur( texte )
    return '<span class="error">' .. (texte or "''aucune erreur indiquée''") .. "</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
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 tvar = type( var )
    
    if tvar == 'string' and var ~= '' then
        return mw.text.trim( var )
    elseif 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 sera systématiquement testé.
function Outils.extractArgs ( frame, ... )
    if type( frame ) == 'table' then
        if type( frame.getParent ) == 'function' then
            if Outils.validTextArg( frame.args, 1, ...) 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="' )
    table.insert( wikiText, args[2] )
    if args[3] then 
        table.insert( wikiText, '" lang="' )
        table.insert( wikiText, args[3] )
    end
    table.insert( wikiText, '">' )
    table.insert( wikiText, args[1] )
    table.insert( wikiText, '</abbr>' )
    if args.nbsp == '-' then
       table.insert( wikiText, 1, '&nbsp;' )
    elseif args.nbsp == '+' then
       table.insert( wikiText, '&nbsp;' )
    end

    return table.concat( wikiText )
end

-- ordinal renvoie une chaine correspondant à l'abréviation de l'adjectif ordinal du nombre.
-- Paramètres :
--        1 = nombre (string ou number) 
--        2 = true pour avoir première au lieu de premier su nombre = 1
function Outils.ordinal( nombre, feminin )
    local num = tonumber( nombre )
    if num == nil then
        return Outils.trim( tostring( nombre ) ) or ''
    elseif num == 1 then
        if feminin then
            return Outils.abr{ '1<sup>re</sup>', 'première' }
        else
            return Outils.abr{ '1<sup>er</sup>', 'premier' }
        end
    else
        local nom = mw.loadData( 'Module:Outil/Data' ).ordinal
        if nom[num] then
            return Outils.abr{ num .. '<sup>e</sup>', nom[num] }
        else
            return num .. '<sup>e</sup>'
        end
    end
end

return Outils