Ҷаҳиш ба мӯҳтаво

Модул:SportsRankings

Мавод аз Википедиа — донишномаи озод

Тарҷума аз en:Module:SportsRankings, ҳуҷҷатгузориро ҳамон ҷо нигаред.

Зерсаҳифаҳо

[вироиши манбаъ]



require('strict')

local p = {}

local error_msg = '<span style="font-size:100%" class="error"><code style="color:inherit; border:inherit; padding:inherit;">&#124;_template=</code> missing or empty</span>'

local data = {}       -- contains rankings data
local templateArgs = {} -- template arguments

-- get template arguments
local function getArgs(frame)
    local parents = mw.getCurrentFrame():getParent()
    for k,v in pairs(parents.args) do
        if v and v ~= "" then templateArgs[k]=v end
    end
    for k,v in pairs(frame.args) do
        if v and v ~= "" then templateArgs[k]=v end
    end
    if parents.args['caption'] then templateArgs['caption'] = parents.args['caption'] end
end

-- load rankings data
local function loadData(frame)
    local source = frame.args[1]
    data = require('Модул:SportsRankings/data/' .. source)
end

-- get date in desired format
local function getDate(option)
    local dateTable = data.updated
    if option == "LAST" then
        local lastDateTable = data.previous
        if lastDateTable then dateTable = lastDateTable
        else return "No previous date available (data.updated missing)" end
    end
    if templateArgs['mdy'] and templateArgs['mdy'] ~= "" then
        return dateTable['month'] .. " " .. dateTable['day'] .. ", " .. dateTable['year']
    else
        return dateTable['day'] .. " " .. dateTable['month'] .. " " .. dateTable['year']
    end
end

-- cite web template
local function addCiteWeb(frame)
    return frame:expandTemplate{ title = 'cite web', args = {
        url = data.source['url'],
        title = data.source['title'],
        website = data.source['website'],
        ['language'] = data.source['language'],
        ['date'] = getDate(),
        ['access-date'] = getDate()
    }}
end

-- add reference template
local function addReference(frame)
    local text = ""
    local name = frame.args[1]
    if name == "World Rugby Rankings" then name = "IRB World Rankings" end
    if data.source['text'] then text = data.source['text'] end
    return frame:expandTemplate{ title = 'refn', args = { name = name, text .. addCiteWeb(frame) } }
end

-- get ordinal suffix for Tajik
local function getOrdinalSuffix(rank)
    local lastTwo = rank % 100
    if lastTwo == 11 or lastTwo == 12 or lastTwo == 13 then return "-ум" end
    local lastDigit = rank % 10
    if lastDigit == 1 then return "-ум"
    elseif lastDigit == 2 or lastDigit == 3 then return "-юм"
    else return "-ум" end
end

-- inline ranking display
function p.inline(frame)
    getArgs(frame)
    loadData(frame)
    local country = templateArgs[2]
    local rank

    if string.len(country) == 3 then
        for _,u in pairs(data.alias) do
            if u[1] == country then country = u[2]; break end
        end
    end
    for _,v in pairs(data.rankings) do
        if v[1] == country then rank = v[2]; break end
    end
    if rank then
        return "Тибқи санаи " .. getDate() .. " дар [[Раддабандии ҷаҳонии ФИФА]] дар ҷойгоҳи " ..
                rank .. getOrdinalSuffix(rank) .. " қарор дорад" .. addReference(frame) .. "."
    else
        return ""
    end
end

-- main ranking function
function p.main(frame)
    getArgs(frame)
    loadData(frame)
    local outputString = ""
    local validCode = false
    local country = templateArgs[2]
    local rank, move

    if string.len(country) == 3 then
        for _,u in pairs(data.alias) do
            if u[1]==country then country = u[2]; validCode = true; break end
        end
        if not validCode then
            outputString='[[Гурӯҳ:Мақолаҳо дар бораи мунтахабҳои миллии футбол бо мушкил дар намоиши раддабандии ФИФА]]' .. outputString
        end
    end

    for _,v in pairs(data.rankings) do
        if v[1]==country then rank=v[2]; move=v[3]; break end
    end
    if not rank then rank='NR' end

    if rank ~= 'NR' then
        outputString = outputString .. ' ' .. rank .. getOrdinalSuffix(rank) .. ' '
        if move < 0 and math.abs(move) == math.abs(rank) then
            outputString = outputString .. frame:expandTemplate{ title='void' }
        elseif move == 0 then
            outputString = outputString .. frame:expandTemplate{ title='Бе тағйир'}
        elseif move < 0 then
            outputString = outputString .. frame:expandTemplate{ title='Коҳиш' } .. ' ' .. math.abs(move)
        elseif move > 0 then
            outputString = outputString .. frame:expandTemplate{ title='Афзоиш' } .. ' ' .. move
        end
    else
        outputString = outputString .. frame:expandTemplate{ title='Abbr', args={"БР","Бидуни раддабандӣ",0} }
    end

    outputString = outputString .. ' <small>(' .. getDate() .. ')</small>'
    outputString = outputString .. addReference(frame)
    return outputString
end

-- replace keywords in captions and headers
function p.replaceKeywords(keyword)
    keyword = string.gsub(keyword, "INSERT_UPDATE_DATE", getDate())
    keyword = string.gsub(keyword, "INSERT_LAST_DATE", getDate("LAST"))
    keyword = string.gsub(keyword, "INSERT_REFERENCE", addReference(mw.getCurrentFrame()))
    return keyword
end

-- table of rankings (list/list2)
local function table(frame, ranking, first, last)
    local styleString = templateArgs['style'] or ""
    local lastRank = 0
    local selectCount = 0
    local selectData, selectList = nil, nil
    if templateArgs['select'] and data.confederation[templateArgs['select']] then
        selectList = templateArgs['select']
        selectData = data.confederation[selectList]
        selectCount = 1
    end

    local rankHeader = templateArgs['rank_header'] or "№"
    local selectionHeader = templateArgs['selection_header'] or selectList or "Rank"
    local teamHeader = templateArgs['team_header'] or "Мунтахаб"
    local pointsHeader = templateArgs['points_header'] or "Холҳо"
    local changeHeader = templateArgs['change_header'] or "[[Акс:Left-right arrow.png|20px|Афзоиш/коҳиш]]"

    local outputString = '{| class="wikitable" style="text-align:center;' .. styleString .. '"'
    local caption = ranking .. ' Тибқи санаи ' .. getDate() .. '.'
    if templateArgs['caption'] and templateArgs['caption'] ~= "" then
        caption = p.replaceKeywords(templateArgs['caption'])
    end
    outputString = outputString .. '\n|+' .. caption .. addReference(frame)

    -- header rows
    local count, header = 0, {}
    local tableWidth = selectList and 5 or 4
    while count < 5 do
        count = count + 1
        if templateArgs['header'..count] then
            header[count] = p.replaceKeywords(templateArgs['header'..count])
            outputString = outputString .. '\n|-\n| colspan="' .. tableWidth .. '" |' .. header[count]
        end
    end

    -- main table rows
    local change, code = "", ""
    for _,v in pairs(data.rankings) do
        if v[2] >= first and v[2] <= last then
            for _,u in pairs(data.alias) do
                if u[2]==v[1] then code=u[1]; break end
            end

            local continue = true
            if selectList then
                continue=false
                for _,u in pairs(selectData) do
                    if u==v[1] or u==code then continue=true; break end
                end
            end
            if continue then
                local rowString = '\n|-'
                if selectList then
                    local selectRank = selectCount
                    if v[2]==lastRank then selectRank=selectCount-1 end
                    rowString = rowString .. '\n|' .. selectRank
                    selectCount = selectCount + 1
                end
                rowString = rowString .. '\n|' .. v[2] .. getOrdinalSuffix(v[2])
                lastRank = v[2]

                local move = v[3]
                if move < 0 and math.abs(move) == math.abs(v[2]) then
                    change = frame:expandTemplate{ title='new entry' }
                elseif move==0 then
                    change = frame:expandTemplate{ title='Бе тағйир' }
                elseif move<0 then
                    change = frame:expandTemplate{ title='Коҳиш' } .. ' ' .. math.abs(move)
                elseif move>0 then
                    change = frame:expandTemplate{ title='Афзоиш' } .. ' ' .. move
                end
                rowString = rowString .. '||' .. change

                local countryTemplate = data.templates['flagged_team_link']
                local countryIconString = frame:expandTemplate{ title=countryTemplate, args={code} }
                local _,test = string.gsub(countryIconString,"Template:Country data","")
                if test==1 then countryIconString = frame:expandTemplate{ title=countryTemplate, args={v[1]} } end
                rowString = rowString .. '\n|style="text-align:left"|' .. countryIconString

                local points = v[4] or ""
                rowString = rowString .. '||' .. points
                outputString = outputString .. rowString
            end
        end
    end

    -- footer rows
    count = 0
    local footer = {}
    while count < 5 do
        count = count + 1
        if templateArgs['footer'..count] then
            footer[count] = p.replaceKeywords(templateArgs['footer'..count])
            outputString = outputString .. '\n|-\n| colspan="' .. tableWidth .. '" |' .. footer[count]
        end
    end

    outputString = outputString .. "\n|}"
    return outputString
end

-- list and list2 functions
function p.list(frame)
    getArgs(frame)
    loadData(frame)
    local ranking = frame.args[1]
    local first,last = tonumber(frame.args['2']) or 1, tonumber(frame.args['3']) or 10
    return table(frame, ranking, first, last)
end

function p.list2(frame)
    getArgs(frame)
    loadData(frame)
    local ranking = frame.args[1]
    local country = frame.args[2]
    local span = tonumber(frame.args[3]) or 2
    local first,last = 1,10

    if string.len(country)==3 then
        for _,u in pairs(data.alias) do
            if u[1]==country then country=u[2]; break end
        end
    end
    for _,v in pairs(data.rankings) do
        if v[1]==country then
            first = v[2]-span
            last = v[2]+span
        end
    end
    return table(frame, ranking, first, last)
end

return p