Módulo:Manutenção
Este módulo é usado em 150 000+ páginas. (Ver Wikipedia:Predefinições em alto risco) 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 é responsável por colocar as categorias de manutenção por data e assunto nas marcas de manutenção, o que antigamente era feito pela {{Manutenção/Categorizando por assunto}}.
Uso
Coloque no código da predefinição de manutenção:
{{#invoke:manutenção|categorizar|tipo de manutenção}}
Isso vai fazer com que os artigos em que a marca de manutenção for colocada sejam categorizados em "!Artigos tipo de manutenção", se for indicada data categoriza em "!Artigos tipo de manutenção data", e se for indicado assunto categoriza em "!Artigos de assunto tipo de manutenção".
Opcionalmente pode ser indicado no parâmetro seção um tipo de manutenção diferente para quando o primeiro parâmetro da marca de manutenção for "Esta seção"
{{#invoke:manutenção|categorizar|tipo de manutenção|seção=outro tipo de manutenção}}
Exemplo
Por exemplo se for colocado no código da {{sem fontes}}
{{#invoke:manutenção|categorizar|que carecem de fontes|seção=que necessitam de referências adicionais}}
e a marca for usada em um artigo da seguinte forma
{{sem fontes|data=novembro de 2015||arte}}
serão adicionadas as categorias "!Artigos que carecem de fontes desde novembro de 2015" e "!Artigos de arte que carecem de fontes". Já se for usado
{{sem fontes|Esta seção|data=abril de 2020}}
será adicionada a categoria "!Artigos que necessitam de referencias adicionais desde abril de 2020".
Primeiro argumento na marca de manutenção
As marcas de manutenção geralmente usam o primeiro argumento para colocar "Esta seção" quando a marca é inserida em uma seção, mas para garantir compatibilidade com predefinições fora do padrão o módulo também procura a data e o assunto no primeiro argumento. Se o primeiro argumento não começar por "Esta " ou "Este " e não for data e nem assunto a página é colocada na Categoria:!Páginas com argumentos incorretos em marca de manutenção. Opcionalmente pode-se usar o parâmetro |arg1=
para indicar um Lua pattern para testar se o primeiro argumento da marca está correto, substituindo o ^Este[ae] .
, que é o padrão.
Categorias de datas
Quando for indicada uma data válida mas não existir a categoria do mês, o módulo irá colocar na categoria do ano, mesmo se a categoria do ano não existir. Se for indicado o ano como data, também se usada a categoria de ano.
Se uma data não for indicada na marca de manutenção é colocada a categoria genérica.
É possível também indicar uma segunda categoria para data usando o parâmetro |cat2=
. Essa segunda categoria deve ser passada por completo, como no exemplo abaixo:
{{#invoke:manutenção|categorizar|que carecem de fontes|cat2=!Biografias de pessoas vivas sem fontes}}
Isso irá categorizar tanto em "!Artigos que carecem de fontes desde ..." quanto em "!Biografias de pessoas vivas sem fonte desde...".
Categorias de assunto
Somente serão considerados os assuntos configurados no início do código do módulo.
Se um assunto não for informado a página será categorizada em "!Artigos tipo de manutenção sem indicação de tema", se essa categoria existir. Se um assunto válido é informado e a categoria do assunto ainda não existir, a página é categorizada em "!Artigos tipo de manutenção por assunto" ou "!Artigos tipo de manutenção por tema", se uma dessas categorias existirem.
-- Configuração dos assuntos
local assuntos = {
['de ambiente'] = {'ambiente', 'amb'},
['de arte'] = {'arte'},
['de biografia'] = {'biografia', 'bio'},
['de biografia histórica'] = {'bioh'},
['do Brasil'] = {'brasil', 'bra', 'br'},
['de ciência'] = {'ciência', 'ciencia', 'ci'},
['sobre cinema e TV'] = {'cinema', 'cine', 'tv'},
['de economia'] = {'economia', 'eco'},
['de empresa'] = {'empresa', 'emp'},
['de esporte'] = {'esporte', 'desp', 'esp'},
['de ficção'] = {'ficção', 'fic'},
['de futebol'] = {'futebol', 'fut'},
['de geografia'] = {'geografia', 'geo'},
['de geografia (África)'] = {'geo-af'},
['de geografia (América)'] = {'geo-am'},
['de geografia (Europa)'] = {'geo-eu'},
['de geografia (Extremo Oriente)'] = {'geo-eo'},
['de geografia (Médio Oriente)'] = {'geo-mo'},
['de geografia (Oceania/Pacífico)'] = {'geo-oc'},
['de história'] = {'história', 'hist'},
['de história (África)'] = {'hist-af'},
['de história (América)'] = {'hist-am'},
['de história (Europa)'] = {'hist-eu'},
['de história (Extremo Oriente)'] = {'hist-eo'},
['de história (Médio Oriente)'] = {'hist-mo'},
['de história (Oceania/Pacífico'] = {'hist-oc'},
['de jogo'] = {'jogo'},
['de localidade'] = {'localidade', 'loc'},
['de lusofonia'] = {'lusofonia', 'lusof'},
['de música'] = {'música', 'musica', 'mús', 'mus'},
['de política'] = {'política', 'pol'},
['de Portugal'] = {'portugal', 'por', 'pt'},
['de sociedade'] = {'sociedade', 'soc'},
['de saúde'] = {'saúde'},
['de tecnologia'] = {'tecnologia', 'tec'}
}
local m = {}
m.assuntos = {}
-- inverte a tabela, de {['de ambiente']={'ambiente', 'amb'}, ...} para {['ambiente']='de ambiente', ['amb']='de ambiente', ...}
for v, t in pairs(assuntos) do
for _, k in ipairs(t) do
m.assuntos[k] = v
end
end
assuntos = nil
-- verifica se o mês é válido e retorna o mês em letra minúscula
local valida_mes = function(mes)
local meses = {'[Jj]aneiro', '[Ff]evereiro', '[Mm]arço', '[Aa]bril', '[Mm]aio', '[Jj]unho',
'[Jj]ulho', '[Aa]gosto', '[Ss]etembro', '[Oo]utubro', '[Nn]ovembro', '[Dd]ezembro'}
for n, m in ipairs(meses) do
if string.find(mes, '^' .. m .. ' de %d+$') then
return string.lower(mes)
end
end
end
m.categorizar = function(frame)
local config = frame.args
local catbase, mes
local cats = {}
-- Esta função é só para manutenção de artigos
if mw.title.getCurrentTitle().namespace ~= 0 then
return
end
if config['1'] then
catbase = config['1']
else
return
end
local catsecao = config['seção']
local arg1 = config['arg1'] or '^Est[ae] .'
local cat2 = config ['cat2']
local args = frame:getParent().args or {}
local secao = args['1'] and string.find(args['1'], '^Esta sec?ção')
if secao and catsecao then
catbase = catsecao
elseif args['1'] and args['1'] ~= '' then
-- permite passar a data no primeiro argumento
if valida_mes(args['1']) or string.match(args['1'], '^2%d%d%d$') then
mes = args['1']
-- se o primeiro argumento não é um assunto e não começa com Este ou Esta
elseif not m.assuntos[args['1']] and not mw.ustring.find(args['1'], arg1) then
table.insert(cats, '!Páginas com argumentos incorretos em marca de manutenção')
end
end
-- categoria de data
mes = mes or args['data'] or args['Data'] or args['date'] or args['Date']
if mes then
local vmes = valida_mes(mes)
if not vmes then
local ano = string.match(mes, '^2%d%d%d$')
if ano then
mes = ano
else
table.insert(cats, '!Páginas com parâmetro de data formatado incorretamente')
mes = nil
end
else
mes = vmes
end
end
if mes then
local cat = '!Artigos ' .. catbase .. ' desde ' .. mes
if mw.title.new(cat, 14).exists then
table.insert(cats, cat)
else
-- se a categoria de mês não existir tenta ver se existe o mês com letra maiúscula
cat = '!Artigos ' .. catbase .. ' desde ' .. string.gsub(mes, '^%a', string.upper)
if mw.title.new(cat, 14).exists then
table.insert(cats, cat)
else
-- se também não existe, tenta colocar somente o ano
local ano = string.match(mes, '2%d%d%d')
if ano then
table.insert(cats, '!Artigos ' .. catbase .. ' desde ' .. ano)
-- senão coloca na categoria base
else
table.insert(cats, '!Artigos ' .. catbase)
end
end
end
-- se tiver cat2, repete tudo para cat2
if cat2 then
cat = cat2 .. ' desde ' .. mes
if mw.title.new(cat, 14).exists then
table.insert(cats, cat)
else
cat = cat2 .. ' desde ' .. string.gsub(mes, '^%a', string.upper)
if mw.title.new(cat, 14).exists then
table.insert(cats, cat)
else
local ano = string.match(mes, '2%d%d%d')
if ano then
table.insert(cats, cat2 .. ' desde ' .. ano)
else
table.insert(cats, cat2)
end
end
end
end
else -- não tem data válida, coloca a categoria base
table.insert(cats, '!Artigos ' .. catbase)
if cat2 then
table.insert(cats, cat2)
end
end
-- categoria de assunto
local algum = false
local semcat = false
for k, v in pairs(args) do
if string.find(k, '^%d%d-$') then
v = string.lower(v)
if m.assuntos[v] then
algum = true
local cat = '!Artigos ' .. m.assuntos[v] .. ' ' .. catbase
if mw.title.new(cat, 14).exists then
table.insert(cats, cat)
else
semcat = true
end
end
else
k = string.lower(k)
if m.assuntos[k] and v ~= '' then
algum = true
local cat = '!Artigos ' .. m.assuntos[k] .. ' ' .. catbase
if mw.title.new(cat, 14).exists then
table.insert(cats, cat)
else
semcat = true
end
end
end
end
if not algum then
local cat = '!Artigos ' .. catbase .. ' sem indicação de tema'
if mw.title.new(cat, 14).exists then
table.insert(cats, cat)
end
elseif semcat then
local cat = '!Artigos ' .. catbase .. ' por assunto'
local cat2 = '!Artigos ' .. catbase .. ' por tema'
if mw.title.new(cat, 14).exists then
table.insert(cats, cat)
elseif mw.title.new(cat2, 14).exists then
table.insert(cats, cat2)
end
end
-- finalizando
for i, cat in ipairs(cats) do
cats[i] = '[[Categoria:' .. cat .. ']]'
end
return table.concat(cats)
end
return m