Módulo:Info
Ir para navegação
Ir para pesquisar
A documentação para este módulo pode ser criada em Módulo:Info/doc
-- Módulo:Info — resolve metadados e skills (robusto/corrigido + gambiarra expandTier/expandTags)
local p = {}
-- ===== util =====
local function trim(s) return (tostring(s or ""):gsub("^%s+",""):gsub("%s+$","")) end
local function safeArgs(node) return (node and node.args) or {} end
-- tenta require nos 3 namespaces: "Módulo:", "Modulo:", "Module:"
local function requireCharacterModule(charName)
charName = trim(charName)
if charName == "" then return nil end
local ok, data
ok, data = pcall(function() return require("Módulo:" .. charName) end)
if ok and type(data) == "table" then return data end
ok, data = pcall(function() return require("Modulo:" .. charName) end)
if ok and type(data) == "table" then return data end
ok, data = pcall(function() return require("Module:" .. charName) end)
if ok and type(data) == "table" then return data end
return nil
end
-- sobe na árvore de frames e tenta achar |nome=; cai no título da página se precisar
local function resolveCharFromFrames(frame, a)
if a.char and trim(a.char) ~= "" then return trim(a.char) end
if a.nome and trim(a.nome) ~= "" then return trim(a.nome) end
local p1 = frame:getParent()
if p1 then
local ap1 = safeArgs(p1)
if ap1.char and trim(ap1.char) ~= "" then return trim(ap1.char) end
if ap1.nome and trim(ap1.nome) ~= "" then return trim(ap1.nome) end
local p2 = p1.getParent and p1:getParent()
if p2 then
local ap2 = safeArgs(p2)
if ap2.char and trim(ap2.char) ~= "" then return trim(ap2.char) end
if ap2.nome and trim(ap2.nome) ~= "" then return trim(ap2.nome) end
end
end
local title = mw.title.getCurrentTitle()
return title and trim(title.text) or ""
end
-- paleta dos marcadores (para textos das skills)
local COLOR = {
debuff = "#ff5252",
atk = "#ffcc00",
def = "#64b5f6",
ms = "#43a047",
hp = "#42a5f5",
sec = "#ffcc00",
}
local function colorize(txt)
if not txt or txt == "" then return "" end
return (txt:gsub("{{(%a+):([^}]+)}}", function(tag, inner)
local hex = COLOR[tag]
if not hex then return "{{" .. tag .. ":" .. inner .. "}}" end
return string.format('<span style="color:%s;">%s</span>', hex, inner)
end))
end
-- ===== API principal =====
-- aceita {{#invoke:Info|getTier|Kalifa}} ou resolve pelo frame
function p.getTier(frame)
local a = safeArgs(frame)
local char = trim(frame.args[1] or a.nome)
if char == "" then char = resolveCharFromFrames(frame, a) end
local data = requireCharacterModule(char) or {}
return trim(data.tier or "")
end
function p.getTags(frame)
local a = safeArgs(frame)
local char = trim(frame.args[1] or a.nome)
if char == "" then char = resolveCharFromFrames(frame, a) end
local data = requireCharacterModule(char) or {}
local tags = data.tags or {}
if type(tags) ~= "table" then return "" end
return trim(table.concat(tags, " / "))
end
-- Gera o JSON de UMA skill (usado por Predefinição:Skill)
function p.skill(frame)
local a = safeArgs(frame)
local m = tonumber(a.M) or 0
local lang = trim((a.lang or (frame:getParent() and frame:getParent().args.lang) or "pt"):lower())
-- resolve char (parent |nome= ou fallback)
local char = trim(a.char or (frame:getParent() and frame:getParent().args.nome) or "")
if char == "" then char = resolveCharFromFrames(frame, a) end
local data = requireCharacterModule(char) or {}
local order = data.order or {}
local key = order[m] or "" -- ex.: "Kick"
local sk = (data.skills or {})[key] or {}
-- name/desc multilíngue
local name = trim(sk.name or key or "")
local desc = ""
if type(sk.desc) == "table" then
desc = sk.desc[lang] or sk.desc["pt"] or ""
else
desc = sk.desc or ""
end
desc = colorize(desc)
local function nz(v) v = v or "" return (trim(v) ~= "" and v or nil) end
local obj = {
name = name,
icon = (trim(a.icon or "") ~= "" and a.icon or "Nada.png"),
level = (trim(a.level or "") ~= "" and a.level or "NIVEL"),
desc = desc,
energy = nz(a.energy),
powerpve = nz(a.powerpve),
powerpvp = nz(a.powerpvp),
cooldown = nz(a.cooldown),
video = a.video or "",
}
return mw.text.jsonEncode(obj)
end
-- ===== “gambiarra” para tier/tags vindos como tokens =====
-- uso na Predefinição:Character:
-- |tier = {{#invoke:Info|expandTier|{{{tier|}}}|{{{nome|}}}}}
-- |classe = {{#invoke:Info|expandTags|{{{classe|}}}|{{{nome|}}}}}
-- {{#invoke:Info|expandTier|tierKalifa|Kalifa}}
function p.expandTier(frame)
local token = trim(frame.args[1] or "")
local nome = trim(frame.args[2] or (frame:getParent() and frame:getParent().args.nome) or "")
if token == "" then return "" end
-- aceita "tierKalifa", "tierAuto", "tier<Nome>", ou texto livre
if token:lower():sub(1,4) ~= "tier" then
return token -- não é token? devolve como veio
end
local char = nome ~= "" and nome or token:match("^tier(.+)$") or ""
if char == "" then
local title = mw.title.getCurrentTitle()
char = title and trim(title.text) or ""
end
local data = requireCharacterModule(char) or {}
-- i18n preferido (PT por enquanto); fallback para data.tier
local i18n = (data.tier_i18n and data.tier_i18n.pt) or data.tier
return trim(i18n or "")
end
-- {{#invoke:Info|expandTags|classKalifa|Kalifa}}
function p.expandTags(frame)
local token = trim(frame.args[1] or "")
local nome = trim(frame.args[2] or (frame:getParent() and frame:getParent().args.nome) or "")
if token == "" then return "" end
-- aceita "classKalifa", "classAuto", "class<Nome>", ou texto livre
if token:lower():sub(1,5) ~= "class" then
return token -- não é token? devolve como veio
end
local char = nome ~= "" and nome or token:match("^class(.+)$") or ""
if char == "" then
local title = mw.title.getCurrentTitle()
char = title and trim(title.text) or ""
end
local data = requireCharacterModule(char) or {}
local arr = (data.tags_i18n and data.tags_i18n.pt) or data.tags
if type(arr) == "table" then
return table.concat(arr, " / ")
end
return trim(arr or "")
end
return p