<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://fanverse.click/index.php?action=history&amp;feed=atom&amp;title=Module%3ADartsRankings</id>
	<title>Module:DartsRankings - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://fanverse.click/index.php?action=history&amp;feed=atom&amp;title=Module%3ADartsRankings"/>
	<link rel="alternate" type="text/html" href="https://fanverse.click/index.php?title=Module:DartsRankings&amp;action=history"/>
	<updated>2026-04-12T12:25:42Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://fanverse.click/index.php?title=Module:DartsRankings&amp;diff=4647&amp;oldid=prev</id>
		<title>Mob: Created page with &quot;require(&#039;strict&#039;);  local p = {}  local error_msg = &#039;&lt;span style=\&quot;font-size:100%\&quot; class=\&quot;error\&quot;&gt;&lt;code style=\&quot;color:inherit; border:inherit; padding:inherit;\&quot;&gt;&amp;#124;_template=&lt;/code&gt; missing or empty&lt;/span&gt;&#039;;  -- data for various rankings held in module subpages, e.g. &quot;Module:SportsRankings/data/FIFA World Rankings&quot; local data = {}      --[[ parameters containing data help in three tables data.source = {}     -- parameters for using in cite web (title, url, website)...&quot;</title>
		<link rel="alternate" type="text/html" href="https://fanverse.click/index.php?title=Module:DartsRankings&amp;diff=4647&amp;oldid=prev"/>
		<updated>2024-12-30T15:39:27Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;require(&amp;#039;strict&amp;#039;);  local p = {}  local error_msg = &amp;#039;&amp;lt;span style=\&amp;quot;font-size:100%\&amp;quot; class=\&amp;quot;error\&amp;quot;&amp;gt;&amp;lt;code style=\&amp;quot;color:inherit; border:inherit; padding:inherit;\&amp;quot;&amp;gt;|_template=&amp;lt;/code&amp;gt; missing or empty&amp;lt;/span&amp;gt;&amp;#039;;  -- data for various rankings held in module subpages, e.g. &amp;quot;Module:SportsRankings/data/FIFA World Rankings&amp;quot; local data = {}      --[[ parameters containing data help in three tables data.source = {}     -- parameters for using in cite web (title, url, website)...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local error_msg = &amp;#039;&amp;lt;span style=\&amp;quot;font-size:100%\&amp;quot; class=\&amp;quot;error\&amp;quot;&amp;gt;&amp;lt;code style=\&amp;quot;color:inherit; border:inherit; padding:inherit;\&amp;quot;&amp;gt;&amp;amp;#124;_template=&amp;lt;/code&amp;gt; missing or empty&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
-- data for various rankings held in module subpages, e.g. &amp;quot;Module:SportsRankings/data/FIFA World Rankings&amp;quot;&lt;br /&gt;
local data = {}      --[[ parameters containing data help in three tables&lt;br /&gt;
data.source = {}     -- parameters for using in cite web (title, url, website)&lt;br /&gt;
data.updated = {}    -- date of latest update (month, day, year)&lt;br /&gt;
data.rankings = {}   -- the rankings list (country code, ranking, movement)&lt;br /&gt;
data.alias = {}      -- player list (player, country code [=key], wiki link, proper display)&lt;br /&gt;
&lt;br /&gt;
--]]&lt;br /&gt;
local tcats = &amp;#039;&amp;#039;&lt;br /&gt;
local tcatsp = &amp;#039;&amp;#039;&lt;br /&gt;
local templateArgs = {} -- contains arguments from template involking module&lt;br /&gt;
&lt;br /&gt;
local function getArgs(frame)&lt;br /&gt;
    local parents = mw.getCurrentFrame():getParent()&lt;br /&gt;
&lt;br /&gt;
    for k,v in pairs(parents.args) do&lt;br /&gt;
        --check content&lt;br /&gt;
        if v and v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            templateArgs[k] = v --parents.args[k]&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    for k,v in pairs(frame.args) do&lt;br /&gt;
        --check content&lt;br /&gt;
        if v and v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            templateArgs[k] = v --parents.args[k]&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- allow empty caption to blank default&lt;br /&gt;
    if parents.args[&amp;#039;caption&amp;#039;] then templateArgs[&amp;#039;caption&amp;#039;] = parents.args[&amp;#039;caption&amp;#039;] end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function loadData(frame)&lt;br /&gt;
    if templateArgs[&amp;#039;org&amp;#039;] then&lt;br /&gt;
        data = mw.loadData(&amp;#039;Module:DartsRankings/data/&amp;#039; .. templateArgs[&amp;#039;org&amp;#039;] .. &amp;#039; Rankings&amp;#039;);&lt;br /&gt;
    else&lt;br /&gt;
    	local source = frame.args[1] -- source of rankings e.g. PDC Rankings&lt;br /&gt;
    	data = mw.loadData(&amp;#039;Module:DartsRankings/data/&amp;#039;.. source);&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getDate(option)&lt;br /&gt;
    local dateTable = data.updated         -- there must be date table (data.updated)&lt;br /&gt;
    -- TODO add a warning and/or category&lt;br /&gt;
    if option == &amp;quot;LAST&amp;quot; then&lt;br /&gt;
        local lastDateTable = data.previous&lt;br /&gt;
        if lastDateTable then             -- there might not be a previous data table (data.previous)&lt;br /&gt;
            dateTable = lastDateTable&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;No previous date available (data.updated missing)&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if templateArgs[&amp;#039;mdy&amp;#039;] and templateArgs[&amp;#039;mdy&amp;#039;] ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        return dateTable[&amp;#039;month&amp;#039;] .. &amp;quot; &amp;quot; .. dateTable[&amp;#039;day&amp;#039;] .. &amp;quot;, &amp;quot; .. dateTable[&amp;#039;year&amp;#039;]&lt;br /&gt;
    else&lt;br /&gt;
        return dateTable[&amp;#039;day&amp;#039;] .. &amp;quot; &amp;quot; .. dateTable[&amp;#039;month&amp;#039;] .. &amp;quot; &amp;quot; .. dateTable[&amp;#039;year&amp;#039;]&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addCiteWeb(frame)  -- use cite web template&lt;br /&gt;
    return frame:expandTemplate{ title = &amp;#039;cite web&amp;#039; , args = {&lt;br /&gt;
        url = data.source[&amp;#039;url&amp;#039;],            --&amp;quot;https://www.fifa.com/fifa-world-ranking/ranking-table/men/index.html&amp;quot;,&lt;br /&gt;
        title = data.source[&amp;#039;title&amp;#039;],        -- &amp;quot;The FIFA/Coca-Cola World Ranking&amp;quot;,&lt;br /&gt;
        website = data.source[&amp;#039;website&amp;#039;],    --&amp;quot;FIFA&amp;quot;,&lt;br /&gt;
        [&amp;#039;date&amp;#039;] = getDate(),&lt;br /&gt;
        [&amp;#039;access-date&amp;#039;] = getDate()&lt;br /&gt;
    }}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addReference(frame)&lt;br /&gt;
    local text = &amp;quot;&amp;quot;&lt;br /&gt;
    if data.source[&amp;#039;text&amp;#039;] then text = data.source[&amp;#039;text&amp;#039;] end&lt;br /&gt;
&lt;br /&gt;
    return frame:expandTemplate{ title = &amp;#039;refn&amp;#039;, args = {&lt;br /&gt;
        name=frame.args[1],                   --ranking used, e.g. &amp;quot;PDC Rankings&amp;quot;,&lt;br /&gt;
        text .. addCiteWeb(frame)&lt;br /&gt;
    }}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local tableAccents = mw.loadData(&amp;#039;Module:DartsRankings/data/other&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local function noAc(str)&lt;br /&gt;
    return str:gsub(&amp;quot;[%z\1-\127\194-\244][\128-\191]*&amp;quot;, tableAccents)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function nameEqual(str1, str2)&lt;br /&gt;
    return string.lower(noAc(str1)):gsub(&amp;quot;%W&amp;quot;, &amp;quot;&amp;quot;) == string.lower(noAc(str2)):gsub(&amp;quot;%W&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.dates(frame)&lt;br /&gt;
    getArgs(frame) -- returns args table having checked for content&lt;br /&gt;
    loadData(frame)&lt;br /&gt;
&lt;br /&gt;
    --	if templateArgs[1]==1 then&lt;br /&gt;
    return getDate(templateArgs[2])&lt;br /&gt;
    --	else&lt;br /&gt;
    --		return getDate()&lt;br /&gt;
    --	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function flagPlayer(frame, player, side)&lt;br /&gt;
    local outputString = &amp;quot;&amp;quot;&lt;br /&gt;
    local flag, link = &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
    if player and player ~= &amp;#039;&amp;#039; then link = &amp;#039;[[&amp;#039; .. player .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        tcatsp=&amp;#039;[[Category:Pages using DartsRankings with missing player data|&amp;#039; .. player .. &amp;#039;]]&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    for _,u in pairs(data.alias) do  -- get country code from name&lt;br /&gt;
        if nameEqual(u[1], player) then&lt;br /&gt;
            tcatsp=&amp;#039;&amp;#039;&lt;br /&gt;
            local nlink = &amp;quot;&amp;quot;&lt;br /&gt;
            if u[5] == 0 then nlink = 1 end&lt;br /&gt;
            if templateArgs[&amp;#039;nolink&amp;#039;] == &amp;#039;1&amp;#039; then nlink = 1 end&lt;br /&gt;
            if templateArgs[&amp;#039;nolink&amp;#039;] == &amp;#039;0&amp;#039; then nlink = &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
            if templateArgs[&amp;#039;surname&amp;#039;] ==&amp;#039;1&amp;#039; then&lt;br /&gt;
            	if nlink == 1 then&lt;br /&gt;
            		link = u[4]&lt;br /&gt;
                elseif u[6] and u[6]~=&amp;quot;&amp;quot; then&lt;br /&gt;
                    link = &amp;#039;[[&amp;#039; .. u[3] .. &amp;#039; &amp;#039; .. u[4] .. &amp;#039; (&amp;#039; ..u[6] .. &amp;#039;)&amp;#039; .. &amp;#039;|&amp;#039; .. u[4] ..&amp;#039;]]&amp;#039;&lt;br /&gt;
                else&lt;br /&gt;
                    link = &amp;#039;[[&amp;#039; .. u[3] .. &amp;#039; &amp;#039; ..  u[4] .. &amp;#039;|&amp;#039; .. u[4] ..&amp;#039;]]&amp;#039;&lt;br /&gt;
                end&lt;br /&gt;
            elseif templateArgs[&amp;#039;surname&amp;#039;] then&lt;br /&gt;
        		if nlink == 1 then&lt;br /&gt;
            		link = templateArgs[&amp;#039;surname&amp;#039;]&lt;br /&gt;
                elseif u[6] and u[6]~=&amp;quot;&amp;quot; then&lt;br /&gt;
                    link = &amp;#039;[[&amp;#039; .. u[3] .. &amp;#039; &amp;#039; .. u[4] .. &amp;#039; (&amp;#039; ..u[6] .. &amp;#039;)&amp;#039; .. &amp;#039;|&amp;#039; .. templateArgs[&amp;#039;surname&amp;#039;] ..&amp;#039;]]&amp;#039;&lt;br /&gt;
                else&lt;br /&gt;
                    link = &amp;#039;[[&amp;#039; .. u[3] .. &amp;#039; &amp;#039; .. u[4] .. &amp;#039;|&amp;#039; .. templateArgs[&amp;#039;surname&amp;#039;] ..&amp;#039;]]&amp;#039;&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                if u[6] and u[6]~=&amp;quot;&amp;quot; then&lt;br /&gt;
                    link = frame:expandTemplate{title= &amp;#039;sortname&amp;#039;, args ={ u[3], u[4] , dab = u[6] , nolink = nlink } }&lt;br /&gt;
                else&lt;br /&gt;
                    link = frame:expandTemplate{title= &amp;#039;sortname&amp;#039;, args ={ u[3], u[4], nolink = nlink } }&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            flag= u[2] -- Flag string from libarary&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if templateArgs[&amp;#039;flag&amp;#039;] then&lt;br /&gt;
        flag = templateArgs[&amp;#039;flag&amp;#039;]&lt;br /&gt;
    end&lt;br /&gt;
    if side == &amp;#039;right&amp;#039; then&lt;br /&gt;
        outputString = link .. require(&amp;#039;Module:Flagg&amp;#039;).luaMain(frame, {&amp;#039;csxr&amp;#039;, flag})&lt;br /&gt;
    elseif side == &amp;#039;none&amp;#039; then&lt;br /&gt;
        outputString = link&lt;br /&gt;
    else&lt;br /&gt;
        outputString = require(&amp;#039;Module:Flagg&amp;#039;).luaMain(frame, {&amp;#039;csx&amp;#039;, flag}) .. link&lt;br /&gt;
    end&lt;br /&gt;
    tcats = tcats .. tcatsp&lt;br /&gt;
    return outputString .. tcats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.playerLink(frame)&lt;br /&gt;
    getArgs(frame) -- returns args table having checked for content&lt;br /&gt;
    loadData(frame)&lt;br /&gt;
    return flagPlayer(frame, frame.args[2], &amp;#039;left&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.playerLinkRight(frame)&lt;br /&gt;
    getArgs(frame) -- returns args table having checked for content&lt;br /&gt;
    loadData(frame)&lt;br /&gt;
    return flagPlayer(frame, frame.args[2], &amp;#039;right&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.playerLinkNoFlag(frame)&lt;br /&gt;
    getArgs(frame) -- returns args table having checked for content&lt;br /&gt;
    loadData(frame)&lt;br /&gt;
    return flagPlayer(frame, frame.args[2], &amp;#039;none&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    getArgs(frame) -- returns args table having checked for content&lt;br /&gt;
    loadData(frame)&lt;br /&gt;
    local outputString = &amp;quot;&amp;quot;&lt;br /&gt;
    local validCode = false&lt;br /&gt;
    local player = templateArgs[2] -- player name passed as parameter&lt;br /&gt;
    local rank, move&lt;br /&gt;
&lt;br /&gt;
    for _,u in pairs(data.alias) do  -- run through the list&lt;br /&gt;
        if nameEqual(u[1], player) then        -- if code = passed parameter&lt;br /&gt;
            validCode = true&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- if no match of code to country name, set category&lt;br /&gt;
&lt;br /&gt;
    for _,v in pairs(data.rankings) do&lt;br /&gt;
        if nameEqual(v[1], player) then&lt;br /&gt;
            rank = v[2]    -- get rank&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if rank then -- no ranking found&lt;br /&gt;
&lt;br /&gt;
        for _,v in pairs(data.rankingsold) do&lt;br /&gt;
            if nameEqual(v[1], player) then&lt;br /&gt;
                move = v[2] - rank    -- get move from last ranking&lt;br /&gt;
                break&lt;br /&gt;
            else&lt;br /&gt;
                move = 0 - rank&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        rank = &amp;#039;NR&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local changeString = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if rank ~= &amp;#039;NR&amp;#039; then&lt;br /&gt;
        outputString = rank&lt;br /&gt;
        if move &amp;lt; 0 and math.abs( move ) == math.abs( rank ) then -- new teams in ranking: move = -ranking&lt;br /&gt;
            changeString = frame:expandTemplate{ title = &amp;#039;new entry&amp;#039; }&lt;br /&gt;
        elseif move == 0 then                                    -- if no change in ranking&lt;br /&gt;
            changeString = frame:expandTemplate{ title = &amp;#039;steady&amp;#039; }&lt;br /&gt;
        elseif move &amp;lt; 0 then                                 --  if ranking down&lt;br /&gt;
            changeString = frame:expandTemplate{ title = &amp;#039;decrease&amp;#039; } .. &amp;#039; &amp;#039; .. math.abs(move)&lt;br /&gt;
        elseif move &amp;gt; 0 then                                 -- if ranking up&lt;br /&gt;
            changeString = frame:expandTemplate{ title = &amp;#039;increase&amp;#039; } .. &amp;#039; &amp;#039; .. move&lt;br /&gt;
        end&lt;br /&gt;
        if not templateArgs[&amp;#039;nochange&amp;#039;] or templateArgs[&amp;#039;nochange&amp;#039;] == &amp;quot;&amp;quot; then&lt;br /&gt;
            outputString = outputString .. &amp;#039; &amp;#039; .. changeString&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        outputString = outputString .. frame:expandTemplate{ title = &amp;#039;Abbr&amp;#039;, args = { &amp;quot;NR&amp;quot;, &amp;quot;Not ranked&amp;quot;}  }&lt;br /&gt;
        --	{{Abbr|NR|Not ranked}}&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not templateArgs[&amp;#039;nodate&amp;#039;] or templateArgs[&amp;#039;nodate&amp;#039;] == &amp;quot;&amp;quot; then&lt;br /&gt;
        outputString = outputString .. &amp;#039; (&amp;#039; .. getDate() .. &amp;#039;)&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    if templateArgs[&amp;#039;par&amp;#039;] and templateArgs[&amp;#039;par&amp;#039;] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        outputString = &amp;#039;(&amp;#039; .. outputString .. &amp;#039;)&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    if not templateArgs[&amp;#039;noref&amp;#039;] or templateArgs[&amp;#039;noref&amp;#039;] == &amp;quot;&amp;quot; then&lt;br /&gt;
        outputString = outputString .. addReference(frame)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return outputString&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.rankOnly(frame)&lt;br /&gt;
    getArgs(frame) -- returns args table having checked for content&lt;br /&gt;
    loadData(frame)&lt;br /&gt;
    local outputString = &amp;quot;&amp;quot;&lt;br /&gt;
    local validCode = false&lt;br /&gt;
    local player = templateArgs[2] -- player name passed as parameter&lt;br /&gt;
    local rank =&amp;#039;NR&amp;#039;&lt;br /&gt;
    local move&lt;br /&gt;
&lt;br /&gt;
    for _,u in pairs(data.alias) do  -- run through the list&lt;br /&gt;
        if nameEqual(u[1], player) then        -- if code = passed parameter&lt;br /&gt;
            validCode = true&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- if no match of code to country name, set category&lt;br /&gt;
&lt;br /&gt;
    for _,v in pairs(data.rankings) do&lt;br /&gt;
        if nameEqual(v[1], player) then&lt;br /&gt;
            rank = v[2]    -- get rank&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return rank&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[  outputs a table of the rankings&lt;br /&gt;
called by list() or list2()&lt;br /&gt;
positional parameters - |ranking|first|last the ranking to use, fist and last in table&lt;br /&gt;
other parameters: |style=               -- CSS styling&lt;br /&gt;
|headerN= footerN=    -- displays header and footer rows with additional information&lt;br /&gt;
|caption=             -- value of caption to display&lt;br /&gt;
-- by default it generates a caption&lt;br /&gt;
-- this can be suppressed with empty |caption=&lt;br /&gt;
]]&lt;br /&gt;
local function table(frame, ranking, first,last)&lt;br /&gt;
&lt;br /&gt;
    local styleString = &amp;quot;&amp;quot;&lt;br /&gt;
    if templateArgs[&amp;#039;style&amp;#039;] and templateArgs[&amp;#039;style&amp;#039;] ~= &amp;quot;&amp;quot; then styleString = templateArgs[&amp;#039;style&amp;#039;] end&lt;br /&gt;
&lt;br /&gt;
    local lastRank = 0&lt;br /&gt;
    local selectCount = 0&lt;br /&gt;
    local selectData = nil&lt;br /&gt;
    local selectList = nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    -- column header customisation&lt;br /&gt;
    local rankHeader = templateArgs[&amp;#039;rank_header&amp;#039;] or &amp;quot;Rank&amp;quot;&lt;br /&gt;
    local selectionHeader = templateArgs[&amp;#039;selection_header&amp;#039;] or selectList or &amp;quot;Rank&amp;quot;&lt;br /&gt;
    local teamHeader = templateArgs[&amp;#039;team_header&amp;#039;] or &amp;quot;Player&amp;quot;&lt;br /&gt;
    local pointsHeader = templateArgs[&amp;#039;points_header&amp;#039;] or &amp;quot;Earnings&amp;quot;&lt;br /&gt;
    local changeHeader = templateArgs[&amp;#039;change_header&amp;#039;] or &amp;quot;Change&amp;quot;&lt;br /&gt;
    local noChange = templateArgs[&amp;#039;change_col&amp;#039;] or 1&lt;br /&gt;
&lt;br /&gt;
    --start table&lt;br /&gt;
    local outputString = &amp;#039;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;#039; .. styleString .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    local tabletitle = data.labels[&amp;#039;title&amp;#039;]&lt;br /&gt;
    -- add default or custom caption&lt;br /&gt;
    local caption = tabletitle .. &amp;#039; as of &amp;#039; .. getDate() .. &amp;#039;.&amp;#039;&lt;br /&gt;
    if templateArgs[&amp;#039;caption&amp;#039;] and templateArgs[&amp;#039;caption&amp;#039;]  ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        caption = templateArgs[&amp;#039;caption&amp;#039;]&lt;br /&gt;
        caption = p.replaceKeywords(caption)&lt;br /&gt;
    end&lt;br /&gt;
    outputString = outputString ..	&amp;#039;\n|+&amp;#039; .. caption .. addReference(frame)&lt;br /&gt;
&lt;br /&gt;
    -- add header rows (logo, date of update etc)&lt;br /&gt;
    local count = 0&lt;br /&gt;
    local header = {}&lt;br /&gt;
    local tableWidth = 4&lt;br /&gt;
    if selectList then tableWidth = 5 end&lt;br /&gt;
    while count &amp;lt; 5 do&lt;br /&gt;
        count = count + 1&lt;br /&gt;
        if templateArgs[&amp;#039;header&amp;#039;..count] then&lt;br /&gt;
            header[count] = templateArgs[&amp;#039;header&amp;#039;..count]&lt;br /&gt;
            header[count] = p.replaceKeywords( header[count])&lt;br /&gt;
            outputString = outputString ..	&amp;#039;\n|-\n| colspan=&amp;quot;&amp;#039;.. tableWidth .. &amp;#039;&amp;quot; |&amp;#039; .. header[count]&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- add the add part of the table&lt;br /&gt;
    local optionalColumn = &amp;quot;&amp;quot;&lt;br /&gt;
    if selectList then&lt;br /&gt;
        optionalColumn = &amp;#039;\n!&amp;#039; .. selectionHeader&lt;br /&gt;
    end&lt;br /&gt;
    outputString = outputString .. &amp;#039;\n|-&amp;#039; .. optionalColumn .. &amp;#039;\n!&amp;#039; .. rankHeader&lt;br /&gt;
    if noChange == 1 then&lt;br /&gt;
        outputString = outputString .. &amp;#039;\n!&amp;#039; .. changeHeader&lt;br /&gt;
    end&lt;br /&gt;
    outputString = outputString .. &amp;#039;\n!&amp;#039; .. teamHeader .. &amp;#039;\n!&amp;#039; .. pointsHeader&lt;br /&gt;
&lt;br /&gt;
    local change,player,plink = &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
    --while i&amp;lt;last do&lt;br /&gt;
    for k,v in pairs(data.rankings) do&lt;br /&gt;
        --v[2] = tonumber(v[2])&lt;br /&gt;
        if v[2] &amp;gt;= first and v[2] &amp;lt;= last then&lt;br /&gt;
&lt;br /&gt;
            plink = flagPlayer(frame, v[1], &amp;#039;left&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
            local continue = true&lt;br /&gt;
&lt;br /&gt;
            if continue ==true  then&lt;br /&gt;
&lt;br /&gt;
                local rowString = &amp;#039;\n|-&amp;#039;&lt;br /&gt;
                if selectList then&lt;br /&gt;
                    local selectRank = selectCount&lt;br /&gt;
                    if v[2]==lastRank then selectRank = selectCount -1 end -- only handles two at same rank&lt;br /&gt;
                    rowString = rowString ..  &amp;#039;\n|&amp;#039; .. selectRank&lt;br /&gt;
                    selectCount = selectCount + 1&lt;br /&gt;
                end&lt;br /&gt;
                rowString = rowString .. &amp;#039;\n|&amp;#039; .. v[2]  -- rank&lt;br /&gt;
                lastRank = v[2]&lt;br /&gt;
&lt;br /&gt;
                local move = nil&lt;br /&gt;
&lt;br /&gt;
                for _,w in pairs(data.rankingsold) do&lt;br /&gt;
                    if nameEqual(w[1], v[1]) then&lt;br /&gt;
                        move = w[2] - lastRank    -- get move from last ranking&lt;br /&gt;
                        break&lt;br /&gt;
                    else&lt;br /&gt;
                        move = 0 - lastRank&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                if move &amp;lt; 0 and math.abs( move ) == math.abs( v[2] ) then -- new teams in ranking: move = -ranking&lt;br /&gt;
                    change = frame:expandTemplate{ title = &amp;#039;new entry&amp;#039; }&lt;br /&gt;
                elseif move == 0 then                                    -- if no change in ranking&lt;br /&gt;
                    change = frame:expandTemplate{ title = &amp;#039;steady&amp;#039; }&lt;br /&gt;
                elseif move &amp;lt; 0 then                                 --  if ranking down&lt;br /&gt;
                    change = frame:expandTemplate{ title = &amp;#039;decrease&amp;#039; } .. &amp;#039; &amp;#039; .. math.abs(move)&lt;br /&gt;
                elseif move &amp;gt; 0 then                                 -- if ranking up&lt;br /&gt;
                    change = frame:expandTemplate{ title = &amp;#039;increase&amp;#039; } .. &amp;#039; &amp;#039; .. move&lt;br /&gt;
                end&lt;br /&gt;
                if noChange == 1 then&lt;br /&gt;
&lt;br /&gt;
                    rowString = rowString .. &amp;#039;||&amp;#039; .. change&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                rowString = rowString .. &amp;#039;\n|style=&amp;quot;text-align:left&amp;quot;|&amp;#039; .. plink&lt;br /&gt;
&lt;br /&gt;
                local points = &amp;quot;&amp;quot;&lt;br /&gt;
                if v[3] then points = v[3] end&lt;br /&gt;
                rowString = rowString ..  &amp;#039;||&amp;#039; .. points       -- country for now, later points&lt;br /&gt;
                outputString = outputString .. rowString&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- add footer rows&lt;br /&gt;
    count = 0&lt;br /&gt;
    local footer = {}&lt;br /&gt;
    while count &amp;lt; 5 do&lt;br /&gt;
        count = count + 1&lt;br /&gt;
        if templateArgs[&amp;#039;footer&amp;#039;..count] then&lt;br /&gt;
            footer[count] = templateArgs[&amp;#039;footer&amp;#039;..count]&lt;br /&gt;
            footer[count] = p.replaceKeywords(footer[count])&lt;br /&gt;
            outputString = outputString ..	&amp;#039;\n|-\n| colspan=&amp;quot;&amp;#039;.. tableWidth .. &amp;#039;&amp;quot; |&amp;#039; .. footer[count]&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    outputString = outputString .. &amp;quot;\n|}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return outputString&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.replaceKeywords(keyword)&lt;br /&gt;
    keyword =  string.gsub( keyword, &amp;quot;INSERT_UPDATE_DATE&amp;quot;, getDate())&lt;br /&gt;
    keyword =  string.gsub( keyword, &amp;quot;INSERT_LAST_DATE&amp;quot;, getDate(&amp;quot;LAST&amp;quot;))&lt;br /&gt;
    keyword =  string.gsub( keyword, &amp;quot;INSERT_REFERENCE&amp;quot;, addReference(mw.getCurrentFrame()))&lt;br /&gt;
    return keyword&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ create a table of rankings&lt;br /&gt;
parameters:  |ranking=        -- ranking to display (e.g. FIFA World Rankings)&lt;br /&gt;
|first= |last=   -- first and last ranking to display (defaults 1-10)&lt;br /&gt;
]]&lt;br /&gt;
function p.list(frame)&lt;br /&gt;
&lt;br /&gt;
    getArgs(frame) -- returns args table having checked for content&lt;br /&gt;
    loadData(frame)&lt;br /&gt;
    local ranking = frame.args[1]&lt;br /&gt;
    local first, last = 1,10&lt;br /&gt;
    first = tonumber(frame.args[&amp;#039;2&amp;#039;])&lt;br /&gt;
    last = tonumber(frame.args[&amp;#039;3&amp;#039;])&lt;br /&gt;
&lt;br /&gt;
    return table(frame, ranking, first, last)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function navlist(frame, ranking, first,last)&lt;br /&gt;
&lt;br /&gt;
    local lastRank = 0&lt;br /&gt;
    local selectCount = 0&lt;br /&gt;
    local selectData = nil&lt;br /&gt;
    local selectList = nil&lt;br /&gt;
&lt;br /&gt;
    --start list&lt;br /&gt;
    local outputString = &amp;#039;&amp;lt;ol start=&amp;quot;&amp;#039; .. first .. &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    local change,player,plink = &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
    for k,v in pairs(data.rankings) do&lt;br /&gt;
        if v[2] &amp;gt;= first and v[2] &amp;lt;= last then&lt;br /&gt;
            plink = flagPlayer(frame, v[1], &amp;#039;left&amp;#039;)&lt;br /&gt;
            local rowString = &amp;#039;&amp;lt;li&amp;gt;&amp;#039;  -- rank&lt;br /&gt;
            lastRank = v[2]&lt;br /&gt;
            rowString = rowString .. plink&lt;br /&gt;
&lt;br /&gt;
            if not templateArgs[&amp;#039;nochange&amp;#039;] or templateArgs[&amp;#039;nochange&amp;#039;] == &amp;quot;&amp;quot; then&lt;br /&gt;
&lt;br /&gt;
                local move = nil&lt;br /&gt;
                for _,w in pairs(data.rankingsold) do&lt;br /&gt;
                    if nameEqual(w[1], v[1]) then&lt;br /&gt;
                        move = w[2] - lastRank    -- get move from last ranking&lt;br /&gt;
                        break&lt;br /&gt;
                    else&lt;br /&gt;
                        move = 0 - lastRank&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                if move &amp;lt; 0 and math.abs( move ) == math.abs( v[2] ) then -- new teams in ranking: move = -ranking&lt;br /&gt;
                    change = frame:expandTemplate{ title = &amp;#039;new entry&amp;#039; }&lt;br /&gt;
                elseif move == 0 then                                    -- if no change in ranking&lt;br /&gt;
                    change = frame:expandTemplate{ title = &amp;#039;steady&amp;#039; }&lt;br /&gt;
                elseif move &amp;lt; 0 then                                 --  if ranking down&lt;br /&gt;
                    change = frame:expandTemplate{ title = &amp;#039;decrease&amp;#039; }&lt;br /&gt;
                elseif move &amp;gt; 0 then                                 -- if ranking up&lt;br /&gt;
                    change = frame:expandTemplate{ title = &amp;#039;increase&amp;#039; }&lt;br /&gt;
                end&lt;br /&gt;
                rowString = rowString .. &amp;#039; &amp;#039; .. change .. &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            outputString = outputString .. &amp;#039;\n&amp;#039;.. rowString&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    outputString = outputString .. &amp;#039;&amp;lt;/ol&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    return outputString&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
--- Returns text list for players first,last for PDC top 20 navbox&lt;br /&gt;
function p.nav(frame)&lt;br /&gt;
    getArgs(frame) -- returns args table having checked for content&lt;br /&gt;
    loadData(frame)&lt;br /&gt;
    local ranking = frame.args[1]&lt;br /&gt;
    local first, last = 1,10&lt;br /&gt;
    first = tonumber(frame.args[&amp;#039;2&amp;#039;])&lt;br /&gt;
    last = tonumber(frame.args[&amp;#039;3&amp;#039;])&lt;br /&gt;
&lt;br /&gt;
    return navlist(frame, ranking, first, last)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Mob</name></author>
	</entry>
</feed>