Módulo:Temporada/Partidas: mudanças entre as edições

De Clube Atletico Mineiro - Enciclopedia Galo Digital
Ir para navegação Ir para pesquisar
Sem resumo de edição
Sem resumo de edição
Linha 6: Linha 6:


local Partidas = {}
local Partidas = {}
local rowIndex = 0


--------------------------------------------------
--------------------------------------------------
-- Cria e normaliza uma partida
-- Utilitário: zebra striping
--------------------------------------------------
local function nextRowClass()
rowIndex = rowIndex + 1
if rowIndex % 2 == 0 then
return "gd-row-even"
end
return "gd-row-odd"
end
 
--------------------------------------------------
-- Utilitário: link condicional (não linkar Atlético)
--------------------------------------------------
local function linkTime(nome)
if Utils.isAtletico(nome) then
return "'''" .. nome .. "'''"
end
return "[[" .. nome .. "]]"
end
 
--------------------------------------------------
-- Utilitário: link de autores (remove contagem)
--------------------------------------------------
local function linkarAutores(lista)
if lista == "" then
return ""
end
 
local autores = mw.text.split(lista, ";")
for i, raw in ipairs(autores) do
raw = mw.text.trim(raw)
 
local nome = mw.ustring.match(raw, "^(.-)%s*%(") or raw
local sufixo = mw.ustring.match(raw, "%((.-)%)")
 
if sufixo then
autores[i] = "[[" .. nome .. "]] (" .. sufixo .. ")"
else
autores[i] = "[[" .. nome .. "]]"
end
end
 
return table.concat(autores, "; ")
end
 
--------------------------------------------------
-- Criação da partida
--------------------------------------------------
--------------------------------------------------
function Partidas.criar(args)
function Partidas.criar(args)
Linha 37: Linha 84:
p.resultado_mandante = Utils.resultadoPartida(p.gols_mandante, p.gols_visitante)
p.resultado_mandante = Utils.resultadoPartida(p.gols_mandante, p.gols_visitante)
p.resultado_visitante = Utils.resultadoPartida(p.gols_visitante, p.gols_mandante)
p.resultado_visitante = Utils.resultadoPartida(p.gols_visitante, p.gols_mandante)
if p.anulada or not p.conta then
p.valida = false
else
p.valida = true
end


return p
return p
end
--------------------------------------------------
-- Identifica lado do Atlético
--------------------------------------------------
function Partidas.ladoDoAtletico(p)
if Utils.isAtletico(p.mandante) then
return "mandante"
elseif Utils.isAtletico(p.visitante) then
return "visitante"
end
return nil
end
end


Linha 63: Linha 92:
--------------------------------------------------
--------------------------------------------------
function Partidas.resultadoDoAtletico(p)
function Partidas.resultadoDoAtletico(p)
local lado = Partidas.ladoDoAtletico(p)
if Utils.isAtletico(p.mandante) then
if lado == "mandante" then
return p.resultado_mandante
return p.resultado_mandante
elseif lado == "visitante" then
elseif Utils.isAtletico(p.visitante) then
return p.resultado_visitante
return p.resultado_visitante
end
end
Linha 73: Linha 101:


--------------------------------------------------
--------------------------------------------------
-- Linka lista de autores
-- Renderização
--------------------------------------------------
local function linkarAutores(lista)
if lista == "" then
return ""
end
 
local autores = mw.text.split(lista, ";")
for i, nome in ipairs(autores) do
nome = mw.text.trim(nome)
autores[i] = "[[" .. nome .. "]]"
end
 
return table.concat(autores, "; ")
end
 
--------------------------------------------------
-- Renderização da linha
--------------------------------------------------
--------------------------------------------------
function Partidas.render(frame)
function Partidas.render(frame)
Linha 96: Linha 107:
local p = Partidas.criar(args)
local p = Partidas.criar(args)


local resultadoAtl = Partidas.resultadoDoAtletico(p)
local rowClass = nextRowClass()
local cssPlacar = Utils.cssResultado(resultadoAtl)
local cssPlacar = Utils.cssResultado(Partidas.resultadoDoAtletico(p))
 
local mandante = "[[" .. p.mandante .. "]]"
local visitante = "[[" .. p.visitante .. "]]"


if Utils.isAtletico(p.mandante) then
-- Autores
mandante = "'''" .. mandante .. "'''"
local autoresMand = "Não identificado"
end
if Utils.isAtletico(p.visitante) then
visitante = "'''" .. visitante .. "'''"
end
 
local autoresMand = ""
if p.gols_mandante == 0 then
if p.gols_mandante == 0 then
autoresMand = "Não houve"
autoresMand = "Não houve"
elseif p.autores_mandante ~= "" then
elseif p.autores_mandante ~= "" then
autoresMand = linkarAutores(p.autores_mandante)
autoresMand = linkarAutores(p.autores_mandante)
else
autoresMand = "Não identificado"
end
end


local autoresVisit = ""
local autoresVisit = "Não identificado"
if p.gols_visitante == 0 then
if p.gols_visitante == 0 then
autoresVisit = "Não houve"
autoresVisit = "Não houve"
elseif p.autores_visitante ~= "" then
elseif p.autores_visitante ~= "" then
autoresVisit = linkarAutores(p.autores_visitante)
autoresVisit = linkarAutores(p.autores_visitante)
else
autoresVisit = "Não identificado"
end
end


local linkSumula = "[[" .. p.id .. "]]"
-- Título da súmula
local linkPlacar = "[[" .. p.id .. "|" .. p.gols_mandante .. " x " .. p.gols_visitante .. "]]"
local sumulaTitle = table.concat({
p.id,
p.mandante,
p.gols_mandante,
"x",
p.gols_visitante,
p.visitante
}, "_"):gsub(" ", "_")
 
-- Links prontos (FORA da string)
local linkSumula = "[[" .. sumulaTitle .. "|" .. p.id .. "]]"
local linkPlacar = "[[" .. sumulaTitle .. "|" .. p.gols_mandante .. " x " .. p.gols_visitante .. "]]"
local linkCompeticao = "[[" .. p.competicao .. "]]"
local linkEstadio = "[[" .. (p.estadio ~= "" and p.estadio or p.localidade) .. "]]"


return string.format([[
return string.format([[
|-
|- class="%s"
| %s
| %s
| %s
| %s
Linha 141: Linha 152:
| %s
| %s
| %s
| %s
| %s
| style="vertical-align: middle;" | %s
]],
]],
rowClass,
linkSumula,
linkSumula,
p.competicao ~= "" and p.competicao or "-",
linkCompeticao,
p.rodada ~= "" and p.rodada or "-",
p.rodada ~= "" and p.rodada or "-",
p.data ~= "" and p.data or "-",
p.data ~= "" and p.data or "-",
autoresMand,
autoresMand,
mandante,
linkTime(p.mandante),
cssPlacar,
cssPlacar,
linkPlacar,
linkPlacar,
visitante,
linkTime(p.visitante),
autoresVisit,
autoresVisit,
p.estadio ~= "" and p.estadio or p.localidade or "-"
linkEstadio
)
)
end
end


return Partidas
return Partidas

Edição das 16h50min de 24 de janeiro de 2026

Predefinição:Documentation

Módulo:Temporada/Partidas

O Módulo:Temporada/Partidas define o modelo lógico das partidas de uma temporada e é responsável pela renderização das linhas individuais e da lista completa de jogos no projeto Wiki Galo Digital.

Ele atua como ponte entre os dados brutos da temporada e a apresentação tabular das partidas.

---

Escopo e responsabilidades

Este módulo é responsável por:

  • Criar o objeto lógico Partida
  • Normalizar e validar dados das partidas
  • Calcular resultado do Atlético (V, E, D)
  • Renderizar:
    • Linha individual da tabela de partidas
    • Lista completa de partidas da temporada
  • Centralizar regras de apresentação do placar

Predefinição:Aviso

---

Dependências

Este módulo depende diretamente de:

  • Module:Temporada/Utils

E consome dados exclusivamente de:

  • Module:Temporada/Dados/ANO

---

Estrutura do objeto Partida

O objeto Partida contém os seguintes campos:

  • Identificação
    • id
    • ano
    • data
    • competicao
    • rodada
  • Local
    • estadio
    • localidade
  • Times
    • mandante
    • visitante
  • Placar
    • gols_mandante
    • gols_visitante
  • Autores dos gols
    • autores_mandante
    • autores_visitante
  • Flags de controle
    • wo
    • anulada
    • conta
  • Resultados calculados
    • resultado_mandante
    • resultado_visitante

---

Funções internas

linkTime(nome)

Gera link condicional para nomes de times.

  • Atlético Mineiro é exibido em negrito, sem link
  • Outros times são linkados automaticamente

---

linkarAutores(lista)

Processa lista de autores de gols:

  • Remove contagem do nome do link
  • Preserva sufixos como "(2)", "(3)"
  • Retorna lista formatada e linkada

---

placarExibido(p)

Determina o placar exibido:

  • Considera partidas decididas por W.O
  • Retorna formato padrão "x" quando aplicável

---

renderLinha(p)

Renderiza uma linha completa da tabela de partidas.

Inclui:

  • Súmula
  • Competição
  • Rodada
  • Data
  • Autores dos gols
  • Mandante e visitante
  • Placar com classe CSS
  • Estádio ou localidade

---

Funções públicas

criar(args)

Cria o objeto lógico Partida a partir dos dados brutos.

  • Normaliza parâmetros
  • Aplica validações defensivas
  • Calcula resultados automaticamente

Predefinição:Nota

---

resultadoDoAtletico(p)

Retorna o resultado do Atlético na partida.

  • Identifica se o clube foi mandante ou visitante
  • Retorna V, E ou D

---

renderLista(frame)

Renderiza a lista completa de partidas de uma temporada.

  • Parâmetro
    • frame.args.ano
  • Fluxo
  1. Carrega dados do ano
  2. Cria objetos Partida
  3. Renderiza cada linha
  4. Retorna tabela consolidada

---

obterPorAno(ano)

Obtém a lista de partidas de uma temporada específica.

  • Parâmetro
    • ano
  • Retorno
    • Lista de partidas ou lista vazia

Predefinição:Aviso

---

Regras de validação

  • Partidas anuladas não são contabilizadas
  • Partidas marcadas como não contabilizáveis são ignoradas
  • Campos vazios recebem valores padrão
  • Erros são tratados sem interromper renderização

---

Boas práticas e manutenção

  • Não duplicar lógica de normalização (usar Utils)
  • Manter consistência entre modelo lógico e renderização
  • Alterações no objeto Partida exigem revisão em:
    • Estatísticas
    • Campanhas
    • Templates
  • Novos campos devem ser documentados

---

Páginas relacionadas

---

Histórico

  • Módulo criado para padronizar o tratamento de partidas
  • Centraliza regras de renderização e normalização
  • Projetado para escalabilidade por temporada

-- Module:Temporada/Partidas
-- Modelo lógico + renderização de partidas
-- Projeto Wiki Galo Digital

local Utils = require("Module:Temporada/Utils")

local Partidas = {}
local rowIndex = 0

--------------------------------------------------
-- Utilitário: zebra striping
--------------------------------------------------
local function nextRowClass()
	rowIndex = rowIndex + 1
	if rowIndex % 2 == 0 then
		return "gd-row-even"
	end
	return "gd-row-odd"
end

--------------------------------------------------
-- Utilitário: link condicional (não linkar Atlético)
--------------------------------------------------
local function linkTime(nome)
	if Utils.isAtletico(nome) then
		return "'''" .. nome .. "'''"
	end
	return "[[" .. nome .. "]]"
end

--------------------------------------------------
-- Utilitário: link de autores (remove contagem)
--------------------------------------------------
local function linkarAutores(lista)
	if lista == "" then
		return ""
	end

	local autores = mw.text.split(lista, ";")
	for i, raw in ipairs(autores) do
		raw = mw.text.trim(raw)

		local nome = mw.ustring.match(raw, "^(.-)%s*%(") or raw
		local sufixo = mw.ustring.match(raw, "%((.-)%)")

		if sufixo then
			autores[i] = "[[" .. nome .. "]] (" .. sufixo .. ")"
		else
			autores[i] = "[[" .. nome .. "]]"
		end
	end

	return table.concat(autores, "; ")
end

--------------------------------------------------
-- Criação da partida
--------------------------------------------------
function Partidas.criar(args)
	local p = {}

	p.id = Utils.normalizeString(args.id)
	p.data = Utils.normalizeString(args.data)
	p.competicao = Utils.normalizeString(args.competicao)
	p.rodada = Utils.normalizeString(args.rodada)
	p.estadio = Utils.normalizeString(args.estadio)

	p["local"] = Utils.normalizeString(args["local"])
	p.localidade = p["local"]

	p.mandante = Utils.normalizeString(args.mandante)
	p.visitante = Utils.normalizeString(args.visitante)

	p.gols_mandante = Utils.toNumber(args.gols_mandante)
	p.gols_visitante = Utils.toNumber(args.gols_visitante)

	p.autores_mandante = Utils.normalizeString(args.gols_mandante_autores)
	p.autores_visitante = Utils.normalizeString(args.gols_visitante_autores)

	p.wo = Utils.toBoolean(args.wo)
	p.anulada = Utils.toBoolean(args.anulada)
	p.conta = not Utils.toBoolean(args.nao_conta)

	p.resultado_mandante = Utils.resultadoPartida(p.gols_mandante, p.gols_visitante)
	p.resultado_visitante = Utils.resultadoPartida(p.gols_visitante, p.gols_mandante)

	return p
end

--------------------------------------------------
-- Resultado do Atlético
--------------------------------------------------
function Partidas.resultadoDoAtletico(p)
	if Utils.isAtletico(p.mandante) then
		return p.resultado_mandante
	elseif Utils.isAtletico(p.visitante) then
		return p.resultado_visitante
	end
	return nil
end

--------------------------------------------------
-- Renderização
--------------------------------------------------
function Partidas.render(frame)
	local args = frame.args
	local p = Partidas.criar(args)

	local rowClass = nextRowClass()
	local cssPlacar = Utils.cssResultado(Partidas.resultadoDoAtletico(p))

	-- Autores
	local autoresMand = "Não identificado"
	if p.gols_mandante == 0 then
		autoresMand = "Não houve"
	elseif p.autores_mandante ~= "" then
		autoresMand = linkarAutores(p.autores_mandante)
	end

	local autoresVisit = "Não identificado"
	if p.gols_visitante == 0 then
		autoresVisit = "Não houve"
	elseif p.autores_visitante ~= "" then
		autoresVisit = linkarAutores(p.autores_visitante)
	end

	-- Título da súmula
	local sumulaTitle = table.concat({
		p.id,
		p.mandante,
		p.gols_mandante,
		"x",
		p.gols_visitante,
		p.visitante
	}, "_"):gsub(" ", "_")

	-- Links prontos (FORA da string)
	local linkSumula = "[[" .. sumulaTitle .. "|" .. p.id .. "]]"
	local linkPlacar = "[[" .. sumulaTitle .. "|" .. p.gols_mandante .. " x " .. p.gols_visitante .. "]]"
	local linkCompeticao = "[[" .. p.competicao .. "]]"
	local linkEstadio = "[[" .. (p.estadio ~= "" and p.estadio or p.localidade) .. "]]"

	return string.format([[
|- class="%s"
| %s
| %s
| %s
| %s
| %s
| %s
| class="%s gd-score" | %s
| %s
| %s
| style="vertical-align: middle;" | %s
]],
		rowClass,
		linkSumula,
		linkCompeticao,
		p.rodada ~= "" and p.rodada or "-",
		p.data ~= "" and p.data or "-",
		autoresMand,
		linkTime(p.mandante),
		cssPlacar,
		linkPlacar,
		linkTime(p.visitante),
		autoresVisit,
		linkEstadio
	)
end

return Partidas