This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
This module implements {{Top male singles tennis players by country}}. Check there for usage documentation.
Usage
{{#invoke:ATP rankings|createNavbox|singles|IOC country code|nationality}}
The template takes an IOC country code and the nationality based on that code, e.g. ITA
and Italian
. The former is used to call the relevant subgroup from the module's JSON file, while the latter is used in the title of the navbox. If using {{Top ten male singles tennis players by country}}, only the country code is needed.
Tracking category for forced disambiguation
The bot, and therefore this module, are pulling names from the PDF provided by the ATP (ATP Rankings and Info Reports). Thus, they will not always meet the naming and page conventions of the English Wikipedia. If a name is a disambiguation page (or a redirect to one) and the disambiguator (tennis)
is insufficient to link to the appropriate page, it will be listed at Category:ATP rankings call with disambiguated page title (0). The links can be corrected by adding an exception to Module:ATP rankings/data/overrides.json. This is also true if the module is linking to the wrong person (e.g. if there is a primary target at the base page name and a disambiguator needs to be manually added).
local mDisambiguation = require('Module:Disambiguation')
local mRedirect = require('Module:Redirect')
local function getData( ranking )
if ranking == "singles" then
return mw.loadJsonData( "Module:ATP rankings/data/singles.json" )
end
end
local function formatName( nameIn )
local name = nameIn
local comma = mw.ustring.find( name, ", " )
if comma == nil then
return name
end
name = mw.ustring.sub( name, comma + 2, mw.ustring.len( name ) ) .. " " .. mw.ustring.sub( name, 1, comma - 1 )
-- Check, in order, the existence of:
-- - Page is on override list
-- - Page with (tennis) disambiguator exists
-- - Page exists
-- If page exists, flag as a dab, otherwise return an unlinked name
local overrides = mw.loadJsonData( "Module:ATP rankings/data/overrides.json" )
if overrides[name] and overrides[name]["article"] then
if overrides[name]["article"] == "x" then
return name
else
return "[[" .. overrides[name]["article"] .. "|" .. name .. "]]"
end
end
local title = mw.title.new( name )
local defaultDisambig = mw.title.new( name .. ' (tennis)' )
if defaultDisambig.exists then
return "[[" .. defaultDisambig.fullText .. "|" .. name .. "]]"
end
if title.exists then
local content = title:getContent()
if not mDisambiguation.isDisambiguation( content ) and not mDisambiguation.isDisambiguation(mRedirect.luaMain(content)) then
return "[[" .. name .. "]]"
end
return "[[" .. name .. "]]" .. "[[Category:ATP rankings call with disambiguated page title]]"
end
return name
end
local p = {}
function p.createNavbox( frame )
local ranking = frame.args[1]
local country = frame.args[2]
local nationality = frame.args[3]
local data = getData( ranking )
local templateParams = {}
local lang = mw.getContentLanguage()
local countryDataCur = assert( data["current"]["per-country"][country], "Invalid country code '" .. country .. "' specified for Module:ATP rankings" )
local countryDataPrev = data["previous"]["per-country"][country]
local flagicon = frame:expandTemplate{ title = "Flagicon", args = { country } }
templateParams["name"] = "Top male singles tennis players by country"
templateParams["title"] = "[[Association of Tennis Professionals]] " .. flagicon .. " Top " .. nationality .. " male " .. ranking .. " tennis players"
templateParams["above"] = "''As of " .. data["current"]["as-of"] .. "''"
templateParams["state"] = frame:getParent().args["state"] or "autocollapse"
templateParams["listclass"] = "hlist"
templateParams["list1"] = ""
local lastRankings = {}
for i, entry in ipairs( countryDataPrev ) do
lastRankings[entry["name"]] = entry["rank"]
end
local listKey = "list1"
for i, entry in ipairs( countryDataCur ) do
if i == 6 then
templateParams["list2"] = ""
listKey = "list2"
elseif i == 11 then
break
end
local changeDirection = "increase"
local changeAmount = ""
if lastRankings[entry["name"]] == nil then
-- do nothing
elseif lastRankings[entry["name"]] == entry["rank"] then
changeDirection = "steady"
elseif lastRankings[entry["name"]] >= entry["rank"] then
-- decrease in value means in increase in ranking
changeDirection = "increase"
changeAmount = lastRankings[entry["name"]] - entry["rank"]
else
changeDirection = "decrease"
changeAmount = entry["rank"] - lastRankings[entry["name"]]
end
changeDirection = frame:expandTemplate{ title = changeDirection }
local tied = ""
if entry["tied"] then
tied = "T"
end
templateParams[listKey] = templateParams[listKey] .. "* " .. i .. ". " .. formatName( entry["name"] ) .. " (" .. tied .. lang:formatNum(entry["rank"]) .. " " .. changeDirection .. changeAmount .. ")\n"
end
return frame:expandTemplate{ title = "Navbox", args = templateParams }
end
return p