Модуль:Wikidata/where

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая Putnik (обсуждение | вклад) в 12:32, 9 мая 2023 (оптимизация потребления памяти и дорогих функций). Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску
Документация

Реализация шаблона {{Wikidata/where}}

local p = {}

local function FormatWhereLinkFromCatName( categoryPageName, sitelink )
	local prep, linktext = string.match( categoryPageName, '^Категория:[^ ]+ ([^ ]+) (.+)$' )
	
	if sitelink then
		return prep .. ' ' .. "[[" .. sitelink .. "|" .. linktext .. "]]"
	else
		return prep .. ' ' .. linktext
	end
end

local function MakeWherePlace(place, propertyOfProperty, isUpperplace)
	if place.mainsnak.datavalue then  -- если значение свойства "значение неизвестно", то datavalue nil
		local entityId = place.mainsnak.datavalue.value.id
		local categories = mw.wikibase.getBestStatements( entityId, propertyOfProperty )
		if categories then
			local sitelink = mw.wikibase.sitelink( entityId )
			local categoryId = categories[ 1 ].mainsnak.datavalue.value.id
			local categoryPageName = mw.wikibase.label( categoryId )
			if categoryPageName then
				return FormatWhereLinkFromCatName( categoryPageName, sitelink )
			end
		end

		if isUpperplace == nil then
			local upperPlace = mw.wikibase.getBestStatements( entityId, 'P131' )
			if upperPlace then
				return MakeWherePlace( upperPlace[1], propertyOfProperty, true )
			end
		end
	end

	return nil
end

local function MakeWherePlaces( places, propertyOfProperty )
	local res = ''
	
	for i, place in pairs(places) do
		if i > 1 then
			if next( places, _ ) == nil then
			    res = res .. ' и '
			else
			    res = res .. ', '
			end
		end
		
		local text = MakeWherePlace( place, propertyOfProperty )
		
		if text then
			res = res .. text
		end
	end
    return res
end

function p.mainFunction( frame )
	local args = {}
	if frame == mw.getCurrentFrame() then
		args = frame.args
	else
		args = frame
	end

	local result = ''
	local entity = mw.wikibase.getEntity()
	
	if entity and entity.claims then
		local countries = entity.claims[ args[ 1 ] ]
		if countries then
			result = result .. MakeWherePlaces( countries, args[ 2 ] )
		end
	end
	return result
end
 
return p