Diferencia entre revisiones de «Módulo:Copa»
Apariencia
Página blanqueada Etiquetas: Vaciado Edición desde móvil Edición vía web móvil Edición móvil avanzada |
Sin resumen de edición Etiquetas: Reversión manual Edición desde móvil Edición vía web móvil Edición móvil avanzada |
||
| Línea 1: | Línea 1: | ||
-- | |||
-- This module will implement {{TeamBracket}} | |||
-- | |||
local p = {} | |||
local args | |||
local rounds | |||
local showSeeds | |||
local roundNames = {} | |||
local roundNamesExists | |||
local dates={} -- Fecha de cada round | |||
local roundDatesExists | |||
local teamsRound1 -- Diferente | |||
local teams = {} -- Diferente. Número de equipos de un round | |||
local matches = {} -- Diferente. Número de partidos de un round | |||
local allMatches= {} -- Diferente. Número de partidos de un round y de los anteriores | |||
local rows={} | |||
local numberOfRows | |||
local rowsPerTeam | |||
local scoresConBlancos = false | |||
local scoresConComas = false | |||
-- Constantes | |||
local CRoundNames = {'Final', 'Semifinales', 'Cuartos de final', 'Octavos de final', 'Dieciseisavos de final', ['3rd']='Tercer lugar'} | |||
local CteamCellWidth={'176px', | |||
'16em' -- de la plantilla:Copa de 4 equipos-1 ronda | |||
--, '16em' | |||
, '11em' -- de la plantilla:Copa de 8 equipos-1 ronda con número | |||
} -- 150px en el original siempre. 226 en total | |||
local function getArgs(frame) | |||
-- Lo rehago. No funcionaba | |||
local parent = frame:getParent(); | |||
local args = {} | |||
for k,v in pairs(parent.args) do | |||
args[k] = v | |||
end | |||
for k,v in pairs(frame.args) do | |||
args[k] = v | |||
end | |||
-- Es diferente a la versión original del módulo pues en la Wikipedia española el nombre de los campos puede ser diferente | |||
local args2 = {} | |||
local k2 | |||
for k,v in pairs(args) do | |||
k2= tostring(k):gsub('seed0','seed') | |||
k2= k2:gsub('team0','team') | |||
k2= k2:gsub('score0','score') | |||
k2= k2:gsub('a$','-1') -- {{{RD3-score01a}}} | |||
k2= k2:gsub('b$','-2') -- {{{RD3-score01b}}} | |||
args2[k2] = v | |||
end | |||
return args2; | |||
end | |||
function getRounds() -- Diferente | |||
if args['RD5'] or args['RD5-team1'] then | |||
return 5 | |||
elseif args['RD4'] or args['RD4-team1'] then | |||
return 4 | |||
elseif args['RD3'] or args['RD3-team1'] then | |||
return 3 | |||
elseif args['RD2'] or args['RD2-team1'] then | |||
return 2 | |||
elseif args['RD1'] or args['RD1-team1'] then | |||
return 1 | |||
end | |||
end | |||
function getGroup(round, group) | |||
local groupArg = args['RD' .. round .. '-group' .. group] | |||
if groupArg then | |||
return groupArg | |||
end | |||
if args['group8'] then -- hay 8 grupos | |||
if rounds == round + 4 then | |||
return args['group'..group] | |||
end | |||
elseif args['group4'] then -- hay 4 grupos | |||
if rounds == round + 3 then | |||
return args['group'..group] | |||
end | |||
elseif args['group2'] then -- solo hay 2 grupos | |||
if rounds == round + 2 then | |||
return args['group'..group] | |||
end | |||
end | |||
end | |||
function getScore(round, team, match) | |||
local resultado | |||
if round == '3rd' then | |||
resultado = args[round .. '-score' .. team .. '-' .. match] or | |||
(match==1 and args[round .. '-score' .. team]) or '' | |||
else | |||
resultado = args['RD' .. round .. '-score' .. team .. '-' .. match] or | |||
(match==1 and args['RD' .. round .. '-score' .. team]) or '' | |||
end | |||
if resultado:match(',') then | |||
scoresConComas= true | |||
end | |||
if resultado:match(' ') and not resultado:match(' %(') and not resultado:match(' {{') and not resultado:match(' <') then | |||
scoresConBlancos = true | |||
end | |||
return resultado | |||
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') | |||
if width then | |||
cell:css('width', width) | |||
end | |||
return cell | |||
end | |||
-- Draws an horizontal line | |||
function addPath(row, top, showPath) | |||
local cell = addBlank(row) | |||
:attr('rowspan', '2') | |||
if showPath then | |||
cell | |||
:css('border-width', '0') | |||
:css('border-style', 'solid') | |||
:css('border-color', 'black') | |||
:css(top and 'border-bottom-width' or 'border-top-width', '1px') | |||
end | |||
return cell | |||
end | |||
function addCompactPath(index, round, top, left) | |||
local prop = top and 'border-bottom-width' or 'border-top-width' | |||
if left and round == 1 then | |||
addBlank(rows[index]) | |||
return nil | |||
else | |||
local cell = addBlank(rows[index]) | |||
:css('border-width', '0') | |||
:css('border-style', 'solid') | |||
:css('border-color', 'black') | |||
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) | |||
if round == '3rd' then | |||
return '3rd-' .. type .. team | |||
else | |||
return string.format('RD%d-%s%01d', round, type, team) | |||
end | |||
end | |||
function renderTeam(row, round, team, top, compact, showTeam) | |||
local seedCell | |||
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 = showTeam and (seedArg and string.len(seedArg) > 0 | |||
or pairSeedArg and string.len(pairSeedArg) > 0) | |||
local teamArg = getTeamArg(round, 'team', team) | |||
if showSeed and showSeeds then | |||
seedCell = row:tag('td') | |||
:css('text-align', 'center') | |||
:css('background-color', '#f2f2f2') | |||
:css('border-color', '#aaa') | |||
:css('border-style', 'solid') | |||
:css('border-top-width', '1px') | |||
:css('border-left-width', '1px') | |||
:css('border-right-width', '1px') | |||
:css('border-bottom-width', '0') | |||
:wikitext(seedArg) | |||
:newline() | |||
end | |||
if not teamArg or string.len(teamArg) == 0 then | |||
teamArg = ' ' | |||
end | |||
local teamCell = row:tag('td') | |||
if showTeam then | |||
teamCell | |||
:css('background-color', '#f9f9f9') | |||
:css('border-color', '#aaa') | |||
:css('border-style', 'solid') | |||
:css('border-top-width', '1px') | |||
:css('border-left-width', '1px') | |||
:css('border-right-width', '0') | |||
:css('border-bottom-width', '0') | |||
:css('padding', '0 2px') | |||
:wikitext(' ' .. teamArg .. ' ') -- Diferente | |||
:newline() | |||
end | |||
if not showSeed and showSeeds then | |||
teamCell:attr('colspan', '2') | |||
end | |||
local scoreCell | |||
for match= 1, matches[round] do | |||
scoreCell = row:tag('td') | |||
if showTeam then | |||
scoreCell | |||
:css('text-align', 'center') | |||
:css('border-color', '#aaa') | |||
:css('border-style', 'solid') | |||
:css('border-top-width', '1px') | |||
:css('border-left-width', '0') | |||
:css('border-right-width', '1px') | |||
:css('border-bottom-width', '0') | |||
:css('background-color', '#f9f9f9') | |||
:wikitext(getScore(round,team,match)) | |||
:newline() | |||
end | |||
if not compact then | |||
scoreCell:attr('rowspan', '2') | |||
end | |||
if showTeam and not compact and not top then | |||
scoreCell:css('border-bottom-width', '1px') | |||
end | |||
end | |||
if not compact then | |||
if seedCell then | |||
seedCell:attr('rowspan', '2') | |||
if not top then | |||
seedCell:css('border-bottom-width', '1px') | |||
end | |||
end | |||
teamCell:attr('rowspan', '2') | |||
if showTeam then | |||
teamCell:css('border-right-width', '1px') | |||
if not top then | |||
teamCell:css('border-bottom-width', '1px') | |||
end | |||
end | |||
else | |||
if not top then | |||
if seedCell then | |||
seedCell:css('border-bottom-width', '1px') | |||
end | |||
if showTeam then | |||
teamCell:css('border-bottom-width', '1px') | |||
end | |||
end | |||
end | |||
end | |||
function renderRound(round) | |||
local teamsRound = teams[round] | |||
local step = numberOfRows / teamsRound | |||
local topTeam = true -- is top row in match-up | |||
local topPair = true -- is top match-up in pair of match-ups | |||
local team = 1 | |||
local showTeam | |||
for i = 1, numberOfRows, step do | |||
local offset, height, blank | |||
if getTeamArg(round, 'team', team) or (team%2 == 0 and getTeamArg(round, 'team', team - 1)) or | |||
(team%2 == 1 and getTeamArg(round, 'team', team + 1)) then | |||
showTeam = true | |||
else | |||
showTeam = false | |||
end | |||
if not topTeam then | |||
topPair = not topPair | |||
end | |||
-- leave room for groups for teams other than first and last | |||
if round ~= rounds then | |||
if team == 1 or team == teamsRound then | |||
offset = topTeam and i or i + 2 | |||
height = step - 2 | |||
else | |||
offset = topTeam and i + 1 or i + 2 | |||
height = step - 3 | |||
end | |||
if height > 0 then | |||
local k=offset | |||
while k < offset + height do | |||
blank = addBlank(rows[k]) | |||
:attr('colspan', (showSeeds and 4 or 3) + matches[round]) | |||
if showTeam then | |||
blank | |||
:css('border-color', 'black') | |||
:css('border-style', 'solid') | |||
:css('border-width', '0') | |||
if not topPair and round < rounds then | |||
blank:css('border-right-width', '2px') | |||
end | |||
end | |||
k=k + 1 | |||
end | |||
end | |||
end | |||
-- Mostrar las 6 filas de los 2 equipos | |||
if showTeam and topTeam then | |||
rows[i + step - 3].show = true | |||
rows[i + step - 2].show = true | |||
rows[i + step - 1].show = true | |||
rows[i + step].show = true | |||
rows[i + step + 1].show = true | |||
rows[i + step + 2].show = true | |||
end | |||
-- add bracket | |||
local j = topTeam and i + step - 2 or i | |||
-- add left path | |||
if round == 1 then | |||
addBlank(rows[j]):css('height', '7px') | |||
addBlank(rows[j + 1]):css('height', '7px') | |||
else | |||
local showLeftTeams | |||
local aux = 4 * (math.ceil(team/2) - 1) | |||
if getTeamArg(round - 1 , 'team', 1 + aux) or | |||
getTeamArg(round - 1 , 'team', 2 + aux) or | |||
getTeamArg(round - 1 , 'team', 3 + aux) or | |||
getTeamArg(round - 1 , 'team', 4 + aux) then | |||
showLeftTeams = true | |||
end | |||
addPath(rows[j], topTeam, showTeam and showLeftTeams) | |||
end | |||
renderTeam(rows[j], round, team, topTeam, false,showTeam) | |||
local rightPath = addPath(rows[j], topTeam, showTeam and round < rounds) | |||
if not topPair and round < rounds and showTeam then | |||
rightPath:css('border-right-width', '2px') | |||
end | |||
team = team + 1 | |||
topTeam = not topTeam | |||
end | |||
end | |||
function renderCompactRound(round) | |||
local teamsRound = teams[round] | |||
local step = numberOfRows / teamsRound | |||
local topTeam = true -- is top row in match-up | |||
local topPair = true -- is top match-up in pair of match-ups | |||
local team = 1 | |||
for i = 1, numberOfRows, step do | |||
local offset, height, blank | |||
-- empty space above or below | |||
local offset = topTeam and i or i + 1 | |||
local height = step - 1 | |||
if height > 0 then | |||
blank = addBlank(rows[offset]) | |||
:attr('colspan', (showSeeds and 4 or 3) + matches[round]) | |||
:css('border-color', 'black') | |||
:css('border-style', 'solid') | |||
:css('border-width', '0') | |||
:attr('rowspan', height) | |||
end | |||
-- add bracket | |||
local j = topTeam and i + step - 1 or i | |||
-- add left path | |||
addCompactPath(j, round, topTeam, true) | |||
renderTeam(rows[j], round, team, topTeam, true) | |||
local rightPath = addCompactPath(j, round, topTeam, false) | |||
if not topTeam then topPair = not topPair end | |||
if not topPair and round < rounds then | |||
if blank then blank:css('border-right-width', '2px') end | |||
rightPath:css('border-right-width', '2px') | |||
end | |||
team = team + 1 | |||
topTeam = not topTeam | |||
end | |||
end | |||
function renderGroups(round) | |||
local roundFromLast = rounds - round + 1 | |||
local groups = math.pow(2, roundFromLast - 2) | |||
local step = numberOfRows / groups | |||
local group = 1 | |||
local cell | |||
for i = step / 2, numberOfRows, step do | |||
addBlank(rows[i]):css('height', '7px') | |||
addBlank(rows[i + 1]):css('height', '7px') | |||
addBlank(rows[i]) | |||
:attr('rowspan', '2') | |||
:attr('colspan', ((showSeeds and 4 or 3)) * round + allMatches[round] - 2) | |||
:css('text-align', 'center') | |||
:wikitext(getGroup(round, group)) | |||
:newline() | |||
cell=addBlank(rows[i]) | |||
if getTeamArg(round, 'team', 1 + (group - 1) * 4) or getTeamArg(round, 'team', 2 + (group - 1) * 4) then | |||
cell | |||
:css('border-color', 'black') | |||
:css('border-style', 'solid') | |||
:css('border-width', '0 2px 0 0') | |||
end | |||
cell=addBlank(rows[i + 1]) | |||
if getTeamArg(round, 'team', 3 + (group - 1) * 4) or getTeamArg(round, 'team', 4 + (group - 1) * 4) then | |||
cell | |||
:css('border-color', 'black') | |||
:css('border-style', 'solid') | |||
:css('border-width', '0 2px 0 0') | |||
end | |||
group = group + 1 | |||
end | |||
end | |||
function renderTree(tbl, compact) | |||
-- create 3 or 1 rows for every team | |||
rowsPerTeam = compact and 1 or 3 | |||
numberOfRows = teamsRound1 * rowsPerTeam | |||
for i = 1, numberOfRows do | |||
rows[i] = addTableRow(tbl) | |||
end | |||
if not compact then | |||
-- fill rows with groups | |||
for r = 1, rounds - 1 do | |||
renderGroups(r) | |||
end | |||
end | |||
-- fill rows with bracket | |||
for r = 1, rounds do | |||
if compact then | |||
renderCompactRound(r) | |||
else | |||
renderRound(r) | |||
end | |||
end | |||
-- Third. De momento solo si no es compacto | |||
if args['3rd-team1'] or args['3rd-team2'] then | |||
if rounds == 2 then | |||
addBlank(rows[numberOfRows]) | |||
:attr('colspan', (showSeeds and 4 or 3) + matches[1]) | |||
--:css('height', '20px') | |||
:wikitext(' ') | |||
numberOfRows = numberOfRows + 1 | |||
rows[numberOfRows] = addTableRow(tbl) | |||
addBlank(rows[numberOfRows]) | |||
:attr('colspan', (showSeeds and 4 or 3) + matches[1]) | |||
rows[numberOfRows].show=true | |||
numberOfRows = numberOfRows + 1 | |||
rows[numberOfRows] = addTableRow(tbl) | |||
addBlank(rows[numberOfRows]) | |||
:attr('colspan', (showSeeds and 4 or 3) + matches[1]) | |||
rows[numberOfRows].show=true | |||
numberOfRows = numberOfRows + 1 | |||
rows[numberOfRows] = addTableRow(tbl) | |||
addBlank(rows[numberOfRows]) | |||
:attr('colspan', (showSeeds and 4 or 3) + matches[1]) | |||
rows[numberOfRows].show=true | |||
numberOfRows = numberOfRows + 1 | |||
rows[numberOfRows] = addTableRow(tbl) | |||
addBlank(rows[numberOfRows]) | |||
:attr('colspan', (showSeeds and 4 or 3) + matches[1]) | |||
rows[numberOfRows].show=true | |||
numberOfRows = numberOfRows + 1 | |||
rows[numberOfRows] = addTableRow(tbl) | |||
addBlank(rows[numberOfRows]) | |||
:attr('colspan', (showSeeds and 4 or 3) + matches[1]) | |||
rows[numberOfRows].show=true | |||
end | |||
addBlank(rows[numberOfRows - 7]) | |||
local cell = addBlank(rows[numberOfRows - 7]) | |||
:attr('rowspan', 2) | |||
:attr('colspan', (showSeeds and 2 or 1) + matches['3rd']) | |||
:css('text-align', 'center') | |||
:css('border', '1px solid #aaa') | |||
:css('background-color', '#f2f2f2') | |||
:wikitext(args['3rd'] or CRoundNames['3rd']) | |||
:newline() | |||
addBlank(rows[numberOfRows - 4]) | |||
renderTeam(rows[numberOfRows - 4], '3rd', 1 , true, false, true) | |||
addBlank(rows[numberOfRows - 2]) | |||
renderTeam(rows[numberOfRows - 2], '3rd', 2 , false, false, true) | |||
end | |||
-- Hide empty rows | |||
local j, row | |||
for j, row in pairs(rows) do | |||
if not row.show then | |||
row:css('display','none') | |||
end | |||
end | |||
end | |||
function renderHeading(tbl, compact) | |||
if not roundNamesExists then | |||
return | |||
end | |||
local titleRow = addTableRow(tbl) | |||
local dateRow = roundDatesExists and 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', (showSeeds and 2 or 1) + matches[r]) | |||
:css('text-align', 'center') | |||
:css('border', '1px solid #aaa') | |||
:css('background-color', '#f2f2f2') | |||
:wikitext(roundNames[r]) | |||
:newline() | |||
local seedCell | |||
if showSeeds then | |||
seedCell = addBlank(widthRow, getWidth('seed', '25px')) | |||
if not compact then | |||
seedCell:wikitext(' ') | |||
end | |||
end | |||
-- local teamCell = addBlank(widthRow, getWidth('team', '150px')) | |||
local teamCell = addBlank(widthRow, getWidth('team', CteamCellWidth[rounds] or '150px')) | |||
if compact then | |||
teamCell:css('height', '7px') | |||
else | |||
teamCell:wikitext(' ') | |||
end | |||
local scoreCell | |||
for match= 1, matches[r] do | |||
scoreCell = addBlank(widthRow, getWidth('score', (matches[1]>=3 and '12px') or '25px')) | |||
if not compact then | |||
scoreCell:wikitext(' ') | |||
end | |||
end | |||
addBlank(titleRow) | |||
addBlank(widthRow, r < rounds and '5px' or nil) | |||
if roundDatesExists then | |||
addBlank(dateRow) | |||
dateRow:tag('td') | |||
:attr('colspan', (showSeeds and 2 or 1) + matches[r]) | |||
:css('text-align', 'center') | |||
:css('border', '1px solid #aaa') | |||
:css('background-color', '#f9f9f9') | |||
:wikitext(dates[r] or ' ') | |||
:newline() | |||
addBlank(dateRow) | |||
end | |||
end | |||
end | |||
function p.teamBracket(frame) | |||
local round | |||
args = getArgs(frame) | |||
--rounds = tonumber(args.rounds) or 2 -- Diferente | |||
rounds = tonumber(args.rounds) or getRounds(args) or 2 -- Diferente | |||
rows = {} | |||
-- Get the names and the dates of each round | |||
local argRound | |||
for round = 1, rounds do | |||
argRound = args['RD' .. round] | |||
roundNames[round] = (argRound and argRound:match('([^<]*)<br />.*')) or argRound | |||
or CRoundNames[rounds - round + 1] or ("Round of " .. teams[round]) | |||
if roundNames[round] ~= '' then | |||
roundNamesExists = true | |||
end | |||
dates[round] = args['RD' .. round .. '-date'] or (argRound and argRound:match('[^<]*<br />(.*)')) or '' | |||
if dates[round] ~= '' then | |||
roundDatesExists = true | |||
end | |||
end | |||
--Set the number of teams of each round | |||
teamsRound1 = 2 | |||
for round=rounds,2,-1 do | |||
teams[round] = teamsRound1 | |||
teamsRound1 = teamsRound1 * 2 | |||
end | |||
teams[1] = teamsRound1 | |||
showSeeds = true | |||
if args['seeds'] and args['seeds'] == 'no' then | |||
showSeeds = false | |||
end | |||
--Set the matches of each round | |||
for round=1,rounds do | |||
matches[round] = 1 | |||
end | |||
for k,v in pairs(args) do | |||
round,match = k:match('^RD(.*)%-score.*%-(.*)$') | |||
if round and match then | |||
round=tonumber(round) | |||
match = tonumber(match) | |||
if match and matches[round] and match > matches[round] then | |||
matches[round] = match | |||
end | |||
end | |||
end | |||
allMatches[1] = matches[1] | |||
for round=2,rounds do | |||
allMatches[round] = allMatches[round - 1] + matches[round] | |||
end | |||
--Set the matches of 3rd | |||
matches['3rd'] = 1 | |||
for k,v in pairs(args) do | |||
match = k:match('^3rd%-score.*%-(.*)$') | |||
if match then | |||
match = tonumber(match) | |||
if match > matches['3rd'] then | |||
matches['3rd'] = match | |||
end | |||
end | |||
end | |||
--if true then return require('Módulo:Tablas').tostring(matches) end | |||
-- 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 = mw.html.create('table') | |||
:css('border-style', 'none') | |||
:css('font-size', '90%') | |||
:css('margin', '1em 2em 1em 1em') | |||
:css('border-collapse', 'separate') | |||
:css('border-spacing', '0') | |||
local compact = false | |||
if args['compact'] and args['compact'] == 'yes' then | |||
compact = true | |||
end | |||
if compact then | |||
tbl:css('font-size', '90%'):attr('cellpadding', '0') | |||
end | |||
renderHeading(tbl, compact) | |||
renderTree(tbl, compact) | |||
local output | |||
output = tostring(tbl) | |||
if scoresConComas then | |||
output = output .. '[[Categoría:Wikipedia:Artículos que usan la plantilla copa con comas]]' | |||
end | |||
if scoresConBlancos then | |||
output = output .. '[[Categoría:Wikipedia:Artículos que usan la plantilla copa con espacios en blanco]]' | |||
end | |||
return output | |||
end | |||
-- Diferencias con el módulo original | |||
p.copa = p.teamBracket | |||
return p | |||
Revisión actual - 15:03 12 feb 2024
--
-- This module will implement {{TeamBracket}}
--
local p = {}
local args
local rounds
local showSeeds
local roundNames = {}
local roundNamesExists
local dates={} -- Fecha de cada round
local roundDatesExists
local teamsRound1 -- Diferente
local teams = {} -- Diferente. Número de equipos de un round
local matches = {} -- Diferente. Número de partidos de un round
local allMatches= {} -- Diferente. Número de partidos de un round y de los anteriores
local rows={}
local numberOfRows
local rowsPerTeam
local scoresConBlancos = false
local scoresConComas = false
-- Constantes
local CRoundNames = {'Final', 'Semifinales', 'Cuartos de final', 'Octavos de final', 'Dieciseisavos de final', ['3rd']='Tercer lugar'}
local CteamCellWidth={'176px',
'16em' -- de la plantilla:Copa de 4 equipos-1 ronda
--, '16em'
, '11em' -- de la plantilla:Copa de 8 equipos-1 ronda con número
} -- 150px en el original siempre. 226 en total
local function getArgs(frame)
-- Lo rehago. No funcionaba
local parent = frame:getParent();
local args = {}
for k,v in pairs(parent.args) do
args[k] = v
end
for k,v in pairs(frame.args) do
args[k] = v
end
-- Es diferente a la versión original del módulo pues en la Wikipedia española el nombre de los campos puede ser diferente
local args2 = {}
local k2
for k,v in pairs(args) do
k2= tostring(k):gsub('seed0','seed')
k2= k2:gsub('team0','team')
k2= k2:gsub('score0','score')
k2= k2:gsub('a$','-1') -- {{{RD3-score01a}}}
k2= k2:gsub('b$','-2') -- {{{RD3-score01b}}}
args2[k2] = v
end
return args2;
end
function getRounds() -- Diferente
if args['RD5'] or args['RD5-team1'] then
return 5
elseif args['RD4'] or args['RD4-team1'] then
return 4
elseif args['RD3'] or args['RD3-team1'] then
return 3
elseif args['RD2'] or args['RD2-team1'] then
return 2
elseif args['RD1'] or args['RD1-team1'] then
return 1
end
end
function getGroup(round, group)
local groupArg = args['RD' .. round .. '-group' .. group]
if groupArg then
return groupArg
end
if args['group8'] then -- hay 8 grupos
if rounds == round + 4 then
return args['group'..group]
end
elseif args['group4'] then -- hay 4 grupos
if rounds == round + 3 then
return args['group'..group]
end
elseif args['group2'] then -- solo hay 2 grupos
if rounds == round + 2 then
return args['group'..group]
end
end
end
function getScore(round, team, match)
local resultado
if round == '3rd' then
resultado = args[round .. '-score' .. team .. '-' .. match] or
(match==1 and args[round .. '-score' .. team]) or ''
else
resultado = args['RD' .. round .. '-score' .. team .. '-' .. match] or
(match==1 and args['RD' .. round .. '-score' .. team]) or ''
end
if resultado:match(',') then
scoresConComas= true
end
if resultado:match(' ') and not resultado:match(' %(') and not resultado:match(' {{') and not resultado:match(' <') then
scoresConBlancos = true
end
return resultado
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')
if width then
cell:css('width', width)
end
return cell
end
-- Draws an horizontal line
function addPath(row, top, showPath)
local cell = addBlank(row)
:attr('rowspan', '2')
if showPath then
cell
:css('border-width', '0')
:css('border-style', 'solid')
:css('border-color', 'black')
:css(top and 'border-bottom-width' or 'border-top-width', '1px')
end
return cell
end
function addCompactPath(index, round, top, left)
local prop = top and 'border-bottom-width' or 'border-top-width'
if left and round == 1 then
addBlank(rows[index])
return nil
else
local cell = addBlank(rows[index])
:css('border-width', '0')
:css('border-style', 'solid')
:css('border-color', 'black')
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)
if round == '3rd' then
return '3rd-' .. type .. team
else
return string.format('RD%d-%s%01d', round, type, team)
end
end
function renderTeam(row, round, team, top, compact, showTeam)
local seedCell
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 = showTeam and (seedArg and string.len(seedArg) > 0
or pairSeedArg and string.len(pairSeedArg) > 0)
local teamArg = getTeamArg(round, 'team', team)
if showSeed and showSeeds then
seedCell = row:tag('td')
:css('text-align', 'center')
:css('background-color', '#f2f2f2')
:css('border-color', '#aaa')
:css('border-style', 'solid')
:css('border-top-width', '1px')
:css('border-left-width', '1px')
:css('border-right-width', '1px')
:css('border-bottom-width', '0')
:wikitext(seedArg)
:newline()
end
if not teamArg or string.len(teamArg) == 0 then
teamArg = ' '
end
local teamCell = row:tag('td')
if showTeam then
teamCell
:css('background-color', '#f9f9f9')
:css('border-color', '#aaa')
:css('border-style', 'solid')
:css('border-top-width', '1px')
:css('border-left-width', '1px')
:css('border-right-width', '0')
:css('border-bottom-width', '0')
:css('padding', '0 2px')
:wikitext(' ' .. teamArg .. ' ') -- Diferente
:newline()
end
if not showSeed and showSeeds then
teamCell:attr('colspan', '2')
end
local scoreCell
for match= 1, matches[round] do
scoreCell = row:tag('td')
if showTeam then
scoreCell
:css('text-align', 'center')
:css('border-color', '#aaa')
:css('border-style', 'solid')
:css('border-top-width', '1px')
:css('border-left-width', '0')
:css('border-right-width', '1px')
:css('border-bottom-width', '0')
:css('background-color', '#f9f9f9')
:wikitext(getScore(round,team,match))
:newline()
end
if not compact then
scoreCell:attr('rowspan', '2')
end
if showTeam and not compact and not top then
scoreCell:css('border-bottom-width', '1px')
end
end
if not compact then
if seedCell then
seedCell:attr('rowspan', '2')
if not top then
seedCell:css('border-bottom-width', '1px')
end
end
teamCell:attr('rowspan', '2')
if showTeam then
teamCell:css('border-right-width', '1px')
if not top then
teamCell:css('border-bottom-width', '1px')
end
end
else
if not top then
if seedCell then
seedCell:css('border-bottom-width', '1px')
end
if showTeam then
teamCell:css('border-bottom-width', '1px')
end
end
end
end
function renderRound(round)
local teamsRound = teams[round]
local step = numberOfRows / teamsRound
local topTeam = true -- is top row in match-up
local topPair = true -- is top match-up in pair of match-ups
local team = 1
local showTeam
for i = 1, numberOfRows, step do
local offset, height, blank
if getTeamArg(round, 'team', team) or (team%2 == 0 and getTeamArg(round, 'team', team - 1)) or
(team%2 == 1 and getTeamArg(round, 'team', team + 1)) then
showTeam = true
else
showTeam = false
end
if not topTeam then
topPair = not topPair
end
-- leave room for groups for teams other than first and last
if round ~= rounds then
if team == 1 or team == teamsRound then
offset = topTeam and i or i + 2
height = step - 2
else
offset = topTeam and i + 1 or i + 2
height = step - 3
end
if height > 0 then
local k=offset
while k < offset + height do
blank = addBlank(rows[k])
:attr('colspan', (showSeeds and 4 or 3) + matches[round])
if showTeam then
blank
:css('border-color', 'black')
:css('border-style', 'solid')
:css('border-width', '0')
if not topPair and round < rounds then
blank:css('border-right-width', '2px')
end
end
k=k + 1
end
end
end
-- Mostrar las 6 filas de los 2 equipos
if showTeam and topTeam then
rows[i + step - 3].show = true
rows[i + step - 2].show = true
rows[i + step - 1].show = true
rows[i + step].show = true
rows[i + step + 1].show = true
rows[i + step + 2].show = true
end
-- add bracket
local j = topTeam and i + step - 2 or i
-- add left path
if round == 1 then
addBlank(rows[j]):css('height', '7px')
addBlank(rows[j + 1]):css('height', '7px')
else
local showLeftTeams
local aux = 4 * (math.ceil(team/2) - 1)
if getTeamArg(round - 1 , 'team', 1 + aux) or
getTeamArg(round - 1 , 'team', 2 + aux) or
getTeamArg(round - 1 , 'team', 3 + aux) or
getTeamArg(round - 1 , 'team', 4 + aux) then
showLeftTeams = true
end
addPath(rows[j], topTeam, showTeam and showLeftTeams)
end
renderTeam(rows[j], round, team, topTeam, false,showTeam)
local rightPath = addPath(rows[j], topTeam, showTeam and round < rounds)
if not topPair and round < rounds and showTeam then
rightPath:css('border-right-width', '2px')
end
team = team + 1
topTeam = not topTeam
end
end
function renderCompactRound(round)
local teamsRound = teams[round]
local step = numberOfRows / teamsRound
local topTeam = true -- is top row in match-up
local topPair = true -- is top match-up in pair of match-ups
local team = 1
for i = 1, numberOfRows, step do
local offset, height, blank
-- empty space above or below
local offset = topTeam and i or i + 1
local height = step - 1
if height > 0 then
blank = addBlank(rows[offset])
:attr('colspan', (showSeeds and 4 or 3) + matches[round])
:css('border-color', 'black')
:css('border-style', 'solid')
:css('border-width', '0')
:attr('rowspan', height)
end
-- add bracket
local j = topTeam and i + step - 1 or i
-- add left path
addCompactPath(j, round, topTeam, true)
renderTeam(rows[j], round, team, topTeam, true)
local rightPath = addCompactPath(j, round, topTeam, false)
if not topTeam then topPair = not topPair end
if not topPair and round < rounds then
if blank then blank:css('border-right-width', '2px') end
rightPath:css('border-right-width', '2px')
end
team = team + 1
topTeam = not topTeam
end
end
function renderGroups(round)
local roundFromLast = rounds - round + 1
local groups = math.pow(2, roundFromLast - 2)
local step = numberOfRows / groups
local group = 1
local cell
for i = step / 2, numberOfRows, step do
addBlank(rows[i]):css('height', '7px')
addBlank(rows[i + 1]):css('height', '7px')
addBlank(rows[i])
:attr('rowspan', '2')
:attr('colspan', ((showSeeds and 4 or 3)) * round + allMatches[round] - 2)
:css('text-align', 'center')
:wikitext(getGroup(round, group))
:newline()
cell=addBlank(rows[i])
if getTeamArg(round, 'team', 1 + (group - 1) * 4) or getTeamArg(round, 'team', 2 + (group - 1) * 4) then
cell
:css('border-color', 'black')
:css('border-style', 'solid')
:css('border-width', '0 2px 0 0')
end
cell=addBlank(rows[i + 1])
if getTeamArg(round, 'team', 3 + (group - 1) * 4) or getTeamArg(round, 'team', 4 + (group - 1) * 4) then
cell
:css('border-color', 'black')
:css('border-style', 'solid')
:css('border-width', '0 2px 0 0')
end
group = group + 1
end
end
function renderTree(tbl, compact)
-- create 3 or 1 rows for every team
rowsPerTeam = compact and 1 or 3
numberOfRows = teamsRound1 * rowsPerTeam
for i = 1, numberOfRows do
rows[i] = addTableRow(tbl)
end
if not compact then
-- fill rows with groups
for r = 1, rounds - 1 do
renderGroups(r)
end
end
-- fill rows with bracket
for r = 1, rounds do
if compact then
renderCompactRound(r)
else
renderRound(r)
end
end
-- Third. De momento solo si no es compacto
if args['3rd-team1'] or args['3rd-team2'] then
if rounds == 2 then
addBlank(rows[numberOfRows])
:attr('colspan', (showSeeds and 4 or 3) + matches[1])
--:css('height', '20px')
:wikitext(' ')
numberOfRows = numberOfRows + 1
rows[numberOfRows] = addTableRow(tbl)
addBlank(rows[numberOfRows])
:attr('colspan', (showSeeds and 4 or 3) + matches[1])
rows[numberOfRows].show=true
numberOfRows = numberOfRows + 1
rows[numberOfRows] = addTableRow(tbl)
addBlank(rows[numberOfRows])
:attr('colspan', (showSeeds and 4 or 3) + matches[1])
rows[numberOfRows].show=true
numberOfRows = numberOfRows + 1
rows[numberOfRows] = addTableRow(tbl)
addBlank(rows[numberOfRows])
:attr('colspan', (showSeeds and 4 or 3) + matches[1])
rows[numberOfRows].show=true
numberOfRows = numberOfRows + 1
rows[numberOfRows] = addTableRow(tbl)
addBlank(rows[numberOfRows])
:attr('colspan', (showSeeds and 4 or 3) + matches[1])
rows[numberOfRows].show=true
numberOfRows = numberOfRows + 1
rows[numberOfRows] = addTableRow(tbl)
addBlank(rows[numberOfRows])
:attr('colspan', (showSeeds and 4 or 3) + matches[1])
rows[numberOfRows].show=true
end
addBlank(rows[numberOfRows - 7])
local cell = addBlank(rows[numberOfRows - 7])
:attr('rowspan', 2)
:attr('colspan', (showSeeds and 2 or 1) + matches['3rd'])
:css('text-align', 'center')
:css('border', '1px solid #aaa')
:css('background-color', '#f2f2f2')
:wikitext(args['3rd'] or CRoundNames['3rd'])
:newline()
addBlank(rows[numberOfRows - 4])
renderTeam(rows[numberOfRows - 4], '3rd', 1 , true, false, true)
addBlank(rows[numberOfRows - 2])
renderTeam(rows[numberOfRows - 2], '3rd', 2 , false, false, true)
end
-- Hide empty rows
local j, row
for j, row in pairs(rows) do
if not row.show then
row:css('display','none')
end
end
end
function renderHeading(tbl, compact)
if not roundNamesExists then
return
end
local titleRow = addTableRow(tbl)
local dateRow = roundDatesExists and 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', (showSeeds and 2 or 1) + matches[r])
:css('text-align', 'center')
:css('border', '1px solid #aaa')
:css('background-color', '#f2f2f2')
:wikitext(roundNames[r])
:newline()
local seedCell
if showSeeds then
seedCell = addBlank(widthRow, getWidth('seed', '25px'))
if not compact then
seedCell:wikitext(' ')
end
end
-- local teamCell = addBlank(widthRow, getWidth('team', '150px'))
local teamCell = addBlank(widthRow, getWidth('team', CteamCellWidth[rounds] or '150px'))
if compact then
teamCell:css('height', '7px')
else
teamCell:wikitext(' ')
end
local scoreCell
for match= 1, matches[r] do
scoreCell = addBlank(widthRow, getWidth('score', (matches[1]>=3 and '12px') or '25px'))
if not compact then
scoreCell:wikitext(' ')
end
end
addBlank(titleRow)
addBlank(widthRow, r < rounds and '5px' or nil)
if roundDatesExists then
addBlank(dateRow)
dateRow:tag('td')
:attr('colspan', (showSeeds and 2 or 1) + matches[r])
:css('text-align', 'center')
:css('border', '1px solid #aaa')
:css('background-color', '#f9f9f9')
:wikitext(dates[r] or ' ')
:newline()
addBlank(dateRow)
end
end
end
function p.teamBracket(frame)
local round
args = getArgs(frame)
--rounds = tonumber(args.rounds) or 2 -- Diferente
rounds = tonumber(args.rounds) or getRounds(args) or 2 -- Diferente
rows = {}
-- Get the names and the dates of each round
local argRound
for round = 1, rounds do
argRound = args['RD' .. round]
roundNames[round] = (argRound and argRound:match('([^<]*)<br />.*')) or argRound
or CRoundNames[rounds - round + 1] or ("Round of " .. teams[round])
if roundNames[round] ~= '' then
roundNamesExists = true
end
dates[round] = args['RD' .. round .. '-date'] or (argRound and argRound:match('[^<]*<br />(.*)')) or ''
if dates[round] ~= '' then
roundDatesExists = true
end
end
--Set the number of teams of each round
teamsRound1 = 2
for round=rounds,2,-1 do
teams[round] = teamsRound1
teamsRound1 = teamsRound1 * 2
end
teams[1] = teamsRound1
showSeeds = true
if args['seeds'] and args['seeds'] == 'no' then
showSeeds = false
end
--Set the matches of each round
for round=1,rounds do
matches[round] = 1
end
for k,v in pairs(args) do
round,match = k:match('^RD(.*)%-score.*%-(.*)$')
if round and match then
round=tonumber(round)
match = tonumber(match)
if match and matches[round] and match > matches[round] then
matches[round] = match
end
end
end
allMatches[1] = matches[1]
for round=2,rounds do
allMatches[round] = allMatches[round - 1] + matches[round]
end
--Set the matches of 3rd
matches['3rd'] = 1
for k,v in pairs(args) do
match = k:match('^3rd%-score.*%-(.*)$')
if match then
match = tonumber(match)
if match > matches['3rd'] then
matches['3rd'] = match
end
end
end
--if true then return require('Módulo:Tablas').tostring(matches) end
-- 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 = mw.html.create('table')
:css('border-style', 'none')
:css('font-size', '90%')
:css('margin', '1em 2em 1em 1em')
:css('border-collapse', 'separate')
:css('border-spacing', '0')
local compact = false
if args['compact'] and args['compact'] == 'yes' then
compact = true
end
if compact then
tbl:css('font-size', '90%'):attr('cellpadding', '0')
end
renderHeading(tbl, compact)
renderTree(tbl, compact)
local output
output = tostring(tbl)
if scoresConComas then
output = output .. '[[Categoría:Wikipedia:Artículos que usan la plantilla copa con comas]]'
end
if scoresConBlancos then
output = output .. '[[Categoría:Wikipedia:Artículos que usan la plantilla copa con espacios en blanco]]'
end
return output
end
-- Diferencias con el módulo original
p.copa = p.teamBracket
return p