Módulo:Temporada/Partidas
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
---
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
idanodatacompeticaorodada
- Local
estadiolocalidade
- Times
mandantevisitante
- Placar
gols_mandantegols_visitante
- Autores dos gols
autores_mandanteautores_visitante
- Flags de controle
woanuladaconta
- Resultados calculados
resultado_mandanteresultado_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
---
resultadoDoAtletico(p)
Retorna o resultado do Atlético na partida.
- Identifica se o clube foi mandante ou visitante
- Retorna
V,EouD
---
renderLista(frame)
Renderiza a lista completa de partidas de uma temporada.
- Parâmetro
frame.args.ano
- Fluxo
- Carrega dados do ano
- Cria objetos Partida
- Renderiza cada linha
- 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
---
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
- Módulo:Temporada
- Módulo:Temporada/Utils
- Módulo:Temporada/Estatisticas
- Módulo:Temporada/Dados/1919
- Predefinição:Partida
---
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 das partidas da temporada
-- Projeto Wiki Galo Digital
--
-- Responsabilidades:
-- - Criar objeto Partida
-- - Renderizar linha individual
-- - Renderizar lista completa a partir dos dados da temporada
--
-- Dependências:
-- - Module:Temporada/Utils
local Utils = require("Module:Temporada/Utils")
local Partidas = {}
--------------------------------------------------
-- LINK CONDICIONAL DE TIME (Atlético sem link)
--------------------------------------------------
local function linkTime(nome)
nome = Utils.normalizeString(nome)
if Utils.isAtletico(nome) then
return "'''" .. nome .. "'''"
end
return nome ~= "" and "[[" .. nome .. "]]" or "-"
end
--------------------------------------------------
-- LINKA AUTORES REMOVENDO CONTAGEM DO LINK
--------------------------------------------------
local function linkarAutores(lista)
if type(lista) ~= "string" then
return "Não identificado"
end
lista = mw.text.trim(lista)
if lista == "" then
return "Não identificado"
end
if lista == "Não houve" then
return "Não houve"
end
local autores = mw.text.split(lista, ";")
for i, raw in ipairs(autores) do
raw = mw.text.trim(raw)
-- remove "(2)", "(3)" do link
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 OBJETO PARTIDA (MODELO LÓGICO)
--------------------------------------------------
function Partidas.criar(args)
local p = {}
args = args or {}
p.id = Utils.normalizeString(args.id)
p.ano = tonumber(args.ano)
p.data = Utils.normalizeString(args.data)
p.competicao = Utils.normalizeString(args.competicao)
p.rodada = Utils.normalizeString(args.rodada)
p.estadio = Utils.normalizeString(args.estadio)
-- Localidade (blindagem total contra boolean)
local loc = ""
if type(args.localidade) == "string" then
loc = args.localidade
elseif type(args["local"]) == "string" then
loc = args["local"]
elseif type(args.estadio_local) == "string" then
loc = args.estadio_local
end
p.localidade = Utils.normalizeString(loc)
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 UMA PARTIDA (linha da tabela)
--------------------------------------------------
local function renderLinha(p)
local resultadoAtl = Partidas.resultadoDoAtletico(p)
local cssPlacar = Utils.cssResultado(resultadoAtl)
local autoresMand = (p.gols_mandante == 0)
and "Não houve"
or linkarAutores(p.autores_mandante)
local autoresVisit = (p.gols_visitante == 0)
and "Não houve"
or linkarAutores(p.autores_visitante)
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 ~= "" and "[[" .. p.competicao .. "]]" or "-"
local estadioNome = p.estadio ~= "" and p.estadio or p.localidade
local linkEstadio = estadioNome ~= "" and "[[" .. estadioNome .. "]]" or "-"
return string.format([[
|-
| %s
| %s
| %s
| %s
| %s
| %s
| class="%s gd-score" | %s
| %s
| %s
| class="gd-stadium" | %s
]],
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
--------------------------------------------------
-- RENDERIZA LISTA COMPLETA DA TEMPORADA
--------------------------------------------------
function Partidas.renderLista(frame)
local ano = frame.args.ano
if not ano or ano == "" then
return "Erro: parâmetro <code>ano</code> não informado."
end
local Dados = require("Module:Temporada/Dados/" .. ano)
local linhas = {}
for _, args in ipairs(Dados.partidas or {}) do
local partida = Partidas.criar(args)
table.insert(linhas, renderLinha(partida))
end
return table.concat(linhas)
end
--------------------------------------------------
-- OBTÉM LISTA DE PARTIDAS POR ANO
-- Fonte única: Module:Temporada/Dados/<ano>
--------------------------------------------------
function Partidas.obterPorAno(ano)
if not ano then
return {}
end
ano = tostring(ano)
local ok, Dados = pcall(require, "Module:Temporada/Dados/" .. ano)
if not ok or not Dados or not Dados.partidas then
return {}
end
return Dados.partidas
end
return Partidas