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

De Wiki Gla
Ir para navegação Ir para pesquisar
Linha 1: Linha 1:
local p = {}
local p = {}


local VIDEO_EXTS = { mp4 = true, webm = true, ogv = true }
function p.card(frame)
 
local function detectMedia(valor)
    if not valor or valor == '' then return nil, nil end
    local ext = valor:match('%.(%w+)$')
    if ext and VIDEO_EXTS[ext:lower()] then
        return 'video', valor
    end
    return 'youtube', valor
end
 
function p.render(frame)
     local args = frame:getParent().args
     local args = frame:getParent().args
     local nome = mw.text.trim(args['nome'] or '')
     local id = args.id or 'b1'
 
     local boss = args.boss or 'Boss'
     local root = mw.html.create('div'):attr('class', 'sv-wrap')
     local ilha = args.ilha or ''
 
     local img = args.img or ''
     root:tag('span'):attr('class', 'tema-btn'):wikitext('☾ Dark')
 
     if nome ~= '' then
        root:tag('div'):attr('class', 'sv-titulo'):wikitext(nome)
    end


    -- Coletar skills dos parâmetros
     local skills = {}
     local skills = {}
     local i = 1
     for i = 1, 5 do
    while true do
         local nome = args['s' .. i]
         local titulo = mw.text.trim(args['skill' .. i .. 'titulo'] or '')
        if nome and nome ~= '' then
        if titulo == '' then break end
            table.insert(skills, {
        skills[#skills + 1] = i
                tab  = args['s' .. i .. '_tab'] or nome,
         i = i + 1
                nome = nome,
                video = args['s' .. i .. '_video'] or '',
                desc  = args['s' .. i .. '_desc'] or ''
            })
         end
     end
     end


     if #skills == 0 then return tostring(root) end
     if #skills == 0 then return '' end


     local box = root:tag('div'):attr('class', 'sv-box')
     local h = {}


     local tabbar = box:tag('div'):attr('class', 'sv-tabs')
     -- Card header
     for idx, n in ipairs(skills) do
    table.insert(h, '<div class="lk-card">')
        local img = mw.text.trim(args['skill' .. n .. 'img'] or '')
     table.insert(h, '<div class="lk-card-header">')
        local tab = tabbar:tag('span')
    if img ~= '' then
            :attr('class', idx == 1 and 'sv-tab active' or 'sv-tab')
        table.insert(h, '<img src="' .. img .. '" alt="' .. boss .. '">')
            :attr('data-skill', tostring(n))
        if img ~= '' then
            tab:node(mw.html.create(''):wikitext('[[File:' .. img .. '|32px|link=]]'))
        else
            tab:wikitext(tostring(n))
        end
     end
     end
    table.insert(h, '<div><div class="lk-boss-name">' .. boss .. '</div>')
    table.insert(h, '<div class="lk-boss-island">' .. ilha .. '</div></div></div>')


     for idx, n in ipairs(skills) do
     -- Tabs container
        local px     = 'skill' .. n
     table.insert(h, '<div class="lk-tabs">')
        local titulo = mw.text.trim(args[px .. 'titulo'] or '')
        local media  = mw.text.trim(args[px .. 'media']  or '')


         local panel = box:tag('div')
    -- Radio inputs
            :attr('class', idx == 1 and 'sv-panel active' or 'sv-panel')
    for i, _ in ipairs(skills) do
            :attr('data-panel', tostring(n))
         local chk = (i == 1) and ' checked' or ''
        table.insert(h, '<input type="radio" name="' .. id .. '" id="' .. id .. 's' .. i .. '" class="lk-radio"' .. chk .. '>')
    end


        panel:tag('h2'):attr('class', 'sv-skill-titulo'):wikitext(titulo)
    -- Nav labels
 
    table.insert(h, '<div class="lk-nav">')
         local descsec = panel:tag('div'):attr('class', 'sv-desc')
    for i, s in ipairs(skills) do
        local j = 1
         table.insert(h, '<label for="' .. id .. 's' .. i .. '">' .. s.tab .. '</label>')
        while true do
    end
            local desc = mw.text.trim(args[px .. 'desc' .. j] or '')
    table.insert(h, '</div>')
            if desc == '' then break end
            descsec:tag('p'):wikitext(desc)
            j = j + 1
        end


        local tipo, valor = detectMedia(media)
    -- Panels
         if tipo == 'youtube' then
    for i, s in ipairs(skills) do
            panel:tag('div')
         table.insert(h, '<div class="lk-panel p-' .. id .. 's' .. i .. '">')
                :attr('class', 'sv-media')
         if s.video ~= '' then
                :attr('data-youtube', valor)
             table.insert(h, '<div class="lk-video"><iframe src="' .. s.video .. '" allowfullscreen></iframe></div>')
         elseif tipo == 'video' then
             local mediaDiv = panel:tag('div'):attr('class', 'sv-media')
            mediaDiv:tag('video')
                :attr('data-wikivideo', valor)
                :attr('controls', '')
                :attr('loop', '')
                :attr('muted', '')
                :wikitext('')
         end
         end
        table.insert(h, '<span class="lk-skill-name">' .. s.nome .. '</span>')
        table.insert(h, '<p class="lk-skill-desc">' .. s.desc .. '</p>')
        table.insert(h, '</div>')
     end
     end


     return tostring(root)
    table.insert(h, '</div></div>')
     return table.concat(h, '\n')
end
end


return p
return p

Edição das 11h49min de 17 de março de 2026

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

local p = {}

function p.card(frame)
    local args = frame:getParent().args
    local id = args.id or 'b1'
    local boss = args.boss or 'Boss'
    local ilha = args.ilha or ''
    local img = args.img or ''

    -- Coletar skills dos parâmetros
    local skills = {}
    for i = 1, 5 do
        local nome = args['s' .. i]
        if nome and nome ~= '' then
            table.insert(skills, {
                tab  = args['s' .. i .. '_tab'] or nome,
                nome = nome,
                video = args['s' .. i .. '_video'] or '',
                desc  = args['s' .. i .. '_desc'] or ''
            })
        end
    end

    if #skills == 0 then return '' end

    local h = {}

    -- Card header
    table.insert(h, '<div class="lk-card">')
    table.insert(h, '<div class="lk-card-header">')
    if img ~= '' then
        table.insert(h, '<img src="' .. img .. '" alt="' .. boss .. '">')
    end
    table.insert(h, '<div><div class="lk-boss-name">' .. boss .. '</div>')
    table.insert(h, '<div class="lk-boss-island">' .. ilha .. '</div></div></div>')

    -- Tabs container
    table.insert(h, '<div class="lk-tabs">')

    -- Radio inputs
    for i, _ in ipairs(skills) do
        local chk = (i == 1) and ' checked' or ''
        table.insert(h, '<input type="radio" name="' .. id .. '" id="' .. id .. 's' .. i .. '" class="lk-radio"' .. chk .. '>')
    end

    -- Nav labels
    table.insert(h, '<div class="lk-nav">')
    for i, s in ipairs(skills) do
        table.insert(h, '<label for="' .. id .. 's' .. i .. '">' .. s.tab .. '</label>')
    end
    table.insert(h, '</div>')

    -- Panels
    for i, s in ipairs(skills) do
        table.insert(h, '<div class="lk-panel p-' .. id .. 's' .. i .. '">')
        if s.video ~= '' then
            table.insert(h, '<div class="lk-video"><iframe src="' .. s.video .. '" allowfullscreen></iframe></div>')
        end
        table.insert(h, '<span class="lk-skill-name">' .. s.nome .. '</span>')
        table.insert(h, '<p class="lk-skill-desc">' .. s.desc .. '</p>')
        table.insert(h, '</div>')
    end

    table.insert(h, '</div></div>')
    return table.concat(h, '\n')
end

return p