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.
- 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:
- 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.
- 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.
- 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.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.