Módulo:Manutenção

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

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