Saltar para o conteúdo

Módulo:Caixa lateral

Origem: Wikipédia, a enciclopédia livre.

-- Este módulo implementa {{caixa lateral}}.

local yesno = require('Módulo:Yesno')
local p = {}

local function makeData(args)
    local data = {}

    -- Classes principais da tabela
    data.classes = {}
    if yesno(args.metadata) ~= false or yesno(args.metadados) ~= false then
        table.insert(data.classes, 'metadata')
    end
    if args.position and args.position:lower() == 'left' or args['posição'] and args['posição']:lower() == 'left' then
        table.insert(data.classes, 'mbox-small-left')
    else
        table.insert(data.classes, 'mbox-small')
    end
    
    if args.collapsible or args['colapsável'] then
        table.insert(data.classes, 'mw-collapsible')
        if args.collapsible == "collapsed" or args['colapsável'] == "collapsed" then
            table.insert(data.classes, 'mw-collapsed')
        end
        data.collapsible = true
    end

    table.insert(data.classes, args.class or args.classe)
    
    -- Imagem
    if args.image and args.image ~= 'none' and args.image ~= 'nenhuma' then
        data.image = args.image
    elseif args.imagem and args.imagem ~= 'none' and args.imagem ~= 'nenhuma' then
        data.image = args.imagem
    end

    -- Classe de texto
    if args.textclass == 'plainlist' or not args.textclass then
        data.textclass = 'plainlist'
        data.plainlist_templatestyles = 'Plainlist/styles.css'
    else
        data.textclass = args.textclass or args['classe-texto']
    end

    -- Copiar os dados que não precisam de ajuste
    local argsToCopy = {
        -- Atributos ARIA
        'role',
        'labelledby',
        
        -- Estilos
        'style',
        'estilo',
        'textstyle',
        'estilotexto',
        'templatestyles',

        -- Linha acima
        'above',
        'acima',
        'abovestyle',
        'acimaestilo',

        -- Linha do corpo
        'text',
        'texto',
        'imageright',
        'imagemdireita',

        -- Linha abaixo
        'below',
        'abaixo',
    }
    for i, key in ipairs(argsToCopy) do
        data[key] = args[key]
    end

    return data
end

local function renderSidebox(data)
    -- Renderiza o HTML da caixa lateral.

    -- Raiz da tabela
    local root = mw.html.create('div')
    root:attr('role', data.role)
        :attr('aria-labelledby', data.labelledby)
        :addClass('side-box')
    for i, class in ipairs(data.classes or {}) do
        root:addClass(class)
    end
    if data.style or data.estilo then
        root:cssText(data.style or data.estilo)
    end
    
    local frame = mw.getCurrentFrame()
    if data.plainlist_templatestyles then
        root:wikitext(frame:extensionTag{
            name = 'templatestyles', args = { src = data.plainlist_templatestyles }
        })
    end

    -- A linha "acima"
    if data.above or data.acima then
        local above = root:newline():tag('div')
        above:addClass('side-box-abovebelow')
            :newline()
            :wikitext(data.above or data.acima)
        if data.textstyle or data.estilotexto then
            above:cssText(data.textstyle or data.estilotexto)
        end
        if data.abovestyle or data.acimaestilo then
            above:cssText(data.abovestyle or data.acimaestilo)
        end
    end

    -- Linha do corpo
    local body = root:newline():tag('div')
        body:addClass('side-box-flex')
            :addClass(data.collapsible and 'mw-collapsible-content')
            :newline()
    if data.image then
        body:tag('div')
            :addClass('side-box-image')
            :wikitext(data.image)
    end
    local text = body:newline():tag('div')
    text:addClass('side-box-text')
        :addClass(data.textclass)
    if data.textstyle or data.estilotexto then
        text:cssText(data.textstyle or data.estilotexto)
    end
    text:wikitext(data.text or data.texto)
    if data.imageright or data.imagemdireita then
        body:newline():tag('div')
            :addClass('side-box-imageright')
            :wikitext(data.imageright or data.imagemdireita)
    end

    -- A linha "abaixo"
    if data.below or data.abaixo then
        local below = root:newline():tag('div')
        below
            :addClass('side-box-abovebelow')
            :wikitext(data.below or data.abaixo)
        if data.textstyle or data.estilotexto then
            below:cssText(data.textstyle or data.estilotexto)
        end
    end

    root:newline()
    local templatestyles = ''
    if data.templatestyles then
        templatestyles = frame:extensionTag{
            name = 'templatestyles', args = { src = data.templatestyles }
        }
    end
    return frame:extensionTag{
        name = 'templatestyles', args = { src = 'Módulo:Caixa lateral/styles.css' }
    } .. templatestyles .. tostring(root)
end

function p._main(args)
    local data = makeData(args)
    return renderSidebox(data)
end

function p.main(frame)
    local origArgs = frame:getParent().args
    local args = {}
    for k, v in pairs(origArgs) do
        v = v:match('%s*(.-)%s*$')
        if v ~= '' then
            args[k] = v
        end
    end
    return p._main(args)
end

return p