Модуль:Wikidata/where: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
уточнение
дополнительная проверка — может вернуться пустой объект
 
(не показана 1 промежуточная версия этого же участника)
Строка 1: Строка 1:
local p = {}
local p = {}


local function FormatWhereLinkFromCatName(cat_link_text, sitelink)
local function FormatWhereLinkFromCatName( categoryPageName, sitelink )
local prep, linktext = string.match(cat_link_text, '^Категория:[^ ]+ ([^ ]+) (.+)$');
local prep, linktext = string.match( categoryPageName, '^Категория:[^ ]+ ([^ ]+) (.+)$' )
if sitelink then
if sitelink then
return prep .. ' ' .. "[[" .. sitelink .. "|" .. linktext .. "]]";
return prep .. ' ' .. "[[" .. sitelink .. "|" .. linktext .. "]]"
else
else
return prep .. ' ' .. linktext;
return prep .. ' ' .. linktext
end
end
end
end
Строка 13: Строка 13:
local function MakeWherePlace(place, propertyOfProperty, isUpperplace)
local function MakeWherePlace(place, propertyOfProperty, isUpperplace)
if place.mainsnak.datavalue then -- если значение свойства "значение неизвестно", то datavalue nil
if place.mainsnak.datavalue then -- если значение свойства "значение неизвестно", то datavalue nil
local id = 'Q' .. place.mainsnak.datavalue.value['numeric-id']
local entityId = place.mainsnak.datavalue.value.id
local placeEntity = mw.wikibase.getEntity(id)
local categories = mw.wikibase.getBestStatements( entityId, propertyOfProperty )
local categories = placeEntity.claims[propertyOfProperty]
if categories and categories[ 1 ] then
local sitelink = mw.wikibase.sitelink( entityId )
if categories ~= nil then
local sitelink = mw.wikibase.sitelink(id)
local categoryId = categories[ 1 ].mainsnak.datavalue.value.id
local categoryPageName = mw.wikibase.label( categoryId )
local cat_qid = 'Q' .. categories[1].mainsnak.datavalue.value['numeric-id']
if categoryPageName then
local cat_link_text = mw.wikibase.label(cat_qid)
return FormatWhereLinkFromCatName( categoryPageName, sitelink )
if cat_link_text ~= nil then
return FormatWhereLinkFromCatName(cat_link_text, sitelink)
end
end
end
end

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

return nil
return nil
end
end


local function MakeWherePlaces(places, propertyOfProperty)
local function MakeWherePlaces( places, propertyOfProperty )
local res = ''
local res = ''
for i, place in pairs(places) do
for i, place in pairs(places) do
if i > 1 then
if i > 1 then
if next(places, _) == nil then
if next( places, _ ) == nil then
res = res .. ' и ';
res = res .. ' и '
else
else
res = res .. ', ';
res = res .. ', '
end
end
end
end
local text = MakeWherePlace(place, propertyOfProperty)
local text = MakeWherePlace( place, propertyOfProperty )
if text then
if text then
Строка 55: Строка 56:
end
end


function p.mainFunction(frame)
function p.mainFunction( frame )
local args = {}
local args = {}
if frame == mw.getCurrentFrame() then
if frame == mw.getCurrentFrame() then
args = frame.args;
args = frame.args
else
else
args = frame
args = frame
Строка 66: Строка 67:
local entity = mw.wikibase.getEntity()
local entity = mw.wikibase.getEntity()
if entity ~= nil and entity.claims ~= nil then
if entity and entity.claims then
local countries = entity.claims[ args[1] ]
local countries = entity.claims[ args[ 1 ] ]
if countries ~= nil then
if countries then
result = result .. MakeWherePlaces(countries, args[2])
result = result .. MakeWherePlaces( countries, args[ 2 ] )
end
end
end
end

Текущая версия от 13:11, 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 and categories[ 1 ] 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 and upperPlace[ 1 ] 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