Это не официальный сайт wikipedia.org 01.01.2023

Модуль:RatingFIDE — Википедия
Документация

GetRating

Возвращает актуальный рейтинг. Данные берутся с викисклада, если отсутствуют там — то с Викиданных, из свойства P1087. Используется в шаблоне {{Рейтинг ЭЛО}}.

GetMaxRating

Возвращает лучший рейтинг за карьеру. Данные берутся с Викиданных, из свойства P1087. Используется в шаблоне {{Максимальный рейтинг ЭЛО}}.

local p = {}

local mwlang = mw.getContentLanguage()

function p.GetRating(frame)
	local args = frame:getParent().args
	local PlayerIDstr = args['ID'] or frame.args['ID']
	local NeedSource = args['Ссылка']=='да' or frame.args['Ссылка']=='да'
	if PlayerIDstr == nil then return "Введите id шахматиста" end
	local PlayerID = tonumber(PlayerIDstr)

	local tabular = mw.ext.data.get("FIDE Standard rating.tab")
	if tabular == nil then return "Нет таблицы с данными" end
	local Rating = nil
	for k,v in pairs(tabular.data) do
		--do return v[1].." ".. v[2] .." ".. PlayerID end
		if v[1] == PlayerID then
			Rating = v[2]
			break 
		end
	end
	if Rating == nil then 
		if args[1]==nil then 
			CallSite = mw.wikibase.getEntity() 
		else
			CallSite = mw.wikibase.getEntity(string.match( args[1], "Q%d+")) 
		end		
		if (CallSite == nil) or (CallSite.claims.P1087 == nil) then
			Rating = "Нет данных"
		else
			
			local latest, latestTime
			latestTime = "+1900-01-01T00:00:00Z"
			for k, v in ipairs(CallSite.claims.P1087) do
				--do return v.qualifiers.P585[1].datavalue.value.time end
				if v.qualifiers.P585[1].datavalue.value.time > latestTime then
					latest = CallSite.claims.P1087[k].mainsnak.datavalue.value.amount
					latestTime = v.qualifiers.P585[1].datavalue.value.time
				end
			end
			Rating = string.sub(latest, 2) .. " <small>(" .. mwlang:formatDate("F Y", latestTime) .. ")</small>"
		end
	else
		if NeedSource then Rating = Rating .. frame:callParserFunction{name = '#tag:ref', args = {'['.. tabular.sources ..']'}} end
	end
	return Rating 
end

function p.GetMaxRating(frame)
	local args = frame:getParent().args

	if args[1] == nil then 
		CallSite = mw.wikibase.getEntity() 
	else
		CallSite = mw.wikibase.getEntity(string.match( args[1], "Q%d+" )) 
	end

	if (CallSite == nil) or (CallSite.claims.P1087 == nil) then
		return ""
	end

	local max_rating = 0
	local timestamp = nil

	for key, value in ipairs(CallSite.claims.P1087) do
		if (value.mainsnak ~= nil) and (value.qualifiers ~= nil) then
			local current_rating = tonumber(value.mainsnak.datavalue.value.amount)
			local current_timestamp = value.qualifiers.P585[1].datavalue.value.time
			if (max_rating < current_rating) or ((max_rating == current_rating) and (timestamp > current_timestamp)) then
				max_rating = current_rating
				timestamp = current_timestamp
			end
		end
	end

	if timestamp == nil then
		return ""
	else
		return max_rating .. " <small>(" .. mwlang:formatDate("F Y", timestamp) .. ")</small>"
	end
end

return p