Módulo:Info – Wikipédia, a enciclopédia livre

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
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
Tópico da segunda infobox
Rótulo 2A dados 2A
Rótulo 2B dados 2B
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


-- Tabela para funções especiais chamadas colocando # no começo do rótulo ou dados local especial = {}  -- Tabela para tabelas de debug debug = {} debug.erros = {}  -- Cores padrões -- local cores = { -- tons das linhas: {'escuro', 'mediano', 'claro', 'bem claro'}     {'#B60000', '#FFAFAF', '#FFD7D7', '#FFEBEB'}, -- vermelho     {'#B00058', '#FFABD5', '#FFD5EA', '#FFEAF5'}, -- bordô     {'#840084', '#FFA4FF', '#FFD2FF', '#FFE9FF'}, -- púrpura     {'#5800B1', '#DAB5FF', '#EDDAFF', '#F6EDFF'}, -- roxo     {'#2020C9', '#BFBFFF', '#DFDFFF', '#EFEFFF'}, -- azul     {'#0057AF', '#93C9FF', '#C9E4FF', '#E4F2FF'}, -- azul~ciano     {'#00626F', '#11E4FF', '#88F2FF', '#C4F9FF'}, -- ciano     {'#00654E', '#27FFCF', '#93FFE7', '#C9FFF3'}, -- verde~ciano     {'#006800', '#7BFF7B', '#BDFFBD', '#DEFFDE'}, -- verde     {'#4A6000', '#CFFF27', '#E7FF93', '#F3FFC9'}, -- verde~amarelo     {'#655900', '#FFE411', '#FFF288', '#FFF9C4'}, -- amarelo     {'#8C4600', '#FFB56B', '#FFDAB5', '#FFEDDA'}, -- laranja     {'#585858', '#C7C7C7', '#E3E3E3', '#F1F1F1'}  -- cinza }  -- Função para montar a infobox depois que os parâmetros foram pré-processados local montarinfo = function(extra)     local partes = {}     -- Cabeçalho --     if params['cabeçalho'] then         partes['cabeçalho'] = '<caption>' .. params['cabeçalho'] .. '</caption>'     end     -- Pictograma --     if params['pictograma'] and string.match(params['pictograma'], '^[^%]%[:]+%.%a%a%a%a?$') then         partes['pictograma'] = '<div style="position:absolute; top:0; right:0;' ..           '">[[Ficheiro:' .. params['pictograma'] .. '|' .. 'x45px]]</div>'     end     -- Título --     partes['cor'] = cor1     partes['título'] = params['título']     if partes['pictograma'] then         -- é preciso colocar o título dentro de um elemento com position para ficar acima do pictograma         partes['título'] = '<div style="position:relative">' .. partes['título'] .. '</div>'     end     -- Campos --     local c = {}     local vazio = params['debug'] == 'vazio'     local i = 1     while i <= #campos do         local campo = campos[i]         if campo['tópico'] then             local n = i + 1             while campos[n] do                 if campos[n][1] and campos[n][1] ~= '' then                     table.insert(c, '|-\n|colspan=2 style="text-align:center; font-weight:bold;' .. cor2 .. '"|' ..                       campo['tópico'])                     break                 elseif campos[n]['tópico'] then                     break                 end                 n = n + 1             end         elseif campo['rótulo'] and (campo[1] or vazio) 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; text-align:left;"|' .. (campo[1] or '(vazio)'))         elseif campo[1] or vazio then             table.insert(c, '|-\n|colspan=2 ' .. (campo['wikidata'] and 'class="dadoswd" ' or '') ..               'style="vertical-align: top; text-align: center' .. (campo['peq'] and '; font-size: 90%' or '') ..               '"|' .. (campo[1] or '(vazio)'))         elseif campo['info'] then -- infobox incluída em um campo             table.insert(c, campo['info'])         end         i = i + 1     end     partes['campos'] = table.concat(c, '\n')     -- Rodapé --     if params['rodapé'] then         partes['rodapé'] = '|-\n|colspan=2 style="text-align:center;' .. cor2 .. '"|' .. params['rodapé']     end     if params['nome'] and string.match(params['nome'], '^Predefinição:') then         partes['ver-editar'] = '|-\n|colspan=2 class="plainlinks" style="text-align:right"|[[' ..         params['nome'] .. '|ver]]'     end     -- Extra (geralmente categorias) --         partes['extra'] = extra     -- Debug --     if params['debug'] and type(debug[params['debug']]) == 'table' then         local lista = table.concat(debug[params['debug']], '\n')         if lista == '' then             lista = '(debug vazio)'         end         partes['rodapé'] = '|-\n|colspan=2|<pre>' .. lista .. '</pre>'     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 '10 ou mais campos'         partes['catcampos'] = '[[Categoria:!Infoboxes com ' .. num .. ']]'     end     if ncamposwd then         local num = ncamposwd == 0 and 'nenhum campo' or ncamposwd == 1 and '1 campo' or ncamposwd < 10 and           tostring(ncamposwd) .. ' campos' or '10 ou mais campos'         partes['catcampos'] = (partes['catcampos'] or '') .. '[[Categoria:!Infoboxes com ' .. num .. ' do Wikidata]]'     end     if todoscamposwd then         partes['catcampos'] = (partes['catcampos'] or '') ..           '[[Categoria:!Infoboxes em que todos campos são do Wikidata]]'     end      -- Montar a partes --     local template = [=[{|class="infobox" style="font-size:90%; line-height:1.2em; float:right; clear:right; margin:0 0 .5em 1em; width:20em; border:1px solid #C7C7C7; padding:2px; background-color:#FAFAFA; border-spacing:3px" { 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 } { campos } { rodapé } { ver-editar } |} { extra } { catcampos }]=]    local 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  -- Campos com rótulo '#imagem' adicionam imagens com 200px de largura especial.imagem = function(campo)     if not campo[1] then         return nil     end     local dominio, img = string.match(campo[1], '^%[%[(%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     elseif string.match(campo[1], '^[^%]%|%.\n]+%.%w%w%w%w?$') then         img = campo[1]     end     if img then         campo['rótulo'] = nil         campo[1] = '[[Ficheiro:' .. img .. '|200px]]'         return campo     else         table.insert(debug.erros, 'nome de imagem não encontrado em "' .. campo[1] .. '"')         return nil     end end  -- Campos com rótulo '#legenda' adicionam texto sem rótulo com letra menor quando existe dados no campo acima especial.legenda = function(campo, i)     if campo[1] and campos[i - 1] and campos[i - 1][1] and campos[i - 1][1] ~= '' then         local small = string.match(campo[1], '^<small>(.*)</small>$')         return {small or campo[1], ['peq'] = true, ['wikidata'] = campo[1]['wikidata']}     else         return nil     end end  -- Separa uma infobox incluída dentro de um campo local subInfo = function(str)     local pos = str:find('\n{|class="infobox')     local campo = str:sub(1, pos - 1)     local infos = {}     while pos do         local inicio = pos         pos = str:find('\n{|class="infobox', pos + 1)         local info = str:sub(inicio, pos)         inicio = info:find'\n|%-\n|'         local p, fim = inicio         while p do             fim = p - 1             p = info:find('\n|}', p + 1)         end         if inicio then             table.insert(infos, info:sub(inicio + 1, fim))         end     end     return campo, table.concat(infos, '\n') end  -- Função principal local base = function(args, nomebase, estender)     local title = mw.title.getCurrentTitle()     local namespace = title.namespace     local vazio = args['debug'] == 'vazio'     local extra      params = {}     -- Para ordenar as chaves de uma tabela em Lua é necessário separar a tabela em duas:     local camposn = {} -- tabela para guardar os números dos campos     local camposv = {} -- tabela para guardar os valores dos campos     for k, v in pairs(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 ~= '' then                     camposv[n] = {['rótulo']=rotulo, dados}                     table.insert(camposn, n)                 elseif dados ~= '' then                     camposv[n] = {dados}                     table.insert(camposn, n)                 elseif vazio and rotulo ~= '' then                     camposv[n] = {['rótulo']=rotulo, '(vazio)'}                     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     local estender = estender or params['estender']     params['título'] = params['título'] or title.text     params['nome'] = params['nome'] or nomebase      -- Cor --     if params['cor'] then         local matiz, tom = string.match(params['cor'], '(%d%d?)%.(%d)')         local cor         if matiz and tonumber(tom) <= 4 then             cor = cores[tonumber(matiz)][tonumber(tom)]         else             cor = string.upper(params['cor'])         end         for _, matiz in ipairs(cores) do             for i, c in ipairs(matiz) do                 if cor == c then                     if i == 1 then                         cor1 = ' background-color:' .. c .. '; color:#FFFFFF'                         i = 2                     else                         cor1 = ' background-color:' .. c                     end                     if i < 4 then                         cor2 = ' background-color:' .. matiz[i + 1]                         if i < 3 then                             cor3 = ' background-color:' .. matiz[i + 2]                         else                             cor3 = ''                         end                     else                         cor2 = ''                         cor3 = ''                     end                     break                 end             end         end     end     if not cor1 then         cor1 = ''         cor2 = ''         cor3 = ''     end      -- Ordenar os campos e agrupar dados de rótulos iguais --     table.sort(camposn)     campos = {}     if params['debug'] == 'campos' then         debug.campos = {}     end     local i = 0     if params['subtítulo'] then        i = 1        campos[1] = {params['subtítulo']}     end     for _, n in ipairs(camposn) do         -- Como no preenchimento antigo existem tópicos e rótulos/dados com o mesmo número,         -- é necessário ordenar desta forma para colocar os dados um número a frente do tópico         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             -- junta campos de mesmo rótulo             if #campos > 0 and camposv[n]['rótulo'] == campos[i]['rótulo'] then                 table.insert(campos[i], camposv[n][1])             else                 i = i + 1                 campos[i] = camposv[n]             end         elseif camposv[n][1] then             i = i + 1             campos[i] = camposv[n]         end         if campos[i][1] and string.match(campos[i][1], '\n{|class="infobox') then             local info             campos[i][1], info = subInfo(campos[i][1])             if info and info ~= '' then                 i = i + 1                 campos[i] = {['info'] = info}             end         end         -- para debug         if debug.campos then             local t = {}             for k, v in pairs(campos[i]) do                 table.insert(t, tostring(k) .. '=' .. tostring(v))             end             table.insert(debug.campos, i .. ' => {' .. table.concat(t, ', ') .. '}')         end     end     camposn, camposv = nil, nil      -- Imagens e legendas no formato antigo --     for i, n in ipairs({'', '1', '2', '3'}) do         if params['imagem' .. n] then 	    table.insert(campos, 1, {['rótulo']='#imagem', params['imagem' .. n]}) 	    if params['legenda' .. n] or params['imagem_legenda' .. n] then 	        table.insert(campos, 2, {params['legenda' .. n] or params['imagem_legenda' .. n]}) 	    end         end     end      -- Chamar extenção     local ext     local especial = especial     if estender then         local title = mw.title.new('Módulo:Info/' .. estender)         if title.exists then             ext = require('Módulo:Info/' .. estender)             if ext.especial then                 for k, v in pairs(ext.especial) do                     especial[k] = v                 end             end             if ext.campos then                 ext.campos(campos)             end         end     end      -- Processar campos que pedem dados do Wikidata, funções especiais e remove dados vazios --     wdEntity = mw.wikibase.getEntity(params['item'] and params['item']:match('^Q%d+$'))     local importar = params['wikidata'] ~= 'não'     for i, campo in ipairs(campos) do         while campo[1] do             local arg = string.match(campo[1], '^#[Ww][Dd]: *(.*)')             if arg and importar then                 if not wd or not debug.wikidata then                     -- Só importa o módulo do Wikidata quando tiver campos do Wikidata                     require('Módulo:Info/' .. (params['wd'] or 'wd'))                     debug.wikidata = {}                 end                 local dados = wd.expandir(arg)                 if dados then                     campo[1] = dados                     campo['wikidata'] = true                     break                 else                     table.remove(campo, 1)                 end                 if wd.temp.debug then                     table.insert(debug.wikidata, wd.temp.debug)                     wd.temp = {}                 end             elseif arg or campo[1] == '' then                 table.remove(campo, 1)             else                 break             end         end         local esp = campo['rótulo'] and string.match(campo['rótulo'], '^#(.*)') or nil         if esp and especial[esp] then             campos[i] = especial[esp](campo, i) or {}         end     end     if ext and ext.extra then         extra = ext.extra()     end      -- Contar número de campos e campos do Wikidata --     local contarmin, contarmax = 0, 2     local contarwdmin, contarwdmax     local contarwdtodos = true     if namespace ~= 0 then  -- só categoriza por padrão em artigos         contarmin, contarmax, contarwdtodos = nil, nil, nil     end     if params['contar campos'] then         contarmin, contarmax = string.match(params['contar campos'], '(%d%d?)[^%d]*(%d%d?)')         if contarmin then             contarmin, contarmax = tonumber(contarmin), math.min(10, tonumber(contarmax))         elseif params['contar campos'] == 'sim' then             contarmin, contarmax = 0, 10         elseif params['contar campos'] == 'não' then             contarmin, contarmax = nil, nil         end     end     if params['contar wikidata'] then         contarwdmin, contarwdmax = string.match(params['contar wikidata'], '(%d%d?)[^%d]*(%d%d?)')         if contarwdmin then             contarwdmin, contarwdmax = tonumber(contarwdmin), math.min(10, tonumber(contarwdmax))         elseif params['contar wikidata'] == 'sim' then             contarwdmin, contarwdmax = 0, 10         elseif params['contar wikidata'] == 'não' then             contarwdtodos = false         end     end     if contarmin or contarwdmin or contarwdtodos then         ncampos, ncamposwd = 0, 0         for k, v in pairs(campos) do             if v[1] then                 ncampos = ncampos + 1             end             if v[1] and v['wikidata'] then                 ncamposwd = ncamposwd + 1             end         end         if contarwdtodos then             todoscamposwd = ncampos >= 1 and ncampos == ncamposwd -- se todos os campos são do Wikidata         end         if not contarmin or (ncampos < tonumber(contarmin) or ncampos > contarmax) then             ncampos = false         end         if not contarwdmin or (ncamposwd < tonumber(contarwdmin) or ncamposwd > contarwdmax) then             ncamposwd = false         end     end      -- Categoria de artigos bons e destacados em Wikipédias de outras línguas     if namespace == 0 and wdEntity and wdEntity['sitelinks'] then         local cats = {}         local badges = {['Q17437796'] = '!Artigos destacados', ['Q17437798'] = '!Artigos bons',           ['Q17506997'] = '!Listas destacadas'}         for wiki, sitelink in pairs(wdEntity['sitelinks']) do             for _, badge in ipairs(sitelink['badges']) do                 if badges[badge] and wiki:match('wiki$') then                     table.insert(cats, {badges[badge], wiki:match('^(.+)wiki$')})                 end             end         end         if #cats > 0 then -- só carrega a lista de prefixos se for usar             prefixos = mw.loadData('Módulo:Prefixos de língua')             for i, cat in ipairs(cats) do                 local lingua = prefixos[cat[2]]                 cats[i] = lingua and '[[Categoria:' .. cat[1] .. ' na Wikipédia em ' .. lingua .. ']]' or ''             end             extra = (extra or '') .. table.concat(cats)         end     end      return montarinfo(extra, debug) end  local m, mt = {}, {}  m.base = function(frame)     local parent = frame:getParent()     return base(frame.args, parent and parent:getTitle()) end  mt.__index = function(t, k)     return function(frame)         local parent = frame:getParent()         return base(frame.args, parent and parent:getTitle(), k)     end end  return setmetatable(m, mt)