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.

« Module:Monnaie » : différence entre les versions

De Nefald
Hiob (discussion | contributions)
Aucun résumé des modifications
Balise : Révoqué
Hiob (discussion | contributions)
m espace insécable
 
(7 versions intermédiaires par le même utilisateur non affichées)
Ligne 10 : Ligne 10 :
}
}


local ICON_SIZE = "24px"
-- ============================================================
-- Aliases acceptés pour chaque monnaie
-- ============================================================
local ALIASES = {
local ALIASES = {
     ecu  = { "écu", "ecu", "écus", "ecus", "e" },
     ecu  = { "écu", "ecu", "écus", "ecus", "e" },
Ligne 16 : Ligne 21 :
}
}


-- ============================================================
-- Construit le tooltip au survol
-- ============================================================
local function buildTooltip(ecus, oboles, sols, total)
local function buildTooltip(ecus, oboles, sols, total)
     local parts = {}
     local parts = {}
Ligne 25 : Ligne 33 :
end
end


local function buildIcon(amount, imageFile, altText, frame)
-- ============================================================
-- filepath retourne l'URL directe du fichier (pas la page)
-- Construit une icône + valeur via wikilink parsé
-- ce qui permet de construire un <img> HTML pur sans aucun pipe
-- ============================================================
    local url = frame:callParserFunction("filepath", imageFile)
local function buildIcon(amount, imageFile, altText)
     local img = tostring(
     local img = "[[Fichier:" .. imageFile .. "|24px|link=|alt=" .. altText .. "]]"
        mw.html.create("img")
     return '<span class="monnaie__groupe">'
            :attr("src", url)
        .. '<span class="monnaie__valeur">' .. amount .. '&#160;</span>'
            :attr("alt", altText)
        .. '<span class="monnaie__icone">'  .. img   .. '</span>'
            :attr("width", "24")
        .. '</span>'
            :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
end


-- ============================================================
-- Parse une chaîne mixte ex: "1écu, 2 oboles, 5sols"
-- Retourne le total en sols, ou nil si invalide
-- ============================================================
local function parseString(input)
local function parseString(input)
     local n = tonumber(input)
     local n = tonumber(input)
Ligne 82 : Ligne 77 :
end
end


-- ============================================================
-- Fonction principale
-- ============================================================
function p.afficher(frame)
function p.afficher(frame)
     local args = frame:getParent().args
     local args = frame:getParent().args
Ligne 87 : Ligne 85 :
     local total
     local total


    -- Mode 3 paramètres : au moins args[2] ou args[3] est déclaré
     if args[2] ~= nil or args[3] ~= nil then
     if args[2] ~= nil or args[3] ~= nil then
         local ecus  = tonumber(mw.text.trim(args[1] or "")) or 0
         local ecus  = tonumber(mw.text.trim(args[1] or "")) or 0
Ligne 93 : Ligne 92 :
         total = (ecus * ECU_VALUE) + (oboles * OBOLE_VALUE) + sols
         total = (ecus * ECU_VALUE) + (oboles * OBOLE_VALUE) + sols


    -- Mode 1 paramètre : nombre brut (sols) ou chaîne texte libre
     elseif args[1] ~= nil then
     elseif args[1] ~= nil then
         local arg1 = mw.text.trim(args[1])
         local arg1 = mw.text.trim(args[1])
Ligne 108 : Ligne 108 :
     end
     end


    -- Décomposition en écus / oboles / sols
     local ecus  = math.floor(total / ECU_VALUE)
     local ecus  = math.floor(total / ECU_VALUE)
     local reste  = total % ECU_VALUE
     local reste  = total % ECU_VALUE
Ligne 113 : Ligne 114 :
     local sols  = reste % OBOLE_VALUE
     local sols  = reste % OBOLE_VALUE


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


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


     local styles = frame:extensionTag("templatestyles", "", { src = "Modèle:Monnaie/styles.css" })
     local html = '<span class="monnaie" title="' .. tooltip .. '">'
        .. table.concat(parts)
        .. '</span>'


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


return p
return p

Dernière version du 1 mars 2026 à 14:10

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 ICON_SIZE = "24px"

-- ============================================================
-- Aliases acceptés pour chaque monnaie
-- ============================================================
local ALIASES = {
    ecu   = { "écu", "ecu", "écus", "ecus", "e" },
    obole = { "obole", "oboles", "o" },
    sol   = { "sol", "sols", "s" },
}

-- ============================================================
-- Construit le tooltip au survol
-- ============================================================
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

-- ============================================================
-- Construit une icône + valeur via wikilink parsé
-- ============================================================
local function buildIcon(amount, imageFile, altText)
    local img = "[[Fichier:" .. imageFile .. "|24px|link=|alt=" .. altText .. "]]"
    return '<span class="monnaie__groupe">'
        .. '<span class="monnaie__valeur">' .. amount .. '&#160;</span>'
        .. '<span class="monnaie__icone">'  .. img    .. '</span>'
        .. '</span>'
end

-- ============================================================
-- Parse une chaîne mixte ex: "1écu, 2 oboles, 5sols"
-- Retourne le total en sols, ou nil si invalide
-- ============================================================
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

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

    local total

    -- Mode 3 paramètres : au moins args[2] ou args[3] est déclaré
    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

    -- Mode 1 paramètre : nombre brut (sols) ou chaîne texte libre
    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

    -- Décomposition en écus / oboles / sols
    local ecus   = math.floor(total / ECU_VALUE)
    local reste  = total % ECU_VALUE
    local oboles = math.floor(reste / OBOLE_VALUE)
    local sols   = reste % OBOLE_VALUE

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

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

    local html = '<span class="monnaie" title="' .. tooltip .. '">'
        .. table.concat(parts)
        .. '</span>'

    return frame:preprocess(html)
end

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