Mudanças entre as edições de "Módulo:Skillbox"

De Wiki Gla
Ir para navegação Ir para pesquisar
Linha 2: Linha 2:


-- Lê uma skill formatada com Nome, Descrição, Vídeo
-- Lê uma skill formatada com Nome, Descrição, Vídeo
function parseSkill(text)
local function parseSkill(text)
     local skill = { nome = '', descricao = '', video = '' }
     local skill = { nome = '', descricao = '', video = '' }
     for line in mw.text.gsplit(text, '\n', true) do
     for line in mw.text.gsplit(text, '\n', true) do
         local chave, valor = line:match("^%s*(.-)%s*=%s*(.-)%s*$")
         local chave, valor = line:match("^%s*(.-)%s*=%s*(.-)%s*$")
Linha 19: Linha 18:
         end
         end
     end
     end
     return skill
     return skill
end
end


function p.exibir(frame)
function p.exibir(frame)
     local args = frame:getParent().args
     local raw = frame:getParent().args
     local skills = {}
     local skills = {}


     for k, v in pairs(args) do
    -- Agora usamos ipairs para pegar cada bloco |skill=...
         if type(k) == "string" and k:match("^skill%d*$") and v:find("Nome%s*=") then
     for i, block in ipairs(raw) do
             table.insert(skills, parseSkill(v))
         if type(block) == "string" and block:find("nome%s*=") then
             table.insert(skills, parseSkill(block))
         end
         end
     end
     end


     local html = mw.html.create("div")
     local html = mw.html.create("div"):addClass("skillbox-container")
    html:addClass("skillbox-container")
 
     local tabs = html:tag("div"):addClass("skillbox-tabs")
     local tabs = html:tag("div"):addClass("skillbox-tabs")
     local content = html:tag("div"):addClass("skillbox-content")
     local content = html:tag("div"):addClass("skillbox-content")
Linha 42: Linha 39:
         local id = "skill" .. i
         local id = "skill" .. i


        -- Aba
         tabs:tag("button")
         tabs:tag("button")
             :addClass("skillbox-tab")
             :addClass("skillbox-tab")
Linha 48: Linha 46:
             :wikitext(skill.nome or ("Skill " .. i))
             :wikitext(skill.nome or ("Skill " .. i))


        -- Painel
         local panel = content:tag("div")
         local panel = content:tag("div")
             :addClass("skillbox-panel")
             :addClass("skillbox-panel")
Linha 59: Linha 58:
         if skill.video and skill.video ~= "" then
         if skill.video and skill.video ~= "" then
             local src = mw.text.trim(skill.video)
             local src = mw.text.trim(skill.video)
            -- (Opcional) Se quiser forçar .webm como padrão:
            -- if not src:match("%.webm$") and not src:match("%.mp4$") then
            --    src = src .. ".webm"
            -- end
             panel:tag("video")
             panel:tag("video")
                 :addClass("skillbox-video")
                 :addClass("skillbox-video")
                 :attr("controls", "true")
                 :attr("controls", "true")
                 :tag("source")
                 :tag("source")
                :attr("src", "https://wiki.gla.com.br/index.php/Special:FilePath/" .. src)
                    :attr("src", "https://wiki.gla.com.br/index.php/Special:FilePath/" .. src)
                :attr("type", "video/mp4")
                    :attr("type", "video/mp4")
         end
         end
     end
     end

Edição das 02h59min de 23 de maio de 2025

A documentação para este módulo pode ser criada em Módulo:Skillbox/doc

local p = {}

-- Lê uma skill formatada com Nome, Descrição, Vídeo
local function parseSkill(text)
    local skill = { nome = '', descricao = '', video = '' }
    for line in mw.text.gsplit(text, '\n', true) do
        local chave, valor = line:match("^%s*(.-)%s*=%s*(.-)%s*$")
        if chave and valor then
            chave = mw.text.trim(chave:lower())
            valor = mw.text.trim(valor)
            if chave == "nome" then
                skill.nome = valor
            elseif chave == "descrição" or chave == "descricao" then
                skill.descricao = valor
            elseif chave == "vídeo" or chave == "video" then
                skill.video = valor
            end
        end
    end
    return skill
end

function p.exibir(frame)
    local raw = frame:getParent().args
    local skills = {}

    -- Agora usamos ipairs para pegar cada bloco |skill=...
    for i, block in ipairs(raw) do
        if type(block) == "string" and block:find("nome%s*=") then
            table.insert(skills, parseSkill(block))
        end
    end

    local html = mw.html.create("div"):addClass("skillbox-container")
    local tabs = html:tag("div"):addClass("skillbox-tabs")
    local content = html:tag("div"):addClass("skillbox-content")

    for i, skill in ipairs(skills) do
        local id = "skill" .. i

        -- Aba
        tabs:tag("button")
            :addClass("skillbox-tab")
            :addClass(i == 1 and "active" or "")
            :attr("data-target", id)
            :wikitext(skill.nome or ("Skill " .. i))

        -- Painel
        local panel = content:tag("div")
            :addClass("skillbox-panel")
            :addClass(i == 1 and "active" or "")
            :attr("id", id)

        panel:tag("div")
            :addClass("skillbox-desc")
            :wikitext(skill.descricao or "")

        if skill.video and skill.video ~= "" then
            local src = mw.text.trim(skill.video)
            panel:tag("video")
                :addClass("skillbox-video")
                :attr("controls", "true")
                :tag("source")
                    :attr("src", "https://wiki.gla.com.br/index.php/Special:FilePath/" .. src)
                    :attr("type", "video/mp4")
        end
    end

    return tostring(html)
end

return p