Módulo:Tabela geral de medalhas

require('strict')
local getArgs = require('Módulo:Arguments').getArgs

local p = {}

local function deflag(s)
    s = mw.ustring.gsub(s or '', '%[%[[Fe][Ii][Ll][Ee]:[^%[%]]*%]%]', '')
    s = mw.ustring.gsub(s, '%[%[[Ii][Mm][Aa][Gg][Ee][Mm]?:[^%[%]]*%]%]', '')
    s = mw.ustring.gsub(s, '<[^<>]*>', '')
    s = mw.ustring.gsub(s, '%s*%([A-Z][A-Z][A-Z]%)%s*$', '')
    while s:match('^%s*&[Nn][Bb][Ss][Pp];%s*') do
        s = mw.ustring.gsub(s, '^%s*&[Nn][Bb][Ss][Pp];%s*', '')
    end
    s = mw.ustring.gsub(s, '%s*&[Nn][Bb][Ss][Pp];%s*$', '')
    s = mw.ustring.gsub(s, '%s%s+', ' ')
    s = mw.ustring.gsub(s, '^%s*(.-?)%s*$', '%1')
    return s
end

function p.createTable(frame, args)
    local Argumentos = frame.args;
    local parent     = frame:getParent();

    if not Argumentos[1] then
        Argumentos = parent.args;
    end

    local team = Argumentos['team'] or Argumentos['equipa'] or Argumentos['equipe'] or 'País'
    local root = mw.html.create()
    local anfitriao = Argumentos['anfitrião'] or ''
    local anfitriaoCor = '#ccccff'
    local defaultRowColor = '#f8f9fa'
    local flagTemplate = Argumentos['predefinição_bandeira']
    local evento = Argumentos['evento']
    local legendpos = (Argumentos['legend_position'] or 't'):lower()
    local header, footer = '', ''
    local totalOuro = 0
    local totalPrata = 0
    local totalBronze = 0
  
    local remainingOuro = 0
    local remainingPrata = 0
    local remainingBronze = 0
    local remainingStart = 0
    local remainingEnd = 0
    local limitReached = false
    local showLimit = tonumber(Argumentos['show_limit'])

    -- build the legend
    if anfitriao ~= '' then
        if Argumentos['name_' .. anfitriao] then
            anfitriao = Argumentos['name_' .. anfitrion]
            anfitriao = 'país anfitrião (' .. deflag(anfitriao) .. ')'
        elseif anfitriao:match('^([A-Z][A-Z][A-Z])') then
            anfitriao = frame:expandTemplate{title = flagTemplate, args = {anfitriao, evento} }
            anfitriao = 'país anfitrião (' .. deflag(anfitriao) .. ')'
        end
        anfitriao = anfitriao .. (Argumentos['anfitriao_nota'] or '')
        anfitriao = frame:expandTemplate{title = 'color box', args = {anfitriaoCor, '&nbsp;*&nbsp;', 'border=darkgray'}} ..'&nbsp;'.. anfitriao
    end
  
    local leading = ''
    if Argumentos['leading'] then
        leading = frame:expandTemplate{title = 'legenda', args = {'#E9D66B', "'''Em primeiro nesse desporto'''"}}
    end
  
    if legendpos == 't' then
        header = header .. anfitriao .. leading
    else
        footer = footer .. anfitriao .. leading
    end
  
    root = root
        :tag('table')
        :addClass('wikitable')
        :addClass('sortable')
        :addClass('plainrowheaders')
        :addClass('jquery-tablesorter')
        :css('text-align', 'center')
  
    root:tag('caption')
        :wikitext(Argumentos['título'])
    -- add the header row
    local row = root:tag('tr')

if Argumentos['hide_rank'] then else
        row:tag('th')
            :attr('scope', 'col')
            :wikitext('<abbr class=abbr title=Posição>Pos.</abbr>')
    end
    row
        :tag('th')
            :attr('scope', 'col')
            :wikitext(team)
        :tag('th')
            :attr('scope', 'col')
            :addClass('headerSort')
            :css('width', '4em')
            :css('background-color', 'gold')
            :wikitext('Ouro')
        :tag('th')
            :attr('scope', 'col')
            :addClass('headerSort')
            :css('width', '4em')
            :css('background-color', 'silver')
            :wikitext('Prata')
        :tag('th')
            :attr('scope', 'col')
            :addClass('headerSort')
            :css('width', '4em')
            :css('background-color', '#C96')
            :wikitext('Bronze')
        :tag('th')
            :attr('scope', 'col')
            :css('width', '4em')
            :wikitext('Total')
  
    -- enumerate the rows
    local rowNums = {}
    local IOCs = {}
    for k,v in pairs(Argumentos) do
        k = ''..k
        local IOC = k:match('^ouro_([A-Z][A-Z][A-Z])$') or k:match('^ouro_(%d+)$')
            or k:match('^prata_([A-Z][A-Z][A-Z])$') or k:match('^prata_(%d+)$')
            or k:match('^bronze_([A-Z][A-Z][A-Z])$') or k:match('^bronze_(%d+)$')
        if IOC and IOCs[IOC] == nil then
            IOCs[IOC] = 1
            local ouro   = (tonumber(Argumentos['ouro_' .. IOC]) or 0)
            local prata = (tonumber(Argumentos['prata_' .. IOC]) or 0)
            local bronze = (tonumber(Argumentos['bronze_' .. IOC]) or 0)
            local noskip = Argumentos['skip_' .. IOC] and 0 or 1
            local pais = Argumentos['name_' .. IOC] or
                frame:expandTemplate{title = flagTemplate, args = {IOC, evento} }
            pais = deflag(pais)
            if pais:match('%[%[[^%[%]%|]*%|([^%[%]]*)%]%]') then
                pais = pais:match('%[%[[^%[%]%|]*%|([^%[%]]*)%]%]')
            end
            if pais:match('%[%[([^%[%]%|]*)%]%]') then
                pais = pais:match('%[%[([^%[%]%|]*)%]%]')
            end
            table.insert(rowNums, {ouro, prata, bronze, noskip, pais, IOC})
        end
    end
    if Argumentos['team'] == 'Games' then
        table.sort(rowNums, function (a,b)
            return  a[5] < b[5]
            end
        )
    else
        table.sort(rowNums, function (a, b)
            return a[1] > b[1] or (a[1] == b[1] and a[2] > b[2])
                or (a[1] == b[1] and a[2] == b[2] and a[3] > b[3])
                or (a[1] == b[1] and a[2] == b[2] and a[3] == b[3] and a[4] > b[4])
                or (a[1] == b[1] and a[2] == b[2] and a[3] == b[3] and a[4] == b[4] and a[5] < b[5])
                end
        )
    end
  
    local lastOuro, lastPrata, lastBronze = -1
    local rank = 0
    local lastspan, lastrankcell = 1, nil
    for i, anum in ipairs(rowNums) do
        local IOC = anum[6]
        if Argumentos['skip_' .. IOC] then
            lastOuro, lastPrata, lastBronze, lastspan = -1, -1, -1, 1
        else
            rank = rank + 1
        end
        local pais = Argumentos['name_' .. IOC] or
            frame:expandTemplate{title = flagTemplate, args = {IOC, evento} }
        local ouro   = tonumber(Argumentos['ouro_' .. IOC]) or 0
        local prata = tonumber(Argumentos['prata_' .. IOC]) or 0
        local bronze = tonumber(Argumentos['bronze_' .. IOC]) or 0
        local isanfitriao = Argumentos['anfitriao_' .. IOC]
        -- this is mainly for the parameter names example so you can override it.
        local total  = Argumentos['total_' .. IOC] or ouro + prata + bronze
        local color = isanfitriao and anfitriaoCor or defaultRowColor

        if Argumentos['grande_total'] then else
                totalOuro = totalOuro + ouro
                totalPrata = totalPrata + prata
                totalBronze = totalBronze + bronze
        end

        if Argumentos['anfitrião_' .. IOC] then
            pais = pais .. '*'
        end

        if Argumentos['note_' .. IOC] then
            pais = pais .. Argumentos['nota_' .. IOC]
        end

        if showLimit and (rank>showLimit) then
            if remainingStart == 0 then remainingStart = rank end
            limitReached = true
            remainingOuro = remainingOuro + ouro
            remainingPrata = remainingPrata + prata
            remainingBronze = remainingBronze + bronze
        else
            local row
            if Argumentos['leading_' .. IOC] then
                row = root:tag('tr'):css('background-color', '#E9D66B')
                color = '#E9D66B'
            else
                row = root:tag('tr')
            end
              
            --Don't put the color on the row because of ranks spanning multiple rows.
            --:css('background-color', color)
          
            if Argumentos['hide_rank'] then else
                if (ouro == lastOuro) and (prata == lastPrata) and (bronze == lastBronze) then
                    lastspan = lastspan + 1
                    lastrankcell:attr('rowspan',lastspan)
                else
                    lastspan = 1
                    if Argumentos['skip_' .. IOC] then
                        lastrankcell = row:tag('td'):wikitext(frame:expandTemplate{title = 'sort', args = {'999', '–'}})
                    else
                        lastrankcell = row:tag('td'):wikitext(rank)
                        lastOuro   = ouro
                        lastPrata = prata
                        lastBronze = bronze
                    end
                end
            end
            row:tag('th')
                    :attr('scope', 'row')
                    :css('background-color', color)
                    :css('text-align','left')
                    :wikitext(pais)
                :tag('td')
                    :wikitext(ouro)
                :tag('td')
                    :wikitext(prata)
                :tag('td')
                    :wikitext(bronze)
                :tag('td')
                    :wikitext(total)
        end
        remainingEnd = rank
    end
  
    if limitReached then
        root:tag('tr')
                :tag('td')
                    :wikitext(remainingStart..'–'..remainingEnd)
                :tag('td')
                    :css('font-style', 'italic')
                    :css('text-align','left')
                    :wikitext(Argumentos['remaining_link'] or Argumentos['remaining_text'] or 'Remaining')
                :tag('td')
                    :wikitext(remainingOuro)
                :tag('td')
                    :wikitext(remainingPrata)
                :tag('td')
                    :wikitext(remainingBronze)
                :tag('td')
                    :wikitext(remainingOuro+remainingPrata+remainingBronze)
    end

    if team:match('^[A-Z][A-Z][A-Z]$') or team:match('>[A-Z][A-Z][A-Z]<') then else team = team:lower() end
    if team:match('^games$') then team = 'game' end
  
    local colspan
    if Argumentos['hide_rank'] then
        colspan = 1
    else
        colspan = 2  
    end
    if Argumentos['hide_totals'] then else
        root:tag('tr')
            :css('background-color', '#eaebef')
            :addClass('sortbottom')
            :tag('th')
                :wikitext('Total ('..remainingEnd..' entradas)')
                :attr('scope', 'row')
                :css('background-color', '#eaebef')
                :css('font-weight', 'normal')
                :attr('colspan', colspan)
            :tag('td')
                :wikitext(Argumentos['total_ouro'] or totalOuro)
                :css('font-weight', 'bold')
            :tag('td')
                :wikitext(Argumentos['total_prata'] or totalPrata)
                :css('font-weight', 'bold')
            :tag('td')
                :wikitext(Argumentos['total_bronze'] or totalBronze)
                :css('font-weight', 'bold')
            :tag('td')
                :wikitext(Argumentos['grand_total'] or totalOuro+totalPrata+totalBronze)
                :css('font-weight', 'bold')
    end

    -- Build the rest of the footer
    if Argumentos['fonte'] or Argumentos['notas'] then
        if footer ~= '' then
            footer = footer .. '<br>'
        end
        footer = frame:expandTemplate{ title = 'refbegin' } .. footer
      
        if Argumentos['fonte'] then
            footer = footer .. 'Fonte: ' .. Argumentos['fonte']
        end
        if Argumentos['notas'] then
            if Argumentos['fonte'] then
                footer = footer .. '<br>'
            end
            footer = footer .. 'Notas: ' .. Argumentos['notas']
        end
        footer = footer .. frame:expandTemplate{ title = 'refend' }
    end

    return header .. tostring(root) .. footer
end

return p