![]() | This Lua module is used on approximately 500 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
Module to display ranking tables and individual rankings for ranked PDC darts players.
Module Data
Rankings | Player library | org code | notes |
---|---|---|---|
PDC Rankings | PDC Players | — | can use PDCFlag with no org parameter |
PDC Pro Tour Rankings | |||
PDC Euro Tour Rankings | |||
BDO Rankings | WDF Players | WDF | |
WDF Rankings | |||
BDO Women's Rankings | WDF Women's | ||
WDF Women's Rankings | |||
CDC Rankings | CDC Players | CDC | |
DPA Rankings | DPA and DPNZ Players | DPA | {{PDCFlag|Kyle Anderson|org=DPA}} displays AUS flag no matter what:
![]() {{DPAFlag|Kyle Anderson}} displays state flag:
![]() |
DPNZ Rankings | DPNZ | player list merged with DPA to reduce duplicates. | |
EADC Rankings | EADC Players | EADC | |
PDCNB Rankings | PDCNB Players | PDCNB | |
PDCAsia Rankings | PDCAsia Players | PDCAsia | Orgs are interchangeable since they use a combined player database. |
PDCChina Rankings | PDCChina | ||
PDJ Rankings | PDJ | ||
WSDT Rankings | WSDT Players | WSDT |
Rankings can be updated above and will display for all OOM instances and rankings on individual pages.
Template for individual rankings
Rank & move w/date: {{ Template:PDC Rankings}}
{{#invoke:DartsRankings|list|PDC Rankings|first|last}}
Examples:
Player examples | Code | Output | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PDC OOM Ranking for Michael van Gerwen | {{#invoke:DartsRankings|main |PDC Rankings|Michael van Gerwen}}
|
2 ![]() | ||||||||||||||||||||||||
PDC OOM Ranking for Peter Wright from template | {{PDC Rankings|Peter Wright}}
|
10 ![]() | ||||||||||||||||||||||||
WDF Ranking for Larry Butler from template | {{WDF Rankings|Larry Butler|mdy=mdy}}
|
150 ![]() | ||||||||||||||||||||||||
WDF Ranking for Fallon Sherrock from template | {{WDF Women's Rankings|Fallon Sherrock}}
|
(WDF
W) 8 ![]() | ||||||||||||||||||||||||
PDC Ranking only for Gary Anderson from template | {{PDC Rankings|Gary Anderson|nochange=1|nodate=1}}
|
21 [1] | ||||||||||||||||||||||||
Flag & link for José de Sousa from template | {{PDCFlag|Jose de Sousa}}
|
![]() | ||||||||||||||||||||||||
PDC Ranking & flag for Simon Whitlock from template | {{PDCFlag|Simon Whitlock}} {{PDC Rankings|Simon Whitlock|nochange=1|nodate=1|par=1}}
|
![]() | ||||||||||||||||||||||||
PDC Rankings table (1-5) | {{#invoke:DartsRankings|list
|PDC Rankings
|1
|5
}}
|
| ||||||||||||||||||||||||
PDC Rankings table (16-20) | {{#invoke:DartsRankings|list
|PDC Rankings
|16
|20
}}
|
| ||||||||||||||||||||||||
PDC Pro Tour table (1-5) | {{#invoke:DartsRankings|list
|PDC Pro Tour Rankings
|1
|5
}}
|
|
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 = {} -- player list (player, country code [=key], wiki link, proper display)
--]]
local tcats = ''
local tcatsp = ''
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
templateArgsk = v --parents.args[k]
end
end
for k,v in pairs(frame.args) do
--check content
if v and v ~= "" then
templateArgsk = 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)
if templateArgs'org' then
data = mw.loadData('Module:DartsRankings/data/' .. templateArgs'org' .. ' Rankings');
else
local source = frame.args1 -- source of rankings e.g. PDC Rankings
data = mw.loadData('Module:DartsRankings/data/'.. source);
end
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.args1], --ranking used, e.g. "PDC Rankings",
text .. addCiteWeb(frame)
}}
end
local function noAc(str)
local tableAccents = {
"À" = "A",
"Á" = "A",
"Â" = "A",
"Ã" = "A",
"Ä" = "A",
"Å" = "A",
"Æ" = "AE",
"Ç" = "C",
"È" = "E",
"É" = "E",
"Ê" = "E",
"Ë" = "E",
"Ì" = "I",
"Í" = "I",
"Î" = "I",
"Ï" = "I",
"Ð" = "D",
"Ñ" = "N",
"Ò" = "O",
"Ó" = "O",
"Ô" = "O",
"Õ" = "O",
"Ö" = "O",
"ő" = "O",
"Ø" = "O",
"Ù" = "U",
"Ú" = "U",
"Û" = "U",
"Ü" = "U",
"Ý" = "Y",
"Þ" = "P",
"ß" = "s",
"à" = "a",
"á" = "a",
"â" = "a",
"ã" = "a",
"ä" = "a",
"å" = "a",
"æ" = "ae",
"ç" = "c",
"č" = "c",
"ć" = "c",
"è" = "e",
"é" = "e",
"ê" = "e",
"ë" = "e",
"ì" = "i",
"í" = "i",
"î" = "i",
"ï" = "i",
"ł" = "l",
"ð" = "eth",
"ñ" = "n",
"ò" = "o",
"ó" = "o",
"ô" = "o",
"õ" = "o",
"ö" = "o",
"ø" = "o",
"ù" = "u",
"ú" = "u",
"û" = "u",
"ü" = "u",
"ý" = "y",
"þ" = "p",
"ÿ" = "y"
}
return str:gsub("[%z\1-\127\194-\244][\128-\191]*", tableAccents)
end
local function nameEqual(str1, str2)
return string.lower(noAc(str1)):gsub("%W", "") == string.lower(noAc(str2)):gsub("%W", "")
end
function p.dates(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
-- if templateArgs[1]==1 then
return getDate(templateArgs2])
-- else
-- return getDate()
-- end
end
local function flagPlayer(frame, player, side)
local outputString = ""
local flag, link = '', ''
if player and player ~= '' then link = '[[' .. player .. ']]'
tcatsp='[[Category:Pages using DartsRankings with missing player data|' .. player .. ']]'
end
for _,u in pairs(data.alias) do -- get country code from name
if nameEqual(u1], player) then
tcatsp=''
local nlink = ""
if u5 == 0 then nlink = 1 end
if templateArgs'nolink' == '1' then nlink = 1 end
if templateArgs'nolink' == '0' then nlink = "" end
if templateArgs'surname' =='1' then
if nlink == 1 then
link = u4
elseif u6 and u6~="" then
link = '[[' .. u3 .. ' ' .. u4 .. ' (' ..u6 .. ')' .. '|' .. u4 ..']]'
else
link = '[[' .. u3 .. ' ' .. u4 .. '|' .. u4 ..']]'
end
elseif templateArgs'surname' then
if nlink == 1 then
link = templateArgs'surname'
elseif u6 and u6~="" then
link = '[[' .. u3 .. ' ' .. u4 .. ' (' ..u6 .. ')' .. '|' .. templateArgs'surname' ..']]'
else
link = '[[' .. u3 .. ' ' .. u4 .. '|' .. templateArgs'surname' ..']]'
end
else
if u6 and u6~="" then
link = frame:expandTemplate{title= 'sortname', args ={ u3], u4 , dab = u6 , nolink = nlink } }
else
link = frame:expandTemplate{title= 'sortname', args ={ u3], u4], nolink = nlink } }
end
end
flag= u2 -- Flag string from libarary
break
end
end
if templateArgs'flag' then
flag = templateArgs'flag'
end
if side == 'right' then
outputString = link .. require('Module:Flagg').luaMain(frame, {'csxr', flag})
elseif side == 'none' then
outputString = link
else
outputString = require('Module:Flagg').luaMain(frame, {'csx', flag}) .. link
end
tcats = tcats .. tcatsp
return outputString .. tcats
end
function p.playerLink(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
return flagPlayer(frame, frame.args2], 'left')
end
function p.playerLinkRight(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
return flagPlayer(frame, frame.args2], 'right')
end
function p.playerLinkNoFlag(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
return flagPlayer(frame, frame.args2], 'none')
end
function p.main(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
local outputString = ""
local validCode = false
local player = templateArgs2 -- player name passed as parameter
local rank, move
for _,u in pairs(data.alias) do -- run through the list
if nameEqual(u1], player) then -- if code = passed parameter
validCode = true
break
end
end
-- if no match of code to country name, set category
for _,v in pairs(data.rankings) do
if nameEqual(v1], player) then
rank = v2 -- get rank
break
end
end
if rank then -- no ranking found
for _,v in pairs(data.rankingsold) do
if nameEqual(v1], player) then
move = v2 - rank -- get move from last ranking
break
else
move = 0 - rank
end
end
else
rank = 'NR'
end
local changeString = ""
if rank ~= 'NR' then
outputString = rank
if move < 0 and math.abs( move ) == math.abs( rank ) then -- new teams in ranking: move = -ranking
changeString = frame:expandTemplate{ title = 'new entry' }
elseif move == 0 then -- if no change in ranking
changeString = frame:expandTemplate{ title = 'steady' }
elseif move < 0 then -- if ranking down
changeString = frame:expandTemplate{ title = 'decrease' } .. ' ' .. math.abs(move)
elseif move > 0 then -- if ranking up
changeString = frame:expandTemplate{ title = 'increase' } .. ' ' .. move
end
if not templateArgs'nochange' or templateArgs'nochange' == "" then
outputString = outputString .. ' ' .. changeString
end
else
outputString = outputString .. frame:expandTemplate{ title = 'Abbr', args = { "NR", "Not ranked"} }
-- {{Abbr|NR|Not ranked}}
end
if not templateArgs'nodate' or templateArgs'nodate' == "" then
outputString = outputString .. ' (' .. getDate() .. ')'
end
if templateArgs'par' and templateArgs'par' ~= '' then
outputString = '(' .. outputString .. ')'
end
if not templateArgs'noref' or templateArgs'noref' == "" then
outputString = outputString .. addReference(frame)
end
return outputString
end
function p.rankOnly(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
local outputString = ""
local validCode = false
local player = templateArgs2 -- player name passed as parameter
local rank ='NR'
local move
for _,u in pairs(data.alias) do -- run through the list
if nameEqual(u1], player) then -- if code = passed parameter
validCode = true
break
end
end
-- if no match of code to country name, set category
for _,v in pairs(data.rankings) do
if nameEqual(v1], player) then
rank = v2 -- get rank
break
end
end
return rank
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 lastRank = 0
local selectCount = 0
local selectData = nil
local selectList = nil
-- 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 "Player"
local pointsHeader = templateArgs'points_header' or "Earnings"
local changeHeader = templateArgs'change_header' or "Change"
local noChange = templateArgs'change_col' or 1
--start table
local outputString = '{| class="wikitable" style="text-align:center;' .. styleString .. '"'
local tabletitle = data.labels'title'
-- add default or custom caption
local caption = tabletitle .. ' as of ' .. 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
headercount = templateArgs'header'..count
headercount = p.replaceKeywords( headercount])
outputString = outputString .. '\n|-\n| colspan="'.. tableWidth .. '" |' .. headercount
end
end
-- add the add part of the table
local optionalColumn = ""
if selectList then
optionalColumn = '\n!' .. selectionHeader
end
outputString = outputString .. '\n|-' .. optionalColumn .. '\n!' .. rankHeader
if noChange == 1 then
outputString = outputString .. '\n!' .. changeHeader
end
outputString = outputString .. '\n!' .. teamHeader .. '\n!' .. pointsHeader
local change,player,plink = '', '', ''
--while i<last do
for k,v in pairs(data.rankings) do
--v[2] = tonumber(v[2])
if v2 >= first and v2 <= last then
plink = flagPlayer(frame, v1], 'left')
local continue = true
if continue ==true then
local rowString = '\n|-'
if selectList then
local selectRank = selectCount
if v2==lastRank then selectRank = selectCount -1 end -- only handles two at same rank
rowString = rowString .. '\n|' .. selectRank
selectCount = selectCount + 1
end
rowString = rowString .. '\n|' .. v2 -- rank
lastRank = v2
local move = nil
for _,w in pairs(data.rankingsold) do
if nameEqual(w1], v1]) then
move = w2 - lastRank -- get move from last ranking
break
else
move = 0 - lastRank
end
end
if move < 0 and math.abs( move ) == math.abs( v2 ) 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
if noChange == 1 then
rowString = rowString .. '||' .. change
end
rowString = rowString .. '\n|style="text-align:left"|' .. plink
local points = ""
if v3 then points = v3 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
footercount = templateArgs'footer'..count
footercount = p.replaceKeywords(footercount])
outputString = outputString .. '\n|-\n| colspan="'.. tableWidth .. '" |' .. footercount
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)
]]
function p.list(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
local ranking = frame.args1
local first, last = 1,10
first = tonumber(frame.args'2'])
last = tonumber(frame.args'3'])
return table(frame, ranking, first, last)
end
local function navlist(frame, ranking, first,last)
local lastRank = 0
local selectCount = 0
local selectData = nil
local selectList = nil
--start list
local outputString = '<ol start="' .. first .. '">'
local change,player,plink = '', '', ''
for k,v in pairs(data.rankings) do
if v2 >= first and v2 <= last then
plink = flagPlayer(frame, v1], 'left')
local rowString = '<li>' -- rank
lastRank = v2
rowString = rowString .. plink
if not templateArgs'nochange' or templateArgs'nochange' == "" then
local move = nil
for _,w in pairs(data.rankingsold) do
if nameEqual(w1], v1]) then
move = w2 - lastRank -- get move from last ranking
break
else
move = 0 - lastRank
end
end
if move < 0 and math.abs( move ) == math.abs( v2 ) 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' }
elseif move > 0 then -- if ranking up
change = frame:expandTemplate{ title = 'increase' }
end
rowString = rowString .. ' ' .. change .. '</li>'
end
outputString = outputString .. '\n'.. rowString
end
end
outputString = outputString .. '</ol>'
return outputString
end
---
--- Returns text list for players first,last for PDC top 20 navbox
function p.nav(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
local ranking = frame.args1
local first, last = 1,10
first = tonumber(frame.args'2'])
last = tonumber(frame.args'3'])
return navlist(frame, ranking, first, last)
end
return p
![]() | This Lua module is used on approximately 500 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
Module to display ranking tables and individual rankings for ranked PDC darts players.
Module Data
Rankings | Player library | org code | notes |
---|---|---|---|
PDC Rankings | PDC Players | — | can use PDCFlag with no org parameter |
PDC Pro Tour Rankings | |||
PDC Euro Tour Rankings | |||
BDO Rankings | WDF Players | WDF | |
WDF Rankings | |||
BDO Women's Rankings | WDF Women's | ||
WDF Women's Rankings | |||
CDC Rankings | CDC Players | CDC | |
DPA Rankings | DPA and DPNZ Players | DPA | {{PDCFlag|Kyle Anderson|org=DPA}} displays AUS flag no matter what:
![]() {{DPAFlag|Kyle Anderson}} displays state flag:
![]() |
DPNZ Rankings | DPNZ | player list merged with DPA to reduce duplicates. | |
EADC Rankings | EADC Players | EADC | |
PDCNB Rankings | PDCNB Players | PDCNB | |
PDCAsia Rankings | PDCAsia Players | PDCAsia | Orgs are interchangeable since they use a combined player database. |
PDCChina Rankings | PDCChina | ||
PDJ Rankings | PDJ | ||
WSDT Rankings | WSDT Players | WSDT |
Rankings can be updated above and will display for all OOM instances and rankings on individual pages.
Template for individual rankings
Rank & move w/date: {{ Template:PDC Rankings}}
{{#invoke:DartsRankings|list|PDC Rankings|first|last}}
Examples:
Player examples | Code | Output | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PDC OOM Ranking for Michael van Gerwen | {{#invoke:DartsRankings|main |PDC Rankings|Michael van Gerwen}}
|
2 ![]() | ||||||||||||||||||||||||
PDC OOM Ranking for Peter Wright from template | {{PDC Rankings|Peter Wright}}
|
10 ![]() | ||||||||||||||||||||||||
WDF Ranking for Larry Butler from template | {{WDF Rankings|Larry Butler|mdy=mdy}}
|
150 ![]() | ||||||||||||||||||||||||
WDF Ranking for Fallon Sherrock from template | {{WDF Women's Rankings|Fallon Sherrock}}
|
(WDF
W) 8 ![]() | ||||||||||||||||||||||||
PDC Ranking only for Gary Anderson from template | {{PDC Rankings|Gary Anderson|nochange=1|nodate=1}}
|
21 [1] | ||||||||||||||||||||||||
Flag & link for José de Sousa from template | {{PDCFlag|Jose de Sousa}}
|
![]() | ||||||||||||||||||||||||
PDC Ranking & flag for Simon Whitlock from template | {{PDCFlag|Simon Whitlock}} {{PDC Rankings|Simon Whitlock|nochange=1|nodate=1|par=1}}
|
![]() | ||||||||||||||||||||||||
PDC Rankings table (1-5) | {{#invoke:DartsRankings|list
|PDC Rankings
|1
|5
}}
|
| ||||||||||||||||||||||||
PDC Rankings table (16-20) | {{#invoke:DartsRankings|list
|PDC Rankings
|16
|20
}}
|
| ||||||||||||||||||||||||
PDC Pro Tour table (1-5) | {{#invoke:DartsRankings|list
|PDC Pro Tour Rankings
|1
|5
}}
|
|
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 = {} -- player list (player, country code [=key], wiki link, proper display)
--]]
local tcats = ''
local tcatsp = ''
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
templateArgsk = v --parents.args[k]
end
end
for k,v in pairs(frame.args) do
--check content
if v and v ~= "" then
templateArgsk = 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)
if templateArgs'org' then
data = mw.loadData('Module:DartsRankings/data/' .. templateArgs'org' .. ' Rankings');
else
local source = frame.args1 -- source of rankings e.g. PDC Rankings
data = mw.loadData('Module:DartsRankings/data/'.. source);
end
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.args1], --ranking used, e.g. "PDC Rankings",
text .. addCiteWeb(frame)
}}
end
local function noAc(str)
local tableAccents = {
"À" = "A",
"Á" = "A",
"Â" = "A",
"Ã" = "A",
"Ä" = "A",
"Å" = "A",
"Æ" = "AE",
"Ç" = "C",
"È" = "E",
"É" = "E",
"Ê" = "E",
"Ë" = "E",
"Ì" = "I",
"Í" = "I",
"Î" = "I",
"Ï" = "I",
"Ð" = "D",
"Ñ" = "N",
"Ò" = "O",
"Ó" = "O",
"Ô" = "O",
"Õ" = "O",
"Ö" = "O",
"ő" = "O",
"Ø" = "O",
"Ù" = "U",
"Ú" = "U",
"Û" = "U",
"Ü" = "U",
"Ý" = "Y",
"Þ" = "P",
"ß" = "s",
"à" = "a",
"á" = "a",
"â" = "a",
"ã" = "a",
"ä" = "a",
"å" = "a",
"æ" = "ae",
"ç" = "c",
"č" = "c",
"ć" = "c",
"è" = "e",
"é" = "e",
"ê" = "e",
"ë" = "e",
"ì" = "i",
"í" = "i",
"î" = "i",
"ï" = "i",
"ł" = "l",
"ð" = "eth",
"ñ" = "n",
"ò" = "o",
"ó" = "o",
"ô" = "o",
"õ" = "o",
"ö" = "o",
"ø" = "o",
"ù" = "u",
"ú" = "u",
"û" = "u",
"ü" = "u",
"ý" = "y",
"þ" = "p",
"ÿ" = "y"
}
return str:gsub("[%z\1-\127\194-\244][\128-\191]*", tableAccents)
end
local function nameEqual(str1, str2)
return string.lower(noAc(str1)):gsub("%W", "") == string.lower(noAc(str2)):gsub("%W", "")
end
function p.dates(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
-- if templateArgs[1]==1 then
return getDate(templateArgs2])
-- else
-- return getDate()
-- end
end
local function flagPlayer(frame, player, side)
local outputString = ""
local flag, link = '', ''
if player and player ~= '' then link = '[[' .. player .. ']]'
tcatsp='[[Category:Pages using DartsRankings with missing player data|' .. player .. ']]'
end
for _,u in pairs(data.alias) do -- get country code from name
if nameEqual(u1], player) then
tcatsp=''
local nlink = ""
if u5 == 0 then nlink = 1 end
if templateArgs'nolink' == '1' then nlink = 1 end
if templateArgs'nolink' == '0' then nlink = "" end
if templateArgs'surname' =='1' then
if nlink == 1 then
link = u4
elseif u6 and u6~="" then
link = '[[' .. u3 .. ' ' .. u4 .. ' (' ..u6 .. ')' .. '|' .. u4 ..']]'
else
link = '[[' .. u3 .. ' ' .. u4 .. '|' .. u4 ..']]'
end
elseif templateArgs'surname' then
if nlink == 1 then
link = templateArgs'surname'
elseif u6 and u6~="" then
link = '[[' .. u3 .. ' ' .. u4 .. ' (' ..u6 .. ')' .. '|' .. templateArgs'surname' ..']]'
else
link = '[[' .. u3 .. ' ' .. u4 .. '|' .. templateArgs'surname' ..']]'
end
else
if u6 and u6~="" then
link = frame:expandTemplate{title= 'sortname', args ={ u3], u4 , dab = u6 , nolink = nlink } }
else
link = frame:expandTemplate{title= 'sortname', args ={ u3], u4], nolink = nlink } }
end
end
flag= u2 -- Flag string from libarary
break
end
end
if templateArgs'flag' then
flag = templateArgs'flag'
end
if side == 'right' then
outputString = link .. require('Module:Flagg').luaMain(frame, {'csxr', flag})
elseif side == 'none' then
outputString = link
else
outputString = require('Module:Flagg').luaMain(frame, {'csx', flag}) .. link
end
tcats = tcats .. tcatsp
return outputString .. tcats
end
function p.playerLink(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
return flagPlayer(frame, frame.args2], 'left')
end
function p.playerLinkRight(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
return flagPlayer(frame, frame.args2], 'right')
end
function p.playerLinkNoFlag(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
return flagPlayer(frame, frame.args2], 'none')
end
function p.main(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
local outputString = ""
local validCode = false
local player = templateArgs2 -- player name passed as parameter
local rank, move
for _,u in pairs(data.alias) do -- run through the list
if nameEqual(u1], player) then -- if code = passed parameter
validCode = true
break
end
end
-- if no match of code to country name, set category
for _,v in pairs(data.rankings) do
if nameEqual(v1], player) then
rank = v2 -- get rank
break
end
end
if rank then -- no ranking found
for _,v in pairs(data.rankingsold) do
if nameEqual(v1], player) then
move = v2 - rank -- get move from last ranking
break
else
move = 0 - rank
end
end
else
rank = 'NR'
end
local changeString = ""
if rank ~= 'NR' then
outputString = rank
if move < 0 and math.abs( move ) == math.abs( rank ) then -- new teams in ranking: move = -ranking
changeString = frame:expandTemplate{ title = 'new entry' }
elseif move == 0 then -- if no change in ranking
changeString = frame:expandTemplate{ title = 'steady' }
elseif move < 0 then -- if ranking down
changeString = frame:expandTemplate{ title = 'decrease' } .. ' ' .. math.abs(move)
elseif move > 0 then -- if ranking up
changeString = frame:expandTemplate{ title = 'increase' } .. ' ' .. move
end
if not templateArgs'nochange' or templateArgs'nochange' == "" then
outputString = outputString .. ' ' .. changeString
end
else
outputString = outputString .. frame:expandTemplate{ title = 'Abbr', args = { "NR", "Not ranked"} }
-- {{Abbr|NR|Not ranked}}
end
if not templateArgs'nodate' or templateArgs'nodate' == "" then
outputString = outputString .. ' (' .. getDate() .. ')'
end
if templateArgs'par' and templateArgs'par' ~= '' then
outputString = '(' .. outputString .. ')'
end
if not templateArgs'noref' or templateArgs'noref' == "" then
outputString = outputString .. addReference(frame)
end
return outputString
end
function p.rankOnly(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
local outputString = ""
local validCode = false
local player = templateArgs2 -- player name passed as parameter
local rank ='NR'
local move
for _,u in pairs(data.alias) do -- run through the list
if nameEqual(u1], player) then -- if code = passed parameter
validCode = true
break
end
end
-- if no match of code to country name, set category
for _,v in pairs(data.rankings) do
if nameEqual(v1], player) then
rank = v2 -- get rank
break
end
end
return rank
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 lastRank = 0
local selectCount = 0
local selectData = nil
local selectList = nil
-- 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 "Player"
local pointsHeader = templateArgs'points_header' or "Earnings"
local changeHeader = templateArgs'change_header' or "Change"
local noChange = templateArgs'change_col' or 1
--start table
local outputString = '{| class="wikitable" style="text-align:center;' .. styleString .. '"'
local tabletitle = data.labels'title'
-- add default or custom caption
local caption = tabletitle .. ' as of ' .. 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
headercount = templateArgs'header'..count
headercount = p.replaceKeywords( headercount])
outputString = outputString .. '\n|-\n| colspan="'.. tableWidth .. '" |' .. headercount
end
end
-- add the add part of the table
local optionalColumn = ""
if selectList then
optionalColumn = '\n!' .. selectionHeader
end
outputString = outputString .. '\n|-' .. optionalColumn .. '\n!' .. rankHeader
if noChange == 1 then
outputString = outputString .. '\n!' .. changeHeader
end
outputString = outputString .. '\n!' .. teamHeader .. '\n!' .. pointsHeader
local change,player,plink = '', '', ''
--while i<last do
for k,v in pairs(data.rankings) do
--v[2] = tonumber(v[2])
if v2 >= first and v2 <= last then
plink = flagPlayer(frame, v1], 'left')
local continue = true
if continue ==true then
local rowString = '\n|-'
if selectList then
local selectRank = selectCount
if v2==lastRank then selectRank = selectCount -1 end -- only handles two at same rank
rowString = rowString .. '\n|' .. selectRank
selectCount = selectCount + 1
end
rowString = rowString .. '\n|' .. v2 -- rank
lastRank = v2
local move = nil
for _,w in pairs(data.rankingsold) do
if nameEqual(w1], v1]) then
move = w2 - lastRank -- get move from last ranking
break
else
move = 0 - lastRank
end
end
if move < 0 and math.abs( move ) == math.abs( v2 ) 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
if noChange == 1 then
rowString = rowString .. '||' .. change
end
rowString = rowString .. '\n|style="text-align:left"|' .. plink
local points = ""
if v3 then points = v3 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
footercount = templateArgs'footer'..count
footercount = p.replaceKeywords(footercount])
outputString = outputString .. '\n|-\n| colspan="'.. tableWidth .. '" |' .. footercount
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)
]]
function p.list(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
local ranking = frame.args1
local first, last = 1,10
first = tonumber(frame.args'2'])
last = tonumber(frame.args'3'])
return table(frame, ranking, first, last)
end
local function navlist(frame, ranking, first,last)
local lastRank = 0
local selectCount = 0
local selectData = nil
local selectList = nil
--start list
local outputString = '<ol start="' .. first .. '">'
local change,player,plink = '', '', ''
for k,v in pairs(data.rankings) do
if v2 >= first and v2 <= last then
plink = flagPlayer(frame, v1], 'left')
local rowString = '<li>' -- rank
lastRank = v2
rowString = rowString .. plink
if not templateArgs'nochange' or templateArgs'nochange' == "" then
local move = nil
for _,w in pairs(data.rankingsold) do
if nameEqual(w1], v1]) then
move = w2 - lastRank -- get move from last ranking
break
else
move = 0 - lastRank
end
end
if move < 0 and math.abs( move ) == math.abs( v2 ) 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' }
elseif move > 0 then -- if ranking up
change = frame:expandTemplate{ title = 'increase' }
end
rowString = rowString .. ' ' .. change .. '</li>'
end
outputString = outputString .. '\n'.. rowString
end
end
outputString = outputString .. '</ol>'
return outputString
end
---
--- Returns text list for players first,last for PDC top 20 navbox
function p.nav(frame)
getArgs(frame) -- returns args table having checked for content
loadData(frame)
local ranking = frame.args1
local first, last = 1,10
first = tonumber(frame.args'2'])
last = tonumber(frame.args'3'])
return navlist(frame, ranking, first, last)
end
return p