Module:Sandbox/trappist the monk/html

--[[

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,
	}

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.