-- Module to build Sports games table -- See documentation for details
require('strict')
local p =
-- Helper functionslocal function get_team_label(team_abbr, team_name) if team_name
local function get_score_background(s, c) local s1, s2 -- Define the colouring local wc, lc, tc if c
'level3' then wc, lc, tc = '#DDFCFF', '#FDD', '#FFD' -- blue3, red3, yellow3 elseif c
-- check for override if s:match('^%s*
]*).-$') then local c = mw.ustring.gsub(s,'^%s*]*).-$', '%1') return c end-- delink if necessary if s:match('^%s*%[%[[^%[%]]*%|([^%[%]]*)%]%]') then s = s:match('^%s*%[%[[^%[%]]*%|([^%[%]]*)%]%]') end if s:match('^%s*%^%[%]%s*%s([^%[%]]*)%]') then s = s:match('^%s*%^%[%]%s*%s([^%[%]]*)%]') end if s:match('
]*>(.-)') then s = s:match(']*>(.-)') end-- get the scores s1 = tonumber(mw.ustring.gsub(s or , '^%s*([%d%.]+)%s*–%s*([%d%.]+).*', '%1') or ) or s2 = tonumber(mw.ustring.gsub(s or , '^%s*([%d%.]+)%s*–%s*([%d%.]+).*', '%2') or ) or
-- return colouring if possible if s1 ~= and s2 ~= then return (s1 > s2) and wc or ((s2 > s1) and lc or tc) else return 'transparent' endend
local function format_score(s) s = mw.ustring.gsub(s or , '^%s*([%d%.]+)%s*[–−—%-]%s*([%d%.]+)', '%1–%2') s = mw.ustring.gsub(s, '^%s*([%d%.]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d%.]+)', '%1–%2') s = mw.ustring.gsub(s, '^%s*(%[%[[^%[%]]*%|[%d%.]+)%s*%-%s*([%d%.]+)', '%1–%2') s = mw.ustring.gsub(s, '^%s*(%^%[%]%s*%s+[%d%.]+)%s*%-%s*([%d%.]+)', '%1–%2') s = mw.ustring.gsub(s, '^%s*(%[%[[^%[%]]*%|[%d%.]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d%.]+)', '%1–%2') s = mw.ustring.gsub(s, '^%s*(%^%[%]%s*%s+[%d%.]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d%.]+)', '%1–%2') return send
local function flip_score(s) s = format_score(s) s = mw.ustring.gsub(s, '([%d%.]+)–([%d%.]+)', '%2–%1') return send
local function is_overtime(s) if s:match('%d+–%d+[%s%]]*%*') then return true end return falseend
-- Main functionfunction p.table(frame) -- Get the args, stripping out blank values local getArgs = require('Module:Arguments').getArgs local Args = getArgs(frame,)
-- Exit early if we are using section transclusion for a different section local tsection = frame:getParent.args['transcludesection'] or frame:getParent.args['section'] or local bsection = frame.args['section'] or if(tsection ~= and bsection ~= ) then if(tsection ~= bsection) then return end end if Args['team_order'] and Args['team_order'] ~= then local tlist = mw.text.split(Args['team_order'], '%s*[;,]%s*') for k, tname in ipairs(tlist) do if tname ~= then Args['team' .. k] = tname end end end -- Build team list local team_list = local other_team_table = local k = 1 while Args['team' .. k] do team_list[k] = Args['team' .. k] other_team_table[Args['team' .. k]] = k = k + 1 end -- Store the results local total_games = 0 for k,v in pairs(Args) do if v and v ~= and k:match('^m%d+_[^_]+_[^_]+$') then local g = k:match('^m(%d+)_[^_]+_[^_]+$') local t1 = k:match('^m%d+_([^_]+)_[^_]+$') local t2 = k:match('^m%d+_[^_]+_([^_]+)$') if other_team_table[t1] then other_team_table[t1][tonumber(g)] = t2 end total_games = (tonumber(g) > total_games) and tonumber(g) or total_games end end
-- Start the div local root = mw.html.create('div') :css('overflow-x', 'auto') :css('white-space', 'nowrap') -- Start table local t = root:tag('table') :addClass('wikitable') :addClass('plainrowheaders') :css('text-align', 'center') -- Table title if Args['title'] and Args['title'] ~= then t:tag('caption'):wikitext(Args['title']) end -- Header rows local row = t:tag('tr') row:tag('th') :attr('scope', 'col') :attr('rowspan', 2) :wikitext('Team') row:tag('th') :attr('scope', 'col') :attr('colspan', total_games) :wikitext('Game') row = t:tag('tr') for jj = 1,total_games do row:tag('th') :attr('scope', 'col') :wikitext(jj) end -- Results rows local ot_note = false for ii=1,#team_list do local team_abbr = team_list[ii] local team_label = get_team_label(team_abbr, Args['name_' .. team_abbr]) row = t:tag('tr') row:tag('th') :attr('scope', 'row') :css('background', 'inherit') :wikitext(team_label) for jj=1,total_games do local other_team_abbr = other_team_table[team_abbr][jj] or local result = if other_team_abbr ~= then result = Args['m' .. jj .. '_' .. team_abbr .. '_' .. other_team_abbr] or if result
'auto' then for kk=1,total_games do local other_result = Args['m' .. kk .. '_' .. other_team_abbr .. '_' .. team_abbr] if other_result then result = flip_score(other_result) end end end end local ot_flag = is_overtime(result) if (ot_flag) then ot_note = true end local bg = get_score_background(result, ot_flag and 'level3' or 'level1') if result ~= then result = other_team_abbr .. '
' .. format_score(result) end row:tag('td') :css('background', bg) :wikitext(result) end end -- footer local t_footer = local update = Args['update'] or 'unknown' local start_date = Args['start_date'] or 'unknown' local source = Args['source'] or frame:expandTemplate -- Date updating if string.lower(update)
then -- Empty parameter table.insert(t_footer,'Updated to match(es) played on unknown. ') elseif string.lower(update)
if ot_note then table.insert(t_footer, '; Matches with lighter background shading were decided after overtime.') table.insert(t_footer, ' (*) Number of asterisks denotes number of overtime periods') end t_footer = mw.html.create('div') :css('font-size', '90%') :css('margin-bottom', '0.5em') :wikitext(table.concat(t_footer)) return tostring(root) .. tostring(t_footer)end
return p