Loading
  • 21 Aug, 2019

  • By, Wikipedia

Module:ATP Rankings

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