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)
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
'F' then marginText = "Forfeited" elseif m.margin
'R' then marginText = "%d run" 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')endcricmatch.getResult = function(m, row) local colour, text local matchNo = string.format('Match %s', m.id, m.id) if m.result
'N' then -- Abandoned match colour = colours.N text = 'Match
abandoned' elseif m.result
'H' or m.result
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" 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']
'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