Module:CricketLeagueGroupStageSummary/sandbox explained

local p =

---------- Background colours for table cells ----------local colours =

local noMatchColour = "#C0C0C0" -- No match definedlocal notPlayedColour = "inherit" -- Not played yetlocal errorColour = "#FF7777" -- Error

function trim(s) if not s then return nil else return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")) endend

function getArgs(frame) local parent = frame:getParent; local args = for k,v in pairs(parent.args) do args[k] = trim(v) end for k,v in pairs(frame.args) do args[k] = trim(v) end return args;end

---- Match class--local cricmatch =

cricmatch.__index = function(t, key) local ret = rawget(t, key) if ret then return ret end ret = cricmatch[key] if type(ret)

'function' then return function(...) return ret(t, ...) end else return ret endend

cricmatch.addResultLink = function(m, cell, text) cell:tag('span') :attr('title', string.format('Match %d', m.id)) :wikitext(string.format('%s', m.id, text))end

cricmatch.getMarginResult = function(m, row, matchNo) local team = m.result

'H' and m.home or m.away local marginText if m.margin

'F' then marginText = "Forfeited" elseif m.margin

'SO' then marginText = "Super Over" else local n = tonumber(string.sub(m.margin, 1, -2)) local t = string.upper(string.sub(m.margin, -1, -1)) if t

'R' then marginText = "%d run" elseif t

'W' then marginText = "%d wicket" elseif t

'I' then marginText = "Inns & %d run" end if marginText and n then marginText = string.format(marginText, n) if n > 1 then marginText = marginText .. "s" end else marginText = matchNo end if m.dl then marginText = marginText .. '

(' .. m.dl .. ')' end end local cell = addTableCell(row, colours[m.result]) :tag('span'):wikitext(team.shortName):done :tag('br'):done m.addResultLink(cell, marginText) return cell:css('padding', '3px 5px')end

cricmatch.getResult = function(m, row) local colour, text local matchNo = string.format('Match %s', m.id, m.id) if m.result

'D' then -- Drawn match colour = colours.D text = 'Match drawn' elseif m.result

'N' then -- Abandoned match colour = colours.N text = 'Match
abandoned' elseif m.result

'T' then -- Tied match colour = colours.T text = 'Match tied' elseif m.result

'H' or m.result

'A' then return m.getMarginResult(row, matchNo) end local cell if text and colour then cell = addTableCell(row, colour) m.addResultLink(cell, text) else cell = addTableCell(row, notPlayedColour, matchNo) end return cell:css('padding', '3px 5px')end

function createMatch(id, home, away, result, margin, dl) if not home or not away then return nil end local match = setmetatable(match, cricmatch) match.id = id match.home = home match.away = away match.result = result match.margin = margin match.dl = dl return matchend

---- Html Builder helpers--function addTableRow(tbl) return tbl:tag('tr')endfunction addTableCell(row, bg, text) return row:tag('td'):css('background-color', bg):wikitext(text)endfunction addNoMatch(row) addTableCell(row, noMatchColour) return rowend

---- Helper functions--function buildLegend(container, types, homeaway) local key = container:tag('table') :addClass('wikitable') :css('float', 'right') :css('text-align', 'center') :css('font-size', '90%') :css('margin', '0 0 0 10px')

local keys = local text = local count = 0 for _, _ in pairs(types) do count = count + 1 end local row = addTableRow(key) for _, k in ipairs(keys) do if types[k] then addTableCell(row, colours[k], text[k]) end end

local list = container:tag('ul') :css('font-size', '90%') :tag('li') :wikitext(homeaway and "Note: Results listed are according to the " .. "home (horizontal) and visitor (vertical) teams." or "Note: Results listed are according to the " .. "first encounter (top-right) and second encounter (bottom-left).") :done :tag('li') :wikitext("Note: Click on a result to see " .. "a summary of the match.") :done return containerend

function getMatchData(args, teams) local i, m = 0, 1 local match local matches = local dlText = args.dls

'Y' and 'DLS' or 'D/L' local home, away, result, margin, dl while args[i * 5 + 5] do home = teams[trim(args[i * 5 + 1])] away = teams[args[i * 5 + 2]] result = args[i * 5 + 3] margin = args[i * 5 + 4] dl = args[i * 5 + 5]

"Y" match = createMatch(m, home, away, result, margin, dl and dlText or nil) if match then table.insert(matches, match) m = m + 1 end i = i + 1 end return matchesend

p.create = function(args, teams, tableStyle) local matches = getMatchData(args, teams)

-- organise by team local codes, results, types =,, for i, match in ipairs(matches) do local home = match.home.code local away = match.away.code if not results[home] then table.insert(codes, home) results[home] = end if not results[away] then table.insert(codes, away) results[away] = end results[home][away] = match types[match.result] = true end local teamsort = function(t1, t2) return teams[t1].fullName < teams[t2].fullName end table.sort(codes, teamsort)

local wrapper = mw.html.create('div')

-- Construct the header local container = wrapper:tag('div') :css('float', 'left') :css('max-width', '100%') local tbl = container:tag('table') :attr('class', 'wikitable') :css('width', '100%') :css('display', 'block') :css('overflow', 'auto') :css('border', 'none') if tableStyle then tbl:cssText(tableStyle) else tbl:css('text-align', 'center') :css('white-space', 'nowrap') :css('width', '100%') if #codes > 8 then tbl:css('font-size', (100 - (#codes - 8) * 10) .. '%') end end local homeaway = not (args['homeaway'] and (args['homeaway']

'no' or args['homeaway']

'n')) local header = addTableRow(tbl) :tag('th') :attr('scope', 'row') :wikitext(homeaway and 'Visitor team →' or nil) :done for i, code in ipairs(codes) do local team = teams[code] header:tag('th') :attr('rowspan', homeaway and '2' or nil) :attr('scope', 'col') :css('padding', 'inherit 10px') :wikitext(string.format('%s', team.pageName, team.abbr or team.code)) :newline end if homeaway then tbl:tag('tr'):tag('th'):attr('scope', 'col'):wikitext('Home team ↓') else types['H'] = false types['A'] = false end

-- Output the main body of the table for i, homecode in ipairs(codes) do local home = teams[homecode] local row = addTableRow(tbl) local teamcell = row:tag('th') :attr('scope', 'row') :css('text-align', 'left') :css('padding', '3px 5px') :css('white-space', 'normal') :wikitext(string.format('%s', home.pageName, home.fullName)) for j, awaycode in ipairs(codes) do local match = results[homecode][awaycode] if match then match.getResult(row) else addNoMatch(row) end end end

-- Legend and notes buildLegend(container, types, homeaway) wrapper:tag('div'):css('clear', 'both') return tostring(wrapper)end

p.IPL = function(frame) local args = getArgs(frame) local teams = mw.loadData("Module:Indian Premier League teams") local teamsAssoc = local i = 1 while teams[i] do teamsAssoc[teams[i].code] = teams[i] i = i + 1 end return p.create(args, teamsAssoc)end

p.BBL = function(frame) local args = getArgs(frame) local teams = return p.create(args, teams)endp.WBBL = function(frame) local args = getArgs(frame) local teams = return p.create(args, teams)endp.PSL = function(frame) local args = getArgs(frame) local teams = mw.loadData("Module:PakistanSuperLeagueTeams") local teamsAssoc = local i = 1 while teams[i] do teamsAssoc[teams[i].code] = teams[i] i = i + 1 end return p.create(args, teamsAssoc)end

p.Aus = function(frame) local args = getArgs(frame) local teams = return p.create(args, teams)endreturn p