Módulo:Temporada/Partidas: mudanças entre as edições
Sem resumo de edição |
Sem resumo de edição |
||
| Linha 6: | Linha 6: | ||
local Partidas = {} | 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) | 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) | ||
return p | return p | ||
end | end | ||
| Linha 63: | Linha 92: | ||
-------------------------------------------------- | -------------------------------------------------- | ||
function Partidas.resultadoDoAtletico(p) | function Partidas.resultadoDoAtletico(p) | ||
if Utils.isAtletico(p.mandante) then | |||
return p.resultado_mandante | return p.resultado_mandante | ||
elseif | elseif Utils.isAtletico(p.visitante) then | ||
return p.resultado_visitante | return p.resultado_visitante | ||
end | end | ||
| Linha 73: | Linha 101: | ||
-------------------------------------------------- | -------------------------------------------------- | ||
-- Renderização | |||
-- Renderização | |||
-------------------------------------------------- | -------------------------------------------------- | ||
function Partidas.render(frame) | function Partidas.render(frame) | ||
| Linha 96: | Linha 107: | ||
local p = Partidas.criar(args) | local p = Partidas.criar(args) | ||
local | local rowClass = nextRowClass() | ||
local cssPlacar = Utils.cssResultado( | local cssPlacar = Utils.cssResultado(Partidas.resultadoDoAtletico(p)) | ||
-- Autores | |||
local autoresMand = "Não identificado" | |||
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) | ||
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) | ||
end | end | ||
local linkSumula = "[[" .. p.id .. "]]" | -- Título da súmula | ||
local linkPlacar = "[[" .. | 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, | ||
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, | ||
linkEstadio | |||
) | ) | ||
end | end | ||
return Partidas | return Partidas | ||
Edição das 16h50min de 24 de janeiro de 2026
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 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