Module:PlayoffBracketv2
From elfpedia.eu
Documentation for this module may be created at Module:PlayoffBracketv2/doc
local M = {}
-- Dependency on Standingsv3 module to get playoff teams and their seeding
-- Changed from Standingsv2 to Standingsv3
local Standings = require('Module:Standingsv3')
-- Function to generate the playoff bracket
function M.generateBracket(frame)
local args = frame:getParent().args
local season = tonumber(args.season) or 2025
if not season then
return "<p>Error: Please provide a season (e.g., {{#invoke:PlayoffBracket|generateBracket|season=2025}})</p>"
end
-- Retrieve data and seeding via the Standings module
local games = Standings.getGameData(season)
local allTeamStats = Standings.calculateTeamStats(games)
-- playoffTeamsInfo returns {TeamName = {status=..., rank=..., isQualified=..., ...}}
local playoffTeamsInfo = Standings.getPlayoffTeams(allTeamStats, season)
-- Filter and sort qualified teams by rank to assign them to matchups
local sortedPlayoffTeams = {}
for teamName, info in pairs(playoffTeamsInfo) do
-- Only insert qualified teams that have a rank
if info.isQualified and info.rank ~= nil then
table.insert(sortedPlayoffTeams, { Name = teamName, Rank = info.rank, Status = info.status })
end
end
-- Now sort the filtered list (line 27 will no longer compare nil values)
table.sort(sortedPlayoffTeams, function(a, b) return a.Rank < b.Rank end)
local teamByRank = {}
for _, team in ipairs(sortedPlayoffTeams) do
teamByRank[team.Rank] = team.Name
end
-- --- HTML Generation for the Bracket ---
local output = {}
table.insert(output, '<div class="playoff-bracket-container">') -- Main container
-- Bye Week Teams
-- Use 'TBD' if a rank does not exist (e.g., less than 6 teams qualified)
local team1_name = teamByRank[1] or "TBD"
local team2_name = teamByRank[2] or "TBD"
-- Wildcard Round Teams
local team3_name = teamByRank[3] or "TBD"
local team4_name = teamByRank[4] or "TBD"
local team5_name = teamByRank[5] or "TBD"
local team6_name = teamByRank[6] or "TBD"
-- Wildcard Round
table.insert(output, '<div class="playoff-round wildcard-round">')
table.insert(output, '<div class="playoff-round-header">WILDCARD ROUND</div>')
table.insert(output, '<div class="playoff-matchup-sub-header">')
table.insert(output, '<div class="playoff-header-away">AWAY</div>')
table.insert(output, '<div class="playoff-header-home">HOME</div>')
table.insert(output, '</div>')
-- Matchup #6 (Away) vs #3 (Home)
table.insert(output, '<div class="playoff-matchup">')
table.insert(output, '<div class="sr-only">Wildcard matchup: Seed #6 ' .. team6_name .. ' at Seed #3 ' .. team3_name .. '.</div>')
table.insert(output, '<div class="playoff-team away-team">[[' .. team6_name .. ']] (#6)</div>')
table.insert(output, '<div class="playoff-at">AT</div>')
table.insert(output, '<div class="playoff-team home-team">[[' .. team3_name .. ']] (#3)</div>')
table.insert(output, '</div>')
-- Matchup #5 (Away) vs #4 (Home)
table.insert(output, '<div class="playoff-matchup">')
table.insert(output, '<div class="sr-only">Wildcard matchup: Seed #5 ' .. team5_name .. ' at Seed #4 ' .. team4_name .. '.</div>')
table.insert(output, '<div class="playoff-team away-team">[[' .. team5_name .. ']] (#5)</div>')
table.insert(output, '<div class="playoff-at">AT</div>')
table.insert(output, '<div class="playoff-team home-team">[[' .. team4_name .. ']] (#4)</div>')
table.insert(output, '</div>')
table.insert(output, '</div>') -- End wildcard-round
-- Bye Week Section (neue kompakte Darstellung)
table.insert(output, '<div class="playoff-bye-info">')
table.insert(output, '<span class="playoff-bye-label">Bye Week:</span>')
table.insert(output, '<span class="playoff-bye-team">[[' .. team1_name .. ']] (#1)</span>')
table.insert(output, '<span class="playoff-bye-team">[[' .. team2_name .. ']] (#2)</span>')
table.insert(output, '</div>')
-- Semifinal Round
table.insert(output, '<div class="playoff-round semifinal-round">')
table.insert(output, '<div class="playoff-round-header">SEMIFINAL ROUND</div>')
-- Matchup 1: Highest remaining Seed vs #2 Seed
table.insert(output, '<div class="playoff-matchup">')
table.insert(output, '<div class="sr-only">Semifinal matchup: Highest remaining Wild Card winner versus Seed #2 ' .. team2_name .. '.</div>')
table.insert(output, '<div class="playoff-team away-team winner-placeholder">(Highest WC Winner)</div>')
table.insert(output, '<div class="playoff-at">AT</div>')
table.insert(output, '<div class="playoff-team home-team">[[' .. team2_name .. ']] (#2)</div>')
table.insert(output, '</div>')
-- Matchup 2: Lowest remaining Seed vs #1 Seed
table.insert(output, '<div class="playoff-matchup">')
table.insert(output, '<div class="sr-only">Semifinal matchup: Lowest remaining Wild Card winner versus Seed #1 ' .. team1_name .. '.</div>')
table.insert(output, '<div class="playoff-team away-team winner-placeholder">(Lowest WC Winner)</div>')
table.insert(output, '<div class="playoff-at">AT</div>')
table.insert(output, '<div class="playoff-team home-team">[[' .. team1_name .. ']] (#1)</div>')
table.insert(output, '</div>')
table.insert(output, '</div>') -- End semifinal-round
-- Championship Game
table.insert(output, '<div class="playoff-round championship-round">')
table.insert(output, '<div class="playoff-round-header">CHAMPIONSHIP GAME</div>')
table.insert(output, '<div class="playoff-matchup">')
table.insert(output, '<div class="sr-only">Championship game matchup: Winner of semifinal one versus winner of semifinal two.</div>')
table.insert(output, '<div class="playoff-team away-team winner-placeholder">Winner Semifinal 1</div>')
table.insert(output, '<div class="playoff-at">VS</div>')
table.insert(output, '<div class="playoff-team home-team winner-placeholder">Winner Semifinal 2</div>')
table.insert(output, '</div>')
table.insert(output, '</div>') -- End championship-round
table.insert(output, '</div>') -- End playoff-bracket-container
return table.concat(output, '\n')
end
return M