<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://www.shadowera.com/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://www.shadowera.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ATeamBracket</id>
		<title>Module:TeamBracket - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://www.shadowera.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ATeamBracket"/>
		<link rel="alternate" type="text/html" href="https://www.shadowera.com/wiki/index.php?title=Module:TeamBracket&amp;action=history"/>
		<updated>2026-05-07T19:41:19Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.22.8</generator>

	<entry>
		<id>https://www.shadowera.com/wiki/index.php?title=Module:TeamBracket&amp;diff=1720&amp;oldid=prev</id>
		<title>Aphistos: Created page with &quot;-- -- This module will implement {{TeamBracket}} --   local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local rounds local padding   local function get...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.shadowera.com/wiki/index.php?title=Module:TeamBracket&amp;diff=1720&amp;oldid=prev"/>
				<updated>2014-07-01T08:43:42Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- -- This module will implement {{TeamBracket}} --   local p = {} local HtmlBuilder = require(&amp;#039;Module:HtmlBuilder&amp;#039;) local args local rounds local padding   local function get...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--&lt;br /&gt;
-- This module will implement {{TeamBracket}}&lt;br /&gt;
--&lt;br /&gt;
 &lt;br /&gt;
local p = {}&lt;br /&gt;
local HtmlBuilder = require('Module:HtmlBuilder')&lt;br /&gt;
local args&lt;br /&gt;
local rounds&lt;br /&gt;
local padding&lt;br /&gt;
 &lt;br /&gt;
local function getArgs(frame)&lt;br /&gt;
	local parent = frame:getParent();&lt;br /&gt;
	local args = parent.args;&lt;br /&gt;
	for k,v in pairs(frame.args) do &lt;br /&gt;
		args[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return args;&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function getSeeds()&lt;br /&gt;
	local seeds = {1, 2}&lt;br /&gt;
	local count = 2&lt;br /&gt;
	local before = false&lt;br /&gt;
	for r = 2, rounds do&lt;br /&gt;
		local max = math.pow(2, r)&lt;br /&gt;
		for i = 1, count do&lt;br /&gt;
			local pos = i * 2&lt;br /&gt;
			if before then pos = pos - 1 end&lt;br /&gt;
			table.insert(seeds, pos, max - seeds[i * 2 - 1] + 1)&lt;br /&gt;
			before = not before&lt;br /&gt;
		end&lt;br /&gt;
		count = count * 2&lt;br /&gt;
	end&lt;br /&gt;
	return seeds&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function addTableRow(tbl)&lt;br /&gt;
	return tbl.tag('tr')&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function addBlank(row, width)&lt;br /&gt;
	local cell = row.tag('td')&lt;br /&gt;
		.css('border-width', '0')&lt;br /&gt;
		.css('border-style', 'solid')&lt;br /&gt;
		.css('border-color', 'black')&lt;br /&gt;
	if width then&lt;br /&gt;
		cell.css('width', width)&lt;br /&gt;
	end&lt;br /&gt;
	return cell&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function addPath(rows, index, round, top, left)&lt;br /&gt;
	local prop = top and 'border-bottom-width' or 'border-top-width'&lt;br /&gt;
	if left and round == 1 then&lt;br /&gt;
		addBlank(rows[index]).css('height', '7px')&lt;br /&gt;
		addBlank(rows[index + 1]).css('height', '7px')&lt;br /&gt;
		return nil&lt;br /&gt;
	else&lt;br /&gt;
		local cell = addBlank(rows[index]).attr('rowspan', '2')&lt;br /&gt;
		if left or round &amp;lt; rounds and not left then&lt;br /&gt;
			cell.css(prop, '2px')&lt;br /&gt;
		end&lt;br /&gt;
		return cell&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function getWidth(param, default)&lt;br /&gt;
	local arg = args[param .. '-width']&lt;br /&gt;
	if not arg or string.len(arg) == 0 then&lt;br /&gt;
		arg = default&lt;br /&gt;
	end&lt;br /&gt;
	if tonumber(arg) ~= nil then&lt;br /&gt;
		arg = arg .. 'px'&lt;br /&gt;
	end&lt;br /&gt;
	return arg&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function getTeamArg(round, type, team)&lt;br /&gt;
	return args[getTeamArgName(round, type, team)]&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function getTeamArgName(round, type, team)&lt;br /&gt;
	return string.format('RD%d-%s' .. padding, round, type, team)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function getRoundName(round)&lt;br /&gt;
	local name = args['RD' .. round]&lt;br /&gt;
	if name and string.len(name) &amp;gt; 0 then&lt;br /&gt;
		return name&lt;br /&gt;
	end&lt;br /&gt;
	local roundFromLast = rounds - round + 1&lt;br /&gt;
	if roundFromLast == 1 then&lt;br /&gt;
		return &amp;quot;Finals&amp;quot;&lt;br /&gt;
	elseif roundFromLast == 2 then&lt;br /&gt;
		return &amp;quot;Semifinals&amp;quot;&lt;br /&gt;
	elseif roundFromLast == 3 then&lt;br /&gt;
		return &amp;quot;Quarterfinals&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;Round of &amp;quot; .. math.pow(2, roundFromLast)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function renderTeam(row, round, team)&lt;br /&gt;
	local seedArg = getTeamArg(round, 'seed', team)&lt;br /&gt;
	-- seed value for the paired team&lt;br /&gt;
	local pairSeedArg = getTeamArg(round, 'seed',&lt;br /&gt;
		team % 2 == 0 and team - 1 or team + 1)&lt;br /&gt;
	-- show seed if seed is defined for either or both&lt;br /&gt;
	local showSeed = seedArg and string.len(seedArg) &amp;gt; 0&lt;br /&gt;
		or pairSeedArg and string.len(pairSeedArg) &amp;gt; 0&lt;br /&gt;
	if showSeed then&lt;br /&gt;
		row.tag('td')&lt;br /&gt;
			.attr('rowspan', '2')&lt;br /&gt;
			.css('text-align', 'center')&lt;br /&gt;
			.css('background-color', '#f2f2f2')&lt;br /&gt;
			.css('border', '1px solid #aaa')&lt;br /&gt;
			.wikitext(seedArg)&lt;br /&gt;
			.newline()&lt;br /&gt;
	end&lt;br /&gt;
	local teamArg = getTeamArg(round, 'team', team)&lt;br /&gt;
	if not teamArg or string.len(teamArg) == 0 then&lt;br /&gt;
		teamArg = '&amp;amp;nbsp;'&lt;br /&gt;
	end&lt;br /&gt;
	local teamCell = row.tag('td')&lt;br /&gt;
		.attr('rowspan', '2')&lt;br /&gt;
		.css('background-color', '#f9f9f9')&lt;br /&gt;
		.css('border', '1px solid #aaa')&lt;br /&gt;
		.css('padding', '0 2px')&lt;br /&gt;
		.wikitext(teamArg)&lt;br /&gt;
		.newline()&lt;br /&gt;
	if not showSeed then&lt;br /&gt;
		teamCell.attr('colspan', '2')&lt;br /&gt;
	end&lt;br /&gt;
	row.tag('td')&lt;br /&gt;
		.attr('rowspan', '2')&lt;br /&gt;
		.css('text-align', 'center')&lt;br /&gt;
		.css('border', '1px solid #aaa')&lt;br /&gt;
		.css('background-color', '#f9f9f9')&lt;br /&gt;
		.wikitext(getTeamArg(round, 'score', team))&lt;br /&gt;
		.newline()&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function renderRound(rows, count, r)	&lt;br /&gt;
	local teams = math.pow(2, rounds - r + 1)&lt;br /&gt;
	local step = count / teams&lt;br /&gt;
	local top = true&lt;br /&gt;
	local open = false&lt;br /&gt;
	local team = 1&lt;br /&gt;
	for i = 1, count, step do&lt;br /&gt;
		local offset, height, blank&lt;br /&gt;
		-- leave room for groups for teams other than first and last&lt;br /&gt;
		if team == 1 or team == teams then&lt;br /&gt;
			offset = top and i or i + 2&lt;br /&gt;
			height = step - 2&lt;br /&gt;
		else&lt;br /&gt;
			offset = top and i + 1 or i + 2&lt;br /&gt;
			height = step - 3&lt;br /&gt;
		end&lt;br /&gt;
		if height &amp;gt; 0 then&lt;br /&gt;
			blank = addBlank(rows[offset])&lt;br /&gt;
				.attr('colspan', '5')&lt;br /&gt;
				.attr('rowspan', height)&lt;br /&gt;
		end&lt;br /&gt;
		-- add bracket&lt;br /&gt;
		local j = top and i + step - 2 or i&lt;br /&gt;
		addPath(rows, j, r, top, true)&lt;br /&gt;
		renderTeam(rows[j], r, team)&lt;br /&gt;
		local right = addPath(rows, j, r, top, false)&lt;br /&gt;
		if not top then open = not open end&lt;br /&gt;
		if open and r &amp;lt; rounds then&lt;br /&gt;
			if blank then blank.css('border-right-width', '2px') end&lt;br /&gt;
			right.css('border-right-width', '2px')&lt;br /&gt;
		end&lt;br /&gt;
		team = team + 1&lt;br /&gt;
		top = not top&lt;br /&gt;
	end&lt;br /&gt;
end	&lt;br /&gt;
 &lt;br /&gt;
function renderGroups(rows, count, round)&lt;br /&gt;
	local roundFromLast = rounds - round + 1&lt;br /&gt;
	local groups = math.pow(2, roundFromLast - 2)&lt;br /&gt;
	local step = count / groups&lt;br /&gt;
	local group = 1&lt;br /&gt;
	for i = step / 2, count, step do&lt;br /&gt;
		local name = 'RD' .. round .. '-group' .. group&lt;br /&gt;
		addBlank(rows[i]).css('height', '7px')&lt;br /&gt;
		addBlank(rows[i + 1]).css('height', '7px')&lt;br /&gt;
		addBlank(rows[i])&lt;br /&gt;
			.attr('rowspan', '2')&lt;br /&gt;
			.attr('colspan', 5 * round - 1)&lt;br /&gt;
			.css('text-align', 'center')&lt;br /&gt;
			.css('border-right-width', '2px')&lt;br /&gt;
			.wikitext(args[name])&lt;br /&gt;
			.newline()&lt;br /&gt;
		group = group + 1&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function renderTree(tbl)&lt;br /&gt;
	-- create 3 rows for every team&lt;br /&gt;
	local count = math.pow(2, rounds) * 3&lt;br /&gt;
	local rows = {}&lt;br /&gt;
	for i = 1, count do&lt;br /&gt;
		rows[i] = addTableRow(tbl)&lt;br /&gt;
	end&lt;br /&gt;
	-- fill rows with groups&lt;br /&gt;
	for r = 1, rounds - 1 do&lt;br /&gt;
		renderGroups(rows, count, r)&lt;br /&gt;
	end&lt;br /&gt;
	-- fill rows with bracket&lt;br /&gt;
	for r = 1, rounds do&lt;br /&gt;
		renderRound(rows, count, r)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function renderHeading(tbl)&lt;br /&gt;
	local titleRow = addTableRow(tbl)&lt;br /&gt;
	local widthRow = addTableRow(tbl)&lt;br /&gt;
	for r = 1, rounds do&lt;br /&gt;
		addBlank(titleRow)&lt;br /&gt;
		addBlank(widthRow, r &amp;gt; 1 and '5px' or nil)&lt;br /&gt;
		titleRow.tag('td')&lt;br /&gt;
			.attr('colspan', '3')&lt;br /&gt;
			.css('text-align', 'center')&lt;br /&gt;
			.css('border', '1px solid #aaa')&lt;br /&gt;
			.css('background-color', '#f2f2f2')&lt;br /&gt;
			.wikitext(getRoundName(r))&lt;br /&gt;
			.newline()&lt;br /&gt;
		addBlank(widthRow, getWidth('seed', '25px')).wikitext('&amp;amp;nbsp;')&lt;br /&gt;
		addBlank(widthRow, getWidth('team', '150px')).wikitext('&amp;amp;nbsp;')&lt;br /&gt;
		addBlank(widthRow, getWidth('score', '25px')).wikitext('&amp;amp;nbsp;')&lt;br /&gt;
		addBlank(titleRow)&lt;br /&gt;
		addBlank(widthRow, r &amp;lt; rounds and '5px' or nil)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function p.teamBracket(frame)&lt;br /&gt;
	args = getArgs(frame)&lt;br /&gt;
	rounds = tonumber(args.rounds) or 2&lt;br /&gt;
	local teams = math.pow(2, rounds)&lt;br /&gt;
	padding = '%0' .. (teams &amp;lt; 10 and 1 or 2) .. 'd'&lt;br /&gt;
 &lt;br /&gt;
	-- set default seeds for round 1&lt;br /&gt;
	local seeds = getSeeds()&lt;br /&gt;
	local argname;&lt;br /&gt;
	for i = 1, table.getn(seeds) do&lt;br /&gt;
		argname = getTeamArgName(1, 'seed', i)&lt;br /&gt;
		if not args[argname] then&lt;br /&gt;
			args[argname] = seeds[i]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
	local tbl = HtmlBuilder.create('table')&lt;br /&gt;
		.css('border-style', 'none')&lt;br /&gt;
		.css('font-size', '90%')&lt;br /&gt;
		.css('margin', '1em 2em 1em 1em')&lt;br /&gt;
		.css('border-collapse', 'separate')&lt;br /&gt;
		.css('border-spacing', '0')&lt;br /&gt;
 &lt;br /&gt;
	renderHeading(tbl)&lt;br /&gt;
	renderTree(tbl)&lt;br /&gt;
	return tostring(tbl)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Aphistos</name></author>	</entry>

	</feed>