Mudanças entre as edições de "Módulo:Info"
Ir para navegação
Ir para pesquisar
m |
m (char translator1) |
||
| Linha 3: | Linha 3: | ||
-- ===== util ===== | -- ===== util ===== | ||
local function trim(s) return (tostring(s or ""):gsub("^%s+", ""):gsub("%s+$", "")) end | local function trim(s) | ||
local function safeArgs(node) return (node and node.args) or {} end | return (tostring(s or ""):gsub("^%s+", ""):gsub("%s+$", "")) | ||
end | |||
local function safeArgs(node) | |||
return (node and node.args) or {} | |||
end | |||
local function requireCharacterModule(charName) | local function requireCharacterModule(charName) | ||
charName = trim(charName) | charName = trim(charName) | ||
if charName == "" then return nil end | if charName == "" then | ||
return nil | |||
end | |||
local ok, data | local ok, data | ||
ok, data = pcall(function() return require("Módulo:" .. charName) end) | ok, data = pcall(function() | ||
if ok and type(data) == "table" then return data end | 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) | ok, data = pcall(function() | ||
if ok and type(data) == "table" then return data end | return require("Modulo:" .. charName) | ||
end) | |||
if ok and type(data) == "table" then | |||
return data | |||
end | |||
ok, data = pcall(function() return require("Module:" .. charName) end) | ok, data = pcall(function() | ||
if ok and type(data) == "table" then return data end | return require("Module:" .. charName) | ||
end) | |||
if ok and type(data) == "table" then | |||
return data | |||
end | |||
return nil | return nil | ||
| Linha 24: | Linha 42: | ||
local function resolveCharFromFrames(frame, a) | local function resolveCharFromFrames(frame, a) | ||
if a.char and trim(a.char) ~= "" then return trim(a.char) end | if a.char and trim(a.char) ~= "" then | ||
if a.nome and trim(a.nome) ~= "" then return trim(a.nome) end | return trim(a.char) | ||
end | |||
if a.nome and trim(a.nome) ~= "" then | |||
return trim(a.nome) | |||
end | |||
local p1 = frame:getParent() | local p1 = frame:getParent() | ||
if p1 then | if p1 then | ||
local ap1 = safeArgs(p1) | local ap1 = safeArgs(p1) | ||
if ap1.char and trim(ap1.char) ~= "" then return trim(ap1.char) end | if ap1.char and trim(ap1.char) ~= "" then | ||
if ap1.nome and trim(ap1.nome) ~= "" then return trim(ap1.nome) end | 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() | local p2 = p1.getParent and p1:getParent() | ||
if p2 then | if p2 then | ||
local ap2 = safeArgs(p2) | local ap2 = safeArgs(p2) | ||
if ap2.char and trim(ap2.char) ~= "" then return trim(ap2.char) end | if ap2.char and trim(ap2.char) ~= "" then | ||
if ap2.nome and trim(ap2.nome) ~= "" then return trim(ap2.nome) end | return trim(ap2.char) | ||
end | |||
if ap2.nome and trim(ap2.nome) ~= "" then | |||
return trim(ap2.nome) | |||
end | |||
end | end | ||
end | end | ||
| Linha 48: | Linha 78: | ||
local COLOR = { | local COLOR = { | ||
debuff = "#ff5252", | debuff = "#ff5252", | ||
atk | atk = "#ffcc00", | ||
def | def = "#64b5f6", | ||
ms | ms = "#43a047", | ||
hp | hp = "#42a5f5", | ||
sec | sec = "#ffcc00" | ||
} | } | ||
local function colorize(txt) | local function colorize(txt) | ||
if not txt or txt == "" then return "" end | if not txt or txt == "" then | ||
return "" | |||
end | |||
return (txt:gsub("{{(%a+):([^}]+)}}", function(tag, inner) | return (txt:gsub("{{(%a+):([^}]+)}}", function(tag, inner) | ||
local hex = COLOR[tag] | local hex = COLOR[tag] | ||
if not hex then return "{{" .. tag .. ":" .. inner .. "}}" end | if not hex then | ||
return "{{" .. tag .. ":" .. inner .. "}}" | |||
end | |||
return string.format('<span style="color:%s;">%s</span>', hex, inner) | return string.format('<span style="color:%s;">%s</span>', hex, inner) | ||
end)) | end)) | ||
| Linha 67: | Linha 101: | ||
function p.getTier(frame) | function p.getTier(frame) | ||
local a | local a = safeArgs(frame) | ||
local char = trim(frame.args[1] or a.nome) | local char = trim(frame.args[1] or a.nome) | ||
if char == "" then char = resolveCharFromFrames(frame, a) end | if char == "" then | ||
char = resolveCharFromFrames(frame, a) | |||
end | |||
local data = requireCharacterModule(char) or {} | local data = requireCharacterModule(char) or {} | ||
return trim(data.tier or "") | return trim(data.tier or "") | ||
| Linha 75: | Linha 111: | ||
function p.getTags(frame) | function p.getTags(frame) | ||
local a | local a = safeArgs(frame) | ||
local char = trim(frame.args[1] or a.nome) | local char = trim(frame.args[1] or a.nome) | ||
if char == "" then char = resolveCharFromFrames(frame, a) end | if char == "" then | ||
char = resolveCharFromFrames(frame, a) | |||
end | |||
local data = requireCharacterModule(char) or {} | local data = requireCharacterModule(char) or {} | ||
local tags = data.tags or {} | local tags = data.tags or {} | ||
if type(tags) ~= "table" then return "" end | if type(tags) ~= "table" then | ||
return "" | |||
end | |||
return trim(table.concat(tags, " / ")) | return trim(table.concat(tags, " / ")) | ||
end | end | ||
| Linha 86: | Linha 126: | ||
-- Skill (normal: com M) | -- Skill (normal: com M) | ||
function p.skill(frame) | function p.skill(frame) | ||
local a | local a = safeArgs(frame) | ||
local lang = trim((a.lang or (frame:getParent() and frame:getParent().args.lang) or "pt"):lower()) | local lang = trim((a.lang or (frame:getParent() and frame:getParent().args.lang) or "pt"):lower()) | ||
local char = trim(a.char or (frame:getParent() and frame:getParent().args.nome) or "") | local char = trim(a.char or (frame:getParent() and frame:getParent().args.nome) or "") | ||
if char == "" then char = resolveCharFromFrames(frame, a) end | if char == "" then | ||
local data | char = resolveCharFromFrames(frame, a) | ||
end | |||
local data = requireCharacterModule(char) or {} | |||
local name, desc_i18n = nil, {} | |||
if a.M and trim(a.M) ~= "" then | if a.M and trim(a.M) ~= "" then | ||
local m | local m = tonumber(a.M) or 0 | ||
local order = data.order or {} | local order = data.order or {} | ||
local key | local key = order[m] or "" | ||
local sk | local sk = (data.skills or {})[key] or {} | ||
name | name = trim(sk.name or key or "") | ||
-- monta tabela de descrições por idioma (já colorizadas) | |||
if type(sk.desc) == "table" then | if type(sk.desc) == "table" then | ||
local langs = {"pt", "en", "es", "pl"} | |||
for _, code in ipairs(langs) do | |||
local d = sk.desc[code] | |||
if d and trim(d) ~= "" then | |||
desc_i18n[code] = colorize(d) | |||
end | |||
end | |||
elseif sk.desc and trim(sk.desc) ~= "" then | |||
desc_i18n["pt"] = colorize(sk.desc) -- fallback: único texto vira pt | |||
end | end | ||
end | end | ||
| Linha 111: | Linha 161: | ||
return (trim(v) ~= "" and v or nil) | return (trim(v) ~= "" and v or nil) | ||
end | end | ||
local chosen = desc_i18n[lang] or desc_i18n["pt"] or "" | |||
local obj = { | local obj = { | ||
icon | icon = (trim(a.icon or "") ~= "" and a.icon or "Nada.png"), | ||
level | level = (trim(a.level or "") ~= "" and a.level or "NIVEL"), | ||
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), | ||
video | video = a.video or "" | ||
} | } | ||
if name and name ~= "" then obj.name = name end | if name and name ~= "" then | ||
if | obj.name = name | ||
end | |||
if chosen ~= "" then | |||
obj.desc = chosen | |||
end | |||
-- inclui as variantes para o Character expor como data-desc-* | |||
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_i18n.pl | |||
end | |||
return mw.text.jsonEncode(obj) | return mw.text.jsonEncode(obj) | ||
end | end | ||
-- Skill (emote: sem M) | |||
function p.emote(frame) | function p.emote(frame) | ||
local a = safeArgs(frame) | local a = safeArgs(frame) | ||
local obj = { | local obj = { | ||
name | name = "Emote", | ||
desc | desc = "", | ||
icon | icon = (trim(a.icon or "") ~= "" and a.icon or "Nada.png"), | ||
level = 25, | level = 25, | ||
video = a.video or "", | video = a.video or "", | ||
desc_i18n = { | |||
pt = "", | |||
en = "", | |||
es = "", | |||
pl = "" | |||
}, | |||
descPt = "", | |||
descEn = "", | |||
descEs = "", | |||
descPl = "" | |||
} | } | ||
return mw.text.jsonEncode(obj) | return mw.text.jsonEncode(obj) | ||
end | end | ||
| Linha 144: | Linha 217: | ||
function p.expandTier(frame) | function p.expandTier(frame) | ||
local token = trim(frame.args[1] or "") | local token = trim(frame.args[1] or "") | ||
local nome | 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 159: | Linha 236: | ||
function p.expandTags(frame) | function p.expandTags(frame) | ||
local token = trim(frame.args[1] or "") | local token = trim(frame.args[1] or "") | ||
local nome | 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, 5) ~= "class" then return token end | return "" | ||
end | |||
if token:lower():sub(1, 5) ~= "class" then | |||
return token | |||
end | |||
local char = nome ~= "" and nome or token:match("^class(.+)$") or "" | local char = nome ~= "" and nome or token:match("^class(.+)$") or "" | ||
if char == "" then | if char == "" then | ||
| Linha 168: | Linha 249: | ||
end | end | ||
local data = requireCharacterModule(char) or {} | local data = requireCharacterModule(char) or {} | ||
local arr | local arr = (data.tags_i18n and data.tags_i18n.pt) or data.tags | ||
if type(arr) == "table" then | if type(arr) == "table" then | ||
return table.concat(arr, " / ") | return table.concat(arr, " / ") | ||
Edição das 04h16min de 10 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 (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
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
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 para marcadores
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 =====
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
-- Skill (normal: com M)
function p.skill(frame)
local a = safeArgs(frame)
local lang = trim((a.lang or (frame:getParent() and frame:getParent().args.lang) or "pt"):lower())
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 name, desc_i18n = nil, {}
if a.M and trim(a.M) ~= "" then
local m = tonumber(a.M) or 0
local order = data.order or {}
local key = order[m] or ""
local sk = (data.skills or {})[key] or {}
name = trim(sk.name or key or "")
-- monta tabela de descrições por idioma (já colorizadas)
if type(sk.desc) == "table" then
local langs = {"pt", "en", "es", "pl"}
for _, code in ipairs(langs) do
local d = sk.desc[code]
if d and trim(d) ~= "" then
desc_i18n[code] = colorize(d)
end
end
elseif sk.desc and trim(sk.desc) ~= "" then
desc_i18n["pt"] = colorize(sk.desc) -- fallback: único texto vira pt
end
end
local function nz(v)
v = v or ""
return (trim(v) ~= "" and v or nil)
end
local chosen = desc_i18n[lang] or desc_i18n["pt"] or ""
local obj = {
icon = (trim(a.icon or "") ~= "" and a.icon or "Nada.png"),
level = (trim(a.level or "") ~= "" and a.level or "NIVEL"),
energy = nz(a.energy),
powerpve = nz(a.powerpve),
powerpvp = nz(a.powerpvp),
cooldown = nz(a.cooldown),
video = a.video or ""
}
if name and name ~= "" then
obj.name = name
end
if chosen ~= "" then
obj.desc = chosen
end
-- inclui as variantes para o Character expor como data-desc-*
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_i18n.pl
end
return mw.text.jsonEncode(obj)
end
-- Skill (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 = 25,
video = a.video or "",
desc_i18n = {
pt = "",
en = "",
es = "",
pl = ""
},
descPt = "",
descEn = "",
descEs = "",
descPl = ""
}
return mw.text.jsonEncode(obj)
end
-- expandTier/expandTags mantidos
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 i18n = (data.tier_i18n and data.tier_i18n.pt) or data.tier
return trim(i18n 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, 5) ~= "class" then
return token
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