How Can We Help?
You are here:
< Back
--[[

build a table of Olymipc medals and country ranks for an individual country.  This example supports Mexico and 
Serbia.  Needs better data organization but serves as proof of concept

]]

require ('strict')

local data_t = mw.loadData ('Module:Sandbox/trappist the monk/html/data');


--[[--------------------------< G A M E S _ T E M P L A T E _ M A K E >----------------------------------------

when <year> is a number, returns a {{GamesName}} template for that year; when not a number, returns <year> as is

TODO: avoid the template call by implementing {{GamesName}} within this module (the template would invoke this
module when used outside of the creation of these medal tables)

]]

local function games_template_make (games, year)
	if tonumber (year) then														-- if <year> is a number or can be converted to a number
		return string.format (data_t.format_strings_t.game, games, year);		-- return a {{GamesName}} template
	else
		return year;															-- return <year> as plain text else
	end
end


--[[--------------------------< H T M L _ T A B L E _ B U I L D >----------------------------------------------

create summer and winter Olympic games medals table

	{{#invoke:Sandbox/trappist_the_monk/html|main|<Olympics country tag>|<SOG|WOG>}}

]]

local function html_table_build (frame)
	local args = require ('Module:Arguments').getArgs (frame);
	if not args[1] or '' == args[1] then
		return '<span style="color:#d33">missing required ISO 3166 country tag</span>'
	end
--args[1] = 'MEX'
	local tag = args[1]:upper();												-- args[1] is Olympics country tag
	if not data_t.country_data_t[tag] then
		return '<span style="color:#d33">no country data for ISO 3166 country tag: ' .. tag .. '</span>';
	end

	local games = args[2]:upper();												-- SOG or WOG
	if 'SOG' ~= games and 'WOG' ~= games then
		return '<span style="color:#d33">unknown games: ' .. games .. '</span>';
	end
--games='WOG'
	local html_tbl = mw.html.create ('table');									-- create the wikitable
	
	html_tbl
		:attr ('class', 'wikitable'):attr ('style', 'text-align:center')		-- add table attributes
		:tag ('caption'):wikitext (string.format (data_t.format_strings_t.caption, data_t.country_data_t[tag].country, ('SOG' == games) and 'Summer' or 'Winter')):done()	-- caption for accessibility
		:tag ('tr')
		:tag ('th'):wikitext ('Games')											-- add table headers
		:tag ('th'):wikitext ('Athletes')
		:tag ('th'):attr ('scope', 'col'):wikitext ('Gold')
		:tag ('th'):attr ('scope', 'col'):wikitext ('Silver')
		:tag ('th'):attr ('scope', 'col'):wikitext ('Bronze')
		:tag ('th'):attr ('scope', 'col'):attr ('style', 'width:3em; font-weight:bold;'):wikitext ('Total')
		:tag ('th'):attr ('scope', 'col'):attr ('style', 'width:3em; font-weight:bold;'):wikitext ('Rank')
	
	local gold_total = 0;														-- we will accumulate totals here
	local silver_total = 0;
	local bronze_total = 0;
	local total_total = 0;														-- total of totals

	local row_count = 0;														-- used as flag when rowspan used for future and no_participate messaging
	
	for _, row_t in ipairs (data_t.country_data_t[tag][games]) do				-- for each row sequence in the data table
		local games_template = games_template_make (games, row_t.year);
	
		if row_t.athletes then													-- only when there are athletes
			local athletes = string.format (data_t.format_strings_t.athletes, data_t.country_data_t[tag].country, row_t.year, ('SOG' == games) and 'Summer' or 'Winter', row_t.athletes);
			local rank = string.format (data_t.format_strings_t.rank, row_t.year, ('SOG' == games) and 'Summer' or 'Winter', row_t.rank);
			
			html_tbl:tag ('tr'):attr ('style', ('yes' == row_t.host) and 'border: 3px solid purple' or nil)	-- create an html row and populate with
				:tag ('td'):attr ('style', 'text-align:left'):wikitext (games_template):done()	-- game name
				:tag ('td'):wikitext (athletes):done()							-- number of athletes
				:tag ('td'):wikitext (row_t.gold):done()						-- number of medals
				:tag ('td'):wikitext (row_t.silver):done()
				:tag ('td'):wikitext (row_t.bronze):done()
				:tag ('td'):wikitext (row_t.gold + row_t.silver + row_t.bronze):done()	-- calculate the total number of medals for the row
				:tag ('td'):wikitext (rank):done()								-- country's rank
	
			gold_total = gold_total + row_t.gold;								-- update totals
			silver_total = silver_total + row_t.silver;
			bronze_total = bronze_total + row_t.bronze;
			total_total = total_total + row_t.gold + row_t.silver + row_t.bronze	-- update total of totals
		elseif row_t.message then
			if row_t.rowspan then
				row_count = row_t.rowspan - 1;
				html_tbl:tag ('tr')
					:tag ('td'):attr ('style', 'text-align:left'):wikitext (games_template):done()	-- game name
					:tag ('td'):attr ('colspan', 6):attr ('rowspan', row_t.rowspan):wikitext (data_t.messages_t[row_t.message] or row_t.message):done()
			else																-- here when single-row message (no rowspan)
				html_tbl:tag ('tr')
					:tag ('td'):attr ('style', 'text-align:left'):wikitext (games_template):done()	-- game name
					:tag ('td'):attr ('colspan', 6):attr ('rowspan', row_t.rowspan):wikitext (data_t.messages_t[row_t.message] or row_t.message):done()
			end
																				-- here when no <row_t.athletes> and no <row_t.message>
		elseif 0 < row_count then												-- when not 0, must be in a rowspan
			row_count = row_count - 1;											-- count down the counter
			html_tbl:tag ('tr')													-- add row that is
				:tag ('td'):attr ('style', 'text-align:left'):wikitext (games_template):done()	-- games name only
		end
	end

	html_tbl	
		:tag ('tr')																-- and create the bottom header
		:tag ('th'):attr ('colspan', '2'):wikitext ('Totals')					-- with all of the totals
		:tag ('th'):wikitext (gold_total)
		:tag ('th'):wikitext (silver_total)
		:tag ('th'):wikitext (bronze_total)
		:tag ('th'):wikitext (total_total)
		:tag ('th'):wikitext ('[[All-time Olympic Games medal table|' .. data_t.country_data_t[tag].all_time_rank .. ']]')
mw.log (tostring (html_tbl))
	return frame:preprocess (tostring (html_tbl));								-- make a big string, preprocess the game templates, and done
end


--[[--------------------------< T O T A L _ M E D A L S _ G E T >----------------------------------------------

calculate total gold/silver/bronze medal totals from country's data in ~/data for use in {{infobox country at games}}

	{{#invoke:Sandbox/trappist the monk/html|total_medals_get|<country tag>|<gold|silver|bronze>}}

]]

local function total_medals_get (frame)
	local args = require ('Module:Arguments').getArgs (frame);

	local country = args[1]:upper();
	local award = args[2]:lower();

	if not data_t.country_data_t[country] then
		return '<span style="color:#d33">unknown country: ' .. args[1] .. '</span>';
	end
	
	if not ({['gold']=true, ['silver']=true, ['bronze']=true,})[award] then
		return '<span style="color:#d33">unknown award: ' .. args[2] .. '</span>';
	end

	local total = 0;

	for _, games in ipairs ({'SOG', 'WOG'}) do
		for _, v_t in ipairs (data_t.country_data_t[country][games]) do
			if v_t[award] then
				total = total + v_t[award]
			end
		end
	end
	
	return total;
end


--[[--------------------------< E X P O R T E D   F U N C T I O N S >------------------------------------------
]]

return 
	{
	html_table_build = html_table_build,
	total_medals_get = total_medals_get,
	}
Categories
Table of Contents