Módulo:Check for unknown parameters
Para evitar sobrecargas desnecessárias ao servidor e outros transtornos, quaisquer mudanças devem ser previamente testadas, seja na subpágina de testes deste módulo, na subpágina de testes de módulos (ou ainda em sua subpágina de testes). Por favor, sempre considere expor eventuais mudanças na página de discussão, antes de implementá-las. |
![]() | Este módulo depende dos seguintes outros módulos: |
Este módulo pode ser anexado a uma predefinição para verificar o uso de parâmetros desconhecidos. Diferentemente de muitos outros módulos, este módulo não é implementado por uma predefinição.
Uso
Uso básico
{{#invoke:Check for unknown parameters|check
|unknown=[[Categoria:Alguma categoria de manutenção]]
|arg1|arg2|arg3|argN}}
ou para classificar as entradas na categoria de manutenção por parâmetro com uma mensagem de erro de visualização
{{#invoke:Check for unknown parameters|check
|unknown=[[Categoria:Alguma categoria de manutenção|_VALUE_]]
|preview=parâmetro desconhecido "_VALUE_"
|arg1|arg2|...|argN}}
ou para uma mensagem de erro vermelha explícita
{{#invoke:Check for unknown parameters|check
|unknown=<span class="error">Desculpe, eu não reconheço _VALUE_</span>
|arg1|arg2|...|argN}}
Aqui, arg1
, arg2
, ..., argN
, são os parâmetros conhecidos. Parâmetros sem nome (posicionais) também podem ser adicionados: |1|2|nomedoarg1|nomedoarg2|...
. Qualquer parâmetro que for usado, mas não estiver nesta lista, fará com que o módulo retorne o que for passado com o parâmetro unknown
. A palavra-chave _VALUE_
, se for utilizada, será alterada para o nome do parâmetro. Isso é útil tanto para classificar as entradas em uma categoria de rastreamento quanto para fornecer informações mais explícitas.
Por padrão, o módulo não faz distinção entre um parâmetro definido, mas em branco, e um parâmetro que não está em branco. Isto é, tanto |foo=x
quanto |foo=
, se não forem listados, são reportados. Para rastrear somente parâmetros que não estiverem em branco, use |ignoreblank=1
.
Por padrão, o módulo ignora os parâmetros posicionais em branco. Ou seja, um |2=
que não estiver listado é ignorado. Para incluir parâmetros posicionais em branco no rastreamento use |showblankpositional=1
.
Padrões Lua
Este módulo suporta Infobox3cols usa
regexp1 = "header[%d]+",
regexp2 = "label[%d]+",
regexp3 = "data[%d]+[abc]?",
regexp4 = "class[%d]+[abc]?",
regexp5 = "rowclass[%d]+",
regexp6 = "rowstyle[%d]+",
regexp7 = "rowcellstyle[%d]+",
para corresponder a todos os parâmetros do formulário headerNUM
, labelNUM
, dataNUM
, dataNUMa
, dataNUMb
, dataNUMc
, ..., rowcellstyleNUM
, onde NUM é uma sequência (string) de dígitos.
Exemplo
{{Infobox
| above = {{{name|{{{nome|}}}}}}
| label1 = Altura
| data1 = {{{height|{{{altura|}}}}}}
| label2 = Peso
| data2 = {{{weight|{{{peso|}}}}}}
| label3 = Website
| data3 = {{{website|}}}
}}<!--
Término da caixa de informações, início do rastreamento
-->{{#invoke:Check for unknown parameters|check
| unknown = {{Testes outro|[[Categoria:Alguma categoria de manutenção|_VALUE_]]}}
| preview = parâmetro "_VALUE_" desconhecido
| name | nome
| height | altura
| weight | peso
| website
}}
Chamada de dentro de código Lua
Veja o final de Flag para exemplos mais complicados.
-- Este módulo pode ser usado para comparar os argumentos passados para o parental (superior)
-- com uma lista de argumentos, retornando um resultado especificado se um argumento
-- não estiver na lista
require ('strict');
local p = {}
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
local function isnotempty(s)
return s and s:match('%S')
end
local function clean(text)
-- Retorna o texto limpo para exibição e truncado se for muito longo.
-- Os marcadores de faixa são substituídos por um texto fictício que
-- representa o texto wiki original.
local pos, truncated
local function truncate(text)
if truncated then
return ''
end
if mw.ustring.len(text) > 25 then
truncated = true
text = mw.ustring.sub(text, 1, 25) .. '...'
end
return mw.text.nowiki(text)
end
local parts = {}
for before, tag, remainder in text:gmatch('([^\127]*)\127[^\127]*%-(%l+)%-[^\127]*\127()') do
pos = remainder
table.insert(parts, truncate(before) .. '<' .. tag .. '>...</' .. tag .. '>')
end
table.insert(parts, truncate(text:sub(pos or 1)))
return table.concat(parts)
end
function p._check(args, pargs)
if type(args) ~= "table" or type(pargs) ~= "table" then
-- TODO: Manipulação de erros
return
end
-- cria a lista de argumentos conhecidos, expressões regulares e a sequência
-- ('string') de retorno
local knownargs = {}
local regexps = {}
for k, v in pairs(args) do
if type(k) == 'number' then
v = trim(v)
knownargs[v] = 1
elseif k:find('^regexp[1-9][0-9]*$') then
table.insert(regexps, '^' .. v .. '$')
end
end
-- faz um "loop" sobre os argumentos parentais (superiores) e verifica
-- se eles estão na lista
local ignoreblank = isnotempty(args['ignoreblank'])
local showblankpos = isnotempty(args['showblankpositional'])
local values = {}
for k, v in pairs(pargs) do
if type(k) == 'string' and knownargs[k] == nil then
local knownflag = false
for _, regexp in ipairs(regexps) do
if mw.ustring.match(k, regexp) then
knownflag = true
break
end
end
if not knownflag and ( not ignoreblank or isnotempty(v) ) then
table.insert(values, clean(k))
end
elseif type(k) == 'number' and knownargs[tostring(k)] == nil then
local knownflag = false
for _, regexp in ipairs(regexps) do
if mw.ustring.match(tostring(k), regexp) then
knownflag = true
break
end
end
if not knownflag and ( showblankpos or isnotempty(v) ) then
table.insert(values, k .. ' = ' .. clean(v))
end
end
end
-- adiciona os resultados às tabelas de saída
local res = {}
if #values > 0 then
local unknown_text = args['unknown'] or 'Found _VALUE_, '
if mw.getCurrentFrame():preprocess( "{{REVISIONID}}" ) == "" then
local preview_text = args['preview']
if isnotempty(preview_text) then
preview_text = require('Módulo:If preview')._warning({preview_text})
elseif preview_text == nil then
preview_text = unknown_text
end
unknown_text = preview_text
end
for _, v in pairs(values) do
-- Corrige (contorna) a falha ('bug') estranha para | = que é removido para
-- a sequência ('string') vazia e quebra as ligações ('links') para categorias
if v == '' then v = ' ' end
-- evita erro com v = 'example%2' ("índice de captura inválido")
local r = unknown_text:gsub('_VALUE_', {_VALUE_ = v})
table.insert(res, r)
end
end
return table.concat(res)
end
function p.check(frame)
local args = frame.args
local pargs = frame:getParent().args
return p._check(args, pargs)
end
return p