Module:Medals table

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 = 'inherit'
	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 lang = mw.getContentLanguage()

	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
	
	local sticky = frame:extensionTag{ name = "templatestyles", args = {src = "template:sticky header/styles.css" } }
	
	root = root
		:tag('table')
		:addClass('wikitable')
		:addClass('sortable')
		:addClass('sticky-header-multi')
		: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 not args['hide_rank'] then
		row:tag('th')
			:attr('scope', 'col')
			:wikitext('Rank')
	end
	row
		:tag('th')
			:attr('scope', 'col')
			: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 IOCs[IOC] == nil then
			IOCs[IOC] = 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  a[5] < b[5]
			end
		)
	else
		table.sort(rowNums, function (a, b) 
			return a[1] > b[1] or (a[1] == b[1] and a[2] > b[2]) 
				or (a[1] == b[1] and a[2] == b[2] and a[3] > b[3]) 
				or (a[1] == b[1] and a[2] == b[2] and a[3] == b[3] and a[4] > b[4])
				or (a[1] == b[1] and a[2] == b[2] and a[3] == b[3] and a[4] == b[4] and a[5] < b[5])
			end
		)
	end
	
	local lastGold, lastSilver, lastBronze = -1
	local rank = 0
	local lastspan, lastrankcell = 1, nil
	for i, anum in ipairs(rowNums) do
		local IOC = anum[6]
		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  = tonumber(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', 'inherit')
					:css('text-align','left')
					:wikitext(nation)
				:tag('td')
					:wikitext(lang:formatNum(gold))
				:tag('td')
					:wikitext(lang:formatNum(silver))
				:tag('td')
					:wikitext(lang:formatNum(bronze))
				:tag('td')
					:wikitext(lang:formatNum(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(lang:formatNum(remainingGold))
				:tag('td')
					:wikitext(lang:formatNum(remainingSilver))
				:tag('td')
					:wikitext(lang:formatNum(remainingBronze))
				:tag('td')
					:wikitext(lang:formatNum(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')
			:addClass('sortbottom')
			:css('background', 'var(--background-color-neutral,#eaecf0)')
			:css('color', 'var(--color-base,#202122)')
			:css('font-weight', 'bold')
			:tag('th')
				:wikitext('Totals ('..remainingEnd..' entries)')
				:attr('scope', 'row')
				:attr('colspan', colspan)
				:css('font-weight', 'bold')
			:tag('td')
				:wikitext(lang:formatNum(tonumber(args['total_gold']) or totalGold))
			:tag('td')
				:wikitext(lang:formatNum(tonumber(args['total_silver']) or totalSilver))
			:tag('td')
				:wikitext(lang:formatNum(tonumber(args['total_bronze']) or totalBronze))
			:tag('td')
				:wikitext(lang:formatNum(tonumber(args['grand_total']) or (totalGold + totalSilver + totalBronze)))
	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 .. sticky .. tostring(root) .. footer
end

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.