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 9: Linha 9:


--------------------------------------------------
--------------------------------------------------
-- Utilitário: zebra striping
-- Zebra striping garantido via inline style
--------------------------------------------------
--------------------------------------------------
local function nextRowClass()
local function nextRow()
rowIndex = rowIndex + 1
rowIndex = rowIndex + 1
if rowIndex % 2 == 0 then
if rowIndex % 2 == 0 then
return "gd-row-even"
return "gd-row-even", ' style="background-color: #f7f7f7;"'
end
end
return "gd-row-odd"
 
return "gd-row-odd", ""
end
end


--------------------------------------------------
--------------------------------------------------
-- Utilitário: link condicional (não linkar Atlético)
-- Link condicional de time (Atlético sem link)
--------------------------------------------------
--------------------------------------------------
local function linkTime(nome)
local function linkTime(nome)
Linha 30: Linha 32:


--------------------------------------------------
--------------------------------------------------
-- Utilitário: link de autores (remove contagem)
-- Linka autores removendo contagem do link
--------------------------------------------------
--------------------------------------------------
local function linkarAutores(lista)
local function linkarAutores(lista)
Linha 55: Linha 57:


--------------------------------------------------
--------------------------------------------------
-- Criação da partida
-- Criação da partida (modelo lógico)
--------------------------------------------------
--------------------------------------------------
function Partidas.criar(args)
function Partidas.criar(args)
Linha 89: Linha 91:


--------------------------------------------------
--------------------------------------------------
-- Resultado do Atlético
-- Resultado do Atlético (V/E/D)
--------------------------------------------------
--------------------------------------------------
function Partidas.resultadoDoAtletico(p)
function Partidas.resultadoDoAtletico(p)
Linha 101: Linha 103:


--------------------------------------------------
--------------------------------------------------
-- Renderização
-- Placar exibido (considera W.O)
--------------------------------------------------
local function placarExibido(p)
if p.wo then
if Utils.isAtletico(p.mandante) then
return "O x W"
elseif Utils.isAtletico(p.visitante) then
return "W x O"
end
end
return p.gols_mandante .. " x " .. p.gols_visitante
end
 
--------------------------------------------------
-- Renderização da linha da tabela
--------------------------------------------------
--------------------------------------------------
function Partidas.render(frame)
function Partidas.render(frame)
Linha 107: Linha 123:
local p = Partidas.criar(args)
local p = Partidas.criar(args)


local rowClass = nextRowClass()
local rowClass, rowStyle = nextRow()
local cssPlacar = Utils.cssResultado(Partidas.resultadoDoAtletico(p))
local resultadoAtl = Partidas.resultadoDoAtletico(p)
local cssPlacar = Utils.cssResultado(resultadoAtl)


-- Autores
-- Autores dos gols
local autoresMand = "Não identificado"
local autoresMand = "Não identificado"
if p.gols_mandante == 0 then
if p.gols_mandante == 0 then
Linha 125: Linha 142:
end
end


-- Título da súmula
-- Placar e título da súmula (COM W x O ou O x W)
local textoPlacar = placarExibido(p)
 
local sumulaTitle = table.concat({
local sumulaTitle = table.concat({
p.id,
p.id,
p.mandante,
p.mandante,
p.gols_mandante,
textoPlacar,
"x",
p.gols_visitante,
p.visitante
p.visitante
}, "_"):gsub(" ", "_")
}, "_"):gsub(" ", "_")


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


return string.format([[
return string.format([[
|- class="%s"
|- class="%s"%s
| %s
| %s
| %s
| %s
Linha 152: Linha 168:
| %s
| %s
| %s
| %s
| style="vertical-align: middle;" | %s
| style="vertical-align: middle !important;" | %s
]],
]],
rowClass,
rowClass,
rowStyle,
linkSumula,
linkSumula,
linkCompeticao,
linkCompeticao,

Edição das 17h01min 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

--------------------------------------------------
-- Zebra striping garantido via inline style
--------------------------------------------------
local function nextRow()
	rowIndex = rowIndex + 1

	if rowIndex % 2 == 0 then
		return "gd-row-even", ' style="background-color: #f7f7f7;"'
	end

	return "gd-row-odd", ""
end

--------------------------------------------------
-- Link condicional de time (Atlético sem link)
--------------------------------------------------
local function linkTime(nome)
	if Utils.isAtletico(nome) then
		return "'''" .. nome .. "'''"
	end
	return "[[" .. nome .. "]]"
end

--------------------------------------------------
-- Linka autores removendo contagem do link
--------------------------------------------------
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 (modelo lógico)
--------------------------------------------------
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 (V/E/D)
--------------------------------------------------
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

--------------------------------------------------
-- Placar exibido (considera W.O)
--------------------------------------------------
local function placarExibido(p)
	if p.wo then
		if Utils.isAtletico(p.mandante) then
			return "O x W"
		elseif Utils.isAtletico(p.visitante) then
			return "W x O"
		end
	end
	return p.gols_mandante .. " x " .. p.gols_visitante
end

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

	local rowClass, rowStyle = nextRow()
	local resultadoAtl = Partidas.resultadoDoAtletico(p)
	local cssPlacar = Utils.cssResultado(resultadoAtl)

	-- Autores dos gols
	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

	-- Placar e título da súmula (COM W x O ou O x W)
	local textoPlacar = placarExibido(p)

	local sumulaTitle = table.concat({
		p.id,
		p.mandante,
		textoPlacar,
		p.visitante
	}, "_"):gsub(" ", "_")

	local linkSumula = "[[" .. sumulaTitle .. "|" .. p.id .. "]]"
	local linkPlacar = "[[" .. sumulaTitle .. "|" .. textoPlacar .. "]]"
	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
| %s
| class="%s gd-score" | %s
| %s
| %s
| style="vertical-align: middle !important;" | %s
]],
		rowClass,
		rowStyle,
		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