-- rows = 12-- cols = 4-- t = -- wd = -- ld = rows = 22cols = 6t = wd = ld =
isSeeded = falsep = vals =
local function _getColspan(col) local span = 2 if isSeeded then span = span + 1 end local score = vals['SCORE'..col] span = span + score return spanend
local function _addWL(tr, text, col) return tr:tag('td') :css('height', '7px') -- :css('width', '140px') :css('overflow', 'inherit') -- Added due to strange interactions with dark mode and Vector 2022. :css('padding', '0 2px') :css('text-align', 'center') :attr('colspan', _getColspan(col)) :wikitext(text)endlocal function addWinner(tr, text, col) _addWL(tr, 'W'..text, col) :css('background-color', '#aaffaa')end
local function addLoser(tr, text, col) _addWL(tr, 'L'..text, col) :css('background-color', '#ffaaaa')end
local function addBlank(tr, col) tr:tag('td') :attr('colspan', _getColspan(col))end
local function addSeparator(tr, border) local cell = tr:tag('td') :css('width', '20px') if border then cell:css('border-color', border['color']) :css('border-style', 'solid') :css('border-top-width', (border['left-top'] and '2px') or '0px') :css('border-left-width', '0px') :css('border-right-width', (border['mid'] and '1px') or '0px') :css('border-bottom-width', (border['left-bottom'] and '2px') or '0px') end local cell = tr:tag('td') :css('height', '7px') :css('width', '20px') if border then cell:css('border-color', border['color']) :css('border-style', 'solid') :css('border-top-width', (border['right-top'] and '2px') or '0px') :css('border-left-width', (border['mid'] and '1px') or '0px') :css('border-right-width', '0px') :css('border-bottom-width', (border['right-bottom'] and '2px') or '0px') endend
local function styleTeam(cell) return cell:css('overflow', 'inherit') -- Added due to strange interactions with dark mode and Vector 2022. :css('background-color', '#f8f9fa') :css('padding', '0 2px') :css('border', '1px solid var(--border-color-base,#a2a9b1)') :css('border-top-width', '1px')end
local function addTeam(tr, r, c, id) if isSeeded then styleTeam(tr:tag('td'):wikitext(tostring(0))) :css('width', '10px') end local sId = vals['SCORE'..c] local csId = vals[c..'S'..id..'?'] styleTeam(tr:tag('td'):wikitext(tostring(vals[c..'T'..id]))) :css('width', '70px') :attr('colspan', sId - csId + 1) for i = 1,csId do local s = vals[c..'S'..id..'_'..i] or "" local w = vals[c..'S'..id..'_'..i..'W'] local score = styleTeam(tr:tag('td'):wikitext(tostring(s))) :css('width', '10px') :css('text-align', 'center') if w then score:css('font-weight', 'bold') end end local ws = vals[c..'S'..id..'W'] local ww = vals[c..'S'..id..'Ww'] local score = styleTeam(tr:tag('td'):wikitext(tostring(ws))) :css('width', '10px') :css('text-align', 'center') if ww then score:css('font-weight', 'bold') endend
local function greenBottom return endlocal function greenTop return endlocal function greenAll return endlocal function greenMid return endlocal function redBottom return endlocal function redTop return endlocal function redAll return endlocal function redMid return end
local function _getX(var, row, col) for _,v in pairs(t[col]) do local type,a,b = v[1],v[2],v[3] if var
nil then return false end return not (_getX(var, row, col)
local function isTeam(row, col) return _isX('t', row, col)end
local function isWinner(row, col) return _isX('w', row, col)end
local function isLoser(row, col) return _isX('l', row, col)end
local function sep(row, col) if t[col]
nil then return nil end for _,v in pairs(wd[col]) do local left = t[col][v[1]] local right = t[col+1][v[2]] local lMid = math.floor((left[2]+left[3]-1)/2) local rMid = math.floor((right[2]+right[3]-1)/2) if row <= lMid and row > rMid then if lMid-rMid
lMid then return greenBottom elseif row-1
nil or ld[col]
1 then return redAll elseif row-1
rMid then return redBottom else return redMid end end end return nilend
local function generateTable(tbl) local tab = for i = 1, cols do tab[i] = 0 end for r = 1, rows do local row = tbl:tag('tr') for c = 1, cols do if isTeam(r, c) then tab[c] = tab[c] + 1 addTeam(row, r, c, tab[c]) elseif isWinner(r, c) then addWinner(row, r*10+c, c) elseif isLoser(r, c) then addLoser(row, r*10+c, c) else addBlank(row, c) end addSeparator(row, sep(r,c)) end endend
local function parseArgs(frame) local args = frame.args local scoreTable = 0 for i = 1,100 do scoreTable = 0 for j = 1,100 do local v = args[i..'T'..j] if v ~= nil then vals[i..'T'..j] = v end local v = args[i..'S'..j] if v ~= nil then vals[i..'S'..j] = v local _, c = v:gsub(",","") if scoreTable < c+1 then scoreTable = c+1 end vals[i..'S'..j..'?'] = c+1 local n = 1 for s in v:gmatch("([^,]+)") do vals[i..'S'..j..'_'..n] = s or "" n = n+1 end end end vals['SCORE'..i] = scoreTable endend
local function analyzeTable for i = 1,100 do for j = 1,100,2 do if vals[i..'S'..j..'?'] ~= nil then local a,b = 0,0 for n = 1,vals[i..'S'..j..'?'] do local s1 = tonumber(vals[i..'S'..j..'_'..n]) local s2 = tonumber(vals[i..'S'..(j+1)..'_'..n]) vals[i..'S'..j..'_'..n..'W'] = (s1 > s2) vals[i..'S'..(j+1)..'_'..n..'W'] = (s2 > s1) if s1 > s2 then a = a+1 else b = b+1 end end vals[i..'S'..j..'W'] = a vals[i..'S'..(j+1)..'W'] = b vals[i..'S'..j..'Ww'] = a>b vals[i..'S'..(j+1)..'Ww'] = b>a end end endend
function p.main(frame) local tbl = mw.html.create('table') :css('border-style', 'none') :css('font-size', '90%') :css('border-collapse', 'separate') :css('border-spacing', '0') :attr('cellpadding', '0') tbl:css('margin', '1em 2em 1em 1em') parseArgs(frame) analyzeTable -- generateHeaders(tbl) generateTable(tbl) return tostring(tbl)end
return p