وحدة:SportsRankings
المظهر
صُنفت هذه الوحدة على أنها في مرحلة ألفا. تكون الوحدة في هذه المرحلة جاهزة نوعا ما لأن تستخدم من طرف ثالث، أي بمعنى أخر على النطاقات في صفحات التجارب. لكن يجب أن تستخدم في صفحات محددة للغاية وأن لا يوسع إستخدامها ابدا، حتى تنتقل للمرحلة التي بعدها. يجب أن يضاف لهذه الوحدة صفحة توثيق تشرح مدخلاتها وطريقة استخدامها. يجب أن تراقب هذه الوحدة جيدا وملاحظة أي أخطاء قد تحدث والعمل على عزلها وإصلاحها. |
Module to display sports rankings of countries in various sports. The data on the rankings is held in module subpages so the lists can be updated in one location.
Data subpages
- SportsRankings/data/FIBA World Rankings
- SportsRankings/data/FIFA Women's World Rankings
- SportsRankings/data/FIFA World Rankings
- SportsRankings/data/FIH Women's World Rankings
- SportsRankings/data/FIH World Rankings
- SportsRankings/data/IIHF World Ranking
- SportsRankings/data/UEFA Coefficient Rankings
- SportsRankings/data/World Football Elo Ratings
Templates for single country rank (with flag and change):
- FIBA :
- FIBA World Rankings: {{تصنيف فيبا العالمي}}
- FIBA Women's World Rankings: {{تصنيف فيبا العالمي للسيدات}}
- FIFA :
- FIFA World Rankings: {{تصنيف الفيفا العالمي}}
- FIFA Women's World Rankings: {{تصنيف الفيفا العالمي للسيدات}}
- FIH :
- FIH World Rankings: {{تصنيف الاتحاد الدولي للهوكي العالمي}}
- FIH Women's World Rankings: {{تصنيف الاتحاد الدولي للهوكي العالمي للسيدات}}
- IIHF :
- IIHF World Rankings: {{التصنيف العالمي لهوكي الجليد}}
- IIHF Women's World Rankings: {{التصنيف العالمي لهوكي الجليد للسيدات}}
- UEFA Coefficient Rankings: no template yet
- World Football Elo Ratings: {{World Football Elo Ratings}}
Template to generate rankings table:
الاستخدام
[عدل]- Show ranking of named country with change:
{{#invoke:SportsRankings|main|country|mdy}}
- List ranking from start ranking to end ranking (default: 1-10):
{{#invoke:SportsRankings|list|FIFA World Rankings|first|last}}
- List ranking from for names country with number of countries above and below:
{{#invoke:SportsRankings|list2|FIFA World Rankings|country name|number to display above and below named country}}
- Show ranking of a confederation:
{{#invoke:SportsRankings|list|FIH World Rankings|first|last|select=confederation|rank_header=FIH}}
Country examples:
Country examples | Code | Output | |||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
FIFA World Rankings for France | {{#invoke:SportsRankings|main |FIFA World Rankings|FRA}}
|
قالب:FIFA World Rankings/sandbox | |||||||||||||||||||||||||||||||||||
World Football Elo Ratings for France | {{#invoke:SportsRankings|main |World Football Elo Ratings|France}}
|
قالب:World Football Elo Ratings/sandbox | |||||||||||||||||||||||||||||||||||
FIBA World Rankings for USA | {{#invoke:SportsRankings|main |FIBA World Rankings|USA}}
|
قالب:FIBA World Rankings/sandbox | |||||||||||||||||||||||||||||||||||
List example | Output | ||||||||||||||||||||||||||||||||||||
FIFA World Rankings table (1-5) | {{#invoke:SportsRankings|list
|FIFA World Rankings
|1
|5
}}
|
| |||||||||||||||||||||||||||||||||||
FIBA World Rankings table (1-5) | {{#invoke:SportsRankings|list
|FIBA World Rankings
|1
|5
}}
|
| |||||||||||||||||||||||||||||||||||
FIBA Women's World Rankings table (1-5) | {{#invoke:SportsRankings|list
|FIBA Women's World Rankings
|1
|5
}}
|
خطأ لوا في package.lua على السطر 80: module 'Module:SportsRankings/data/FIBA Women's World Rankings' not found. | |||||||||||||||||||||||||||||||||||
FIFA Women's World Rankings (1-5): | {{#invoke:SportsRankings|list
|FIFA Women's World Rankings
|1
|5
}}
|
| |||||||||||||||||||||||||||||||||||
FIH World Rankings by confederation | {{#invoke:SportsRankings|list
|FIH World Rankings
|1
|65
|select=AfHF
|rankheader=FIH
}}
|
| |||||||||||||||||||||||||||||||||||
World Football Elo Ratings(1-5): | {{#invoke:SportsRankings|list
|World Football Elo Ratings
|1
|5
}}
|
| |||||||||||||||||||||||||||||||||||
UEFA Coefficient Rankings (+/-2): | {{#invoke:SportsRankings|list2
|UEFA Coefficient Rankings
|Luxembourg
|2
}}
|
| |||||||||||||||||||||||||||||||||||
IIHF World Rankings (1-5) (with optional caption parameter): |
{{#invoke:SportsRankings|list
|IIHF World Rankings
|1
|5
caption=Men's IIHF World Rankings (INSERT_UPDATE_DATE)
}}
|
| |||||||||||||||||||||||||||||||||||
IIHF Women's World Rankings (1-5) (with optional caption parameter): |
{{#invoke:SportsRankings|list
|IIHF Women's World Rankings
|1
|5
caption=Women's IIHF World Rankings (INSERT_UPDATE_DATE)
}}
|
خطأ لوا في package.lua على السطر 80: module 'Module:SportsRankings/data/IIHF Women's World Ranking' not found. |
Usage
- ^ "The FIFA/Coca-Cola World Ranking". FIFA. 18 يوليو 2024. اطلع عليه بتاريخ 2024-07-18.
- ^ "FIBA Ranking Presented by Nike". FIBA. 15 أغسطس 2024. اطلع عليه بتاريخ 2024-08-15.
- ^ "The FIFA/Coca-Cola Women's World Ranking". FIFA. 15 ديسمبر 2023. اطلع عليه بتاريخ 2023-12-15.
- ^ "FIH Hero World Rankings June 2019 – Men" (PDF). FIH. 30 يونيو 2019. اطلع عليه بتاريخ 2019-06-30.
- ^ Elo rankings change compared to one year ago. "World Football Elo Ratings". eloratings.net. 26 يوليو 2019. اطلع عليه بتاريخ 2019-07-26.
- ^ "Member Associations-UEFA Coefficients". UEFA. 23 أكتوبر 2018. اطلع عليه بتاريخ 2018-10-23.
- ^ ا ب "IIHF Men's World Ranking". IIHF. 21 مايو 2018. اطلع عليه بتاريخ 2018-05-21.
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>';
-- data for various rankings held in module subpages, e.g. "Module:SportsRankings/data/FIFA World Rankings"
local data = {} --[[ parameters containing data help in three tables
data.source = {} -- parameters for using in cite web (title, url, website)
data.updated = {} -- date of latest update (month, day, year)
data.rankings = {} -- the rankings list (country code, ranking, movement)
data.alias = {} -- alias list (country code, country name [=key])
--]]
local templateArgs = {} -- contains arguments from template involking module
local function getArgs(frame)
local parents = mw.getCurrentFrame():getParent()
for k,v in pairs(parents.args) do
--check content
if v and v ~= "" then
templateArgs[k]=v --parents.args[k]
end
end
for k,v in pairs(frame.args) do
--check content
if v and v ~= "" then
templateArgs[k]=v --parents.args[k]
end
end
-- allow empty caption to blank default
if parents.args['caption'] then templateArgs['caption'] = parents.args['caption'] end
end
local function loadData(frame)
local source = frame.args[1] -- source of rankings e.g. FIFA World Rankings
data = require('Module:SportsRankings/data/'.. source);
end
local function getDate(option)
local dateTable = data.updated -- there must be date table (data.updated)
-- TODO add a warning and/or category
if option == "LAST" then
local lastDateTable = data.previous
if lastDateTable then -- there might not be a previous data table (data.previous)
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
local function addCiteWeb(frame) -- use cite web template
return frame:expandTemplate{ title = 'cite web' , args = {
url = data.source['url'], --"https://www.fifa.com/fifa-world-ranking/ranking-table/men/index.html",
title = data.source['title'], -- "The FIFA/Coca-Cola World Ranking",
website = data.source['website'], --"FIFA",
['date'] = getDate(),
['access-date'] = getDate()
}}
end
local function addReference(frame)
local text = ""
if data.source['text'] then text = data.source['text'] end
return frame:expandTemplate{ title = 'refn' , args = {
name=frame.args[1], --ranking used, e.g. "FIFA World Rankings",
text .. addCiteWeb(frame)
}}
end
--[[ the main function returning ranking for one country
- takes three-letter country code or name of country as parameters
- displays as rank | movement |date
]]
function p.main(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
local outputString = ""
local validCode = false
local country = templateArgs[2] -- country name or county code passed as parameter
local rank, move
if string.len( country) == 3 then -- if we have a three letter country code
for _,u in pairs(data.alias) do -- run through alias list { 3-letter code, country name }
if u[1]==country then -- if code = passed parameter
country = u[2] -- set country name as key for ranking table
validCode = true
break
end
end
-- if no match of code to country name, set category
if not validCode then
--outputString="[[تصنيف:Pages using SportsRankings with unknown parameters]]" .. outputString
outputString = outputString
end
end
for _,v in pairs(data.rankings) do
if v[1]==country then
rank = v[2] -- get rank
move = v[3] -- get move from last ranking
break
end
end
if not rank then -- no ranking found (do we want a tracking for no rank found?)
rank = 'NR'
--outputString="[[تصنيف:Pages using SportsRankings with unknown parameters]]" .. outputString
--outputString="[[تصنيف:Pages using SportsRankings with no ranking]]" .. outputString
end
if rank ~= 'NR' then
outputString = outputString .. ' ' .. rank .. ' '
if move < 0 and math.abs( move ) == math.abs( rank ) then -- new teams in ranking: move = -ranking
outputString = outputString .. frame:expandTemplate{ title = 'new entry' }
elseif move == 0 then -- if no change in ranking
outputString = outputString .. frame:expandTemplate{ title = 'steady' }
elseif move < 0 then -- if ranking down
outputString = outputString .. frame:expandTemplate{ title = 'decrease' } .. ' ' .. math.abs(move)
elseif move > 0 then -- if ranking up
outputString = outputString .. frame:expandTemplate{ title = 'increase' } .. ' ' .. move
end
else
outputString = outputString .. frame:expandTemplate{ title = 'Abbr', args = { "NR", "Not ranked"} }
-- {{Abbr|NR|Not ranked}}
end
outputString = outputString .. ' <small>(' .. getDate() .. ')</small>'
outputString = outputString .. addReference(frame)
return outputString
end
--[[ outputs a table of the rankings
called by list() or list2()
positional parameters - |ranking|first|last the ranking to use, fist and last in table
other parameters: |style= -- CSS styling
|headerN= footerN= -- displays header and footer rows with additional information
|caption= -- value of caption to display
-- by default it generates a caption
-- this can be suppressed with empty |caption=
]]
local function table(frame, ranking, first,last)
local styleString = ""
if templateArgs['style'] and templateArgs['style'] ~= "" then styleString = templateArgs['style'] end
local sublist2 = { "ENG", "SCO", "WAL", "IRE", "NIR", "FRA", "England", "France", "Germany" }
local sublist3 = { "AFG","AUS","BAN","BHR","BHU","BRU","CAM","CHN","GUM","HKG","IDN","IND","IRN","IRQ","JOR",
"JPN","KGZ","KOR","KSA","KUW","LAO","LIB","MAC","MAS","MDV","MNG","MYA","NEP","OMA","PAK",
"PHI","PLE","PRK","QAT","SIN","SRI","SYR","THA","TJK","TKM","TLS","TPE","UAE","UZB","VIE",
"YEM" }
local lastRank = 0
local selectCount = 0
local selectData = nil
local selectList = nil
if templateArgs['select'] then
if data.confederation[templateArgs['select']] then
selectList = templateArgs['select']
selectData = data.confederation[selectList]
selectCount = 1
end
end
-- column header customisation
local rankHeader = templateArgs['rank_header'] or "الترتيب"
local selectionHeader = templateArgs['selection_header'] or selectList or "الترتيب"
local teamHeader = templateArgs['team_header'] or "الفريق"
local pointsHeader = templateArgs['points_header'] or "النقاط"
local changeHeader = templateArgs['change_header'] or "التغير"
--start table
local outputString = '{| class="wikitable" style="text-align:center;' .. styleString .. '"'
-- add default or custom caption
local caption = ranking .. ' في ' .. getDate() .. '.'
if templateArgs['caption'] and templateArgs['caption'] ~= "" then
caption = templateArgs['caption']
caption = p.replaceKeywords(caption)
end
outputString = outputString .. '\n|+' .. caption .. addReference(frame)
-- add header rows (logo, date of update etc)
local count = 0
local header = {}
local tableWidth = 4
if selectList then tableWidth = 5 end
while count < 5 do
count = count + 1
if templateArgs['header'..count] then
header[count] = templateArgs['header'..count]
header[count] = p.replaceKeywords( header[count])
outputString = outputString .. '\n|-\n| colspan="'.. tableWidth .. '" |' .. header[count]
end
end
-- add the add part of the table
local optionalColumn = ""
if selectList then
optionalColumn = '\n!' .. selectionHeader
end
outputString = outputString .. '\n|-' .. optionalColumn
.. '\n!' .. rankHeader .. '\n!' .. changeHeader
.. '\n!' .. teamHeader .. '\n!' .. pointsHeader
local change,code = '', ''
--while i<last do
for k,v in pairs(data.rankings) do
--v[2] = tonumber(v[2])
if v[2] >= first and v[2] <= last then
for _,u in pairs(data.alias) do -- get country code from name
if u[2]==v[1] then
code = u[1] -- if alias (country code) then use country name as key
break
end
end
local continue = true
if selectList then -- select from list
continue = false
for _,u in pairs(selectData) do
if u == v[1] or u == code then
continue = true
break
end
end
end
if continue ==true then
local rowString = '\n|-'
if selectList then
local selectRank = selectCount
if v[2]==lastRank then selectRank = selectCount -1 end -- only handles two at same rank
rowString = rowString .. '\n|' .. selectRank
selectCount = selectCount + 1
end
rowString = rowString .. '\n|' .. v[2] -- rank
lastRank = v[2]
local move = v[3]
if move < 0 and math.abs( move ) == math.abs( v[2] ) then -- new teams in ranking: move = -ranking
change = frame:expandTemplate{ title = 'new entry' }
elseif move == 0 then -- if no change in ranking
change = frame:expandTemplate{ title = 'steady' }
elseif move < 0 then -- if ranking down
change = frame:expandTemplate{ title = 'decrease' } .. ' ' .. math.abs(move)
elseif move > 0 then -- if ranking up
change = frame:expandTemplate{ title = 'increase' } .. ' ' .. move
end
rowString = rowString .. '||' .. change
--[[ for _,u in pairs(data.alias) do
if u[2]==v[1] then
code = u[1] -- if alias (country code) then use country name as key
break
end
end
]]
--TODO reorganise the following with better logic
--[[ template to display flag icon and team link (e.g. fb, fbw, bk, ih)
e.g. "FIFA World Rankings" = 'fb', "FIFA Women's World Rankings" 'fbw',
"FIBA World Rankings" = 'bk', "IIHF World Ranking" = 'ih'
tries with country code, then if error, tried with country name]]
local countryTemplate = data.templates['flagged_team_link']
local countryIconString = frame:expandTemplate{ title = countryTemplate, args = {code} } -- country
local _,test = string.gsub( countryIconString, "Template:Country data", "") -- page does not exist
if test == 1 then -- if error try country name
countryIconString = frame:expandTemplate{ title = countryTemplate, args = {v[1]} }
--countryIconString = "testing"
else
-- countryIconString = "exists"
end
rowString = rowString .. '\n|style="text-align:right"|' .. countryIconString
local points = ""
if v[4] then points = v[4] end
rowString = rowString .. '||' .. points -- country for now, later points
outputString = outputString .. rowString
end
end
end
-- add footer rows
count = 0
local footer = {}
while count < 5 do
count = count + 1
if templateArgs['footer'..count] then
footer[count] = templateArgs['footer'..count]
footer[count] = p.replaceKeywords(footer[count])
outputString = outputString .. '\n|-\n| colspan="'.. tableWidth .. '" |' .. footer[count]
end
end
outputString = outputString .. "\n|}"
return outputString
end
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
--[[ create a table of rankings
parameters: |ranking= -- ranking to display (e.g. FIFA World Rankings)
|first= |last= -- first and last ranking to display (defaults 1-10)
]]
local Labels = {}
Labels["FIFA Women's World Rankings"] = "تصنيف الفيفا العالمي للسيدات"
Labels["FIFA World Rankings"] = "تصنيف الفيفا العالمي"
Labels["World Football Elo Ratings"] = "تصنيف إيلو العالمي"
Labels["FIBA World Rankings"] = "تصنيف الاتحاد الدولي لكرة السلة"
Labels["UEFA Coefficient Rankings"] = "تصنيف معامل اليويفا"
Labels["Men's IIHF World Rankings"] = "تصنيف الاتحاد الدولي لهوكي الجليد للرجال"
Labels["Women's IIHF World Rankings"] = "تصنيف الاتحاد الدولي لهوكي الجليد للسيدات"
Labels["FIH World Rankings"] = "التصنيف العالمي لاتحاد الدولي للهوكي"
Labels["FIH Women's World Rankings"] = "التصنيف العالمي لاتحاد الدولي للهوكي للسيدات"
function p.list(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
local ranking = frame.args[1]
if frame.args[1] and frame.args[1] ~= "" and Labels[frame.args[1]]
then ranking = Labels[frame.args[1]]
end
local first, last = 1,10
first = tonumber(frame.args['2'])
last = tonumber(frame.args['3'])
return table(frame, ranking, first, last)
end
--[[ create a particla table of rankings above and below a country
parameters: |ranking |country |span
-- ranking - the ranking to display (e.g. FIFA World Rankings)
-- country - country table is centred around
-- span= - rows to display above and below country
]]
function p.list2(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
local ranking = frame.args[1]
if frame.args[1] and frame.args[1] ~= "" and Labels[frame.args[1]]
then ranking = Labels[frame.args[1]]
end
local first, last = 1,10
local country = frame.args[2] -- name or code of country to center table around
local span = frame.args[3] or 2 -- number of rows to display above and below country (default:2)
if string.len(country) == 3 then -- if three letter country code
for _,u in pairs(data.alias) do
if u[1]==country then
country = u[2] -- if country code then use country name
break
end
end
end
for k,v in pairs(data.rankings) do -- find position of country in rankings
if v[1] == country then
first = v[2]-span
last = v[2]+span
end
end
return table(frame, ranking, first, last)
end
return p