Модул: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;">|_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