Módulo:Manutenção

-- 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