Module:Bracket
Appearance
This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
Wrapper for bracket templates, which can be used in place of the following for reduced Post-expand include size:
- {{2TeamBracket}}
- {{4TeamBracket}}
- {{4TeamBracket-Tennis3}}
- {{4TeamBracket-Tennis35}}
- {{4TeamBracket-Tennis5}}
- {{6TeamBracket}}
- {{7TeamBracket}}
- {{8TeamBracket}}
- {{8TeamBracket-Byes}}
- {{8TeamBracket-Compact-Byes}}
- {{8TeamBracket-Compact-NoSeeds-Byes}}
- {{8TeamBracket-Tennis3}}
- {{8TeamBracket-Tennis5}}
- {{16TeamBracket}}
- {{16TeamBracket-Byes}}
- {{16TeamBracket-Compact-Archery}}
- {{16TeamBracket-Compact-NoSeeds-Byes}}
- {{16TeamBracket-Compact-Tennis3}}
- {{16TeamBracket-Compact-Tennis3-Byes}}
- {{16TeamBracket-Compact-Tennis5}}
- {{16TeamBracket-Compact-Tennis5-Byes}}
- {{16TeamBracket-Tennis3}}
- {{16TeamBracket-Tennis5}}
- {{32TeamBracket}}
- {{32TeamBracket-Byes}}
- {{32TeamBracket-Compact-NoSeeds-Byes}}
- {{32TeamBracket-Compact-Squash5}}
- {{32TeamBracket-Compact-Tennis3}}
- {{32TeamBracket-Tennis3}}
- {{64TeamBracket}}
Usage
{{#invoke:Bracket|template_name}}
Example
{{#invoke:Bracket|16TeamBracket-Compact-Tennis3}}
1st round | 2nd round | Semifinals | Finals | ||||||||||||||||||||||||
Adding new templates
New templates can be added using the following format:
p['TEMPLATE_NAME'] = function (frame)
return p._teamBracket(frame, 'TEMPLATE_NAME', {ALTERNATIVE_PARAMETER_NAMES}, {PARAMETER_DEFAULTS})
end
- TEMPLATE_NAME is the name of the template without "Template:"
- ALTERNATIVE_PARAMETER_NAMES is an array of custom parameters and the standard parameter of Moduke:Team Bracket that they translate to, in the form
CUSTOM_NAME = "STANDARD_NAME"
. For example, a template that uses|RD1-group1 = {{{RD1-group1|{{{group1|}}}}}}
would havegroup1 = "RD1-group1"
. Any parameters that start with a number or contain a dash need to be specified as['CUSTOM_NAME']
, e.g.['RD1-seed01'] = 'RD1-seed1'
. - PARAMETER_DEFAULTS is an array of default parameter values that are used if a parameter is not specified. For example, a template that uses
|RD1 = Quarterfinals
would haveRD1 = "Quarterfinals"
, or a template that uses|team-width = {{{team-width|125}}}
would have['team-width'] = "125"
. Some parameters are automatically determined based on TEMPLATE-NAME unless explicity specified in PARAMETER_DEFAULTS:rounds
is automatically calculated based on the##Team
or##Round
text present in TEMPLATE-NAME. This does not need to be specified.- Templates with
-Tennis##
or-Squash##
in TEMPLATE-NAME will havesets
set to the value of##
. In addition, these templates will have{seeds = "yes", nowrap = "yes"}
set. - Templates with
-Compact
in TEMPLATE-NAME will automatically default tocompact = "yes"
local p = {}
p['_teamBracket'] = function (frame, template, subs, args)
-- figure out parameters from template name
args.rounds = args.rounds or mw.ustring.match(template or '', "^(%d*)Round")
if not args.rounds then
local teams = tonumber(mw.ustring.match(template or '', "^(%d*)Team"))
if teams and teams > 1 then -- log2(teams) is the number of rounds
args.rounds = math.ceil( math.log(teams)/math.log(2) )
end
end
local tennis = mw.ustring.match(template or '', "-Tennis(%d*)")
local squash = mw.ustring.match(template or '', "-Squash(%d*)")
if tennis or squash then
args.sets = args.sets or tennis or squash
args.seeds = args.seeds or 'yes'
args.nowrap = args.nowrap or 'yes'
end
if string.find(template, "-Compact") then
args.compact = args.compact or 'yes'
end
-- overwrite defaults with frame args and alternative args
for k, v in pairs(frame.args) do
if subs[k] then
args[subs[k]] = v
else
args[k] = v
end
end
--return template
return require('Module:Team bracket').main(frame:newChild{title = ("Template:" .. template), args = args})
end
p['2TeamBracket'] = function (frame)
return p._teamBracket(frame, '2TeamBracket', {}, {autoseeds = "y"})
end
p['4TeamBracket'] = function (frame)
return p._teamBracket(frame, '4TeamBracket', {
group1 = "RD1-group1"
}, {
autoseeds = "y",
['RD1-group1'] = ""
})
end
p['4TeamBracket-Tennis3'] = function (frame)
return p._teamBracket(frame, '4TeamBracket-Tennis3', {}, {
seeds = '',
RD2 = "Final",
['team-width'] = 125
})
end
p['4TeamBracket-Tennis5'] = function (frame)
return p._teamBracket(frame, '4TeamBracket-Tennis5', {}, {
seeds = '',
RD1 = "Quarterfinals",
RD2 = "Semifinals",
['team-width'] = 125,
['RD1-seed1'] = '',
['RD1-seed2'] = '',
['RD1-seed3'] = '',
['RD1-seed4'] = '',
})
end
p['4TeamBracket-Tennis35'] = function (frame)
return p._teamBracket(frame, '4TeamBracket-Tennis35', {}, {
sets = "3/5",
RD1 = "Semifinals",
RD2 = "Final",
['RD1-seed1'] = '',
['RD1-seed2'] = '',
['RD1-seed3'] = '',
['RD1-seed4'] = '',
})
end
p['6TeamBracket'] = function (frame)
stepdown = require('Module:yesno')(frame.args.stepdown)
return p._teamBracket(frame, '6TeamBracket', {
group1 = "RD1-group1",
group2 = "RD1-group2",
group3 = "RD2-group1",
}, {
compact = "y",
seeds = "y",
byes = '',
['RD1-omit'] = stepdown and "3/4/7/8" or "1/2/5/6",
['RD1-group1'] = "",
['RD1-group2'] = "",
['RD2-group1'] = "",
['RD1-seed1'] = 4,
['RD1-seed2'] = 5,
['RD1-seed3'] = 3,
['RD1-seed4'] = 6,
['RD2-seed1'] = stepdown and '' or 1,
['RD2-seed2'] = stepdown and 1 or '',
['RD2-seed3'] = stepdown and '' or 2,
['RD2-seed4'] = stepdown and 2 or '',
})
end
p['7TeamBracket'] = function (frame)
return p._teamBracket(frame, '7TeamBracket', {
group1 = "RD1-group1",
group2 = "RD1-group2",
group3 = "RD2-group1",
['RD1-seed01'] = 'RD1-seed1',
['RD1-seed02'] = 'RD1-seed2',
['RD1-seed03'] = 'RD1-seed3',
['RD1-seed04'] = 'RD1-seed4',
['RD1-seed05'] = 'RD1-seed5',
['RD1-seed06'] = 'RD1-seed6',
['RD2-seed01'] = 'RD2-seed1',
['RD1-team01'] = 'RD1-team1',
['RD1-team02'] = 'RD1-team2',
['RD1-team03'] = 'RD1-team3',
['RD1-team04'] = 'RD1-team4',
['RD1-team05'] = 'RD1-team5',
['RD1-team06'] = 'RD1-team6',
}, {
['RD1-omit'] = "1/2",
byes = 1,
['RD1-group1'] = "",
['RD1-group2'] = "",
['RD2-group1'] = "",
['RD1-seed1'] = 4,
['RD1-seed2'] = 5,
['RD1-seed3'] = 2,
['RD1-seed4'] = 7,
['RD1-seed5'] = 3,
['RD1-seed6'] = 6,
['RD2-seed1'] = 1,
['RD1-team1'] = ' ',
['RD1-team2'] = ' ',
['RD1-team3'] = ' ',
['RD1-team4'] = ' ',
['RD1-team5'] = ' ',
['RD1-team6'] = ' ',
})
end
p['8TeamBracket'] = function (frame)
return p._teamBracket(frame, '8TeamBracket', {
group1 = 'RD1-group1',
group2 = 'RD1-group2',
group3 = 'RD2-group1',
['RD1-seed01'] = 'RD1-seed1',
['RD1-seed02'] = 'RD1-seed2',
['RD1-seed03'] = 'RD1-seed3',
['RD1-seed04'] = 'RD1-seed4',
['RD1-seed05'] = 'RD1-seed5',
['RD1-seed06'] = 'RD1-seed6',
['RD1-seed07'] = 'RD1-seed7',
['RD1-seed08'] = 'RD1-seed8',
}, {
['RD1-seed1'] = 1,
['RD1-seed2'] = 8,
['RD1-seed3'] = 4,
['RD1-seed4'] = 5,
['RD1-seed5'] = 2,
['RD1-seed6'] = 7,
['RD1-seed7'] = 3,
['RD1-seed8'] = 6,
})
end
p['8TeamBracket-Byes'] = function (frame)
return p._teamBracket(frame, '8TeamBracket-Byes', {
group1 = "RD1-group1",
group2 = "RD1-group2",
group3 = "RD2-group1",
Consol = "RD3b"
}, {
seeds = 'yes',
byes = 1,
['team-width'] = '11em',
['score-width'] = '2em',
['RD1-group1'] = '',
['RD1-group2'] = '',
['RD2-group1'] = '',
RD3b = frame.args['RD3-team3'] and "Third place" or ""
})
end
p['3RoundBracket-Byes'] = p['8TeamBracket-Byes']
p['8TeamBracket-Compact-Byes'] = function (frame)
return p._teamBracket(frame, '8TeamBracket-Compact-Byes', {
}, {
nowrap = 'y',
byes = 1,
['seed-width'] = 5,
['team-width'] = '125',
['score-width'] = '15',
})
end
p['8TeamBracket-Compact-NoSeeds-Byes'] = function (frame)
return p._teamBracket(frame, '8TeamBracket-Compact-NoSeeds-Byes', {
['RD1-seed01'] = 'RD1-seed1',
['RD1-seed02'] = 'RD1-seed2',
['RD1-seed03'] = 'RD1-seed3',
['RD1-seed04'] = 'RD1-seed4',
['RD1-seed05'] = 'RD1-seed5',
['RD1-seed06'] = 'RD1-seed6',
['RD1-seed07'] = 'RD1-seed7',
['RD1-seed08'] = 'RD1-seed8',
}, {
byes = 2,
['team-width'] = '125',
['score-width'] = '25',
RD1 = 'Quarterfinals',
RD2 = 'Semifinals',
RD3 = 'Final',
})
end
p['8TeamBracket-Tennis3'] = function (frame)
return p._teamBracket(frame, '8TeamBracket-Tennis3', {}, {
RD1 = 'Quarterfinals',
RD2 = 'Semifinals',
RD3 = 'Finals',
['team-width'] = 140,
['RD1-seed1'] = 1,
['RD1-seed2'] = 8,
['RD1-seed3'] = 4,
['RD1-seed4'] = 5,
['RD1-seed5'] = 3,
['RD1-seed6'] = 6,
['RD1-seed7'] = 2,
['RD1-seed8'] = 7,
})
end
p['8TeamBracket-Tennis5'] = function (frame)
return p._teamBracket(frame, '8TeamBracket-Tennis5', {}, {
RD1 = 'Quarterfinals',
RD2 = 'Semifinals',
RD3 = 'Final',
})
end
p['16TeamBracket'] = function (frame)
return p._teamBracket(frame, '16TeamBracket', {
subgroup1 = 'RD1-group1',
subgroup2 = 'RD1-group2',
subgroup3 = 'RD1-group3',
subgroup4 = 'RD1-group4',
group1 = 'RD2-group1',
group2 = 'RD2-group2',
group3 = 'RD3-group1',
['RD1-seed01'] = 'RD1-seed1',
['RD1-seed02'] = 'RD1-seed2',
['RD1-seed03'] = 'RD1-seed3',
['RD1-seed04'] = 'RD1-seed4',
['RD1-seed05'] = 'RD1-seed5',
['RD1-seed06'] = 'RD1-seed6',
['RD1-seed07'] = 'RD1-seed7',
['RD1-seed08'] = 'RD1-seed8',
['RD1-seed09'] = 'RD1-seed9',
}, {
['RD1-seed1'] = 1,
['RD1-seed2'] = 16,
['RD1-seed3'] = 8,
['RD1-seed4'] = 9,
['RD1-seed5'] = 5,
['RD1-seed6'] = 12,
['RD1-seed7'] = 4,
['RD1-seed8'] = 13,
['RD1-seed9'] = 6,
['RD1-seed10'] = 11,
['RD1-seed11'] = 3,
['RD1-seed12'] = 14,
['RD1-seed13'] = 7,
['RD1-seed14'] = 10,
['RD1-seed15'] = 2,
['RD1-seed16'] = 15,
RD1 = 'First round',
RD2 = 'Quarter-finals',
RD3 = 'Semi-finals',
RD4 = 'Final',
})
end
p['16TeamBracket-Byes'] = function (frame)
return p._teamBracket(frame, '16TeamBracket-Byes', {
group1 = "RD1-group1",
group2 = "RD2-group2",
}, {
seeds = 'yes',
byes = 1,
RD1 = 'First round',
RD2 = 'Second round',
RD3 = 'Semifinals',
RD4 = 'Finals',
['team-width'] = '11em',
['score-width'] = '2em',
['RD1-group1'] = '',
['RD2-group2'] = '',
})
end
p['4RoundBracket-Byes'] = p['16TeamBracket-Byes']
p['16TeamBracket-Tennis3'] = function (frame)
return p._teamBracket(frame, '16TeamBracket-Tennis3', {}, {
['team-width'] = 140,
['score-width'] = 25,
RD1 = 'First round',
RD2 = 'Quarterfinals',
RD3 = 'Semifinals',
RD4 = 'Final',
})
end
p['16TeamBracket-Compact-NoSeeds-Byes'] = function (frame)
return p._teamBracket(frame, '16TeamBracket-Compact-NoSeeds-Byes', {
['RD1-seed01'] = 'RD1-seed1',
['RD1-seed02'] = 'RD1-seed2',
['RD1-seed03'] = 'RD1-seed3',
['RD1-seed04'] = 'RD1-seed4',
['RD1-seed05'] = 'RD1-seed5',
['RD1-seed06'] = 'RD1-seed6',
['RD1-seed07'] = 'RD1-seed7',
['RD1-seed08'] = 'RD1-seed8',
['RD1-seed09'] = 'RD1-seed9',
}, {
byes = 3,
RD1 = 'Round of 16',
RD2 = 'Quarterfinals',
RD3 = 'Semifinals',
RD4 = 'Final',
['team-width'] = 125,
['score-width'] = 25
})
end
p['16TeamBracket-Compact-Tennis3'] = function (frame)
return p._teamBracket(frame, '16TeamBracket-Compact-Tennis3', {}, {
RD1 = '1st round',
RD2 = '2nd round',
})
end
p['16TeamBracket-Compact-Tennis3-Byes'] = function (frame)
return p._teamBracket(frame, '16TeamBracket-Compact-Tennis3-Byes', {}, {
byes = 2,
['seed-width'] = 25,
['team-width'] = 150,
RD1 = '1st round',
RD2 = '2nd round',
RD3 = 'Semifinals',
RD4 = 'Final',
})
end
p['4RoundBracket-Compact-Tennis3-Byes'] = p['16TeamBracket-Compact-Tennis3-Byes']
p['16TeamBracket-Compact-Archery'] = function (frame)
return p._teamBracket(frame, '16TeamBracket-Compact-Archery', {}, {
nowrap = 'yes',
sets = 6,
seeds = 'yes',
['team-width'] = 150,
['score-width'] = 12,
RD1 = '1st round',
RD2 = '2nd round',
RD3 = 'Semifinals',
RD4 = 'Finals',
})
end
p['16TeamBracket-Tennis5'] = function (frame)
return p._teamBracket(frame, '16TeamBracket-Tennis5', {}, {
RD1 = 'First round',
RD2 = 'Quarterfinals',
RD3 = 'Semifinals',
RD4 = 'Final',
['seed-width'] = 25,
['team-width'] = 150,
['score-width'] = 12,
})
end
p['16TeamBracket-Compact-Tennis5'] = function (frame)
return p._teamBracket(frame, '16TeamBracket-Compact-Tennis5', {}, {
RD1 = 'First round',
RD2 = 'Second round',
RD3 = 'Third round',
RD4 = 'Fourth round',
})
end
p['16TeamBracket-Compact-Tennis5-Byes'] = function (frame)
return p._teamBracket(frame, '16TeamBracket-Compact-Tennis5-Byes', {}, {
byes = 1,
RD1 = 'First round',
RD2 = 'Second round',
RD3 = 'Semifinals',
RD4 = 'Final',
})
end
p['4RoundBracket-Compact-Tennis5-Byes'] = p['16TeamBracket-Compact-Tennis5-Byes']
p['32TeamBracket'] = function (frame)
return p._teamBracket(frame, '32TeamBracket', {
subgroup1 = 'RD1-group1',
subgroup2 = 'RD1-group2',
subgroup3 = 'RD1-group3',
subgroup4 = 'RD1-group4',
subgroup5 = 'RD1-group5',
subgroup6 = 'RD1-group6',
subgroup7 = 'RD1-group7',
subgroup8 = 'RD1-group8',
group1 = 'RD2-group1',
group2 = 'RD2-group2',
group3 = 'RD3-group3',
group4 = 'RD2-group4',
half1 = 'RD3-group1',
half2 = 'RD3-group2',
group5 = 'RD4-group1',
}, {
autoseeds = 'y',
RD1 = "1st Round",
RD2 = "2nd Round",
})
end
p['32TeamBracket-Byes'] = function (frame)
return p._teamBracket(frame, '32TeamBracket-Byes', {}, {
byes = 1,
seeds = 'y',
RD1 = "First Round",
RD2 = "Second Round",
RD3 = "Quarter Finals",
RD4 = "Semi Finals",
RD5 = "Final",
['seed-width'] = '2em',
['team-width'] = '11em',
['score-width'] = '2em',
})
end
p['32TeamBracket-Compact-NoSeeds-Byes'] = function (frame)
return p._teamBracket(frame, '32TeamBracket-Compact-NoSeeds-Byes', {}, {
byes = 4,
RD1 = "Round of 32",
RD2 = "Round of 16",
RD3 = "Quarterfinals",
RD4 = "Semifinals",
RD5 = "Final",
['team-width'] = 125,
['score-width'] = 25,
})
end
p['32TeamBracket-Compact-Squash5'] = function (frame)
return p._teamBracket(frame, '32TeamBracket-Compact-Squash5', {}, {
['compact-final'] = 'yes',
['team-width'] = 190,
['score-width'] = 12,
['seed-width'] = 10,
RD1 = "1st round",
RD2 = "2nd round",
RD3 = "3rd round",
RD4 = "4th round",
RD5 = "5th round",
})
end
p['32TeamBracket-Compact-Tennis3'] = function (frame)
return p._teamBracket(frame, '32TeamBracket-Compact-Tennis3', {}, {
seeds = '',
['compact-final'] = 'yes',
['team-width'] = 'auto',
['score-width'] = 12,
RD1 = "1st round",
RD2 = "2nd round",
RD3 = "Quarterfinals",
RD4 = "Semifinals",
RD5 = "Finals",
})
end
p['32TeamBracket-Tennis3'] = function (frame)
return p._teamBracket(frame, '32TeamBracket-Tennis3', {}, {
compact = 'yes',
RD1 = "First Round",
RD2 = "Second Round",
RD3 = "Quarterfinals",
RD4 = "Semifinals",
RD5 = "Final",
})
end
p['64TeamBracket'] = function (frame)
return p._teamBracket(frame, '64TeamBracket', {
subgroup1 = 'RD1-group1',
subgroup2 = 'RD1-group2',
subgroup3 = 'RD1-group3',
subgroup4 = 'RD1-group4',
subgroup5 = 'RD1-group5',
subgroup6 = 'RD1-group6',
subgroup7 = 'RD1-group7',
subgroup8 = 'RD1-group8',
subgroup9 = 'RD1-group9',
subgroup10 = 'RD1-group10',
subgroup11 = 'RD1-group11',
subgroup12 = 'RD1-group12',
subgroup13 = 'RD1-group13',
subgroup14 = 'RD1-group14',
subgroup15 = 'RD1-group15',
subgroup16 = 'RD1-group16',
group1 = 'RD2-group1',
group2 = 'RD2-group2',
group3 = 'RD3-group3',
group4 = 'RD2-group4',
group5 = 'RD2-group5',
group6 = 'RD3-group6',
group7 = 'RD2-group7',
group8 = 'RD2-group8',
quarter1 = 'RD3-group1',
quarter2 = 'RD3-group2',
quarter3 = 'RD3-group3',
quarter4 = 'RD3-group4',
half1 = 'RD4-group1',
half2 = 'RD4-group2',
group9 = 'RD5-group1',
['RD1-group01'] = 'RD1-group1',
['RD1-group02'] = 'RD1-group2',
['RD1-group03'] = 'RD1-group3',
['RD1-group04'] = 'RD1-group4',
['RD1-group05'] = 'RD1-group5',
['RD1-group06'] = 'RD1-group6',
['RD1-group07'] = 'RD1-group7',
['RD1-group08'] = 'RD1-group8',
['RD1-group09'] = 'RD1-group9',
}, {
autoseeds = 'y',
RD1 = "1st Round",
RD2 = "2nd Round",
RD3 = "3rd Round",
})
end
p['list'] = function (frame)
local funcs={}
for k,_ in pairs(p) do
if string.match(k, "^%d+Team") then
table.insert(funcs, k)
end
end
table.sort(funcs, function (a,b)
na, nb = tonumber(string.match(a, "^%d+")), tonumber(string.match(b, "^%d+"))
return na == nb and string.match(a, "^%d*(.*)$") < string.match(b, "^%d*(.*)$") or na < nb
end)
return frame.preprocess(frame,
"\n* {{tl|"..table.concat(funcs, "}}\n* {{tl|").."}}")
end
p['doc'] = function (frame)
local pagename = mw.title.getCurrentTitle().rootText
if type(p[pagename]) == "function" then
return frame.preprocess(frame, "{{tlx|"..pagename.."}} can be " ..
"replaced with {{mlx|bracket|"..pagename.."}}.")
end
return frame.preprocess(frame, "In most cases, the name of the bracket " ..
"template can be used as the function name for {{ml|Bracket}}, e.g. " ..
"{{tlx|16TeamBracket-Compact-Tennis3}}→" ..
"{{mlx|bracket|16TeamBracket-Compact-Tennis3}}.")
end
return p