Module:Sandbox/KasciJ explained

-- 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

type and row >= a and row <= b then return row-a+1 end end return -1endlocal function _isX(var, row, col) if t[col]

nil then return false end return not (_getX(var, row, col)

-1)end

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 or wd[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

1 then return greenAll elseif row

lMid then return greenBottom elseif row-1

rMid then return greenTop else return greenMid end end end if t[col]

nil or ld[col]

nil then return nil end for _,v in pairs(ld[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 rMid-lMid

1 then return redAll elseif row-1

lMid then return redTop elseif row

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