Module:Utile

Un livre de Wikilivres.

Ce module fournit la fonction suivante :

{{#invoke:Utile|afficheSiExiste|page| ... |texte alternatif}}
  • Cette fonction transclut la page donnée si elle existe, en lui transmettant les autres paramètres éventuels (nommés et non nommés) sauf le dernier ; si elle n’existe pas, le texte alternatif (dernier paramètre non nommé) sera renvoyé.
    La séquence spéciale {{_}} sera remplacée dans le texte alternatif par page, et {{_|parser function|paramètre}} sera remplacée par l’appel à la parser function correspondante avec comme paramètres page et le paramètre éventuel ; par exemple, si page est Abcd, {{_|urlencode|WIKI}} donnera le même résultat que {{urlencode:Abcd|WIKI}}.
  • Alias : showIfExist.
local M = {}

function M.showIfExist(frame)
    local page = mw.text.trim(frame.args[1] or "")
 
    -- Crée un objet title pour la page demandée, ou un faux si le titre n'est pas valide.
    local t = mw.title.new(page) or {id = 0}
 
    -- Crée une copie des paramètres pour le modèle.
    local templateArgs = {}
    local l = 1
    for k, v in pairs(frame.args) do
        if type(k) == "number" then
            if k > l then
                l = k - 1
                templateArgs[l] = v
            end
        else templateArgs[k] = v end
    end
    local alternative = mw.text.trim(templateArgs[l] or "")
    templateArgs[l] = nil
 
    local remplacement = function(capture)
        if capture == "" then return page end
        local parserFunctions = {
            ["localurl"] = true, ["fullurl"] = true,
            ["canonicalurl"] = true, ["filepath"] = true,
            ["urlencode"] = true
            }
        local arg
        local avecArg = string.find(capture, "|", 1, true)
        if avecArg then
            arg = string.sub(capture, avecArg + 1)
            capture = string.sub(capture, 1, avecArg - 1)
        end
        if parserFunctions[capture] then
            return frame:callParserFunction(capture, page, arg)
        end
    end
 
    -- Renvoie le texte alternatif si la page n'existe pas.
    if t.id == 0 then
        return tostring(string.gsub(alternative,"{{_|?([^}]*)}}", remplacement))
          -- Note: tostring car gsub renvoie 2 valeurs
    end
 
    -- Renvoie l'inclusion de la page sinon.
    if t.namespace == 0 then page = ":" .. page end
    return tostring(string.gsub(frame:expandTemplate{title = page, args = templateArgs}, "\n$", ""))
      -- Note: tostring car gsub renvoie 2 valeurs
end
 
M.afficheSiExiste = M.showIfExist -- alias
 
return M