Permanently protected module
From Wikipedia, the free encyclopedia


require('strict')

local getArgs = require('Module:Arguments').getArgs

local flagg = require('Module:Flagg').luaMain



local p = {}



local function deflag(s)

	s = mw.ustring.gsub(s or '', '%[%[[Ff][Ii][Ll][Ee]:[^%[%]]*%]%]', '')

	s = mw.ustring.gsub(s, '%[%[[Ii][Mm][Aa][Gg][Ee]:[^%[%]]*%]%]', '')

	s = mw.ustring.gsub(s, '<[^<>]*>', '')

	s = mw.ustring.gsub(s, '%s*%([A-Z][A-Z][A-Z]%)%s*$', '')

	while s:match('^%s*&[Nn][Bb][Ss][Pp];%s*') do

		s = mw.ustring.gsub(s, '^%s*&[Nn][Bb][Ss][Pp];%s*', '')

	end

	s = mw.ustring.gsub(s, '%s*&[Nn][Bb][Ss][Pp];%s*$', '')

	s = mw.ustring.gsub(s, '%s%s+', ' ')

	s = mw.ustring.gsub(s, '^%s*(.-?)%s*$', '%1')

	return s

end



local function ifexists(arg)

	return ((arg or '') ~= '') and arg or false

end



function p.createTable(frame, args)

	if not args then

		args = getArgs(frame)

	end



    local team = args'team' or 'Nation'

	local root = mw.html.create()

	local host = args'host' or ''

	local host1 = args'host1' or ''

	local host2 = args'host2' or ''

	local hostColor = '#ccccff'

	local defaultRowColor = '#ffffff'

	local flagTemplate = ifexists(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'])



	local function getFlag(code)

		if (flagTemplate == 'flagteam' or mw.ustring.lower(flagTemplate) == 'flagcountry') then

			local alias = ifexists(event) or '23px'

			local fout = flagg(frame,{'usce', code, mw.ustring.match(alias, "[12]%d%d%d") or alias})

			if (flagTemplate == 'flagteam') then

				fout = fout..'&nbsp;<span style="font-size:90%;">('..code..')</span>'

			end

			return fout

		end

		return frame:expandTemplate{title = flagTemplate, args = {code, event} }

	end



	-- build the legend

	if host2 ~= '' and host1 ~= '' then

		if args'name_' .. host1 then

			host1 = args'name_' .. host1

		elseif host1:match('^([A-Z][A-Z][A-Z])') then

			host1 = getFlag(host1)

		end

		if args'name_' .. host2 then

			host2 = args'name_' .. host2

		elseif host2:match('^([A-Z][A-Z][A-Z])') then

			host2 = getFlag(host2)

		end

		host = 'Host nations (' .. deflag(host1) .. ', ' .. deflag(host2) .. ')'

		host = frame:expandTemplate{title = 'color box', args = {hostColor, '&nbsp;*&nbsp;', 'border=darkgray'}} ..'&nbsp;'.. host

	elseif host ~= '' then

		if args'name_' .. host then

			host = args'name_' .. host

		elseif host:match('^([A-Z][A-Z][A-Z])') then

			host = getFlag(host)

		end

		host = 'Host nation (' .. deflag(host) .. ')'

		host = host .. (args'host_note' or '')

		host = frame:expandTemplate{title = 'color box', args = {hostColor, '&nbsp;*&nbsp;', 'border=darkgray'}} ..'&nbsp;'.. 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('notheme')

		:addClass('plainrowheaders')

		:addClass('jquery-tablesorter')

		:css('text-align', 'center')

		:css('background-color', 'white')

		:css('color', 'black')



	root:tag('caption')

		:wikitext(args'caption'])

	-- add the header row

	local row = root:tag('tr')

	

	if not args'hide_rank' then

		row:tag('th')

			:attr('scope', 'col')

			:css('background-color', 'white')

			:css('color', 'inherit')

			:wikitext('Rank')

	end

	row

		:tag('th')

			:attr('scope', 'col')

			:css('background-color', 'white')

			:css('color', 'inherit')

			:wikitext(team)

		:tag('th')

			:attr('scope', 'col')

			:addClass('headerSort')

			:css('width', '4em')

			:css('background-color', 'gold')

			:css('color', '#333')

			:wikitext('Gold')

		:tag('th')

			:attr('scope', 'col')

			:addClass('headerSort')

			:css('width', '4em')

			:css('background-color', 'silver')

			:css('color', '#333')

			:wikitext('Silver')

		:tag('th')

			:attr('scope', 'col')

			:addClass('headerSort')

			:css('width', '4em')

			:css('background-color', '#c96')

			:css('color', '#333')

			:wikitext('Bronze')

		:tag('th')

			:attr('scope', 'col')

			:css('width', '4em')

			:wikitext('Total')

	

	-- enumerate the rows

	local rowNums = {}

	local IOCs = {}

	for k,v in pairs(args) do

		k = ''..k

		local IOC = k:match('^gold_([A-Z][A-Z][A-Z])$') or k:match('^gold_(%d+)$')

			or k:match('^silver_([A-Z][A-Z][A-Z])$') or k:match('^silver_(%d+)$')

			or k:match('^bronze_([A-Z][A-Z][A-Z])$') or k:match('^bronze_(%d+)$')

		if IOC and IOCsIOC == nil then

			IOCsIOC = 1

			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 getFlag(IOC)

			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 < b5

			end

		)

	else

		table.sort(rowNums, function (a, b) 

			return a1 > 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 < b5])

			end

		)

	end

	

	local lastGold, lastSilver, lastBronze = -1

	local rank = 0

	local lastspan, lastrankcell = 1, nil

	for i, anum in ipairs(rowNums) do

		local IOC = anum6

		if args'skip_' .. IOC then 

			lastGold, lastSilver, lastBronze, lastspan = -1, -1, -1, 1

		else 

			rank = rank + 1 

		end

		local nation = args'name_' .. IOC or getFlag(IOC)

		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 isHost = args'host_' .. IOC

		-- this is mainly for the parameter names example so you can override it.

		local total  = args'total_' .. IOC or gold + silver + bronze

		local color = isHost and hostColor or defaultRowColor



		if not args'grand_total' then 

			totalGold = totalGold + gold

			totalSilver = totalSilver + silver

			totalBronze = totalBronze + bronze

		end



		if args'host_' .. IOC then

			nation = nation .. '*'

		end



		if args'note_' .. IOC then

			nation = nation .. args'note_' .. IOC

		end



		if showLimit and (rank>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'):css('color', '#202122')

				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):css('color', '#202122')

			

			if not args'hide_rank' then

				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('color', '#202122')

					: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 not (team:match('^[A-Z][A-Z][A-Z]$') or team:match('>[A-Z][A-Z][A-Z]<')) then

		team = team:lower()

	end

	if team:match('^games$') then team = 'game' end

	

	local colspan 

	if args'hide_rank' then 

		colspan = 1 

	else 

		colspan = 2	

	end

	if not args'hide_totals' then

		root:tag('tr')

			:css('color',  '#202122')

			:css('background-color', '#eaebef')

			:addClass('sortbottom')

			:tag('th')

				:wikitext('Totals ('..remainingEnd..' entries)')

				:attr('scope', 'row')

			    :css('color',  '#202122')

				:css('background-color', '#eaebef')

				:css('font-weight', 'bold')

				:attr('colspan', colspan)

			:tag('td')

				:wikitext(args'total_gold' or totalGold)

				:css('font-weight', 'bold')

			:tag('td')

				:wikitext(args'total_silver' or totalSilver)

				:css('font-weight', 'bold')

			:tag('td')

				:wikitext(args'total_bronze' or totalBronze)

				:css('font-weight', 'bold')

			:tag('td')

				:wikitext(args'grand_total' or totalGold+totalSilver+totalBronze)

				:css('font-weight', 'bold')

	end



	-- Build the rest of the footer

	if args'source' or args'notes' then

		if footer ~= '' then

			footer = footer .. '<br>'

		end

		footer = frame:expandTemplate{ title = 'refbegin' } .. footer

		

		if args'source' then 

			footer = footer .. 'Source: ' .. args'source'

		end

		if args'notes' then

			if args'source' then

				footer = footer .. '<br>'

			end

			footer = footer .. 'Notes: ' .. args'notes'

		end

		footer = footer .. frame:expandTemplate{ title = 'refend' }

	end



	return header .. tostring(root) .. footer

end



return p