Módulo:ECD

Origem: Wikipédia, a enciclopédia livre.
Documentação do módulo[ver] [editar] [histórico] [purgar]

Módulo usado como {{#invoke:ECD|ARTIGO}} para gerar a lista de artigos a destacar.

local m = {}

function m.EAD (frame)
  -- Esta é a função antiga que não é mais usada, ela é mantida apenas para permitir a visualização
  -- correta de versões antigas da EAD/Lista, a versão atualmente usada é a m.link
  
  local page = frame.args[1]
  return m.placar(page)
end

function m.link (frame)
  -- Função que gera a linha da tabela em [[Wikipédia:Escolha do artigo em destaque/Lista]]

  local titulo = frame.args[1]
  local title = mw.title.new('Wikipédia:Escolha do artigo em destaque/' .. titulo)
  local page = title:getContent()
  
  local placar = m.placar(page)
  
  -- Colocando os dados na tabela
  local template = [=[|-
|[[Wikipédia:Escolha do artigo em destaque/%s|%s]] 
|style="text-align:center; font-size:smaller;"|[[%s|Art]] / [[Discussão:%s|disc]]%s]=]
  return mw.ustring.format(template, titulo, titulo, titulo, titulo, placar)
end

function m.erro(texto)
  return mw.ustring.format('\n|colspan=6 style="color:#800; font-size:small"|(erro: [[Módulo:ECD|módulo]] %s)', texto)
end

function m.placar (page)
  frame = mw.getCurrentFrame()
  meses = {["janeiro"] = "01", ["fevereiro"] = "02", ["março"] = "03", ["abril"] = "04", ["maio"] = "05", ["junho"] = "06",
      ["julho"] = "07", ["agosto"] = "08", ["setembro"] = "09", ["outubro"] = "10", ["novembro"] = "11", ["dezembro"] = "12"}
  local placar = {0,0,0}
  
  -- Buscas no texto
  -- Prazo de discussão
  local a, b, prazod, diad, mesd, anod = mw.ustring.find(page, " até às %d%dh%d%dmin '''UTC''' de ((%d%d?) de (%S+) de (%d%d%d%d))")
  -- Prazo de votação
  local a, b, prazo, hora, min, dia, mes, ano = mw.ustring.find(page, "<section begin=\"fim do prazo\"/>((%d%d)h(%d%d)min '''UTC''' de (%d%d?) de (%S+) de (%d%d%d%d))")
  -- Prazo de speed close (deve ser mantido para a correta visualização do histórico da lista das EAD)
  local a, b, diab, mesb, anob = mw.ustring.find(page, "voto contra no dia (%d%d?) de (%S+) de (%d%d%d%d)")
  dia, diab = #(dia or '') == 1 and "0" .. dia or dia, #(diab or '') == 1 and "0" .. diab or diab
  -- Seções de votos
  local destaque = mw.ustring.find(page, "{{Voto artigo destacado}}")
  local bom = mw.ustring.find(page, "{{Voto artigo bom}}")
  local nenhum = mw.ustring.find(page, "{{Voto artigo normal}}")

  if not prazo then
    return m.erro'não encontrou prazo na página de votação'
  end

  -- Verificação dos prazos
  local agora = tonumber(os.date("%Y%m%d%H%M"))
  local timestamp = tonumber(ano .. meses[mes] .. (#dia == 1 and '0' or '') .. dia .. hora .. min)
  local timestampd = diad and tonumber(anod .. meses[mesd] .. (#diad == 1 and '0' or '') .. diad .. hora .. min)
  local timestampb = diab and tonumber(anob .. meses[mesb] .. (#diab == 1 and '0' or '') .. diab .. hora .. min)
  -- tempo == 2 quer dizer que terminou o prazo, tempo == 1 terminou o prazo do speed close, -1 está na discussão
  local tempo = timestamp < agora and 2 or diab and timestampb < agora and 1 or diad and timestampd > agora and -1 or 0

  -- Linha exibida no perído de discussão
  if tempo == -1 then
  	local tempod = timestampd - agora > 2000 and prazod or string.format("%dh%dmin '''UTC'''", hora, min)
    local linha = mw.ustring.format([=[

|style="text-align:center; color:#bbb"|%s
|style="text-align:center; color:#bbb"|0
|style="text-align:center; color:#bbb"|0
|style="text-align:center;white-space:nowrap"|em discussão até %s
|style="text-align:center; color:#bbb"|%s
|style="text-align:center; color:#bbb"|0]=],
      destaque and '0' or '—', tempod, destaque and '0' or '—')
    return linha
  end

  -- Contagem dos votos
  -- placar[3] são os votos para destacado, placar[2] votos para bom e placar[1] para artigo normal
  local pos, p
  if destaque then
    pos, p = destaque, 3
  elseif bom then
    pos, p = bom, 2
  else
    return m.erro'não encontrou seções de voto na página de votação'
  end
  local linhavazia = 0
  local linha = mw.ustring.find(page, "\n", pos) + 1
  local proxima = mw.ustring.find(page, "\n", linha)
  while proxima do
    proxima = proxima + 1
    local a, b = mw.ustring.find(page, '<!--[^\n]-->', linha)
    -- conta voto
    if mw.ustring.sub(page, linha, linha) == '#' and proxima > linha + 10 then
      -- pula voto riscado
	  if not mw.ustring.find(mw.ustring.sub(page, linha, proxima), '^#:*<s>.+</s>') then
        placar[p] = placar[p] + 1
      end
      linhavazia = 0
    -- próximo placar
    elseif p == 3 and bom >= linha and bom < proxima or p == 2 and nenhum >= linha and nenhum < proxima then
      p = p - 1
      linhavazia = 0
    -- pula linha vazia ou com pucos caracteres ou espaços ou com <!-- comentário -->
    elseif (proxima < linha + 7 or a and b < proxima) and linhavazia < 4 then
      linhavazia = linhavazia + 1
    else
      break
    end
    linha = proxima
    proxima = mw.ustring.find(page, "\n", linha)
  end
  pos, p = nil, nil
  
  -- Decide o formato da célula da tabela que mostra o prazo
  if not destaque and diab and placar[1] == 0 and tempo == 0 then
      -- aqui existia o speedy-close, não é mais usado
      elseif tempo == 2 then
      -- fundo vermelho quando o prazo termina
      prazo = "style=\"text-align:center;white-space:nowrap; background-color:#FCC\"|" .. (prazo or 0)
  else
      prazo = "style=\"text-align:center;white-space:nowrap;\"|" .. prazo
  end
      
  -- Percentagem de votos para artígo destacado
  local percentD
  if destaque and placar[3] + placar[2] > 0 then
      local p = math.floor(placar[3] / (placar[1] + placar[2] + placar[3]) * 100)
      local negrito = (placar[3] >= 7 and placar[3] >= 3 * (placar[2] + placar[1]))
      percentD = negrito and "'''" .. p .. "%'''" or p > 0 and p .. "%" or "0"
  else
      percentD = "—"
  end
  
  -- Percentagem de votos para artigo bom
  local percentB
  if placar[3] + placar[2] > 0 then
      local p = math.floor((placar[2] + placar[3]) / (placar[1] + placar[2] + placar[3]) * 100)
      local negrito = (tempo == 1 and placar[2] + placar[3] >= 7
                       and placar[2] + placar[3] >= 3 * placar[1]
                       and percentD ~= "'''100%'''"
                       or not destaque and tempo == 0
                       and placar[2] >= 7 and placar [1] == 0)
      percentB = negrito and "'''" .. p .. "%'''" or p .. "%"
  else
      percentB = "0"
  end
  
  -- Placar
  local placarD = destaque and (placar[3] >= 7 and placar[3] >= 3 * (placar[2] + placar[1]) and
      "style=\"text-align:center;background-color:#FFF8CC\"|'''" .. placar[3] .. "'''" or -- Artigo destacado
      "style=\"text-align:center;\"|" .. placar[3]) or
      "style=\"text-align:center;\"|—" -- A eleição é para artigo bom
  local placarB = (not destaque and placar[2] >= 7 and placar[3] + placar[1] == 0 and tempo == 0 or
      placar[2] >= 7 and placar[2] >= 3 * (placar[3] + placar[1])) and
      "style=\"text-align:center;background-color:#CCCCCC\"|'''" .. placar[2] .. "'''" or -- Artigo bom
      "style=\"text-align:center;\"|" .. placar[2]
  local placarN = tempo == 2 and #placarD < 40 and #placarB < 40 and
      "style=\"text-align:center;background-color:#FCC\"|'''" .. placar[1] .. "'''" or -- Artigo normal
      "style=\"text-align:center;\"|" .. placar[1]
  
  -- Colocando os dados na tabela
  return mw.ustring.format("\n|%s\n|%s\n|%s\n|%s\n|style=\"text-align:center;\"|%s||style=\"text-align:center;\"|%s",
      placarD, placarB, placarN, prazo, percentD, percentB)

end

return m