Saltar para o conteúdo

Módulo:Info: diferenças entre revisões

Origem: Wikipédia, a enciclopédia livre.
Conteúdo apagado Conteúdo adicionado
Dbastro (discussão | contribs)
m
Dbastro (discussão | contribs)
m
Linha 10: Linha 10:
{'#00626F', '#11E4FF', '#88F2FF', '#C4F9FF'},
{'#00626F', '#11E4FF', '#88F2FF', '#C4F9FF'},
{'#00654E', '#27FFCF', '#93FFE7', '#C9FFF3'},
{'#00654E', '#27FFCF', '#93FFE7', '#C9FFF3'},
{'#006800', '#7BFF7B', '#BDFFBD', '#DEFFDE'},
{'#006800', '#7BFF7B', '#BDFFBD', '#DEFFDE'}, -- azul
{'#4A6000', '#CFFF27', '#E7FF93', '#F3FFC9'},
{'#4A6000', '#CFFF27', '#E7FF93', '#F3FFC9'},
{'#655900', '#FFE411', '#FFF288', '#FFF9C4'},
{'#655900', '#FFE411', '#FFF288', '#FFF9C4'},
{'#8C4600', '#FFB56B', '#FFDAB5', '#FFEDDA'},
{'#8C4600', '#FFB56B', '#FFDAB5', '#FFEDDA'},
{'#FFFFC0', '#FFFFC0', '', ''}, -- amarelo
{'#E8E8E8', '#E8E8E8', '', ''}, -- cinza claro
{'#585858', '#C7C7C7', '#E3E3E3', '#F1F1F1'}
{'#585858', '#C7C7C7', '#E3E3E3', '#F1F1F1'}
}
}
Linha 74: Linha 76:
for _, campo in ipairs(campos) do
for _, campo in ipairs(campos) do
if campo['tópico'] then -- TODO: verificar a necessidade de uma opção para ocultar
if campo['tópico'] then -- TODO: verificar a necessidade de uma opção para ocultar
table.insert(c, '|-\n|colspan=2 style="text-align:center;' .. cor2 .. '"|' .. campo['tópico'])
table.insert(c, '|-\n|colspan=2 style="text-align:center; font-weight:bold;' .. cor2 .. '"|' .. campo['tópico'])
elseif campo['rótulo'] and campo[1] then
elseif campo['rótulo'] and campo[1] then
table.insert(c, '|-\n|scope="row" ' .. 'style="vertical-align:top;' .. cor3 .. '"|' .. campo['rótulo'] ..
table.insert(c, '|-\n|scope="row" ' .. 'style="vertical-align:top; text-align:left; font-weight:bold;' .. cor3 .. '"|' .. campo['rótulo'] ..
'\n|' .. (campo['wikidata'] and 'class="dadoswd" ' or '') .. 'style="vertical-align:top;"|' .. campo[1])
'\n|' .. (campo['wikidata'] and 'class="dadoswd" ' or '') .. 'style="vertical-align:top;"|' .. campo[1])
elseif campo[1] then
elseif campo[1] then

Revisão das 19h47min de 31 de outubro de 2018

Documentação do módulo[ver] [editar] [histórico] [purgar]


Descrição

Este módulo gera infoboxes semelhante à {{Info}}

Uso

O módulo funciona de modo semelhante à {{Info}} e em muitos casos vai funcionar da mesma forma ao trocar a linha

{{Info

por

{{#invoke:Info|base

O preenchimento dos campos pode ser igual ao da {{Info}} (usando rótulo1, dados1, rótulo2, dados2, etc), porém este módulo oferece uma opção mais simples de preenchimento:

Título
Tópico 1
Rótulo A dados A
Rótulo B dados B
dados D sem rótulo
Tópico 2
Rótulo E dados E
Rodapé
{{#invoke:Info|base
| cor      = 6.3
| título   = Título
| rodapé   = Rodapé
| #tópico  : Tópico 1
| Rótulo A : dados A
| Rótulo B : dados B
| Rótulo B : #wd:17
| Rótulo C : {{{campo C|}}}
| Rótulo C : #wd:P123
| : dados D sem rótulo
| #tópico  : Tópico 2
| Rótulo E : dados E
}}

Nessa forma de preenchimento os rótulos e dados são inseridos na mesma linha, o que torna a criação da infobox mais rápida, e, como não existe números nos campos, é mais fácil trocar a ordem dos campos e inserir novos campos em qualquer posição.

Quando existem dois rótulos iguais, como o "Rótulo C" no exemplo acima, será criado somente um campo com esse rótulo, usando o primeiro campo que possuir dados, o "#wd:P123" é a forma como uma propriedade do Wikidata é usada, como não existe essa propriedade para esta página o campo não é preenchido.

Wikidata

Se os dados estiverem no formato #wd:P<número da propriedade>, os dados dessa propriedade serão obtidos do Wikidata, por exemplo |país: #wd:P17 vai gerar o rótulo "país" e pegar o nome do país no Wikidata. Para colocar ligação interna coloque ":link" depois da propriedade, por exemplo #wd:P17:link. Outras funções também estão disponíveis para modificar o valor obtido do Wikidata, veja a documentação do Módulo:Info/wd para detalhes.

Todo campo que estiver usando dados do Wikidata tem a classe de estilo "dadoswd", isso é útil para visualizar quais campos usam dados do Wikidata e quais usam dados locais, para isso edite o seu common.css e adicione algum estilo para diferenciar os campos do Wikidata dos campos locais. O exemplo abaixo coloca um borda roxa a direita do campo:

/* Exibir borda roxa ao lado dos campos da infobox que usam dados do Wikidata */
.dadoswd {
    border-right: 1px solid #CC99FF
}
Diferenciar campos do Wikidata
Rótulo1 dado preenchido localmente
Rótulo2 dado obtido do Wikidata

O código acima em seu common.css produz o efeito ao lado nas infoboxes com dados do Wikidata. O efeito é sutil mas suficiente para diferenciar visualmente qual campo usa dados do Wikidata, para marcar a diferença de forma mais forte use cores mais fortes, bordas mais espessas ou qualquer outro estilo que quiser, só você verá o estilo que configurar no seu common.css.

Cor e estilos

Este módulo segue o padrão visual, nenhuma classe de estilo ou estilos em linha podem ser adicionados, isso garante a acessibilidade das informações e garante uma consistência visual. Somente a cor pode ser alterada usando as cores padrões.

Para usar cores preencha o parâmetro |cor= com uma das cores do padrão visual ou os respectivos números na tabela de cores abaixo, essa cor será usada como fundo do título, as cores mais claras da mesma matiz serão automaticamente usadas no fundo dos tópicos (primeira mais clara) e rótulos (segunda mais clara).

Cor 9.3
dados sem rótulo
Tópico
Rótulo1 dados
Rótulo2 dados
Rodapé
Cor 2.1
dados sem rótulo
Tópico
Rótulo1 dados
Rótulo2 dados
Rodapé
Tom escuro Tom médio Tom claro Tom mais claro
1.1 1.2 1.3 1.4
2.1 2.2 2.3 2.4
3.1 3.2 3.3 3.4
4.1 4.2 4.3 4.4
5.1 5.2 5.3 5.4
6.1 6.2 6.3 6.4
7.1 7.2 7.3 7.4
8.1 8.2 8.3 8.4
9.1 9.2 9.3 9.4
10.1 10.2 10.3 10.4
11.1 11.2 11.3 11.4
12.1 12.2 12.3 12.4
13.1 13.2 13.3 13.4

Pictograma

Pictogramas podem ser colocados no título da infobox com o parâmetro pictograma:

Título
Tópico
Rótulo dados
{{#invoke:Info|base
|título     = Título
|cor        = 12.3
|pictograma = Picto infobox map.png
|#tópico    : Tópico
|rótulo     : dados
}}

Imagem e legenda

A imagem pode ser inserida usando o rótulo #imagem e a legenda com o rótulo #legenda como no exemplo abaixo.

Imagem e legenda
#imagem Flatirons Winter Sunrise edit.jpg
#legenda esta é a legenda da imagem
{{#invoke:Info|base
|título   = Imagem e legenda
|#imagem  : Flatirons Winter Sunrise edit.jpg
|#legenda : esta é a legenda da imagem
}}

A imagem inserida pode estar no formato "exemplo.jpg" ou no formato "[[Ficheiro:exemplo.jpg|220px]]", caso esteja no segundo formato o módulo irá usar somente o nome da imagem, qualquer argumento como o tamanho será ignorado, o tamanho exibido será sempre 200px.

A legenda pode ser usada após uma imagem ou após qualquer outro campo, mesmo que a legenda esteja preenchida ela só será exibida se o campo acima contiver dados, e ela terá o texto menor (90%), então não é preciso usar <small>.

Fusão de infoboxes

É possível inserir uma infobox dentro da outra simplesmente colocando-a dentro de um campo como no exemplo abaixo.

Infobox principal
Rótulo A dados A
Rótulo B dados B
Infobox secundária (este título não aparece)
Tópico da segunda infobox
Rótulo 2A dados 2A
Rótulo 2B dados 2B
Infobox secundária (este título não aparece)
Tópico da terceira infobox
Rótulo 3A dados 3A
Rótulo 3B dados 3B
Rótulo C dados C
{{#invoke:Info|base
|título   = Infobox principal
|Rótulo A : dados A
|Rótulo B : dados B
{{#invoke:Info|base
|título = Infobox secundária (este título não aparece)
|#tópico : Tópico da segunda infobox
|Rótulo 2A : dados 2A
|Rótulo 2B : dados 2B
}}
{{#invoke:Info|base
|título = Infobox secundária (este título não aparece)
|#tópico : Tópico da terceira infobox
|Rótulo 3A : dados 3A
|Rótulo 3B : dados 3B
}}
|Rótulo C : dados C
}}

Ao incluir uma infobox dentro de outra lembre de usar infoboxes com a mesma cor e preste atenção aos campos que usam o Wikidata, pois mesmo que uma informação não for preenchida localmente ela pode ser preenchida com dados do Wikidata e fazer com que duas infoboxes fundidas tenham campos repetidos.

Contagem de campos

O número de campos das infoboxes são contados e por padrão a página é categorizada quando não tem nenhum campo, tem apenas 1 campo, tem apenas 2 campos e quando todos os campos são obtidos do Wikidata. Essa categorização ajuda a encontrar infoboxes que precisam de mais dados.

A contagem tambem pode ser modificada através dos parâmetros 'contar campos' e 'contar wikidata':

  • |contar campos=sim vai fazer a categorização ocorrer sempre, até 9 campos será usada a categoria '!Artigos com N campos' com N sendo o número de campos, infoboxes com 10 ou mais serão categorizadas na Categoria:!Infoboxes com 10 ou mais campos.
  • |contar campos=não vai desativar a contagem inclusive para 0, 1 e 2 campos.
  • |contar campos=X a Y vai fazer a categorização ocorrer no intervalo X a Y, por exemplo |contar campos=0 a 5 vai categorizar quando o número de campos estiver entre 0 e 5. O número 10 ou qualquer número maior que 10 será considerado 10 ou mais.
  • |contar wikidata=sim vai fazer a categorização específica para campos do Wikidata, até 9 campos será usada a categoria '!Artigos com N campos do Wikidata' com N sendo o número de campos que usam dados do Wikidata, infoboxes com 10 ou mais serão categorizadas na Categoria:!Infoboxes com 10 ou mais campos do Wikidata.
  • |contar wikidata=não vai desativar a categorização na Categoria:!Infoboxes em que todos campos são do Wikidata
  • |contar wikidata=X a Y vai fazer a categorização específica para campos do Wikidata ocorrer no intervalo X a Y, por exemplo |contar campos=0 a 5 vai categorizar quando o número de campos que usam dados do Wikidata estiver entre 0 e 5. O número 10 ou qualquer número maior que 10 será considerado 10 ou mais.

Extensões

O módulo pode ser estendido com um submódulo para adicionar funções especiais. Para usar por exemplo a extensão Módulo:Info/local use {{#invoke:Info|local em vez de usar o {{#invoke:Info|base.

Os submódulos devem retornar uma tabela, por exemplo ext, na qual deve haver uma tabela ext.especial com as funções especiais, por exemplo para que o rótulo '#nome' chame a função ext.especial['nome']. E se existir a função ext.extra, ela será chamada após o processamento dos campos, o que for retornado será colocado após a infobox.

Campo debug

Para facilitar a identificação de erros durante o preenchimento da infobox ou erros no funcionamento do módulo, o campo 'debug' pode ser usado de diferentes formas:

Campo resultado
| debug = vazio Exibe todos os campos que não foram preenchidos
| debug = campos Exibe o processamento dos campos no rodapé
| debug = erros Exibe erros durante o processamento no rodapé
| debug = wikidata Exibe processamento dos campos do Wikidata no rodapé

Ver também


m = {}

local cores = {
    {'#B60000', '#FFAFAF', '#FFD7D7', '#FFEBEB'},
    {'#B00058', '#FFABD5', '#FFD5EA', '#FFEAF5'},
    {'#840084', '#FFA4FF', '#FFD2FF', '#FFE9FF'},
    {'#5800B1', '#DAB5FF', '#EDDAFF', '#F6EDFF'},
    {'#2020C9', '#BFBFFF', '#DFDFFF', '#EFEFFF'},
    {'#0057AF', '#93C9FF', '#C9E4FF', '#E4F2FF'},
    {'#00626F', '#11E4FF', '#88F2FF', '#C4F9FF'},
    {'#00654E', '#27FFCF', '#93FFE7', '#C9FFF3'},
    {'#006800', '#7BFF7B', '#BDFFBD', '#DEFFDE'}, -- azul
    {'#4A6000', '#CFFF27', '#E7FF93', '#F3FFC9'},
    {'#655900', '#FFE411', '#FFF288', '#FFF9C4'},
    {'#8C4600', '#FFB56B', '#FFDAB5', '#FFEDDA'},
    {'#FFFFC0', '#FFFFC0', '', ''},               -- amarelo
    {'#E8E8E8', '#E8E8E8', '', ''},               -- cinza claro
    {'#585858', '#C7C7C7', '#E3E3E3', '#F1F1F1'}
}

montarinfo = function()
    partes = {}
    -- Cabeçalho --
    if params['cabeçalho'] then
        partes['cabeçalho'] = '<caption>' .. params['cabeçalho'] .. '</caption>'
    end
    -- Pictograma --
    if params['pictograma'] then
        local pictograma = {params['pictograma'], '33px'}
        if params['pictograma-ligação'] then
            table.insert(pictograma, 'link=http://pt.wikipedia.org/wiki/File:' .. params['pictograma-ligação'])
        end
        if params['pictograma-legenda'] then
            table.insert(pictograma, params['pictograma-legenda'])
        end
        partes['pictograma'] = '<div style="float: right; overflow: hidden; opacity: ' ..
          (params['opacidade'] or '0.4') .. '">[[Ficheiro:' .. table.concat(pictograma, '|') .. ']]</div>'
    end
    -- Título --
    partes['cor'] = cor1
    partes['título'] = params['título'] or pagename
    -- Subtítulo --
    if params['subtítulo'] then
        partes['subtítulo'] = '|-\n!colspan=2 style="text-align:center|' .. params['subtítulo'] .. '\n'
        if params['subtítulo2'] then
            partes['subtítulo'] = partes['subtítulo'] ..
              '|-\n!colspan=2 style="text-align:center"|' .. params['subtítulo2'] .. '\n'
        end
    end
    -- Imagem --
    local imagens = {}
    for i, n in ipairs({'', '2', '3'}) do
        if params['imagem' .. n] then
            local dominio, img = string.match(params['imagem' .. n], '^%[%[(%w+):([^%]%|%.\n]+%.%w%w%w%w?)[%]%|]')
            if dominio then
                for _, d in pairs({'Ficheiro', 'Imagem', 'File', 'Image', 'ficheiro', 'imagem', 'file', 'image'}) do
                    if dominio == d then
                        dominio = nil
                        break
                    end
                end
                if dominio then img = nil end
            else
                img = params['imagem' .. n]
            end
            if img then
                imagens[i] = '|-\n|colspan=2 style="text-align: center"|[[Ficheiro:' .. img .. '|200px]]'
            end
        end
    end
    if imagens then
        partes['imagem'] = table.concat(imagens, '\n')
    end
    -- Campos --
    local c = {}
    for _, campo in ipairs(campos) do
        if campo['tópico'] then -- TODO: verificar a necessidade de uma opção para ocultar
            table.insert(c, '|-\n|colspan=2 style="text-align:center; font-weight:bold;' .. cor2 .. '"|' .. campo['tópico'])
        elseif campo['rótulo'] and campo[1] then
            table.insert(c, '|-\n|scope="row" ' .. 'style="vertical-align:top; text-align:left; font-weight:bold;' .. cor3 .. '"|' .. campo['rótulo'] ..
               '\n|' .. (campo['wikidata'] and 'class="dadoswd" ' or '') .. 'style="vertical-align:top;"|' .. campo[1])
        elseif campo[1] then
            table.insert(c, '|-\n|colspan=2 ' .. (campo['wikidata'] and 'class="dadoswd" ' or '') ..
              'style="vertical-align: top; text-align: center;' .. cor3 .. '"|' .. campo[1])
        end
    end
    partes['campos'] = table.concat(c, '\n')
    -- Rodapé --
    if params['rodapé'] then
        partes['rodapé'] = '|-\n|colspan=2 style="text-align:center;' .. cor2 .. '"|' .. params['rodapé']
    elseif params['debug'] == 'campos' then
        partes['rodapé'] = '|-\n|colspan=2|<pre>' .. (debug or '(debug vazio)') .. '</pre>'
    end
    -- ver · editar --
    if string.match(nomebase, '^Predefinição:') then
        partes['ver-editar'] = '|-\n|colspan=2 class="plainlinks" style="text-align:right"|[[' .. nomebase .. '|ver]] · [https:' .. tostring( mw.uri.fullUrl( nomebase, 'veaction=edit&section=0' ) ) .. ' editar]'
    end
    -- Título do artigo itálico --
    if params['título itálico'] == 'forçar' then
        partes['itálico'] = frame:callParserFunction('DISPLAYTITLE', "''" .. mw.title.getCurrentTitle() .. "''")
    elseif params['título itálico'] == 'sim' then
        local titulo = mw.title.getCurrentTitle()
        local i = string.find(titulo, '(', 1, true)
        if i and i > 1 then
            titulo = "''" .. string.sub(titulo, 1, i - 1) .. "''" .. string.sub(titulo, i)
        else
            titulo = "''" .. titulo .. "''"
        end
        partes['itálico'] = frame:callParserFunction('DISPLAYTITLE', "''" .. titulo .. "''")
    end

    -- Coordenadas geográficas --
    if coortitulo then
        local pagename = '&pagename=' .. mw.uri.encode(mw.title.getCurrentTitle().fullText)
        local paramcoor = string.gsub(string.gsub(string.gsub(coortitulo, '[^0-9NSLO]+', '_'), 'O', 'W'), 'L', 'E')
        partes['coordenadas'] = [=[<div id="coordinates" class="noprint plainlinks" style="padding:0.5em">[[Coordenadas geográficas|Coordenadas]]: '''[//tools.wmflabs.org/geohack/geohack.php?language=pt]=] ..
          pagename .. '&params=' .. paramcoor .. ' <span title="Mapas, fotos aéreas e outros dados para este local">' ..
          coortitulo .. "</span>]'''</div>"
    end

    -- Categorias de número de campos --
    if ncampos then
        local num = ncampos == 0 and 'nenhum campo' or ncampos == 1 and '1 campo' or ncampos <= 10 and
          tostring(ncampos) .. ' campos' or 'mais de 10 campos'
        partes['catcampos'] = '[[Categoria:!Infoboxes com ' .. num .. ']]'
        if ncamposwd then
            num = ncamposwd == 0 and 'nenhum campo' or ncamposwd == 1 and '1 campo' or ncamposwd <= 10 and
              tostring(ncamposwd) .. ' campos' or 'mais de 10 campos'
             partes['catcampos'] = partes['catcampos'] .. '[[Categoria:!Infoboxes com ' .. num .. ' do Wikidata]]'
        end
    end

    -- Montar a partes --
    local template = [=[{|style="font-size: 90%; line-height: 1.1em; float:right; clear:right; margin:0 0 .5em 1em; width: 20em; border: 1px solid #C7C7C7; padding: 2px; background-color: #FAFAFA"
{ cabeçalho }
|-
!colspan=2 style="height:45px; vertical-align:middle; text-align:center; font-size:120%; font-weight:bolder; line-height:1.3em; position:relative;{ cor }"|{ pictograma }{ título }
{ subtítulo }
{ imagem }
{ campos }
{ rodapé }
{ ver-editar }
|}
{ itálico }
{ coordenadas }]=]
--{ catcampos }]=] desligar cats temporariamente
   infobox = string.gsub(template, '(\n?){ ([^}]+) }',
      function(nl, parte)
          if partes[parte] and partes[parte] ~= "" then
              return nl .. partes[parte] else return ''
          end
      end)
   return infobox
end

m.base = function (frame)
    baseframe = frame
    nomebase = frame:getParent():getTitle()
    params = {}
    local camposn = {}
    local camposv = {}
    for k, v in pairs(frame.args) do
        if v == '' then
            -- pass
        elseif string.match(k, '^%d+$') then
            local n = tonumber(k)
            local rotulo, dados = string.match(v, '^([^:]-):(.*)$')
            if rotulo then
                rotulo = string.gsub(rotulo, '^%s*(.-)%s*$', '%1')
                dados = string.gsub(dados, '^%s*(.-)%s*$', '%1')
                if rotulo == '#tópico' and dados ~= '' then
                    camposv[n] = {['tópico']=dados}
                    table.insert(camposn, n)
                elseif rotulo ~= '' and dados ~= '' then
                    camposv[n] = {['rótulo']=rotulo, dados}
                    table.insert(camposn, n)
                elseif dados ~= '' then
                    camposv[n] = {dados}
                    table.insert(camposn, n)
                end
            elseif v ~= '' then
                camposv[n] = {v}
                table.insert(camposn, n)
            end
        elseif string.match(k, '^tópico%d+%.?%d?$') or string.match(k, '^rótulo%d+%.?%d?$') or
          string.match(k, '^dados%d+%.?%d?$') then
            local tipo, n = string.match(k, '^([^%d]+)(%d+%.?%d?)$')
            if tipo == 'dados' then
                tipo = 1
            end
            n = tonumber(n)
            if v == '' then
                -- pass
            elseif camposv[n] then
                camposv[n][tipo] = v
            else
                camposv[n] = {[tipo]=v}
                table.insert(camposn, n)
            end
        else
            params[k] = v
        end
    end
    for k, v in pairs(camposv) do
        local t = {}
        for k, v in pairs(v) do table.insert(t, tostring(k) .. '=' .. tostring(v)) end
    end

    -- Ordenar os campos e agrupar dados de rótulos iguais --
    table.sort(camposn)
    campos = {}
    local rotulos = {}
    local i = 0
    for _, n in ipairs(camposn) do
        if camposv[n]['tópico'] then
            i = i + 1
            campos[i] = {['tópico']=camposv[n]['tópico']}
            camposv[n]['tópico'] = nil
        end
        if camposv[n]['rótulo'] then
            if rotulos[camposv[n]['rótulo']] then
                table.insert(campos[rotulos[camposv[n]['rótulo']]], camposv[n][1])
            else
                i = i + 1
                campos[i] = camposv[n]
                rotulos[camposv[n]['rótulo']] = i
            end
        elseif camposv[n][1] then
            i = i + 1
            campos[i] = camposv[n]
        end
    end
    camposn, camposv = nil, nil
    debug = {}
    for k, v in pairs(campos) do
        local t = {}
        for k, v in pairs(v) do table.insert(t, tostring(k) .. '=' .. tostring(v)) end
        table.insert(debug, k .. ' => {' .. table.concat(t, ', ') .. '}')
    end
    debug = table.concat(debug, '\n')

    -- Coordenadas --
    if params['coordenadas'] == 'wikidata' then
        --pass
    elseif params['coordenadas'] then
        coortitulo = coorgms(params['coordenadas'])
    elseif params['latd'] and params['longd'] then
        local coor = params['latd'] .. ' ' .. (params['latm'] or '') .. ' ' .. (params['lats'] or '') ..
          ' ' .. (params['latNS'] or '') .. ' ' .. params['longd'] .. ' ' .. (params['longm'] or '') ..
          ' ' .. (params['longs'] or '') .. ' ' .. (params['longEW'] or '')
        coortitulo = coorgms(coor)
    end

    -- Processar campos que pedem dados do Wikidata --
    importar = params['wikidata']
    verwikidata = {}
    if not importar or not (importar == 'sim' or importar == 'não') then
        importar = 'sim' -- padrão quando parâmetro wikidata não informado
    end
    if importar == 'sim' then
        for i, campo in ipairs(campos) do
            if campo[1] and string.match(campo[1], '^#wd:') then
                table.insert(verwikidata, i)
            end
        end
    else
        for i, campo in ipairs(campos) do
            for n, dados in ipairs(campo) do
                if not string.match(dados, '^#wd:') then
                    if n > 1 then
                        campos[i][1] = dados
                    end
                    break
                end
            end
        end
    end
    if #verwikidata > 0 or (params['coordenadas'] == 'wikidata' and importar == 'sim') then
        -- Só importa o módulo do Wikidata quando tiver campos do Wikidata
        require('Módulo:Info/wd')
        wd.infocampos()
    end
    for k, v in pairs(campos) do
        local t = {}
        for k, v in pairs(v) do table.insert(t, tostring(k) .. '=' .. tostring(v)) end
    end

    -- Contar número de campos e campos do Wikidata --
    ncampos = 0
    ncamposwd = 0
    for k, v in pairs(campos) do
        if v[1] then
            ncampos = ncampos + 1
            if v['wikidata'] then
                ncamposwd = ncamposwd + 1
            end
        end
    end

    -- Cor --
    if params['cor'] then
        local cor = string.upper(params['cor'])
        for _, matiz in ipairs(cores) do
            for i, c in ipairs(matiz) do
                if cor == c then
                    cor1 = 'background-color:' .. c
                    if i < 4 then
                        cor2 = 'background-color:' .. matiz[i + 1]
                        if i < 3 then
                            cor3 = 'background-color:' .. matiz[1 + 2]
                        else
                            cor3 = ''
                        end
                    else
                        cor2 = ''
                        cor3 = ''
                    end
                    break
                end
            end
        end
    end
    if not cor1 then
        cor1 = ''
        cor2 = ''
        cor3 = ''
    end

    return montarinfo()
end

coorgms = function(coor)
    local formato, hemi, lat, long
    local latn, longn
    for match in string.gmatch(coor, '[0-9%.NSLOWE]+') do
        if not formato then
            if string.match(match, '^%-?%d+%.%d+$') then
                formato = 'g.f'
                lat = match
                if string.match(match, '^%-') then
                    hemi = '+-'
                end
            elseif string.match(match, '^%d+$') then
                formato = 'gms'
                lat = match .. '°'
                latn = 1
            else
                return nil
            end
        elseif string.match(match, '^[NSLOEW]$') then
            if hemi == '+-' then
                return nil
            elseif formato == 'g.f' then
                if not long and match == 'S' then
                    lat = '-' .. lat
                elseif long and (match == 'O' or match == 'W') then
                    long = '-' .. long
                end
            else
                if long then
                    long = long .. ' ' .. (match == 'W' and 'O' or match == 'E' and 'L' or match)
                else
                    lat = lat .. ' ' .. match
                end
            end
            hemi = 'NSLO'
        elseif string.match(match, '^%d+$') then
            if not long and formato == 'gms' and latn < 3 and not string.match(lat, '[NS]$') then
                lat = lat .. ' ' .. match .. (latn == 1 and "'" or latn == 2 and '"')
                latn = latn + 1
            elseif not long and formato == 'gms' then
                long = match .. '°'
                longn = 1
            elseif long and formato == 'gms' and longn < 3 and not string.match(long, '[LO]$') then
                long = long .. ' ' .. match .. (longn == 1 and "'" or longn == 2 and '"')
                longn = longn + 1
            else
                return nil
            end
        elseif not long and formato == 'g.f' and string.match(match, '^%-?%d+%.%d+$') then
            long = match
        else
            return nil
        end
    end
    if formato == 'gms' then
        if not string.match(lat, '%d%d?° %d%d?\' %d%d?" [NS]') and not string.match(lat, '%d%d?° %d%d?\' [NS]')
          and not string.match(lat, '%d%d?° [NS]') then
            return 'erro nas coordenadas, lat = ' .. lat
        elseif not string.match(long, '%d%d?° %d%d?\' %d%d?" [LO]') and not string.match(long, '%d%d?° %d%d?\' [LO]')
          and not string.match(long, '%d%d?° [LO]') then
            return 'erro nas coordenadas, long = ' .. long
        end
    else
        lat, long = tonumber(lat), tonumber(long)
        local abs = math.abs(lat)
        local grau = math.floor(abs)
        local min = math.floor((abs - grau) * 60)
        local seg = math.floor(((abs - grau) * 60 - min) * 60)
        local hemi = lat >= 0 and 'N' or 'S'
        lat = string.format('%02d° %02d\' %02d" %s', grau, min, seg, hemi)
        abs = math.abs(long)
        grau = math.floor(abs)
        min = math.floor((abs - grau) * 60)
        seg = math.floor(((abs - grau) * 60 - min) * 60)
        hemi = long >= 0 and 'O' or 'L'
        long = string.format('%02d° %02d\' %02d" %s', grau, min, seg, hemi)
    end
    return string.gsub(lat, ' ', '&nbsp;') .. ' ' .. string.gsub(long, ' ', '&nbsp;')
end

return m