Module:DartsRankings/sandbox

  1. ^ a b c d e f "Ranking Tables". PDPA. 3 June 2026. Retrieved 3 June 2026.
  2. ^ "WDF Open Rankings Table". WDF. March 16, 2026. Retrieved March 16, 2026.
  3. ^ "WDF Women's Rankings Table". WDF. 16 March 2026. Retrieved 16 March 2026.
  4. ^ "PDC ProTour Rankings". PDC. 13 May 2026. Retrieved 13 May 2026.
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>';

-- 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 notblank(v)
	return (v or '') ~= ''
end

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)
    if templateArgs['org'] then
        data = mw.loadData('Module:DartsRankings/data/' .. templateArgs['org'] .. ' Rankings');
    else
    	local source = frame.args[1] -- 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.args[1],                   --ranking used, e.g. "PDC Rankings",
        text .. addCiteWeb(frame)
    }}
end

local tableAccents = mw.loadData('Module:DartsRankings/data/other')

local function noAc(str)
    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(templateArgs[2])
    --	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(u[1], player) then
            tcatsp=''
            local nlink = ""
            if u[5] == 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 = u[4]
                elseif u[6] and u[6]~="" then
                    link = '[[' .. u[3] .. ' ' .. u[4] .. ' (' ..u[6] .. ')' .. '|' .. u[4] ..']]'
                else
                    link = '[[' .. u[3] .. ' ' ..  u[4] .. '|' .. u[4] ..']]'
                end
            elseif templateArgs['surname'] then
        		if nlink == 1 then
            		link = templateArgs['surname']
                elseif u[6] and u[6]~="" then
                    link = '[[' .. u[3] .. ' ' .. u[4] .. ' (' ..u[6] .. ')' .. '|' .. templateArgs['surname'] ..']]'
                else
                    link = '[[' .. u[3] .. ' ' .. u[4] .. '|' .. templateArgs['surname'] ..']]'
                end
            else
                if u[6] and u[6]~="" then
                    link = frame:expandTemplate{title= 'sortname', args ={ u[3], u[4] , dab = u[6] , nolink = nlink } }
                else
                    link = frame:expandTemplate{title= 'sortname', args ={ u[3], u[4], nolink = nlink } }
                end
            end
            flag= u[2] -- 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.args[2], 'left')
end

function p.playerLinkRight(frame)
    getArgs(frame) -- returns args table having checked for content
    loadData(frame)
    return flagPlayer(frame, frame.args[2], 'right')
end

function p.playerLinkNoFlag(frame)
    getArgs(frame) -- returns args table having checked for content
    loadData(frame)
    return flagPlayer(frame, frame.args[2], 'none')
end

function p.main(frame)
    getArgs(frame) -- returns args table having checked for content
    loadData(frame)
    local outputString = ""
    local validCode = false
    local player = templateArgs[2] -- player name passed as parameter
    local rank, move

    for _,u in pairs(data.alias) do  -- run through the list
        if nameEqual(u[1], 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(v[1], player) then
            rank = v[2]    -- get rank
            break
        end
    end

    if rank then -- no ranking found

        for _,v in pairs(data.rankingsold) do
            if nameEqual(v[1], player) then
                move = v[2] - 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 = templateArgs[2] -- player name passed as parameter
    local rank ='NR'
    local move

    for _,u in pairs(data.alias) do  -- run through the list
        if nameEqual(u[1], 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(v[1], player) then
            rank = v[2]    -- 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
            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
    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 v[2] >= first and v[2] <= last then

            plink = flagPlayer(frame, v[1], 'left')

            local continue = true

            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 = nil

                for _,w in pairs(data.rankingsold) do
                    if nameEqual(w[1], v[1]) then
                        move = w[2] - lastRank    -- get move from last ranking
                        break
                    else
                        move = 0 - lastRank
                    end
                end

                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
                if noChange == 1 then

                    rowString = rowString .. '||' .. change
                end


                rowString = rowString .. '\n|style="text-align:left"|' .. plink

                local points = ""
                if v[3] then points = v[3] 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)
]]
function p.list(frame)

    getArgs(frame) -- returns args table having checked for content
    loadData(frame)
    local ranking = frame.args[1]
    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 v[2] >= first and v[2] <= last then
            plink = flagPlayer(frame, v[1], 'left')
            local rowString = '<li>'  -- rank
            lastRank = v[2]
            rowString = rowString .. plink

            if not templateArgs['nochange'] or templateArgs['nochange'] == "" then

                local move = nil
                for _,w in pairs(data.rankingsold) do
                    if nameEqual(w[1], v[1]) then
                        move = w[2] - lastRank    -- get move from last ranking
                        break
                    else
                        move = 0 - lastRank
                    end
                end

                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' }
                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.args[1]
    local first, last = 1,10
    first = tonumber(frame.args['2'])
    last = tonumber(frame.args['3'])

    return navlist(frame, ranking, first, last)
end

---
--- Implements [[Template:PDCFlag]] and [[Template:PDCFlagR]]
function p.PDCFlag(frame, right)
	getArgs(frame)
	local output = mw.html.create('span'):addClass('nowrap')
	local plName = notblank(templateArgs.b) and output:tag('b') or output
	if notblank(templateArgs[1]) then
		local plFrame = frame:newChild{
			title = 'Template:PDCFlag', args = {
				[1] = 'PDC Rankings',
				[2] = templateArgs[1],
				flag = (templateArgs.org == 'DPA' and 'AUS' or '') .. ' '
			}
		}
		plName:wikitext(right and p.playerLinkRight(plFrame) or p.playerLink(plFrame))
		if notblank(templateArgs.txt) then plName:wikitext('&nbsp;') end
	else
		plName:wikitext(require('Module:flagg').luaMain(frame,{'cxxl', templateArgs.flag or ''}))
		plName:wikitext('&nbsp;')
	end
	plName:wikitext(templateArgs.txt or '')
	output:tag('span'):addClass('nobold'):tag('small'):css('color', 'dimgray'):wikitext(' ' .. (templateArgs.avg or ''))
	return frame:extensionTag('nowiki') .. tostring(output)						-- nowiki per [[phab:T18700]]
end
function p.PDCFlagR(frame) return p.PDCFlag(frame, true) end

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.