require('strict');
local p =
local error_msg = '
|_template=
missing or empty';-- data for various rankings held in module subpages, e.g. "Module:SportsRankings/data/FIFA World Rankings"local data = --parameters containing data help in three tablesdata.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 modulelocal 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'] endend
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); endend
local function getDate(option) local dateTable = data.updated -- there must be date table (data.updated) -- TODO add a warning and/or category if option
if templateArgs['mdy'] and templateArgs['mdy'] ~= "" then return dateTable['month'] .. " " .. dateTable['day'] .. ", " .. dateTable['year'] else return dateTable['day'] .. " " .. dateTable['month'] .. " " .. dateTable['year'] endend
local function addCiteWeb(frame) -- use cite web template return frame:expandTemplateend
local function addReference(frame) local text = "" if data.source['text'] then text = data.source['text'] end
return frame:expandTemplateend
local function noAc(str) local tableAccents =
return str:gsub("[%z\1-\127\194-\244][\128-\191]*", tableAccents)end
local function nameEqual(str1, str2) return string.lower(noAc(str1)):gsub("%W", "")
function p.dates(frame) getArgs(frame) -- returns args table having checked for content loadData(frame)
-- if templateArgs[1]
local function flagPlayer(frame, player, side) local outputString = "" local flag, link = , if player and player ~= then link = '' .. player .. '' tcatsp='' 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]
'1' then nlink = 1 end if templateArgs['nolink']
if templateArgs['surname']
1 then link = u[4] elseif u[6] and u[6]~="" then link = '' .. u[4] ..'' else link = '' .. u[4] ..'' end elseif templateArgs['surname'] then if nlink
'right' then outputString = link .. require('Module:Flagg').luaMain(frame,) elseif side
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)
0 then -- if no change in ranking changeString = frame:expandTemplate elseif move < 0 then -- if ranking down changeString = frame:expandTemplate .. ' ' .. math.abs(move) elseif move > 0 then -- if ranking up changeString = frame:expandTemplate .. ' ' .. move end if not templateArgs['nochange'] or templateArgs['nochange']
if not templateArgs['nodate'] or templateArgs['nodate']
"" then outputString = outputString .. addReference(frame) end
return outputStringend
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 rankend
--ranking|first|last the ranking to use, fist and last in tableother 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 = '
-\n | ' .. 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 plink = flagPlayer(frame, v[1], 'left') local continue = true if continue true thenlocal 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 elseif move0 then -- if no change in ranking change = frame:expandTemplate elseif move < 0 then -- if ranking down change = frame:expandTemplate .. ' ' .. math.abs(move) elseif move > 0 then -- if ranking up change = frame:expandTemplate .. ' ' .. move end if noChange 1 thenrowString = rowString .. ' | ' .. change end rowString = rowString .. '\n | ' .. 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 | ' .. footer[count] end end outputString = outputString .. "\n |
---|
return outputStringend
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 keywordend
--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 = '
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 = '
if not templateArgs['nochange'] or templateArgs['nochange']
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)
0 then -- if no change in ranking change = frame:expandTemplate elseif move < 0 then -- if ranking down change = frame:expandTemplate elseif move > 0 then -- if ranking up change = frame:expandTemplate end rowString = rowString .. ' ' .. change .. '' end
outputString = outputString .. '\n'.. rowString end end outputString = outputString .. '
return outputStringend
------ Returns text list for players first,last for PDC top 20 navboxfunction 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
return p