Ir para o conteúdo

Módulo:Banner

De Wikivoyage

A documentação para este módulo pode ser criada na página Módulo:Banner/doc

local p = {}

-- Compatibilidade: aceita tanto "main" quanto "principal"
function p.main(frame)
    local args = frame:getParent().args
    return p.renderizar(args)
end

function p.principal(frame)
    local args = frame:getParent().args
    return p.renderizar(args)
end

function p.renderizar(args)
    local imagemParam = args[1] or ''
    local titulo = args['título'] or mw.title.getCurrentTitle().text
    local descricao = args['descrição'] or ''
    local mesmonome = args['mesmonome'] or ''
    local semmdc = args['semmdc'] or ''
    local caixa = args['caixa'] or 'p'
    local desambig = args['desambig'] or ''
    local tamanho = args['tamanho'] or '25'
    local proporcao = args['proporção'] or args['proporcao'] or ''
    local cor = args['cor'] or ''
    local cortitulo = args['cortitulo'] or args['cortítulo'] or ''
    local corfundo = args['corfundo'] or ''
    
    -- Determinar qual imagem usar
    local imagem = p.obterImagem(imagemParam)
    
    -- Construir HTML
    local html = mw.html.create('div')
        :addClass('naoimprime')
        :node(mw.html.create('div')
            :addClass('naomobile')
            :node(p.construirBanner(titulo, mesmonome, tamanho, imagem, descricao, semmdc, caixa, proporcao, cor, cortitulo, corfundo))
        )
    
    -- Adicionar texto de desambiguação se necessário
    local resultado = tostring(html)
    if desambig ~= '' then
        resultado = resultado .. p.textoDesambiguacao(desambig)
    end
    
    return resultado
end

function p.obterImagem(param)
    local wikidata = mw.wikibase.getEntity()
    local imagemWikidata = wikidata and wikidata:getBestStatements('P948')[1]
    
    -- Mapear parâmetros para imagens padrão
    local imagensPadrao = {
        ['none'] = 'Pagebanner default.jpg',
        ['Europa'] = 'Pagebanner default.jpg',
        ['América do Norte'] = 'Pagebanner default.jpg',
        ['Pagebanner default.jpg'] = 'Pagebanner default.jpg',
        ['Oriente Médio'] = 'Mena-asia_default_banner.jpg',
        ['OM'] = 'Mena-asia_default_banner.jpg',
        ['Norte da África'] = 'Mena-asia_default_banner.jpg',
        ['NA'] = 'Mena-asia_default_banner.jpg',
        ['Ásia'] = 'Mena-asia_default_banner.jpg',
        ['América do Sul'] = 'S-amer africa default banner.jpg',
        ['AS'] = 'S-amer africa default banner.jpg',
        ['África'] = 'S-amer africa default banner.jpg',
        ['Caribe'] = 'Caribbean default banner.jpg',
        ['AO'] = 'Australia-oceania default banner.jpg',
        ['Austrália'] = 'Australia-oceania default banner.jpg',
        ['Oceania'] = 'Australia-oceania default banner.jpg',
        ['Nova Zelândia'] = 'NZ default banner.jpg',
        ['NZ'] = 'NZ default banner.jpg',
        ['Dica'] = 'TT Banner.jpg',
        ['Dicas'] = 'TT Banner.jpg',
        ['Dica de viagem'] = 'TT Banner.jpg',
        ['dica'] = 'TT Banner.jpg',
        ['dicas'] = 'TT Banner.jpg',
        ['dica de viagem'] = 'TT Banner.jpg',
        ['Guia de mergulho'] = 'Default Scuba diving banner.JPG',
        ['Mergulho'] = 'Default Scuba diving banner.JPG',
        ['Itinerário'] = 'Itinerary banner.jpg',
        ['itinerário'] = 'Itinerary banner.jpg',
        ['Guia de conversação'] = 'Welcome banner.jpg',
        ['Conversação'] = 'Welcome banner.jpg',
        ['guia de conversação'] = 'Welcome banner.jpg',
        ['conversação'] = 'Welcome banner.jpg',
        ['Desambiguação'] = 'Disambiguation banner.png',
        ['desambiguação'] = 'Disambiguation banner.png',
        ['desamb'] = 'Disambiguation banner.png'
    }
    
    -- Prioridade: Wikidata > Parâmetro específico > Padrão regional
    if imagemWikidata and imagemWikidata.mainsnak.datavalue then
        return imagemWikidata.mainsnak.datavalue.value
    elseif param ~= '' and not imagensPadrao[param] then
        return param
    elseif imagensPadrao[param] then
        return imagensPadrao[param]
    else
        return 'Pagebanner default.jpg'
    end
end

function p.construirBanner(titulo, mesmonome, tamanho, imagem, descricao, semmdc, caixa, proporcao, cor, cortitulo, corfundo)
    local banner = mw.html.create('div')
        :addClass('topbanner')
        :css('position', 'relative')
        :css('width', '100%')
        :css('overflow', 'hidden')
        :css('display', 'flex')
        :css('align-items', 'center')
    
    -- Definir cor de fundo (padrão: preto, ou customizado)
    if corfundo ~= '' then
        banner:css('background', corfundo)
    else
        banner:css('background', '#000')
    end
    
    -- Se proporção = sim, não limitar altura
    if proporcao == '' or proporcao == 'não' or proporcao == 'nao' then
        banner:css('height', '200px')
    end
    
    -- Definir cor do título (padrão: branco, ou customizado)
    local corTitulo = cortitulo ~= '' and cortitulo or 'white'
    
    -- Título
    banner:node(mw.html.create('div')
        :addClass('name')
        :css('position', 'absolute')
        :css('top', '10px')
        :css('left', '10px')
        :css('z-index', '2')
        :css('color', corTitulo)
        :css('text-shadow', '2px 2px 4px rgba(0,0,0,0.8)')
        :css('font-size', '2em')
        :css('font-weight', 'bold')
        :wikitext("'''" .. titulo .. "'''")
    )
    
    -- Ícone de desambiguação
    if mesmonome ~= '' then
        local linkDesamb = mesmonome == 'sim' and mw.title.getCurrentTitle().text or mesmonome
        banner:node(mw.html.create('div')
            :addClass('caixaicone')
            :css('position', 'absolute')
            :css('top', '10px')
            :css('right', '10px')
            :css('z-index', '2')
            :wikitext('[[Imagem:Question_Circle.svg|' .. tamanho .. 'px|link=' .. linkDesamb .. ' (desambiguação)|Para outros locais com este mesmo nome, vide ' .. linkDesamb .. ' (desambiguação)]]')
        )
    end
    
    -- Imagem do banner
    local containerImg = mw.html.create('div')
        :css('width', '100%')
        :css('line-height', '0')
        :css('display', 'flex')
        :css('align-items', 'center')
        :css('justify-content', 'center')
        :css('overflow', 'hidden')
    
    -- Se tem limite de altura, aplicar ao container
    if proporcao == '' or proporcao == 'não' or proporcao == 'nao' then
        containerImg:css('max-height', '300px')
    end
    
    local imgTag = '[[File:' .. imagem .. '|1800px'
    if descricao ~= '' then
        imgTag = imgTag .. '|' .. descricao
    end
    imgTag = imgTag .. ']]'
    
    containerImg:wikitext(imgTag)
    banner:node(containerImg)
    
    -- MDC (Mapa de Conteúdo / TOC)
    if semmdc ~= 'sim' then
        local classeTabela = 'tabmdc-p'
        local corMDC = ''
        
        -- Verificar se é cor hexadecimal (começa com # e tem 4 ou 7 caracteres)
        local primeiroCar = string.sub(caixa, 1, 1)
        local tamanhoCaixa = string.len(caixa)
        
        if primeiroCar == '#' and (tamanhoCaixa == 7 or tamanhoCaixa == 4) then
            -- É uma cor hexadecimal
            corMDC = caixa
        elseif caixa == 'branco' or caixa == 'b' then
            classeTabela = 'tabmdc-b'
        elseif caixa == 'cinza' or caixa == 'c' then
            classeTabela = 'tabmdc-c'
        end
        
        local divMDC = mw.html.create('div')
            :css('position', 'absolute')
            :css('bottom', '6px')
            :css('left', '0')
            :css('z-index', '3')
            :css('width', '100%')
        
        local caixaMDC = mw.html.create('div')
            :addClass('hlista')
            :addClass(classeTabela)
            :wikitext('__TOC__')
        
        -- Se for cor customizada, aplicar
        if corMDC ~= '' then
            caixaMDC:css('background-color', corMDC)
        end
        
        divMDC:node(caixaMDC)
        banner:node(divMDC)
    end
    
    return banner
end

function p.textoDesambiguacao(desambig)
    local pageName = mw.title.getCurrentTitle().text
    local link = desambig == 'sim' and pageName or desambig
    return "\n:''Para outros locais com este mesmo nome, vide [[" .. link .. " (desambiguação)]].'''"
end

return p