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.

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

local p = {}

local ECU_VALUE   = 4096
local OBOLE_VALUE = 64

local IMAGES = {
    ecu   = "Écu_pièce_or.png",
    obole = "Obole_pièce_argent.png",
    sol   = "Sol_pièce_cuivre.png",
}

local ALIASES = {
    ecu   = { "écu", "ecu", "écus", "ecus", "e" },
    obole = { "obole", "oboles", "o" },
    sol   = { "sol", "sols", "s" },
}

local function buildTooltip(ecus, oboles, sols, total)
    local parts = {}
    if ecus   > 0 then parts[#parts+1] = ecus   .. " écu"   .. (ecus   > 1 and "s" or "") end
    if oboles > 0 then parts[#parts+1] = oboles .. " obole" .. (oboles > 1 and "s" or "") end
    if sols   > 0 then parts[#parts+1] = sols   .. " sol"   .. (sols   > 1 and "s" or "") end
    if #parts == 0 then parts[#parts+1] = "0 sol" end
    return table.concat(parts, ", ") .. " (" .. total .. " sols)"
end

local function buildIcon(amount, imageFile, altText, frame)
-- filepath retourne l'URL directe du fichier (pas la page)
-- ce qui permet de construire un <img> HTML pur sans aucun pipe
    local url = frame:callParserFunction("filepath", imageFile)
    local img = tostring(
        mw.html.create("img")
            :attr("src", url)
            :attr("alt", altText)
            :attr("width", "24")
            :attr("height", "24")
            :addClass("monnaie__img")
    )
    return tostring(
        mw.html.create("span")
            :addClass("monnaie__groupe")
            :node(
                mw.html.create("span")
                    :addClass("monnaie__valeur")
                    :wikitext(amount)
            )
            :node(
                mw.html.create("span")
                    :addClass("monnaie__icone")
                    :wikitext(img)
            )
    )
end

local function parseString(input)
    local n = tonumber(input)
    if n then return math.floor(n) end

    local total = 0
    local found = false
    local s = mw.ustring.lower(input)

    for amount_str, unit in mw.ustring.gmatch(s, "(%d+)%s*([%a]+)") do
        local amount = tonumber(amount_str) or 0
        unit = mw.text.trim(unit)

        for monnaie, aliases in pairs(ALIASES) do
            for _, alias in ipairs(aliases) do
                if unit == alias then
                    if monnaie == "ecu"   then total = total + amount * ECU_VALUE   end
                    if monnaie == "obole" then total = total + amount * OBOLE_VALUE end
                    if monnaie == "sol"   then total = total + amount               end
                    found = true
                    break
                end
            end
        end
    end

    if not found then return nil end
    return total
end

function p.afficher(frame)
    local args = frame:getParent().args

    local total

    if args[2] ~= nil or args[3] ~= nil then
        local ecus   = tonumber(mw.text.trim(args[1] or "")) or 0
        local oboles = tonumber(mw.text.trim(args[2] or "")) or 0
        local sols   = tonumber(mw.text.trim(args[3] or "")) or 0
        total = (ecus * ECU_VALUE) + (oboles * OBOLE_VALUE) + sols

    elseif args[1] ~= nil then
        local arg1 = mw.text.trim(args[1])
        if arg1 == "" then
            return '<span class="error">Paramètre manquant</span>'
        end
        total = parseString(arg1)

    else
        return '<span class="error">Paramètre manquant</span>'
    end

    if not total or total < 0 then
        return '<span class="error">Montant invalide</span>'
    end

    local ecus   = math.floor(total / ECU_VALUE)
    local reste  = total % ECU_VALUE
    local oboles = math.floor(reste / OBOLE_VALUE)
    local sols   = reste % OBOLE_VALUE

    local tooltip = buildTooltip(ecus, oboles, sols, total)

    local parts = {}
    if ecus   > 0 then parts[#parts+1] = buildIcon(ecus,   IMAGES.ecu,   "écu",   frame) end
    if oboles > 0 then parts[#parts+1] = buildIcon(oboles, IMAGES.obole, "obole", frame) end
    if sols   > 0 then parts[#parts+1] = buildIcon(sols,   IMAGES.sol,   "sol",   frame) end
    if #parts == 0 then
        parts[#parts+1] = buildIcon(0, IMAGES.sol, "sol", frame)
    end

    local styles = frame:extensionTag("templatestyles", "", { src = "Modèle:Monnaie/styles.css" })

    return styles
        .. tostring(
            mw.html.create("span")
                :addClass("monnaie")
                :attr("title", tooltip)
                :wikitext(table.concat(parts))
        )
end

return p
Les témoins (''cookies'') nous aident à fournir nos services. En utilisant nos services, vous acceptez notre utilisation de témoins.