Module:Medals table country
Appearance
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
implements:
Usage
local p = {}
function p.render(frame)
local args = frame:getParent().args
local country = args["country"] or "Country"
local maxRows = 50
-- Step 1: Collect raw rows from args
local raw_rows = {}
for i = 1, maxRows do
local games = args["row"..i.."_games"]
if games and games ~= "" then
local athletes_val = args["row"..i.."_athletes"]
local participation = args["row"..i.."_participation"]
local is_host = args["row"..i.."_host"] == "yes"
if athletes_val == "no" then
participation = "''did not participate''"
end
local gold = tonumber(args["row"..i.."_gold"]) or 0
local silver = tonumber(args["row"..i.."_silver"]) or 0
local bronze = tonumber(args["row"..i.."_bronze"]) or 0
local rank_raw = args["row"..i.."_rank"] or ""
table.insert(raw_rows, {
games = games,
athletes_val = athletes_val,
participation = participation,
gold = gold,
silver = silver,
bronze = bronze,
rank_raw = rank_raw,
is_host = is_host,
})
end
end
-- Step 2: Group participation rows with identical text
local rows = {}
local i = 1
while i <= #raw_rows do
local row = raw_rows[i]
if row.participation and row.participation ~= "" then
local rowspan = 1
for j = i + 1, #raw_rows do
if raw_rows[j].participation == row.participation then
rowspan = rowspan + 1
else
break
end
end
local merged_games = {}
for k = i, i + rowspan - 1 do
table.insert(merged_games, raw_rows[k].games)
end
table.insert(rows, {
participation = row.participation,
rowspan = rowspan,
games_list = merged_games,
merged = true
})
i = i + rowspan
else
local year = row.games:match("(%d%d%d%d)") or ""
local athletes_num = tonumber(row.athletes_val) or 0
local athletes_cell = string.format("[[%s at the %s Summer Olympics|%d]]", country, year, athletes_num)
local total = row.gold + row.silver + row.bronze
local rank_raw = row.rank_raw
local rank = tonumber(rank_raw)
local rank_link
if rank then
rank_link = string.format("[[%s Summer Olympics medal table|%d]]", year, rank)
elseif rank_raw == "–" then
rank_link = string.format("[[%s Summer Olympics medal table|–]]", year)
else
rank_link = rank_raw
end
local bgcolor = ""
if rank == 1 then
bgcolor = "#F7F6A8"
elseif rank == 2 then
bgcolor = "#dce5e5"
elseif rank == 3 then
bgcolor = "#ffdab9"
end
table.insert(rows, {
games = row.games,
athletes = athletes_cell,
gold = row.gold,
silver = row.silver,
bronze = row.bronze,
total = total,
rank = rank_link,
bgcolor = bgcolor,
is_host = row.is_host,
merged = false
})
i = i + 1
end
end
-- Step 3: Calculate totals for medal rows
local total_gold, total_silver, total_bronze = 0, 0, 0
for _, row in ipairs(rows) do
if not row.merged then
total_gold = total_gold + row.gold
total_silver = total_silver + row.silver
total_bronze = total_bronze + row.bronze
end
end
local total_medals = total_gold + total_silver + total_bronze
local total_rank_raw = args["total_rank"] or ""
local total_rank = total_rank_raw ~= "" and string.format("[[%s at the Olympics|%s]]", country, total_rank_raw) or ""
-- Step 4: Render table
local wikitext = '{| class="wikitable" style="text-align:center; font-size:90%;"\n'
wikitext = wikitext .. "|-\n! Games !! Athletes !! style=\"background:gold; width:3.7em; font-weight:bold;\"| Gold !! style=\"background:silver; width:3em; font-weight:bold;\"| Silver !! style=\"background:#c96; width:3.7em; font-weight:bold;\"| Bronze !! style=\"width:3.7em; font-weight:bold;\"| Total !! style=\"width:3em; font-weight:bold;\"| Rank\n"
local idx = 1
while idx <= #rows do
local row = rows[idx]
if row.merged then
-- First participation row
wikitext = wikitext .. string.format(
"|-\n| align=left | %s || colspan=6 rowspan=%d | %s\n",
row.games_list[1],
row.rowspan,
row.participation
)
-- Subsequent participation rows: only Games
for off = 2, row.rowspan do
wikitext = wikitext .. string.format(
"|-\n| align=left | %s\n",
row.games_list[off]
)
end
idx = idx + 1
else
local tr_style = row.is_host and ' style="border: 3px solid purple"' or ""
local line = "|-" .. tr_style .. "\n"
line = line .. "| align=left | " .. row.games .. " || " .. row.athletes
line = line .. string.format(" || %d || %d || %d || %d", row.gold, row.silver, row.bronze, row.total)
if row.bgcolor ~= "" then
line = line .. string.format(" || style=\"background-color:%s\" | %s", row.bgcolor, row.rank)
else
line = line .. " || " .. row.rank
end
wikitext = wikitext .. line .. "\n"
idx = idx + 1
end
end
wikitext = wikitext .. string.format("|-\n! colspan=2 | Total !! %d !! %d !! %d !! %d !! %s\n",
total_gold, total_silver, total_bronze, total_medals, total_rank)
wikitext = wikitext .. "|}"
return wikitext
end
return p