มอดูล:Sports results

-- Module to build results cross-tables for standings in Sports
-- See documentation for details
require('strict')
local p = {}
-- Main function
function p.main(frame)
	-- Get the args, stripping out blank values
	local getArgs = require('มอดูล:Arguments').getArgs
	local Args = getArgs(frame, {parentFirst = true})
	-- 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
	-- Declare locals
	local t = {}
	local t_footer = {}
	local t_return = {}
	local team_list = {}
	local notes_exist = false
	local ii, ii_fw, bg_col, team_name, team_code_ii, ii_start, ii_end
	-- Optional custom team header
	local team_header = Args'team_header' or 'เหย้า \\ เยือน'
	-- Number of legs
	local legs = tonumber(Args'legs') or 1
	local multirowlegs = (Args'multirowlegs' or 'no') ~= 'no'
	-- Edit links if requested
	local baselink = frame:getParent():getTitle()
	if mw.title.getCurrentTitle().fullText == baselink then	baselink =  end
	local template_name = Args'template_name'
		or (baselink ~=  and (':' .. baselink))
		or 
	local edit_links = template_name ==  and 
		or require('มอดูล:Navbar')._navbar({
			template_name,
			mini=1,
		})
	-- Get the custom start point for the table (most will start by default at 1)
	local top_pos = tonumber(Args'highest_pos') or 1
	-- Get the custom end point for the table (unrestricted if bottom_pos is สัญลักษณ์: สีฟ้า = ทีมในคอลัมน์ด้านซ้ายชนะ; เหลือง = เสมอ; แดง = ทีมในแถวด้านบนชนะ'
			or 'สัญลักษณ์: สีฟ้า = ทีมเหย้าชนะ; เหลือง = เสมอ; แดง = ทีมเยือนชนะ')
	elseif (Args'matches_style' or ) == 'BSR' then
		table.insert(t_footer, Args'team_header'
			and 'สัญลักษณ์: สีฟ้า = ทีมในคอลัมน์ด้านซ้ายชนะ; แดง = ทีมในแถวด้านบนชนะ'
			or 'สัญลักษณ์: สีฟ้า = ทีมเหย้าชนะ; แดง = ทีมเยือนชนะ')
	end
	if Args'a_note' then
		table.insert(t_footer, 'อักษร "a" สำหรับการแข่งขันที่ยังไม่เกิดขึ้นหมายความว่ามีบทความเกี่ยวกับคู่การแข่งขันดังกล่าว')
	end
	if Args'ot_note' then
		table.insert(t_footer, 'การแข่งขันที่แรเงาสีจางหมายถึงมีตัดสินหลังต่อเวลาพิเศษ')
	end
	local templatestyles = frame:extensionTag{
		name = 'templatestyles', args = { src = 'มอดูล:Sports results/styles.css' }
	}
	-- Add notes (if applicable)
	if notes_exist then
		table.insert(t_footer,'Notes:')
		t_footer = templatestyles .. ..table.concat(t_footer)..
		t_footer = t_footer..frame:expandTemplate{ title = 'notelist', args = { group='lower-alpha'} }
	else
		t_footer = templatestyles .. ..table.concat(t_footer)..
	end
	-- Add footer to main text table
	table.insert(t,t_footer)
	-- Rewrite anchor links
	for k=1,#t do
		if tk:match('%%#^%%*%|') then
			tk = mw.ustring.gsub(tk, '(%%)(#^%%*%|)', '%1' .. baselink .. '%2')
		end
	end
	return 
		.. '\n'
		.. table.concat(t) .. 
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, '%%FfIiLlEe:^%%*%%', )
			n = mw.ustring.gsub(n, '^%s* %s*', )
		elseif ss == 'flag' then
			n = mw.ustring.gsub(n, '(%s*%%FfIiLlEe:^%%*link=)^%|%%*(%%^*)%s*%%(^%%%|*)%|^%%*%%', '%1%3%2')
			n = mw.ustring.gsub(n, '(%%FfIiLlEe:^%%*link=)^%|%%*(%%)%s* %s*%%(^%%%|*)%|^%%*%%', '%1%3%2')
			n = mw.ustring.gsub(n, '(%%FfIiLlEe:^%%*link=)^%|%%*(%%)%s*%%(^%%%|*)%|^%%*%%', '%1%3%2')
			n = mw.ustring.gsub(n, '.*(%s*%%FfIiLlEe:^%%*%%^*).*', '%1')
			n = mw.ustring.gsub(n, '.*(%%FfIiLlEe:^%%*%%).*', '%1')
			n = mw.ustring.gsub(n, ' ()', '%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-ZA-ZA-Z)(%%) *>%(A-ZA-ZA-Z%)', '%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**).-$') then
		local c = mw.ustring.gsub(s,'^%s**).-$', '%1')
		return 'background: ' .. 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 ('background: ' .. wc .. ';') 
			or ((s2 > s1) and ('background: ' .. lc .. ';')
				or ('background: ' .. tc .. ';'))
	else
		return 
	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*&MmNnDdAaSsHh;%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*&MmNnDdAaSsHh;%s*(%d%.+)', '%1–%2')
	s = mw.ustring.gsub(s, '^%s*(%^%%%s*%s+%d%.+)%s*&MmNnDdAaSsHh;%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_listii
			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 ' style="border-left:2px solid #aaa;"' 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_listii
	-- 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,'
		end
		for jj=top_pos,N_teams do
			team_code_jj = team_listjj
			local m = (legs == 1) and 'match_' or 'match' .. l .. '_'
			result = Argsm..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 'border-left:2px solid #aaa;' or 
			if ii == jj or result == 'null' then
				-- Solid cell
				fw = 'font-weight:' .. (ii==ii_show and 'bold' or 'normal') .. ';'
				bg = 
				-- Grey background color for solid cell
				if Args'solid_cell' == 'grey' then
					table.insert(tt,'| style="'..fw..bl..'background:#bbb;" |\n')
				else
					table.insert(tt,'| style="'..fw..bl..bg..'" | —\n')
				end
			else
				-- Content cell
				-- Set bolding and background
				fw = 'font-weight:' .. ((ii==ii_show or jj == ii_show) and 'bold' or 'normal') .. ';'
				bg = 
				-- 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 = get_score_background(result,'level2')
					elseif result_extra == 'PK' then
						bg = get_score_background(result,'level3')
					else
						bg = get_score_background(result,)
					end
				elseif matches_style == 'BSR' and result ~=  then
					if result_extra == 'OT' then
						bg = get_score_background(result,'level3')
					elseif result_extra == 'OTL' then
						bg = get_score_background('0–1','level3')
					elseif result_extra == 'OTW' then
						bg = get_score_background('1–0','level3')
					elseif result_extra == 'L' then
						bg = get_score_background('0–1',)
					elseif result_extra == 'W' then
						bg = get_score_background('1–0',)
					else
						bg = get_score_background(result,)
					end
				end
				table.insert(tt,'| style="white-space:nowrap;'..fw..bl..bg..'" |'..result..'\n')
			end
		end
	end
	return tt
end
return p