Module: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/BSWW World Ranking
- 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
- SportsRankings/data/doc
Templates for single country rank (with flag and change):
Template:Col-2- FIBA World Rankings: {{FIBA World Rankings}}
- FIBA Women's World Rankings: {{FIBA Women's World Rankings}}
- FIFA Women's World Rankings: {{FIFA Women's World Rankings}}
- FIFA World Rankings: {{FIFA World Rankings}}
- FIH Women's World Rankings: {{FIH Women's World Rankings}}
- FIH World Rankings: {{FIH World Rankings}}
- IIHF World Rankings: {{IIHF World Ranking}}
- IIHF Women's World Rankings: {{IIHF Women's World Ranking}}
- UEFA Coefficient Rankings: {{UEFA Coefficient Rankings}}
- World Football Elo Ratings: {{World Football Elo Ratings}}
- BSWW World Rankings: Template:T
Usage
- 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}}
|
Template:FIFA World Rankings/sandbox |
World Football Elo Ratings for France | {{#invoke:SportsRankings|main |World Football Elo Ratings|France}}
|
Template:World Football Elo Ratings/sandbox |
FIBA World Rankings for USA | {{#invoke:SportsRankings|main |FIBA World Rankings|USA}}
|
Template:FIBA World Rankings/sandbox |
List example | Output | |
FIFA World Rankings table (1-5) | {{#invoke:SportsRankings|list
|FIFA World Rankings
|1
|5
}}
|
Lua error: expandTemplate: template "refn" does not exist. |
FIBA World Rankings table (1-5) | {{#invoke:SportsRankings|list
|FIBA World Rankings
|1
|5
}}
|
Lua error: expandTemplate: template "refn" does not exist. |
FIBA Women's World Rankings table (1-5) | {{#invoke:SportsRankings|list
|FIBA Women's World Rankings
|1
|5
}}
|
Lua error in package.lua at line 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
}}
|
Lua error: expandTemplate: template "refn" does not exist. |
FIH World Rankings by confederation | {{#invoke:SportsRankings|list
|FIH World Rankings
|1
|65
|select=AfHF
|rankheader=FIH
}}
|
Lua error: expandTemplate: template "refn" does not exist. |
World Football Elo Ratings(1-5): | {{#invoke:SportsRankings|list
|World Football Elo Ratings
|1
|5
}}
|
Lua error: expandTemplate: template "refn" does not exist. |
UEFA Coefficient Rankings (+/-2): | {{#invoke:SportsRankings|list2
|UEFA Coefficient Rankings
|Luxembourg
|2
}}
|
Lua error: expandTemplate: template "refn" does not exist. |
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)
}}
|
Lua error: expandTemplate: template "refn" does not exist. |
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)
}}
|
Lua error in package.lua at line 80: module 'Module:SportsRankings/data/IIHF Women's World Ranking' not found. |
Usage
require('Module:No globals'); 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 if frame.args['caption'] then templateArgs['caption'] = frame.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="[[Category:Pages using SportsRankings with unknown parameters]]" .. 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="[[Category:Pages using SportsRankings with unknown parameters]]" .. outputString --outputString="[[Category: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 .. ' (' .. getDate() .. ')' 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 "Rank" local selectionHeader = templateArgs['selection_header'] or selectList or "Rank" local teamHeader = templateArgs['team_header'] or "Team" local pointsHeader = templateArgs['points_header'] or "Points" local changeHeader = templateArgs['change_header'] or "Change" --start table local outputString = '{| class="wikitable" style="text-align:center;' .. styleString .. '"' -- add default or custom caption local caption = ranking .. ' as of ' .. getDate() .. '.' if templateArgs['caption'] and templateArgs['caption'] ~= "" then caption = templateArgs['caption'] caption = p.replaceKeywords(caption) end if not (templateArgs['caption'] and templateArgs['caption'] == "") then outputString = outputString .. '\n|+' .. caption .. addReference(frame) end -- 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:left"|' .. 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")) if string.find(keyword, "INSERT_REFERENCE") then keyword = string.gsub( keyword, "INSERT_REFERENCE", addReference(mw.getCurrentFrame())) end 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) ]] function p.list(frame) getArgs(frame) -- returns args table having checked for content loadData(frame) local ranking = frame.args[1] local first = tonumber(frame.args['2']) or 1 local last = tonumber(frame.args['3']) or 10 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] 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