มอดูล:Medals table

require('Module:No globals')
local getArgs = require('Module:Arguments').getArgs
local p = {}
local function deflag(s)
	s = mw.ustring.gsub(s or , '%%FeIiLlEe:^%%*%%', )
	s = mw.ustring.gsub(s, '%%IiMmAaGgEe:^%%*%%', )
	s = mw.ustring.gsub(s, '*>', )
	s = mw.ustring.gsub(s, '%s*%(A-ZA-ZA-Z%)%s*$', )
	while s:match('^%s*&NnBbSsPp;%s*') do
		s = mw.ustring.gsub(s, '^%s*&NnBbSsPp;%s*', )
	end
	s = mw.ustring.gsub(s, '%s*&NnBbSsPp;%s*$', )
	s = mw.ustring.gsub(s, '%s%s+', ' ')
	s = mw.ustring.gsub(s, '^%s*(.-?)%s*$', '%1')
	return s
end
function p.createTable(frame, args)
	if not args then
		args = getArgs(frame)
	end
local team = args'team' or 'ประเทศ'
	local root = mw.html.create()
	local host = args'host' or 
	local hostColor = '#ccccff'
	local defaultRowColor = '#f8f9fa'
	local flagTemplate = args'flag_template' or 'flagteam'
	local event = args'event'
	local legendpos = (args'legend_position' or 't'):lower()
	local header, footer = , 
	local totalGold = 0
	local totalSilver = 0
	local totalBronze = 0
	
	local remainingGold = 0
	local remainingSilver = 0
	local remainingBronze = 0
	local remainingStart = 0
	local remainingEnd = 0
	local limitReached = false
	local showLimit = tonumber(args'show_limit')
	-- build the legend
	if host ~=  then
		if args'name_' .. host then
			host = args'name_' .. host
			host = 'เจ้าภาพ (' .. deflag(host) .. ')'
		elseif host:match('^(A-ZA-ZA-Z)') then
			host = frame:expandTemplate{title = flagTemplate, args = {host, event} }
			host = 'เจ้าภาพ (' .. deflag(host) .. ')'
		end
		host = host .. (args'host_note' or )
		host = frame:expandTemplate{title = 'color box', args = {hostColor, ' * ', 'border=darkgray'}} .. host
	end
	
	local leading = 
	if args'leading' then
		leading = frame:expandTemplate{title = 'legend', args = {'#E9D66B', "Leading in that sport"}}
	end
	
	if legendpos == 't' then
		header = header .. host .. leading
	else
		footer = footer .. host .. leading
	end
	
	root = root
		:tag('table')
		:addClass('wikitable')
		:addClass('sortable')
		:addClass('plainrowheaders')
		:addClass('jquery-tablesorter')
		:css('text-align', 'center')
	
	root:tag('caption')
		:wikitext(args'caption')
	-- add the header row
	local row = root:tag('tr')
	
	if args'hide_rank' then else
		row:tag('th')
			:wikitext('ลำดับที่')
	end
	row
		:tag('th')
			:wikitext(team)
		:tag('th')
			:addClass('headerSort')
			:css('width', '4em')
			:css('background-color', 'gold')
			:wikitext('ทอง')
		:tag('th')
			:addClass('headerSort')
			:css('width', '4em')
			:css('background-color', 'Silver')
			:wikitext('เงิน')
		:tag('th')
			:addClass('headerSort')
			:css('width', '4em')
			:css('background-color', '#c96')
			:wikitext('ทองแดง')
		:tag('th')
			:css('width', '4em')
			:wikitext('รวม')
	
	-- enumerate the rows
	local rowNums = {}
	
	for k,v in pairs(args) do
		k = ..k
		local IOC = k:match('^gold_(A-ZA-ZA-Z)$') or k:match('^gold_(%d+)$')
		if IOC then
			local gold   = (tonumber(args'gold_' .. IOC) or 0)
			local silver = (tonumber(args'silver_' .. IOC) or 0)
			local bronze = (tonumber(args'bronze_' .. IOC) or 0)
			local noskip = args'skip_' .. IOC and 0 or 1
			local nation = args'name_' .. IOC or 
				frame:expandTemplate{title = flagTemplate, args = {IOC, event} }
			nation = deflag(nation)
			if nation:match('%%^%%%|*%|(^%%*)%%') then
				nation = nation:match('%%^%%%|*%|(^%%*)%%')
			end
			if nation:match('%%(^%%%|*)%%') then
				nation = nation:match('%%(^%%%|*)%%')
			end
			table.insert(rowNums, {gold, silver, bronze, noskip, nation, IOC}) 
		end
	end
	if args'team' == 'Games' then
		table.sort(rowNums, function (a,b)
			return  a5  b1 or (a1 == b1 and a2 > b2) 
				or (a1 == b1 and a2 == b2 and a3 > b3) 
				or (a1 == b1 and a2 == b2 and a3 == b3 and a4 > b4)
				or (a1 == b1 and a2 == b2 and a3 == b3 and a4 == b4 and a5 showLimit) then 
			if remainingStart == 0 then remainingStart = rank end
			limitReached = true
			remainingGold = remainingGold + gold
			remainingSilver = remainingSilver + silver
			remainingBronze = remainingBronze + bronze
		else
			local row
			if args'leading_' .. IOC then
				row = root:tag('tr'):css('background-color', '#E9D66B')
				color = '#E9D66B'
			else
				row = root:tag('tr')
			end
				
			--Don't put the color on the row because of ranks spanning multiple rows. 
			--:css('background-color', color)
			
			if args'hide_rank' then else
				if (gold == lastGold) and (silver == lastSilver) and (bronze == lastBronze) then
					lastspan = lastspan + 1
					lastrankcell:attr('rowspan',lastspan)
				else
					lastspan = 1
					if args'skip_' .. IOC then
						lastrankcell = row:tag('td'):wikitext(frame:expandTemplate{title = 'sort', args = {'999', '–'}})
					else
						lastrankcell = row:tag('td'):wikitext(rank)
						lastGold   = gold
						lastSilver = silver
						lastBronze = bronze
					end
				end
			end
			row:tag('th')
					:attr('scope', 'row')
					:css('background-color', color)
					:css('text-align','left')
					:wikitext(nation)
				:tag('td')
					:wikitext(gold)
				:tag('td')
					:wikitext(silver)
				:tag('td')
					:wikitext(bronze)
				:tag('td')
					:wikitext(total)
		end
		remainingEnd = rank
	end
	
	if limitReached then
		root:tag('tr')
				:tag('td')
					:wikitext(remainingStart..'–'..remainingEnd)
				:tag('td')
					:css('font-style', 'italic')
					:css('text-align','left')
					:wikitext(args'remaining_link' or args'remaining_text' or 'Remaining')
				:tag('td')
					:wikitext(remainingGold)
				:tag('td')
					:wikitext(remainingSilver)
				:tag('td')
					:wikitext(remainingBronze)
				:tag('td')
					:wikitext(remainingGold+remainingSilver+remainingBronze)
	end
	if team:match('^A-ZA-ZA-Z$') or team:match('>A-ZA-ZA-Z'
		end
		footer = frame:expandTemplate{ title = 'refbegin' } .. footer
		
		if args'source' then 
			footer = footer .. 'แหล่งที่มา: ' .. args'source'
		end
		if args'notes' then
			if args'source' then
				footer = footer .. 
			end
			footer = footer .. 'หมายเหตุ: ' .. args'notes'
		end
		footer = footer .. frame:expandTemplate{ title = 'refend' }
	end
	return header .. tostring(root) .. footer
end
return p