Mudanças entre as edições de "Módulo:Info"
Ir para navegação
Ir para pesquisar
m (fix colorize (subskills)) |
m Etiqueta: Revertido |
||
| Linha 45: | Linha 45: | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
local I18N = { | local I18N = { | ||
pt = { level = "Nível", power = "Poder", power_pvp = "Poder PvP", energy = "Energia", energy_cost = "Energia", energy_gain = "Energia", cooldown = "Recarga" }, | pt = { | ||
en = { level = "Level", power = "Power", power_pvp = "Power PvP", energy = "Energy", energy_cost = "Energy", energy_gain = "Energy", cooldown = "Cooldown" }, | level = "Nível", | ||
es = { level = "Nivel", power = "Poder", power_pvp = "Poder PvP", energy = "Energía", energy_cost = "Energía", energy_gain = "Energía", cooldown = "Enfriamiento" }, | power = "Poder", | ||
pl = { level = "Poziom", power = "Moc", power_pvp = "Moc PvP", energy = "Energia", energy_cost = "Energia", energy_gain = "Energia", cooldown = "Odnawianie" } | power_pvp = "Poder PvP", | ||
energy = "Energia", | |||
energy_cost = "Energia", | |||
energy_gain = "Energia", | |||
cooldown = "Recarga" | |||
}, | |||
en = { | |||
level = "Level", | |||
power = "Power", | |||
power_pvp = "Power PvP", | |||
energy = "Energy", | |||
energy_cost = "Energy", | |||
energy_gain = "Energy", | |||
cooldown = "Cooldown" | |||
}, | |||
es = { | |||
level = "Nivel", | |||
power = "Poder", | |||
power_pvp = "Poder PvP", | |||
energy = "Energía", | |||
energy_cost = "Energía", | |||
energy_gain = "Energía", | |||
cooldown = "Enfriamiento" | |||
}, | |||
pl = { | |||
level = "Poziom", | |||
power = "Moc", | |||
power_pvp = "Moc PvP", | |||
energy = "Energia", | |||
energy_cost = "Energia", | |||
energy_gain = "Energia", | |||
cooldown = "Odnawianie" | |||
} | |||
} | } | ||
| Linha 79: | Linha 111: | ||
local COLOR = { | local COLOR = { | ||
debuff = "#ff5252", | debuff = "#ff5252", | ||
ms | ms = "#5bc0de", | ||
hp | hp = "#70d86b", | ||
atk | atk = "#ffd166", | ||
def | def = "#c0a9ff", | ||
sec | sec = "#ffcc00" | ||
} | } | ||
| Linha 135: | Linha 167: | ||
-- Skill (com M) | -- Skill (com M) | ||
function p. | function p.skin(frame) | ||
local a = safeArgs(frame) | local a = safeArgs(frame) | ||
local | |||
local function nz(s) | |||
s = trim(s or ""); | |||
return (s ~= "" and s or nil) | |||
end | end | ||
-- BG padrão se não vier nada | |||
local bg = trim(a.background or "") | |||
if bg == "" then | |||
bg = "Backgroundteste.png" | |||
end | end | ||
local | -- width/height em % (numeral); default 100 | ||
local w = tonumber(a.w) or 100 | |||
local h = tonumber(a.h) or 100 | |||
if w < 1 then | |||
w = 100 | |||
end | |||
if h < 1 then | |||
h = 100 | |||
end | end | ||
local | -- tooltips: ficam na predefinição, mas a gente empacota todas as línguas | ||
local tip_pt = a["tooltip-pt"] or a.tooltip or "" | |||
local tip_en = a["tooltip-en"] or "" | |||
local tip_es = a["tooltip-es"] or "" | |||
local tip_pl = a["tooltip-pl"] or "" | |||
local obj = { | local obj = { | ||
sprite = nz(a.sprite) or "Nada.png", | |||
background = bg, | |||
w = w, -- percent | |||
h = h, -- percent | |||
-- pacote i18n (o widget escolhe em runtime conforme lang) | |||
tooltip_i18n = { | |||
pt = tip_pt, | |||
en = tip_en, | |||
es = tip_es, | |||
pl = tip_pl | |||
}, | |||
-- também expõe campos "achatados" p/ data-attrs | |||
tooltipPt = tip_pt, | |||
tooltipEn = tip_en, | |||
tooltipEs = tip_es, | |||
tooltipPl = tip_pl | |||
} | } | ||
return mw.text.jsonEncode(obj) | return mw.text.jsonEncode(obj) | ||
| Linha 228: | Linha 227: | ||
icon = (trim(a.icon or "") ~= "" and a.icon or "Nada.png"), | icon = (trim(a.icon or "") ~= "" and a.icon or "Nada.png"), | ||
level = (trim(a.level or "") ~= "" and a.level or "NIVEL"), | level = (trim(a.level or "") ~= "" and a.level or "NIVEL"), | ||
video = a.video or "" | video = a.video or "" | ||
} | } | ||
return mw.text.jsonEncode(obj) | return mw.text.jsonEncode(obj) | ||
| Linha 254: | Linha 253: | ||
local sub = sk.subskills[n] | local sub = sk.subskills[n] | ||
if sub then | if sub then | ||
local langs = {"pt","en","es","pl"} | local langs = {"pt", "en", "es", "pl"} | ||
for _, code in ipairs(langs) do | for _, code in ipairs(langs) do | ||
local d = sub.desc and sub.desc[code] | local d = sub.desc and sub.desc[code] | ||
| Linha 266: | Linha 265: | ||
end | end | ||
local function nz(v) v = v or ""; return (trim(v) ~= "" and v or nil) end | local function nz(v) | ||
v = v or ""; | |||
return (trim(v) ~= "" and v or nil) | |||
end | |||
local obj = { | local obj = { | ||
name | name = n, | ||
icon | icon = (trim(a.icon or "") ~= "" and a.icon or "Nada.png"), | ||
level = (trim(a.level or "") ~= "" and a.level or "NIVEL"), | level = (trim(a.level or "") ~= "" and a.level or "NIVEL"), | ||
video = a.video or "", | video = a.video or "", | ||
energy | energy = nz(a.energy), | ||
powerpve = nz(a.powerpve), | powerpve = nz(a.powerpve), | ||
powerpvp = nz(a.powerpvp), | powerpvp = nz(a.powerpvp), | ||
cooldown = nz(a.cooldown) | cooldown = nz(a.cooldown) | ||
} | } | ||
| Linha 293: | Linha 295: | ||
local token = trim(frame.args[1] or "") | local token = trim(frame.args[1] or "") | ||
local nome = trim(frame.args[2] or (frame:getParent() and frame:getParent().args.nome) or "") | local nome = trim(frame.args[2] or (frame:getParent() and frame:getParent().args.nome) or "") | ||
if token == "" then return "" end | if token == "" then | ||
if token:lower():sub(1,4) ~= "tier" then return token end | return "" | ||
end | |||
if token:lower():sub(1, 4) ~= "tier" then | |||
return token | |||
end | |||
local char = nome ~= "" and nome or token:match("^tier(.+)$") or "" | local char = nome ~= "" and nome or token:match("^tier(.+)$") or "" | ||
if char == "" then | if char == "" then | ||
| Linha 302: | Linha 308: | ||
local data = requireCharacterModule(char) or {} | local data = requireCharacterModule(char) or {} | ||
local lang = trim((frame.args.lang or "pt"):lower()) | local lang = trim((frame.args.lang or "pt"):lower()) | ||
if data.tier_i18n and data.tier_i18n[lang] then return data.tier_i18n[lang] end | if data.tier_i18n and data.tier_i18n[lang] then | ||
return data.tier_i18n[lang] | |||
end | |||
return trim(data.tier or "") | return trim(data.tier or "") | ||
end | end | ||
| Linha 309: | Linha 317: | ||
local token = trim(frame.args[1] or "") | local token = trim(frame.args[1] or "") | ||
local nome = trim(frame.args[2] or (frame:getParent() and frame:getParent().args.nome) or "") | local nome = trim(frame.args[2] or (frame:getParent() and frame:getParent().args.nome) or "") | ||
if token == "" then return "" end | if token == "" then | ||
if token:lower():sub(1,4) ~= "tags" then return token end | return "" | ||
end | |||
if token:lower():sub(1, 4) ~= "tags" then | |||
return token | |||
end | |||
local char = nome ~= "" and nome or token:match("^tags(.+)$") or "" | local char = nome ~= "" and nome or token:match("^tags(.+)$") or "" | ||
if char == "" then | if char == "" then | ||
Edição das 20h10min de 14 de setembro de 2025
A documentação para este módulo pode ser criada em Módulo:Info/doc
-- Módulo:Info — resolve metadados e skills (com Subskill e cores inline)
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
local function requireCharacterModule(charName)
charName = trim(charName)
if charName == "" then
return nil
end
local ok, data = pcall(function()
return require("Módulo:" .. charName)
end)
if ok and type(data) == "table" then
return data
end
charName = charName:gsub(" ", "_")
ok, data = pcall(function()
return require("Módulo:" .. charName)
end)
if ok and type(data) == "table" then
return data
end
return nil
end
-- Separa uma sequência de {} (JSONs colados) em uma tabela de chunks
local function collectJsonObjects(s)
s = tostring(s or "")
local out = {}
for chunk in s:gmatch("%b{}") do
table.insert(out, chunk)
end
return out
end
--------------------------------------------------------------------------------
-- I18N: rótulos de atributos + "Nível"
--------------------------------------------------------------------------------
local I18N = {
pt = {
level = "Nível",
power = "Poder",
power_pvp = "Poder PvP",
energy = "Energia",
energy_cost = "Energia",
energy_gain = "Energia",
cooldown = "Recarga"
},
en = {
level = "Level",
power = "Power",
power_pvp = "Power PvP",
energy = "Energy",
energy_cost = "Energy",
energy_gain = "Energy",
cooldown = "Cooldown"
},
es = {
level = "Nivel",
power = "Poder",
power_pvp = "Poder PvP",
energy = "Energía",
energy_cost = "Energía",
energy_gain = "Energía",
cooldown = "Enfriamiento"
},
pl = {
level = "Poziom",
power = "Moc",
power_pvp = "Moc PvP",
energy = "Energia",
energy_cost = "Energia",
energy_gain = "Energia",
cooldown = "Odnawianie"
}
}
local function resolveCharFromFrames(frame, a)
a = a or {}
if frame and frame.getParent then
local parent = frame:getParent()
if parent and parent.args then
if parent.args.nome and trim(parent.args.nome) ~= "" then
return trim(parent.args.nome)
end
for k, v in pairs(parent.args) do
if type(k) == "string" and k:match("^class") and trim(v) ~= "" then
return trim(v)
end
end
end
end
if a.nome and trim(a.nome) ~= "" then
return trim(a.nome)
end
if a.char and trim(a.char) ~= "" then
return trim(a.char)
end
local title = mw.title.getCurrentTitle()
return title and trim(title.text) or ""
end
-- mapa de cores (inline!)
local COLOR = {
debuff = "#ff5252",
ms = "#5bc0de",
hp = "#70d86b",
atk = "#ffd166",
def = "#c0a9ff",
sec = "#ffcc00"
}
-- substitui {{atk:}}, {{def:}}, {{ms:}}, {{hp:}}, {{sec:}}, {{debuff:}} por <span style="color:#hex">…</span>
local function colorize(txt)
if not txt or txt == "" then
return ""
end
return (tostring(txt):gsub("{{%s*(%a+)%s*:%s*([^}]+)%s*}}", function(tag, inner)
tag = tag:lower()
local hex = COLOR[tag]
if not hex then
return "{{" .. tag .. ":" .. inner .. "}}"
end
return string.format('<span style="color:%s;">%s</span>', hex, trim(inner))
end))
end
-- ===== API =====
-- Tier textual (i18n)
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 {}
local lang = trim((a.lang or (frame:getParent() and frame:getParent().args.lang) or "pt"):lower())
if data.tier_i18n and data.tier_i18n[lang] then
return data.tier_i18n[lang]
end
return trim(data.tier or "")
end
-- Tags textuais (i18n)
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 lang = trim((a.lang or (frame:getParent() and frame:getParent().args.lang) or "pt"):lower())
local tags = (data.tags_i18n and data.tags_i18n[lang]) or data.tags or {}
if type(tags) ~= "table" then
return trim(tags or "")
end
return trim(table.concat(tags, " / "))
end
-- Skill (com M)
function p.skin(frame)
local a = safeArgs(frame)
local function nz(s)
s = trim(s or "");
return (s ~= "" and s or nil)
end
-- BG padrão se não vier nada
local bg = trim(a.background or "")
if bg == "" then
bg = "Backgroundteste.png"
end
-- width/height em % (numeral); default 100
local w = tonumber(a.w) or 100
local h = tonumber(a.h) or 100
if w < 1 then
w = 100
end
if h < 1 then
h = 100
end
-- tooltips: ficam na predefinição, mas a gente empacota todas as línguas
local tip_pt = a["tooltip-pt"] or a.tooltip or ""
local tip_en = a["tooltip-en"] or ""
local tip_es = a["tooltip-es"] or ""
local tip_pl = a["tooltip-pl"] or ""
local obj = {
sprite = nz(a.sprite) or "Nada.png",
background = bg,
w = w, -- percent
h = h, -- percent
-- pacote i18n (o widget escolhe em runtime conforme lang)
tooltip_i18n = {
pt = tip_pt,
en = tip_en,
es = tip_es,
pl = tip_pl
},
-- também expõe campos "achatados" p/ data-attrs
tooltipPt = tip_pt,
tooltipEn = tip_en,
tooltipEs = tip_es,
tooltipPl = tip_pl
}
return mw.text.jsonEncode(obj)
end
-- Emote (sem M)
function p.emote(frame)
local a = safeArgs(frame)
local obj = {
name = "Emote",
desc = "",
icon = (trim(a.icon or "") ~= "" and a.icon or "Nada.png"),
level = (trim(a.level or "") ~= "" and a.level or "NIVEL"),
video = a.video or ""
}
return mw.text.jsonEncode(obj)
end
-- Subskill (nome n EXATO do suborder; agrega desc_i18n do módulo + atributos locais)
function p.subskill(frame)
local a = safeArgs(frame)
local lang = trim((a.lang or (frame:getParent() and frame:getParent().args.lang) or "pt"):lower())
local n = trim(a.n or "")
if n == "" then
return mw.text.jsonEncode({})
end
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 desc_i18n = {}
for _, key in ipairs(data.order or {}) do
local sk = (data.skills or {})[key]
if type(sk) == "table" and type(sk.subskills) == "table" then
local sub = sk.subskills[n]
if sub then
local langs = {"pt", "en", "es", "pl"}
for _, code in ipairs(langs) do
local d = sub.desc and sub.desc[code]
if d and trim(d) ~= "" then
desc_i18n[code] = colorize(d)
end
end
break
end
end
end
local function nz(v)
v = v or "";
return (trim(v) ~= "" and v or nil)
end
local obj = {
name = n,
icon = (trim(a.icon or "") ~= "" and a.icon or "Nada.png"),
level = (trim(a.level or "") ~= "" and a.level or "NIVEL"),
video = a.video or "",
energy = nz(a.energy),
powerpve = nz(a.powerpve),
powerpvp = nz(a.powerpvp),
cooldown = nz(a.cooldown)
}
if next(desc_i18n) ~= nil then
obj.desc_i18n = desc_i18n
obj.descPt = desc_i18n.pt
obj.descEn = desc_i18n.en
obj.descEs = desc_i18n.es
obj.descPl = desc_ini18n and desc_i18n.pl or nil
end
return mw.text.jsonEncode(obj)
end
-- Gambis: expandir tier/tags via token "tierNome", "tagsNome"
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
if token:lower():sub(1, 4) ~= "tier" then
return token
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 {}
local lang = trim((frame.args.lang or "pt"):lower())
if data.tier_i18n and data.tier_i18n[lang] then
return data.tier_i18n[lang]
end
return trim(data.tier or "")
end
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
if token:lower():sub(1, 4) ~= "tags" then
return token
end
local char = nome ~= "" and nome or token:match("^tags(.+)$") 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