Module:TeamBracket
Sauter à la navigation
Sauter à la recherche
Ce modèle génère une représentation visuelle du déroulement de tournois à élimination directe.
Sommaire
Usage
{{#invoke: TeamBracket | teamBracket | rounds = | seed-width = | team-width = | score-width = | RD1 = | RD1-group1 = | RD1-seed1 = | RD1-team1 = | RD1-score1 = ... }}
Liste des paramètres
seed-width –
la largeur des cellules pour les "seeds".team-width –
la largeur des cellules pour les noms d'équipe.score-width –
la largeur des cellules pour les scores.
RDn –
Le nom du round n.RDn-groupm –
Le nom du groupe m dans le round n.RDn-seedm –
Le "seed" de l'équipe m dans le round n.RDn-teamm –
Le nom de l'équipe m dans le round n.RDn-scorem –
Le score de l'équipe m dans le round n.
Description des paramètres
(A traduire.)
- seed-width
- The width of the seed cells in CSS. Examples:
N [em/%/px]
auto
- team-width
- The width of the team name cells in CSS.
- score-width
- The width of the score cells in CSS.
- RDn
- The name of round n. Defaults are "Round of m", ..., "Quarterfinals", "Semifinals", and "Finals", where m is the number of teams in the round.
- RDn-groupm
- The name of group m in round n. For each round, every set of four teams is classified as a group.
- RDn-seedm
- The seed of team m in round n. For round 1, this value defaults to the conventional seed allocation for tournaments. If omitted, the cell is hidden. To hide seeds for round 1, the value must be explicitly set to be empty. m is the zero-padded position.
- RDn-teamm
- The name of team m in round n. m is the zero-padded position.
- RDn-scorem
- The score of team m in round n. m is the zero-padded position.
Exemples
Pas de "seeds"
{{#invoke: TeamBracket | teamBracket | rounds = 2 | RD1-seed1 = | RD1-seed2 = | RD1-seed3 = | RD1-seed4 = }}
Demi-finales | Finale | ||||||||
Groupes
{{#invoke: TeamBracket | teamBracket | rounds = 3 | RD1-group1 = Pacific | RD1-group2 = Mountain | RD2-group1 = West }}
Quarts de finale | Demi-finales | Finale | ||||||||||||
1 | ||||||||||||||
8 | ||||||||||||||
Pacific | ||||||||||||||
5 | ||||||||||||||
4 | ||||||||||||||
West | ||||||||||||||
3 | ||||||||||||||
6 | ||||||||||||||
Mountain | ||||||||||||||
7 | ||||||||||||||
2 | ||||||||||||||
-- -- This module will implement {{TeamBracket}} -- local p = {} local HtmlBuilder = require('Module:HtmlBuilder') local args local rounds local padding local function getArgs(frame) local parent = frame:getParent(); local args = parent.args; for k,v in pairs(frame.args) do args[k] = v end return args; end function getSeeds() local seeds = {1, 2} local count = 2 local before = false for r = 2, rounds do local max = math.pow(2, r) for i = 1, count do local pos = i * 2 if before then pos = pos - 1 end table.insert(seeds, pos, max - seeds[i * 2 - 1] + 1) before = not before end count = count * 2 end return seeds end function addTableRow(tbl) return tbl.tag('tr') end function addBlank(row, width) local cell = row.tag('td') .css('border-width', '0') .css('border-style', 'solid') .css('border-color', 'black') if width then cell.css('width', width) end return cell end function addPath(rows, index, round, top, left) local prop = top and 'border-bottom-width' or 'border-top-width' if left and round == 1 then addBlank(rows[index]).css('height', '7px') addBlank(rows[index + 1]).css('height', '7px') return nil else local cell = addBlank(rows[index]).attr('rowspan', '2') if left or round < rounds and not left then cell.css(prop, '2px') end return cell end end function getWidth(param, default) local arg = args[param .. '-width'] if not arg or string.len(arg) == 0 then arg = default end if tonumber(arg) ~= nil then arg = arg .. 'px' end return arg end function getTeamArg(round, type, team) return args[getTeamArgName(round, type, team)] end function getTeamArgName(round, type, team) return string.format('RD%d-%s' .. padding, round, type, team) end function getRoundName(round) local name = args['RD' .. round] if name and string.len(name) > 0 then return name end local roundFromLast = rounds - round + 1 if roundFromLast == 1 then return "Finale" elseif roundFromLast == 2 then return "Demi-finales" elseif roundFromLast == 3 then return "Quarts de finale" elseif roundFromLast == 4 then return "Huitièmes de finale" elseif roundFromLast == 5 then return "Seizièmes de finale" elseif roundFromLast == 6 then return "Trente-deuxièmes de finale" else return "Tour " .. math.pow(2, roundFromLast) end end function renderTeam(row, round, team) local seedArg = getTeamArg(round, 'seed', team) -- seed value for the paired team local pairSeedArg = getTeamArg(round, 'seed', team % 2 == 0 and team - 1 or team + 1) -- show seed if seed is defined for either or both local showSeed = seedArg and string.len(seedArg) > 0 or pairSeedArg and string.len(pairSeedArg) > 0 if showSeed then row.tag('td') .attr('rowspan', '2') .css('text-align', 'center') .css('background-color', '#f2f2f2') .css('border', '1px solid #aaa') .wikitext(seedArg) .newline() end local teamArg = getTeamArg(round, 'team', team) if not teamArg or string.len(teamArg) == 0 then teamArg = ' ' end local teamCell = row.tag('td') .attr('rowspan', '2') .css('background-color', '#f9f9f9') .css('border', '1px solid #aaa') .css('padding', '0 2px') .wikitext(teamArg) .newline() if not showSeed then teamCell.attr('colspan', '2') end row.tag('td') .attr('rowspan', '2') .css('text-align', 'center') .css('border', '1px solid #aaa') .css('background-color', '#f9f9f9') .wikitext(getTeamArg(round, 'score', team)) .newline() end function renderRound(rows, count, r) local teams = math.pow(2, rounds - r + 1) local step = count / teams local top = true local open = false local team = 1 for i = 1, count, step do local offset, height, blank -- leave room for groups for teams other than first and last if team == 1 or team == teams then offset = top and i or i + 2 height = step - 2 else offset = top and i + 1 or i + 2 height = step - 3 end if height > 0 then blank = addBlank(rows[offset]) .attr('colspan', '5') .attr('rowspan', height) end -- add bracket local j = top and i + step - 2 or i addPath(rows, j, r, top, true) renderTeam(rows[j], r, team) local right = addPath(rows, j, r, top, false) if not top then open = not open end if open and r < rounds then if blank then blank.css('border-right-width', '2px') end right.css('border-right-width', '2px') end team = team + 1 top = not top end end function renderGroups(rows, count, round) local roundFromLast = rounds - round + 1 local groups = math.pow(2, roundFromLast - 2) local step = count / groups local group = 1 for i = step / 2, count, step do local name = 'RD' .. round .. '-group' .. group addBlank(rows[i]).css('height', '7px') addBlank(rows[i + 1]).css('height', '7px') addBlank(rows[i]) .attr('rowspan', '2') .attr('colspan', 5 * round - 1) .css('text-align', 'center') .css('border-right-width', '2px') .wikitext(args[name]) .newline() group = group + 1 end end function renderTree(tbl) -- create 3 rows for every team local count = math.pow(2, rounds) * 3 local rows = {} for i = 1, count do rows[i] = addTableRow(tbl) end -- fill rows with groups for r = 1, rounds - 1 do renderGroups(rows, count, r) end -- fill rows with bracket for r = 1, rounds do renderRound(rows, count, r) end end function renderHeading(tbl) local titleRow = addTableRow(tbl) local widthRow = addTableRow(tbl) for r = 1, rounds do addBlank(titleRow) addBlank(widthRow, r > 1 and '5px' or nil) titleRow.tag('td') .attr('colspan', '3') .css('text-align', 'center') .css('border', '1px solid #aaa') .css('background-color', '#f2f2f2') .wikitext(getRoundName(r)) .newline() addBlank(widthRow, getWidth('seed', '25px')).wikitext(' ') addBlank(widthRow, getWidth('team', '150px')).wikitext(' ') addBlank(widthRow, getWidth('score', '25px')).wikitext(' ') addBlank(titleRow) addBlank(widthRow, r < rounds and '5px' or nil) end end function p.teamBracket(frame) args = getArgs(frame) rounds = tonumber(args.rounds) or 2 local teams = math.pow(2, rounds) padding = '%0' .. (teams < 10 and 1 or 2) .. 'd' -- set default seeds for round 1 local seeds = getSeeds() local argname; for i = 1, table.getn(seeds) do argname = getTeamArgName(1, 'seed', i) if not args[argname] then args[argname] = seeds[i] end end local tbl = HtmlBuilder.create('table') .css('border-style', 'none') .css('font-size', '90%') .css('margin', '1em 2em 1em 1em') .css('border-collapse', 'separate') .css('border-spacing', '0') renderHeading(tbl) renderTree(tbl) return tostring(tbl) end return p