Module:IndianPremierLeagueProgression
Usage
{{#invoke:IndianPremierLeagueProgression|create|parameters}}
This module has only one function: create.
Named parameters
- caption
- Optional. Specifies a caption for the top of the table.
- teams
- A comma-separated list of the participating teams. These will automatically be wikilinked in the table.
- matchesPerTeam
- The number of group stage matches per team.
- matchReportArticle
- Optional. The name of the article on which the match scorecards exist. The scorecard for each match must be on the specified article and must be accessible via an element with the
id
attribute set tomatchN
, where N is the match number (the{{anchor}}
template may be used for this purpose). If not specified, it will be the article from which the module is invoked. - knockoutType
- Specifies the model of the playoff stage. This can be one of two values: 1, to use the 2008-2010 model (2 semifinals/final), or 2, to use the current model (2 qualifiers/eliminator/final).
Data
- All unnamed parameters are used to represent data.
- Each of the teams mentioned in the teams parameter take two data parameters, in the order in which they are mentioned. The first team in the teams parameter uses the 1st and 2nd parameters, the second team uses the 3rd and 4th parameters, the third team uses the 5th and 6th parameters ans so on.
- Odd-numbered parameters represent group stage data, even-numbered parameters represent playoff data.
- The value of each data parameter consists of one or more result fields, separated by commas. The order of the result fields must be the same order in which the matches were played.
- Each result field starts with one of the letters W (win), L (loss), N (no result), E or U, followed by the match number. (E and U are used only in the playoff stage data and must not be followed by a match number)
- Points in the group stage will be inferred from the result fields.
- For playoff stage only
- If the
knockoutType
parameter is set to 1, the playoff stage data for each team can have a maximum of two result fields: the first for either of the semifinals, and the second for the final. - If the
knockoutType
parameter is set to 2, the playoff stage data for each team can have a maximum of three result fields: the first for the first qualifier or the eliminator, the second for the second qualifier and the third for the final. - The result field E indicates that the team has been eliminated. It must be the last result in the playoff data, after the result of the match that caused the elimination. For teams eliminated in the group stage, the playoff stage data for the team must only consist of an E.
- The result field U indicates that the team does not have to play the match, but is not eliminated. This should only be used only used when the
knockoutType
parameter is set to 2, and is used as the second result for the team that has won the first qualifier and progressed directly into the final.
--[[ Module for generating league progresion tables intended for use in Indian Premier League season articles. ]] local _module = {} _module.create = function(frame) ------------- Functions ------------- local strFind = string.find local strMatch = string.match local strSplit = mw.text.split local strFormat = string.format local strTrim = mw.text.trim local strSub = string.sub local strRepeat = string.rep local strUpper = string.upper ------------- Arguments ------------- local args = frame.args local matchesPerTeam = tonumber(args.matchesPerTeam) or error("Invalid or missing parameter 'matchesPerTeam'") local ktype = tonumber(args.knockoutType) or error("Invalid or missing parameter 'knockoutType'") local teams = strSplit(args.teams or error("Invalid or missing parameter 'knockoutType'"), ',', true) local matchReportArticle = args.matchReportArticle or '' local caption = args.caption -- The colours for each result local colours_win = "#99FF99" -- Win local colours_loss = "#FFDDDD" -- Loss --local colours_tie = "" local colours_noResult = "#DFDFFF" -- No result local colours_eliminated = "#DCDCDC" -- Eliminated local colours_notPossible = "#DCDCDC" -- Not technically possible (only used for some playoff matches with knockoutType=2) -- The CSS classes applied to the cells of each result local classes_win = "yes table-yes2" local classes_loss = "no table-no2" local classes_noResult = "noresult" --local classes_tie = "" -- The output buffer local output = {} local outputIndex = 1 function print(s) output[outputIndex] = s outputIndex = outputIndex + 1 end local kMatches = ({ 2, 3 }) [ktype] if not kMatches then error("Invalid knockout type: " .. ktype) end -- Construct the header print(strFormat([[ {| class="wikitable" style="text-align: center"%s ! scope="col" rowspan="2" | Team ! colspan="%d" style="border-left: 4px solid #454545" | Group matches ! colspan="%d" style="border-left: 4px solid #454545" | Playoffs |- ]], caption and '\n|+' .. caption or '', matchesPerTeam, kMatches)) for i = 1, matchesPerTeam do -- Generate the headers for each group match print(strFormat('! scope="col" style="width: 30px;%s" | %d\n', i == 1 and " border-left: 4px solid #454545" or "", i)) end --[[ Headers specific to each knockout type ]] local knockoutHeaders = { -- Knockout type 1 (used from 2008 to 2010) [[ ! scope="col" style="width: 32px; border-left: 4px solid #454545" | <abbr title="Semi-final">SF</abbr> ! scope="col" style="width: 32px" | <abbr title="Final">F</abbr>]], -- Knockout type 2 (used from 2011 onwards) [[ ! scope="col" style="width: 32px; border-left: 4px solid #454545" | <abbr title="Qualifier 1 or Eliminator">Q1/E</abbr> ! scope="col" style="width: 32px" | <abbr title="Qualifier 2">Q2</abbr> ! scope="col" style="width: 32px" | <abbr title="Final">F</abbr>]] } print(knockoutHeaders[ktype]) local argCounter = 1 -- Generate the table for i = 1, #teams do local team = strTrim(teams[i]) print('\n|-\n! scope="row" style="text-align: left; padding-right: 10px" | [[' .. team .. ']]\n') -- Add the team name local gs, ks = args[argCounter] or '', args[argCounter + 1] or '' local j, comma, runningScore, lastMatch = 0, 0, 0, 0 argCounter = argCounter + 2 repeat j = j + 1 if j > matchesPerTeam then error(strFormat("Too many group stage matches. Expected %d (team: %s)", matchesPerTeam, team)) end local startPos = comma + 1 comma = strFind(gs, ',', startPos, true) or 0 print(j == 1 and '| style="border-left: 4px solid #454545; ' or '|| style="') local rpos = strFind(gs, '%S', startPos) if rpos and (rpos < comma or comma == 0) then local result, match = strUpper(strSub(gs, rpos, rpos)), tonumber(strMatch(strSub(gs, rpos + 1, comma - 1), '^(.-)%s*$')) -- Check that the match number is a valid non-negative integer greater than the preceding match number. if not match or match <= 0 or match % 1 ~= 0 then error(strFormat("Match number does not exist or is not a valid integer greater than 0 for group stage result #%d (team: %s)", j, team)) elseif match <= lastMatch then error(strFormat("Invalid match number: %d for group stage result #%d, must be greater than the preceding match number (%d) (team: %s)", match, j, lastMatch, team)) end lastMatch = match if result == 'W' then -- Win runningScore = runningScore + 2 print(strFormat('background-color: %s" class="%s" | [[%s#match%s|%d]] ', colours_win, classes_win, matchReportArticle, match, runningScore)) elseif result == 'L' then -- Loss print(strFormat('background-color: %s" class="%s" | [[%s#match%s|%d]] ', colours_loss, classes_loss, matchReportArticle, match, runningScore)) elseif result == 'N' then -- No result runningScore = runningScore + 1 print(strFormat('background-color: %s" class="%s" | [[%s#match%s|%d]] ', colours_noResult, classes_noResult, matchReportArticle, match, runningScore)) --elseif result == 'T' then -- Tie -- runningScore = runningScore + 1 -- print(strFormat('background-color: %s" class="%s" | [[%s#match%s|%d]] ', colours_tie, classes_tie, matchReportArticle, match, runningScore)) else error(strFormat("Invalid group stage result #%d: '%s', expecting 'W', 'L', 'N', or 'T' as first character (team: %s)", j, result, team)) end else -- Result not given print('" | ') end until comma == 0 if j ~= matchesPerTeam then -- Output empty cells for the remaining matches print(strRepeat('|| ', matchesPerTeam - j)) end j, comma = 0, 0 repeat j = j + 1 if j > kMatches then error(strFormat("Too many playoff stage matches. Expected %d (team: %s)", kMatches, team)) end local startPos = comma + 1 comma = strFind(ks, ',', startPos, true) or 0 print(j == 1 and '|| style="border-left: 4px solid #454545; ' or '|| style="') local rpos = strFind(ks, '%S', startPos) if rpos and (rpos < comma or comma == 0) then local result, match = strUpper(strSub(ks, rpos, rpos)), tonumber(strMatch(strSub(ks, rpos + 1, comma - 1), '^(.-)%s*$')) if result == 'E' then if comma ~= 0 then error("The result 'E' must be the last result in the playoff stage result list. (team: " .. team ..")") end print(strFormat('background-color: %s" colspan="%d" | ', colours_eliminated, kMatches - j + 1)) j = kMatches -- To avoid printing empty cells for the remaining matches break elseif result == 'U' then print('background-color: ' .. colours_notPossible .. '" | ') else if not match or match < 0 or match % 1 ~= 0 then error(strFormat("Match number does not exist or is invalid for playoff stage result #%d (team: %s)", j, team)) elseif match <= lastMatch then error(strFormat("Invalid match number: %d for group stage result #%d, must be greater than the preceding match number (%d) (team: %s)", match, j, lastMatch, team)) end lastMatch = match if result == 'W' then print(strFormat('background-color: %s" class="%s" | [[%s#match%s|W]] ', colours_win, classes_win, matchReportArticle, match)) elseif result == 'L' then print(strFormat('background-color: %s" class="%s" | [[%s#match%s|L]] ', colours_loss, classes_loss, matchReportArticle, match)) elseif result == 'N' then print(strFormat('background-color: %s" class="%s" | [[%s#match%s|N]] ', colours_noResult, classes_noResult, matchReportArticle, match)) --elseif result == 'T' then -- print(strFormat('background-color: %s" class="%s" | [[%s#match%s|T]] ', colours_tie, classes_tie, matchReportArticle, match)) else error(strFormat("Invalid group stage result #%d: '%s', expecting 'W', 'L', 'N', ', 'E' or 'U' as first character (team: %s)", j, result, team)) end end else -- Result not given print('" | ') end until comma == 0 if j ~= kMatches then -- Output empty cells for the remaining matches print(strRepeat('|| ', kMatches - j)) end end -- Footer print(strFormat([[ |} {| class="wikitable" style="float: right; width: 20%%; text-align: center; font-size: 90%%" | class="%s" style="background-color: %s" | Win | class="%s" style="background-color: %s" | Loss | class="%s" style="background-color: %s" | No result |} <ul style="font-size: 90%%"> <li>'''Note''': The total points at the end of each group match are listed.</li> <li>'''Note''': Click on the points (group matches) or W/L (playoffs) to see the match summary.</li> </ul>]], classes_win, colours_win, classes_loss, colours_loss, classes_noResult, colours_noResult)) return table.concat(output) end return _module