Jump to content

Module:Medals table country

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Miria~01 (talk | contribs) at 13:23, 19 June 2025 (linking). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

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 not games or games == "" then break end

        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

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