<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ACricketLeagueProgression%2Fsandbox</id>
	<title>Module:CricketLeagueProgression/sandbox - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ACricketLeagueProgression%2Fsandbox"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:CricketLeagueProgression/sandbox&amp;action=history"/>
	<updated>2026-04-16T00:15:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:CricketLeagueProgression/sandbox&amp;diff=135857&amp;oldid=prev</id>
		<title>imported&gt;Jackmcbarn: sync</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:CricketLeagueProgression/sandbox&amp;diff=135857&amp;oldid=prev"/>
		<updated>2015-01-07T20:24:31Z</updated>

		<summary type="html">&lt;p&gt;sync&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
---------- Background colours for table cells ----------&lt;br /&gt;
local colours = {&lt;br /&gt;
    W = &amp;quot;#99FF99&amp;quot;,&lt;br /&gt;
    L = &amp;quot;#FFDDDD&amp;quot;,&lt;br /&gt;
    N = &amp;quot;#DFDFFF&amp;quot;,&lt;br /&gt;
    D = &amp;quot;#F0E68C&amp;quot;,&lt;br /&gt;
    T = &amp;quot;#DDFFDD&amp;quot;,&lt;br /&gt;
    X = &amp;quot;#FFD&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
local classes = {&lt;br /&gt;
    W = &amp;quot;yes table-yes2&amp;quot;,&lt;br /&gt;
    L = &amp;quot;no table-no2&amp;quot;,&lt;br /&gt;
    N = &amp;quot;noresult&amp;quot;,&lt;br /&gt;
    X = &amp;quot;partial table-partial&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
local elimColour = &amp;quot;#DCDCDC&amp;quot; -- Eliminated&lt;br /&gt;
&lt;br /&gt;
function trim(s)&lt;br /&gt;
    if not s then&lt;br /&gt;
        return nil&lt;br /&gt;
    else&lt;br /&gt;
        return (mw.ustring.gsub(s, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;))&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getArgs(frame)&lt;br /&gt;
    local parent = frame:getParent();&lt;br /&gt;
    local args = {}&lt;br /&gt;
    for k,v in pairs(parent.args) do&lt;br /&gt;
        args[k] = trim(v)&lt;br /&gt;
    end&lt;br /&gt;
    for k,v in pairs(frame.args) do&lt;br /&gt;
        args[k] = trim(v)&lt;br /&gt;
    end&lt;br /&gt;
    return args;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Match class&lt;br /&gt;
--&lt;br /&gt;
local cricmatch = {}&lt;br /&gt;
&lt;br /&gt;
cricmatch.__index = function(t, key)&lt;br /&gt;
    local ret = rawget(t, key)&lt;br /&gt;
    if ret then&lt;br /&gt;
        return ret&lt;br /&gt;
    end&lt;br /&gt;
    ret = cricmatch[key]&lt;br /&gt;
    if type(ret) == &amp;#039;function&amp;#039; then&lt;br /&gt;
        return function(...)&lt;br /&gt;
            return ret(t, ...)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        return ret&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
cricmatch.render = function(m, row, team, points)&lt;br /&gt;
	local cell = row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
	local home = m.home == team&lt;br /&gt;
&lt;br /&gt;
	local vs = home and m.away or m.home&lt;br /&gt;
	local venue = home and &amp;#039;H&amp;#039; or &amp;#039;A&amp;#039;&lt;br /&gt;
	cell:attr(&amp;#039;title&amp;#039;, string.format(&amp;#039;vs. %s (%s)&amp;#039;, vs.fullName, venue))&lt;br /&gt;
&lt;br /&gt;
	local result = m.result&lt;br /&gt;
	local gained = 0&lt;br /&gt;
	if m.result == &amp;#039;H&amp;#039; then&lt;br /&gt;
		result = home and &amp;#039;W&amp;#039; or &amp;#039;L&amp;#039;&lt;br /&gt;
		gained = home and 2 or 0&lt;br /&gt;
	elseif m.result == &amp;#039;A&amp;#039; then&lt;br /&gt;
		result = home and &amp;#039;L&amp;#039; or &amp;#039;W&amp;#039;&lt;br /&gt;
		gained = home and 0 or 2&lt;br /&gt;
	elseif m.result == &amp;#039;N&amp;#039; or m.result == &amp;#039;T&amp;#039; then&lt;br /&gt;
		gained = 1&lt;br /&gt;
	else&lt;br /&gt;
		cell&lt;br /&gt;
			:css(&amp;#039;background-color&amp;#039;, colours.X)&lt;br /&gt;
			:attr(&amp;#039;class&amp;#039;, classes.X)&lt;br /&gt;
			:wikitext(string.format(&amp;#039;[[#match%d|?]]&amp;#039;, m.id))&lt;br /&gt;
		return points&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	points = points + gained&lt;br /&gt;
	cell&lt;br /&gt;
		:css(&amp;#039;background-color&amp;#039;, colours[result])&lt;br /&gt;
		:wikitext(string.format(&amp;#039;[[#match%d|%d]]&amp;#039;, m.id, points))&lt;br /&gt;
	if classes[cell] then cell:attr(&amp;#039;class&amp;#039;, classes[cell]) end&lt;br /&gt;
	return points&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function createMatch(id, home, away, result, margin, dl)&lt;br /&gt;
    if not home or not away then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
    local match = {}&lt;br /&gt;
    setmetatable(match, cricmatch)&lt;br /&gt;
    match.id = id&lt;br /&gt;
    match.home = home&lt;br /&gt;
    match.away = away&lt;br /&gt;
    match.result = result&lt;br /&gt;
    match.margin = margin&lt;br /&gt;
    match.dl = dl&lt;br /&gt;
    return match&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Helper functions&lt;br /&gt;
--&lt;br /&gt;
function buildLegend(container, types)&lt;br /&gt;
    local key = container:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
        :addClass(&amp;#039;wikitable&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;float&amp;#039;, &amp;#039;right&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;font-size&amp;#039;, &amp;#039;90%&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;margin&amp;#039;, &amp;#039;0 0 0 10px&amp;#039;)&lt;br /&gt;
        :tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
            :css(&amp;#039;background-color&amp;#039;, colours.W)&lt;br /&gt;
            :css(&amp;#039;padding-left&amp;#039;, &amp;#039;10px&amp;#039;)&lt;br /&gt;
            :css(&amp;#039;padding-right&amp;#039;, &amp;#039;10px&amp;#039;)&lt;br /&gt;
            :wikitext(&amp;#039;Win&amp;#039;)&lt;br /&gt;
        :done()&lt;br /&gt;
        :tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
            :css(&amp;#039;background-color&amp;#039;, colours.L)&lt;br /&gt;
            :css(&amp;#039;padding&amp;#039;, &amp;#039;0 10px&amp;#039;)&lt;br /&gt;
            :wikitext(&amp;#039;Loss&amp;#039;)&lt;br /&gt;
        :done()&lt;br /&gt;
        :tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
            :css(&amp;#039;background-color&amp;#039;, colours.N)&lt;br /&gt;
            :css(&amp;#039;padding&amp;#039;, &amp;#039;0 10px&amp;#039;)&lt;br /&gt;
            :wikitext(&amp;#039;No result&amp;#039;)&lt;br /&gt;
        :done()&lt;br /&gt;
&lt;br /&gt;
    local list = container:tag(&amp;#039;ul&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;font-size&amp;#039;, &amp;#039;90%&amp;#039;)&lt;br /&gt;
        :tag(&amp;#039;li&amp;#039;)&lt;br /&gt;
            :wikitext(&amp;quot;&amp;#039;&amp;#039;&amp;#039;Note&amp;#039;&amp;#039;&amp;#039;: The total points &amp;quot; ..&lt;br /&gt;
                &amp;quot;at the end of each group match are listed.&amp;quot;)&lt;br /&gt;
        :done()&lt;br /&gt;
        :tag(&amp;#039;li&amp;#039;)&lt;br /&gt;
            :wikitext(&amp;quot;&amp;#039;&amp;#039;&amp;#039;Note&amp;#039;&amp;#039;&amp;#039;: Click on the points (group matches) &amp;quot; ..&lt;br /&gt;
                &amp;quot;or W/L (playoffs) to see the match summary.&amp;quot;)&lt;br /&gt;
        :done()&lt;br /&gt;
    return container&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getMatchData(args, teams)&lt;br /&gt;
    local i, m = 0, 1&lt;br /&gt;
    local match&lt;br /&gt;
    local matches = {}&lt;br /&gt;
    local home, away, result, margin, dl&lt;br /&gt;
    while args[i * 5 + 5] do&lt;br /&gt;
        home = teams[trim(args[i * 5 + 1])]&lt;br /&gt;
        away = teams[args[i * 5 + 2]]&lt;br /&gt;
        result = args[i * 5 + 3]&lt;br /&gt;
        margin = args[i * 5 + 4]&lt;br /&gt;
        dl = args[i * 5 + 5] == &amp;quot;Y&amp;quot;&lt;br /&gt;
        match = createMatch(m, home, away, result, margin, dl)&lt;br /&gt;
        if match then&lt;br /&gt;
            table.insert(matches, match)&lt;br /&gt;
            m = m + 1&lt;br /&gt;
        end&lt;br /&gt;
        i = i + 1&lt;br /&gt;
    end&lt;br /&gt;
    return matches&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function renderTeam(tbl, count, team, matches, koStages, total)&lt;br /&gt;
    local row = tbl:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
        :tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
            :css(&amp;#039;text-align&amp;#039;, &amp;#039;left&amp;#039;)&lt;br /&gt;
            :css(&amp;#039;padding-right&amp;#039;, &amp;#039;10px&amp;#039;)&lt;br /&gt;
            :css(&amp;#039;border-right&amp;#039;, &amp;#039;black solid 2px&amp;#039;)&lt;br /&gt;
            :css(&amp;#039;min-width&amp;#039;, &amp;#039;160px&amp;#039;)&lt;br /&gt;
            :wikitext(string.format(&amp;#039;[[%s|%s]]&amp;#039;, team.pageName, team.fullName))&lt;br /&gt;
        :done()&lt;br /&gt;
    local points = 0&lt;br /&gt;
    for i = 1, count do&lt;br /&gt;
        if matches[i] then&lt;br /&gt;
            points = matches[i].render(row, team, points)&lt;br /&gt;
        else&lt;br /&gt;
            row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local cell, koMatches, koMatch, result, colour, matchNo&lt;br /&gt;
    local eliminated = true&lt;br /&gt;
    for i = 1, #koStages do&lt;br /&gt;
        result = nil&lt;br /&gt;
        cell = row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
        if i == 1 then cell:css(&amp;#039;border-left&amp;#039;, &amp;#039;black solid 2px&amp;#039;) end&lt;br /&gt;
        koMatches = koStages[i].matches&lt;br /&gt;
        for j = 1, #koMatches do&lt;br /&gt;
            total = total + 1&lt;br /&gt;
            koMatch = koMatches[j]&lt;br /&gt;
            if result then&lt;br /&gt;
            elseif not koMatch.winner then&lt;br /&gt;
                eliminated = false&lt;br /&gt;
            else&lt;br /&gt;
                if koMatch.winner == team.code then&lt;br /&gt;
                    result = &amp;#039;W&amp;#039;&lt;br /&gt;
                    matchNo = total&lt;br /&gt;
                elseif koMatch.loser == team.code then&lt;br /&gt;
                    result = &amp;#039;L&amp;#039;&lt;br /&gt;
                    matchNo = total&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if result then&lt;br /&gt;
            cell:css(&amp;#039;background-color&amp;#039;, colours[result])&lt;br /&gt;
                :wikitext(string.format(&amp;#039;[[#match%d|%s]]&amp;#039;, matchNo, result))&lt;br /&gt;
        elseif eliminated then&lt;br /&gt;
            cell:css(&amp;#039;background-color&amp;#039;, elimColour)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.create = function(args, teams, koName, koStages)&lt;br /&gt;
    local matches = getMatchData(args, teams)&lt;br /&gt;
    local wrapper = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    local codes, results = {}, {}&lt;br /&gt;
    local count = 0&lt;br /&gt;
    for _, match in ipairs(matches) do&lt;br /&gt;
        local home = match.home.code&lt;br /&gt;
        local away = match.away.code&lt;br /&gt;
        if not results[home] then&lt;br /&gt;
            table.insert(codes, home)&lt;br /&gt;
            results[home] = {}&lt;br /&gt;
        end&lt;br /&gt;
        if not results[away] then&lt;br /&gt;
            table.insert(codes, away)&lt;br /&gt;
            results[away] = {}&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(results[home], match)&lt;br /&gt;
        table.insert(results[away], match)&lt;br /&gt;
        count = math.max(count, #results[home], #results[away])&lt;br /&gt;
    end&lt;br /&gt;
    local teamsort = function(t1, t2)&lt;br /&gt;
        return teams[t1].fullName &amp;lt; teams[t2].fullName&lt;br /&gt;
    end&lt;br /&gt;
    table.sort(codes, teamsort)&lt;br /&gt;
&lt;br /&gt;
    local container = wrapper:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;float&amp;#039;, &amp;#039;left&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;max-width&amp;#039;, &amp;#039;100%&amp;#039;)&lt;br /&gt;
    local tbl = container:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
        :attr(&amp;#039;class&amp;#039;, &amp;#039;wikitable&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;width&amp;#039;, &amp;#039;100%&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;display&amp;#039;, &amp;#039;block&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;overflow&amp;#039;, &amp;#039;auto&amp;#039;)&lt;br /&gt;
        :css(&amp;#039;border&amp;#039;, &amp;#039;none&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    -- headers&lt;br /&gt;
    local row = tbl:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
    row&lt;br /&gt;
        :tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
            :attr(&amp;#039;scope&amp;#039;, &amp;#039;col&amp;#039;)&lt;br /&gt;
            :attr(&amp;#039;rowspan&amp;#039;, &amp;#039;2&amp;#039;)&lt;br /&gt;
            :css(&amp;#039;border-right&amp;#039;, &amp;#039;black solid 2px&amp;#039;)&lt;br /&gt;
            :wikitext(&amp;#039;Team&amp;#039;)&lt;br /&gt;
        :done()&lt;br /&gt;
        :tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, count):wikitext(&amp;#039;Group matches&amp;#039;):done()&lt;br /&gt;
    if koStages then&lt;br /&gt;
        row:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
            :attr(&amp;#039;colspan&amp;#039;, #koStages)&lt;br /&gt;
            :css(&amp;#039;border-left&amp;#039;, &amp;#039;black solid 2px&amp;#039;)&lt;br /&gt;
            :wikitext(koName or &amp;#039;Knockout matches&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    row = tbl:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
    for i = 1, count do&lt;br /&gt;
        row:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;scope&amp;#039;, &amp;#039;col&amp;#039;):css(&amp;#039;min-width&amp;#039;, &amp;#039;18px&amp;#039;):wikitext(i)&lt;br /&gt;
    end&lt;br /&gt;
    local cell&lt;br /&gt;
    for i = 1, #koStages do&lt;br /&gt;
        cell = row:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
            :attr(&amp;#039;scope&amp;#039;, &amp;#039;col&amp;#039;)&lt;br /&gt;
            :css(&amp;#039;width&amp;#039;, &amp;#039;18px&amp;#039;)&lt;br /&gt;
            :tag(&amp;#039;abbr&amp;#039;)&lt;br /&gt;
                :attr(&amp;#039;title&amp;#039;, koStages[i].name)&lt;br /&gt;
                :wikitext(koStages[i].abbr)&lt;br /&gt;
            :done()&lt;br /&gt;
        if i == 1 then cell:css(&amp;#039;border-left&amp;#039;, &amp;#039;black solid 2px&amp;#039;) end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- matches&lt;br /&gt;
    for _, code in ipairs(codes) do&lt;br /&gt;
        renderTeam(tbl, count, teams[code], results[code], koStages, #matches)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    buildLegend(container)&lt;br /&gt;
    wrapper:tag(&amp;#039;div&amp;#039;):css(&amp;#039;clear&amp;#039;, &amp;#039;left&amp;#039;)&lt;br /&gt;
    return tostring(wrapper)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.IPL = function(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    local teams = mw.loadData(&amp;quot;Module:IndianPremierLeague/Teams&amp;quot;)&lt;br /&gt;
    local teamsAssoc = {}&lt;br /&gt;
    local i = 1&lt;br /&gt;
    while teams[i] do&lt;br /&gt;
        teamsAssoc[teams[i].code] = teams[i]&lt;br /&gt;
        i = i + 1&lt;br /&gt;
    end&lt;br /&gt;
    local playoffs = {&lt;br /&gt;
        { name = &amp;#039;Qualifier 1 or Eliminator&amp;#039;, abbr = &amp;#039;Q1/E&amp;#039;, matches = {&lt;br /&gt;
            { winner = args.P1W, loser = args.P1L },&lt;br /&gt;
            { winner = args.P2W, loser = args.P2L }&lt;br /&gt;
        }},&lt;br /&gt;
        { name = &amp;#039;Qualifier 2&amp;#039;, abbr = &amp;#039;Q2&amp;#039;, matches = {&lt;br /&gt;
            { winner = args.P3W, loser = args.P3L }&lt;br /&gt;
        }},&lt;br /&gt;
        { name = &amp;#039;Final&amp;#039;, abbr = &amp;#039;F&amp;#039;, matches = {&lt;br /&gt;
            { winner = args.P4W, loser = args.P4L }&lt;br /&gt;
        }}&lt;br /&gt;
    }&lt;br /&gt;
    return p.create(args, teamsAssoc, &amp;quot;Playoffs&amp;quot;, playoffs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.IPL_SF = function(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    local teams = mw.loadData(&amp;quot;Module:IndianPremierLeague/Teams&amp;quot;)&lt;br /&gt;
    local teamsAssoc = {}&lt;br /&gt;
    local i = 1&lt;br /&gt;
    while teams[i] do&lt;br /&gt;
        teamsAssoc[teams[i].code] = teams[i]&lt;br /&gt;
        i = i + 1&lt;br /&gt;
    end&lt;br /&gt;
    local knockout = {&lt;br /&gt;
        { name = &amp;#039;Semi-finals&amp;#039;, abbr = &amp;#039;SF&amp;#039;, matches = {&lt;br /&gt;
            { winner = args.SF1W, loser = args.SF1L },&lt;br /&gt;
            { winner = args.SF2W, loser = args.SF2L }&lt;br /&gt;
        }},&lt;br /&gt;
        { name = &amp;#039;Final&amp;#039;, abbr = &amp;#039;F&amp;#039;, matches = {&lt;br /&gt;
            { winner = args.FW, loser = args.FL }&lt;br /&gt;
        }}&lt;br /&gt;
    }&lt;br /&gt;
    return p.create(args, teamsAssoc, &amp;quot;Knockout&amp;quot;, knockout)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Jackmcbarn</name></author>
	</entry>
</feed>