elseif string.lower(update)=='future' then
-- Future start date
table.insert(t_footer,'First match(es) will be played on '..start_date..'. ')
else
table.insert(t_footer,'Updated to match(es) played on '..update..'. ')
end
table.insert(t_footer,'Source: '..source)
if (Args['matches_style'] or '') == 'FBR' then
table.insert(t_footer, Args['team_header']
and '
Legend: Blue = column team win; Yellow = draw; Red = top row team win.'
or '
Legend: Blue = home team win; Yellow = draw; Red = away team win.')
elseif (Args['matches_style'] or '') == 'BSR' then
table.insert(t_footer, Args['team_header']
and '
Legend: Blue = column team win; Red = top row team win.'
or '
Legend: Blue = home team win; Red = away team win.')
end
if Args['a_note'] then
table.insert(t_footer, '
For upcoming matches, an "a" indicates there is an article about the rivalry between the two participants.')
end
if Args['ot_note'] then
table.insert(t_footer, '
Matches with lighter background shading were decided after overtime.')
end  
-- Add notes (if applicable)
if notes_exist then
table.insert(t_footer,'
Notes:')
-- As reflist size text
t_footer = '<div>'..table.concat(t_footer)..'</div>'
t_footer = t_footer..:expandTemplate{ title = 'notelist', args = { group='lower-alpha'} }
else
-- As reflist size text
t_footer = '<div>'..table.concat(t_footer)..'</div>'
end  
-- Add footer to main text table
table.insert(t,t_footer)  
-- Rewrite anchor links
for k=1,#t do
if t[k]:match('%[%[#[^%[%]]*%|') then
t[k] = mw.ustring.gsub(t[k], '(%[%[)(#[^%[%]]*%|)', '%1' .. baselink .. '%2')
end
end  
return '<div>'
.. '<div>\n'
.. table.concat(t) .. '</div></div>'
end  
-- Other functions
local function get_short_name(s, t, n, ss)
-- return short name if defined
if s and s ~= '' then
return s
end
-- deflag if necessary
if ss and n then
if ss == 'noflag' then
n = mw.ustring.gsub(n, '%[%[[Ff][Ii][Ll][Ee]:[^%[%]]*%]%]', '')
elseif ss == 'flag' then
n = mw.ustring.gsub(n, '(<span>%s*%[%[[Ff][Ii][Ll][Ee]:[^%[%]]*link=)[^%|%[%]]*(%]%][^<>]*</span>)%s*%[%[([^%[%]%|]*)%|[^%[%]]*%]%]', '%1%3%2')
n = mw.ustring.gsub(n, '.*(<span>%s*%[%[[Ff][Ii][Ll][Ee]:[^%[%]]*%]%][^<>]*</span>).*', '%1')
n = mw.ustring.gsub(n, '&nbsp;(</span>)', '%1')
end
end  
-- replace link text in name with team abbr if possible
if n and t and n:match('(%[%^%[%*%]%])') then
n = mw.ustring.gsub(n, '(%[%%*%|)[^%|%]]*(%]%])', '%1' .. t .. '%2')
n = mw.ustring.gsub(n, '(%[%%*)(%]%])', '%1|' .. t .. '%2')
n = mw.ustring.gsub(n, '(%[%%*%|)([A-Z][A-Z][A-Z])(%]%])&nbsp;<span[^<>]*>%([A-Z][A-Z][A-Z]%)</span>', '%1%2%3')
return n
end
-- nothing worked, so just return the unlinked team abbr
return t or ''
end  
local function get_score_background(s, c)
local s1, s2
-- Define the colouring
local wc, lc, tc
if c == 'level2' then
wc, lc, tc = '#CCF9FF', '#FCC', '#FFC' -- blue2, red2, yellow2
elseif c == 'level3' then
wc, lc, tc = '#DDFCFF', '#FDD', '#FFD' -- blue3, red3, yellow3
elseif c == 'level4' then
wc, lc, tc = '#EEFFFF', '#FEE', '#FFE' -- blue4, red4, yellow4
else
wc, lc, tc = '#BBF3FF', '#FBB', '#FFB' -- blue1, red1, yellow1
end  
-- check for override
if s:match('^%s*<span%s%s*style%s*=["\'%s]*background[%-colr]*%s*:([^\'";<>]*).-$') then
local c = mw.ustring.gsub(s,'^%s*<span%s%s*style%s*=["\'%s]*background[%-colr]*%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('<span[^<>]*>(.-)</span>') then
s = s:match('<span[^<>]*>(.-)</span>')
end  
-- get the scores
s1 = tonumber(mw.ustring.gsub( s or '',
'^%s*([%d%.][%d%.]*)%s*–%s*([%d%.][%d%.]*).*', '%1' ) or *) or *
s2 = tonumber(mw.ustring.gsub( s or '',
'^%s*([%d%.][%d%.]*)%s*–%s*([%d%.][%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'
end
end  
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 s
end  
function p.header(tt,Args,p_sub,N_teams,team_list,legs,multirowlegs)
local ii, team_code_ii, short_name
legs = legs or 1  
-- Set match column width
local col_width = Args['match_col_width'] or '28'  
-- Get some default values in case it doesn't start at 1
local top_pos = tonumber(Args['highest_pos']) or 1  
for l=1,legs do
if multirowlegs and l > 1 then
break
end
for ii=top_pos,N_teams do
team_code_ii = team_list[ii]
short_name = get_short_name(Args['short_'..team_code_ii],
team_code_ii, Args['name_'..team_code_ii], Args['short_style'] or '')
local bl = legs > 1 and ii == top_pos and * or *
tt = p_sub.colhead(tt,col_width .. bl,short_name)
end
end
return tt
end  
function p.row(tt,Args,N_teams,team_list,ii,ii_show,legs,multirowlegs)
-- Note ii is the row number being shown
local jj, fw, bg, result, result_extra, team_code_ii, team_code_jj
legs = legs or 1  
-- Set score cell style
local matches_style = Args['matches_style'] or ''  
team_code_ii = team_list[ii]  
-- Get some default values in case it doesn't start at 1
local top_pos = tonumber(Args['highest_pos']) or 1
for l=1,legs do
if multirowlegs and l > 1 then
table.insert(tt,'|- \n') -- New row
end
for jj=top_pos,N_teams do
team_code_jj = team_list[jj]
local m = (legs == 1) and 'match_' or 'match' .. l .. '_'
result = Args[m..team_code_ii..'_'..team_code_jj] or ''
result_extra = Args['result_'..team_code_ii..'_'..team_code_jj] or ''
local bl = legs > 1 and jj == top_pos and '-: solid #aaa;' or ''  
if ii == jj or result == 'null' then
-- Solid cell
fw = 'font-weight:' .. (ii==ii_show and 'bold' or 'normal') .. ';'
bg = 'background:transparent;'  
-- Grey background color for solid cell
if Args['solid_cell'] == 'grey' then
table.insert(tt,'| |\n')
else
table.insert(tt,'| | &mdash;\n')
end
else
-- Content cell
-- Set bolding and background
fw = 'font-weight:' .. ((ii==ii_show or jj == ii_show) and 'bold' or 'normal') .. ';'
bg = 'background:transparent;'  
-- Reformat dashes
if result ~= '' then
result = format_score(result)
end
-- Background coloring if enabled
if matches_style == 'FBR' and result ~= '' then
if result_extra == 'OT' then
bg = 'background:' .. get_score_background(result,'level2') .. ';'
elseif result_extra == 'PK' then
bg = 'background:' .. get_score_background(result,'level3') .. ';'
else
bg = 'background:' .. get_score_background(result,'') .. ';'
end
elseif matches_style == 'BSR' and result ~= '' then
if result_extra == 'OT' then
bg = 'background:' .. get_score_background(result,'level3') .. ';'
elseif result_extra == 'OTL' then
bg = 'background:' .. get_score_background('0–1','level3') .. ';'
elseif result_extra == 'OTW' then
bg = 'background:' .. get_score_background('1–0','level3') .. ';'
elseif result_extra == 'L' then
bg = 'background:' .. get_score_background('0–1','') .. ';'
elseif result_extra == 'W' then
bg = 'background:' .. get_score_background('1–0','') .. ';'
else
bg = 'background:' .. get_score_background(result,'') .. ';'
end
end
table.insert(tt,'| |'..result..'\n')
end
end
end  
return tt
end  
return p