Módulo:EventosCronologicosAno
Ir para navegação
Ir para pesquisar
A documentação para este módulo pode ser criada em Módulo:EventosCronologicosAno/doc
local p = {} -- Função para substituir caracteres especiais local function removerAcentos(str) local substituicoes = { ["ç"] = "c", ["Ç"] = "C", ["á"] = "a", ["à"] = "a", ["ã"] = "a", ["â"] = "a", ["é"] = "e", ["ê"] = "e", ["í"] = "i", ["ó"] = "o", ["ô"] = "o", ["õ"] = "o", ["ú"] = "u", ["Á"] = "A", ["À"] = "A", ["Ã"] = "A", ["Â"] = "A", ["É"] = "E", ["Ê"] = "E", ["Í"] = "I", ["Ó"] = "O", ["Ô"] = "O", ["Õ"] = "O", ["Ú"] = "U" } for acento, substituicao in pairs(substituicoes) do str = str:gsub(acento, substituicao) end return str end -- Função para processar jogos notáveis local function processarJogosNotaveis(jogosNotaveis, anoFiltro) local eventos = {} local marcos = {100, 200, 300, 400, 500, 600, 700} for _, item in ipairs(jogosNotaveis or {}) do local atleta = type(item.ApelidoJogador2) == "string" and item.ApelidoJogador2 or 'Atleta desconhecido' for _, marco in ipairs(marcos) do local propriedade = "Jogo" .. marco local dataJogo = item[propriedade] if dataJogo and type(dataJogo) == "string" then local diaJogo, mesJogo, anoJogo = dataJogo:match("^(%d%d)/(%d%d)/(%d%d%d%d)") if anoJogo and tonumber(anoJogo) == anoFiltro then table.insert(eventos, { ano = tonumber(anoJogo) or 0, mes = tonumber(mesJogo) or 0, dia = tonumber(diaJogo) or 0, -- Adicionar o dia texto = string.format("%02d/%02d - %s completou %d jogos pelo [[Grêmio]].", tonumber(diaJogo), tonumber(mesJogo), atleta, marco) }) end end end end return eventos end -- Função para processar treinadores notáveis local function processarJogosNotaveisTreinador(jogosNotaveisTreinador, anoFiltro) local eventos = {} local marcos = {100, 200, 300, 400, 500} for _, item in ipairs(jogosNotaveisTreinador or {}) do local atleta = type(item.PaginaJogador2) == "string" and item.PaginaJogador2 or 'Treinador desconhecido' for _, marco in ipairs(marcos) do local propriedade = "Jogo" .. marco .. "treinador" local dataJogo = item[propriedade] if dataJogo and type(dataJogo) == "string" then local diaJogo, mesJogo, anoJogo = dataJogo:match("^(%d%d)/(%d%d)/(%d%d%d%d)") if anoJogo and tonumber(anoJogo) == anoFiltro then table.insert(eventos, { ano = tonumber(anoJogo) or 0, mes = tonumber(mesJogo) or 0, dia = tonumber(diaJogo) or 0, -- Adicionar o dia texto = string.format("%02d/%02d - %s completou %d jogos como treinador do [[Grêmio]].", tonumber(diaJogo), tonumber(mesJogo), atleta, marco) }) end end end end return eventos end -- Função para processar estreias notáveis local function processarEstreias(estreias, anoFiltro) local eventos = {} for _, item in ipairs(estreias or {}) do local dataEstreia = type(item.EstreiaNotavel) == "string" and item.EstreiaNotavel or '' local atleta = type(item.ApelidoJogador2) == "string" and item.ApelidoJogador2 or 'Atleta desconhecido' local diaEstreia, mesEstreia, anoEstreia = dataEstreia:match("^(%d%d)/(%d%d)/(%d%d%d%d)") if anoEstreia and tonumber(anoEstreia) == anoFiltro then table.insert(eventos, { ano = tonumber(anoEstreia) or 0, mes = tonumber(mesEstreia) or 0, dia = tonumber(diaEstreia) or 0, -- Adicionar o dia texto = string.format("%02d/%02d - Estreia de %s pelo [[Grêmio]].", tonumber(diaEstreia), tonumber(mesEstreia), atleta) }) end end return eventos end -- Função para processar gols marcantes local function processarGolsMarcantes(golsMarcantes, anoFiltro) local eventos = {} local marcos = {1, 50, 100, 150, 200} for _, item in ipairs(golsMarcantes or {}) do local atleta = type(item.ApelidoJogador2) == "string" and item.ApelidoJogador2 or 'Atleta desconhecido' -- Processar marcos de gols for _, marco in ipairs(marcos) do local propriedade = "DataGol" .. marco local dataGol = item[propriedade] if dataGol and type(dataGol) == "string" then local diaGol, mesGol, anoGol = dataGol:match("^(%d%d)/(%d%d)/(%d%d%d%d)") if anoGol and tonumber(anoGol) == anoFiltro then table.insert(eventos, { ano = tonumber(anoGol) or 0, mes = tonumber(mesGol) or 0, dia = tonumber(diaGol) or 0, -- Adicionar o dia texto = string.format("%02d/%02d - %s marcou seu %dº gol com a camisa do [[Grêmio]].", tonumber(diaGol), tonumber(mesGol), atleta, marco) }) end end end -- Processar o último gol local dataGolUltimo = type(item.DataGolUltimo) == "string" and item.DataGolUltimo or nil if dataGolUltimo then local diaGol, mesGol, anoGol = dataGolUltimo:match("^(%d%d)/(%d%d)/(%d%d%d%d)") if anoGol and tonumber(anoGol) == anoFiltro then table.insert(eventos, { ano = tonumber(anoGol) or 0, mes = tonumber(mesGol) or 0, dia = tonumber(diaGol) or 0, -- Adicionar o dia texto = string.format("%02d/%02d - %s marcou seu último gol com a camisa do [[Grêmio]].", tonumber(diaGol), tonumber(mesGol), atleta) }) end end end return eventos end -- Função para processar nascimentos local function processarNascimentos(nascimentos, anoFiltro) local eventos = {} for _, item in ipairs(nascimentos or {}) do local dataNascimento = type(item.DataNascimentoCompleta) == "string" and item.DataNascimentoCompleta or '' local atleta = type(item.ApelidoJogador2) == "string" and item.ApelidoJogador2 or 'Atleta desconhecido' -- Extrair dia, mês e ano da data (formato dd/mm/aaaa) local dia, mes, ano = dataNascimento:match("^(%d%d)/(%d%d)/(%d%d%d%d)$") if dia and mes and ano and tonumber(ano) == anoFiltro then table.insert(eventos, { ano = tonumber(ano), mes = tonumber(mes), dia = tonumber(dia), -- Adicionar o dia texto = string.format("%02d/%02d - Nascimento de %s.", tonumber(dia), tonumber(mes), atleta) }) end end return eventos end -- Função para processar falecimentos local function processarFalecimentos(falecimentos, anoFiltro) local eventos = {} for _, item in ipairs(falecimentos or {}) do local dataFalecimento = type(item.DataFalecimentoCompleta) == "string" and item.DataFalecimentoCompleta or '' local atleta = type(item.ApelidoJogador2) == "string" and item.ApelidoJogador2 or 'Atleta desconhecido' -- Extrair dia, mês e ano da data (formato dd/mm/aaaa) local dia, mes, ano = dataFalecimento:match("^(%d%d)/(%d%d)/(%d%d%d%d)$") if dia and mes and ano and tonumber(ano) == anoFiltro then table.insert(eventos, { ano = tonumber(ano), mes = tonumber(mes), dia = tonumber(dia), -- Adicionar o dia texto = string.format("%02d/%02d - Falecimento de %s.", tonumber(dia), tonumber(mes), atleta) }) end end return eventos end -- Função para obter o nome do mês a partir do número local function nomeMes(mes) local meses = { "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro" } return meses[mes] or "Mês desconhecido" end function p.getEventos(frame) local smw = mw.smw.ask local currentTitle = mw.ustring.toNFC(mw.title.getCurrentTitle().text) -- Remover espaços extras e normalizar o título currentTitle = mw.text.trim(currentTitle) currentTitle = removerAcentos(currentTitle:lower()) -- Extrair o ano do título local anoFiltro = currentTitle:match("^(%d%d%d%d)$") if not anoFiltro then return "Erro: O título da página deve ser um ano válido (ex: 2023)." end anoFiltro = tonumber(anoFiltro) if not anoFiltro then return "Erro: Ano inválido." end local jogosTitulo = smw{ '[[AnoJogo::' .. anoFiltro .. ']]', '[[Categoria:Jogo do Título]]', '?AnoJogo', '?Competição', '?Detalhes', '?Data2', -- Incluir Data2 na consulta 'sort=AnoJogo', 'order=asc' } or {} -- Consulta os estádios inaugurados no ano filtrado local estadios = smw{ '[[AnoJogo::' .. anoFiltro .. ']]', -- Filtra por Data2 no ano especificado '[[Categoria:Estádios inaugurados pelo Grêmio]]', -- Filtra pela categoria correta '?AnoJogo', '?Data2', '?EstadioApelido2', '?Adversario', -- Seleciona as propriedades necessárias 'sort=AnoJogo', 'order=asc' -- Ordena por Data2 } or {} local estreias = smw{ '[[EstreiaNotavel::+]]', '?EstreiaNotavel', '?ApelidoJogador2', 'sort=EstreiaNotavel', 'order=asc' } or {} local jogosNotaveis = smw{ '[[Jogo100::+]] OR [[Jogo200::+]] OR [[Jogo300::+]] OR [[Jogo400::+]] OR [[Jogo500::+]] OR [[Jogo600::+]] OR [[Jogo700::+]]', '?Jogo100', '?Jogo200', '?Jogo300', '?Jogo400', '?Jogo500', '?Jogo600', '?Jogo700', '?ApelidoJogador2', 'sort=Jogo100', 'order=asc' } or {} local jogosNotaveisTreinador = smw{ '[[Jogo100treinador::+]] OR [[Jogo200treinador::+]] OR [[Jogo300treinador::+]] OR [[Jogo400treinador::+]] OR [[Jogo500treinador::+]]', '?Jogo100treinador', '?Jogo200treinador', '?Jogo300treinador', '?Jogo400treinador', '?Jogo500treinador', '?PaginaJogador2', 'sort=Jogo100', 'order=asc' } or {} local golsMarcantes = smw{ '[[DataGol1::+]] OR [[DataGol50::+]] OR [[DataGol100::+]] OR [[DataGol150::+]] OR [[DataGol200::+]] OR [[DataGolUltimo::+]]', '?DataGol1', '?DataGol50', '?DataGol100', '?DataGol150', '?DataGol200', '?DataGolUltimo', '?ApelidoJogador2', 'sort=DataGol1', 'order=asc' } or {} local nascimentos = smw{ '[[DataNascimentoCompleta::+]]', '?DataNascimentoCompleta', '?ApelidoJogador2', '?Função', 'sort=DataNascimentoCompleta', 'order=asc' } or {} local falecimentos = smw{ '[[DataFalecimentoCompleta::+]]', '?DataFalecimentoCompleta', '?ApelidoJogador2', '?Função', 'sort=DataFalecimentoCompleta', 'order=asc' } or {} local eventos = {} for _, item in ipairs(jogosTitulo) do local dataJogo = type(item.Data2) == "string" and item.Data2 or '' local dia, mes, ano = dataJogo:match("^(%d%d)/(%d%d)/(%d%d%d%d)") if dia and mes and ano and tonumber(ano) == anoFiltro then local competicao = type(item["Competição"]) == "string" and item["Competição"] or 'Competição desconhecida' local detalhes = type(item.Detalhes) == "string" and item.Detalhes or 'Sem detalhes' table.insert(eventos, { ano = tonumber(ano), mes = tonumber(mes), dia = tonumber(dia), -- Adicionar o dia texto = string.format("%02d/%02d - [[Grêmio]] Campeão - %s.", tonumber(dia), tonumber(mes), competicao, detalhes) }) end end -- Processa cada estádio retornado pela consulta for _, item in ipairs(estadios) do local dataJogo = type(item.Data2) == "string" and item.Data2 or '' -- Obtém a data do jogo local dia, mes, ano = dataJogo:match("^(%d%d)/(%d%d)/(%d%d%d%d)") -- Extrai dia, mês e ano -- Verifica se a data é válida e se o ano corresponde ao filtro if dia and mes and ano and tonumber(ano) == anoFiltro then -- Adiciona o evento à lista de eventos table.insert(eventos, { ano = tonumber(ano), mes = tonumber(mes), dia = tonumber(dia), -- Adiciona o dia texto = string.format("%02d/%02d - [[Grêmio]] inaugura %s em partida contra [[%s]].", tonumber(dia), tonumber(mes), item.EstadioApelido2 or 'Estádio', item.Adversario or 'Adversário desconhecido') }) else -- Log para depuração (caso a data seja inválida ou o ano não corresponda) mw.log("Data inválida ou ano não corresponde ao filtro:", dataJogo) end end -- Processar estreias for _, evento in ipairs(processarEstreias(estreias, anoFiltro)) do table.insert(eventos, evento) end -- Processar jogos notáveis for _, evento in ipairs(processarJogosNotaveis(jogosNotaveis, anoFiltro)) do table.insert(eventos, evento) end -- Processar jogos notáveis de treinadores for _, evento in ipairs(processarJogosNotaveisTreinador(jogosNotaveisTreinador, anoFiltro)) do table.insert(eventos, evento) end -- Processar gols marcantes for _, evento in ipairs(processarGolsMarcantes(golsMarcantes, anoFiltro)) do table.insert(eventos, evento) end -- Processar nascimentos for _, evento in ipairs(processarNascimentos(nascimentos, anoFiltro)) do table.insert(eventos, evento) end -- Processar falecimentos for _, evento in ipairs(processarFalecimentos(falecimentos, anoFiltro)) do table.insert(eventos, evento) end -- Organizar eventos por mês e ordenar por dia local eventosPorMes = {} for _, evento in ipairs(eventos) do local mes = evento.mes if not eventosPorMes[mes] then eventosPorMes[mes] = {} end table.insert(eventosPorMes[mes], evento) end -- Ordenar os eventos dentro de cada mês pelo dia for mes, eventosMes in pairs(eventosPorMes) do table.sort(eventosMes, function(a, b) return a.dia < b.dia end) end -- Ordenar os meses local mesesOrdenados = {} for mes in pairs(eventosPorMes) do table.insert(mesesOrdenados, mes) end table.sort(mesesOrdenados) -- Construir o resultado final local resultado = {} for _, mes in ipairs(mesesOrdenados) do table.insert(resultado, "==" .. nomeMes(mes) .. "==") -- Adiciona o cabeçalho do mês for _, evento in ipairs(eventosPorMes[mes]) do table.insert(resultado, "* " .. evento.texto) -- Adiciona cada evento em uma nova linha end table.insert(resultado, "") -- Adiciona uma linha em branco após cada mês (opcional) end return #resultado > 0 and table.concat(resultado, '\n') or "''Sem dados para o ano " .. anoFiltro .. ".''" end return p