<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://bukvica.org/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AWikidata%2FPlaces2</id>
	<title>Модуль:Wikidata/Places2 - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://bukvica.org/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AWikidata%2FPlaces2"/>
	<link rel="alternate" type="text/html" href="https://bukvica.org/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Wikidata/Places2&amp;action=history"/>
	<updated>2026-04-26T10:23:12Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://bukvica.org/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Wikidata/Places2&amp;diff=238403&amp;oldid=prev</id>
		<title>Karaby: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="https://bukvica.org/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Wikidata/Places2&amp;diff=238403&amp;oldid=prev"/>
		<updated>2025-07-27T15:36:26Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 15:36, 27 июля 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key wiki:diff:1.41:old-238402:rev-238403 --&gt;
&lt;/table&gt;</summary>
		<author><name>Karaby</name></author>
	</entry>
	<entry>
		<id>https://bukvica.org/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Wikidata/Places2&amp;diff=238402&amp;oldid=prev</id>
		<title>Буквица&gt;Сидик из ПТУ: для Российской империи показывать губернии, а не генерал-губернаторства</title>
		<link rel="alternate" type="text/html" href="https://bukvica.org/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Wikidata/Places2&amp;diff=238402&amp;oldid=prev"/>
		<updated>2025-01-31T09:24:13Z</updated>

		<summary type="html">&lt;p&gt;для Российской империи показывать губернии, а не генерал-губернаторства&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local categorizeByPlace = true;&lt;br /&gt;
&lt;br /&gt;
local WDS = require( &amp;#039;Module:WikidataSelectors&amp;#039; );&lt;br /&gt;
local Flags = require( &amp;#039;Module:Wikidata/Flags&amp;#039; );&lt;br /&gt;
local p = {&lt;br /&gt;
	config = {&lt;br /&gt;
		hideSameLabels = false,&lt;br /&gt;
		hidePartOfLabels = false,&lt;br /&gt;
		hideUnitsForCapitals = true,&lt;br /&gt;
		reverseOrder = false,&lt;br /&gt;
		catAmbiguousGeoChains = &amp;#039;[[Категория:Википедия:Страницы с неоднозначными геоцепочками в преамбуле]]&amp;#039;,&lt;br /&gt;
		catLoopInGeoChains = &amp;#039;[[Категория:Википедия:Страницы с зацикливающимися геоцепочками]]&amp;#039;,&lt;br /&gt;
		catWikibaseError = &amp;#039;[[Категория:Википедия:Страницы с ошибками скриптов, использующих Викиданные]]&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
local function min( prev, next )&lt;br /&gt;
	if prev == nil then&lt;br /&gt;
		return next;&lt;br /&gt;
	elseif prev &amp;gt; next then&lt;br /&gt;
		return next;&lt;br /&gt;
	else&lt;br /&gt;
		return prev;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function max( prev, next )&lt;br /&gt;
	if prev == nil then&lt;br /&gt;
		return next;&lt;br /&gt;
	elseif prev &amp;lt; next then&lt;br /&gt;
		return next;&lt;br /&gt;
	else&lt;br /&gt;
		return prev;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getTimeBoundariesFromProperty( context, propertyId )&lt;br /&gt;
	local dateClaims = WDS.filter( context.entity.claims, propertyId );&lt;br /&gt;
	if not dateClaims or #dateClaims == 0 then&lt;br /&gt;
		return nil;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- only support exact date so far, but need improvment&lt;br /&gt;
	local left = nil;&lt;br /&gt;
	local right = nil;&lt;br /&gt;
	for _, claim in pairs( dateClaims ) do&lt;br /&gt;
		if not claim.mainsnak then return nil; end&lt;br /&gt;
		local boundaries = context.parseTimeBoundariesFromSnak( claim.mainsnak );&lt;br /&gt;
		if not boundaries then return nil; end&lt;br /&gt;
		left = min( left, boundaries[ 1 ] );&lt;br /&gt;
		right = max( right, boundaries[ 2 ] );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not left or not right then return nil; end&lt;br /&gt;
&lt;br /&gt;
	return { left, right };&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getTimeBoundariesFromProperties( context, propertyIds )&lt;br /&gt;
	for _, propertyId in ipairs( propertyIds ) do&lt;br /&gt;
		local result = getTimeBoundariesFromProperty( context, propertyId );&lt;br /&gt;
		if result then&lt;br /&gt;
			return result;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return nil;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getParentsInBoundariesSnak( context, entityId, boundaries )&lt;br /&gt;
	if not entityId then error(&amp;#039;entityId must be specified&amp;#039;); end&lt;br /&gt;
	if type(entityId) ~= &amp;#039;string&amp;#039; then error(&amp;#039;entityId must be string&amp;#039;); end&lt;br /&gt;
	if not boundaries then error(&amp;#039;boundaries must be specified&amp;#039;); end&lt;br /&gt;
	if type(boundaries) ~= &amp;#039;table&amp;#039; then error(&amp;#039;boundaries must be table&amp;#039;); end&lt;br /&gt;
&lt;br /&gt;
	local results = context.getPropertyInBoundaries( context, entityId, boundaries, {&amp;#039;P131&amp;#039;} ) -- located in&lt;br /&gt;
	if not results or #results == 0 then&lt;br /&gt;
		results = context.getPropertyInBoundaries( context, entityId, boundaries, {&amp;#039;P17&amp;#039;} ) -- country&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for r, result in pairs( results ) do&lt;br /&gt;
		if result.snaktype ~= &amp;#039;value&amp;#039; then&lt;br /&gt;
			return nil;&lt;br /&gt;
		end&lt;br /&gt;
		local resultId = result.datavalue.value.id;&lt;br /&gt;
		if resultId == entityId then&lt;br /&gt;
			return nil;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return results;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local unions = { &lt;br /&gt;
	Q1140229 = true, -- political union&lt;br /&gt;
	Q3623811 = true, -- Экономический союз&lt;br /&gt;
	Q4120211 = true -- региональная организация&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local countries = {&lt;br /&gt;
	Q6256 = true, -- страна&lt;br /&gt;
	Q7275 = true, -- государство&lt;br /&gt;
	Q3024240 = true, -- историческое государство&lt;br /&gt;
	Q3624078 = true -- суверенное государство&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function isSkipTopLevel( entity )&lt;br /&gt;
	local isCountry = false;&lt;br /&gt;
	local isUnion = false;&lt;br /&gt;
	if entity and&lt;br /&gt;
		entity.claims and&lt;br /&gt;
		entity.claims.P31&lt;br /&gt;
	then&lt;br /&gt;
		for c, claim in pairs( entity.claims.P31 ) do&lt;br /&gt;
			if claim and&lt;br /&gt;
				claim.mainsnak and&lt;br /&gt;
				claim.mainsnak.datavalue and&lt;br /&gt;
				claim.mainsnak.datavalue.value and&lt;br /&gt;
				claim.mainsnak.datavalue.value.id&lt;br /&gt;
			then&lt;br /&gt;
				local typeId = claim.mainsnak.datavalue.value.id;&lt;br /&gt;
				isCountry = isCountry or countries[ typeId ];&lt;br /&gt;
				isUnion = isUnion or unions[ typeId ];&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return isUnion and not isCountry;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isPartOfNext( prevLabel, nextLabel )&lt;br /&gt;
	return ( mw.ustring.len( prevLabel ) &amp;gt; mw.ustring.len( nextLabel ) )&lt;br /&gt;
		and ( mw.ustring.sub( prevLabel, mw.ustring.len( prevLabel ) - mw.ustring.len( nextLabel ) + 1 ) == nextLabel );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Property:P19, Property:P20, Property:P119&lt;br /&gt;
function p.formatPlaceWithQualifiers( context, options, statement )&lt;br /&gt;
	local property = mw.ustring.upper( options.property );&lt;br /&gt;
	if options.nocat then categorizeByPlace = false end&lt;br /&gt;
&lt;br /&gt;
	local actualDateBoundariesProperties = nil;&lt;br /&gt;
	if property == &amp;#039;P19&amp;#039; then actualDateBoundariesProperties = {&amp;#039;P569&amp;#039;,&amp;#039;P570&amp;#039;}; end&lt;br /&gt;
	if property == &amp;#039;P20&amp;#039; then actualDateBoundariesProperties = {&amp;#039;P570&amp;#039;,&amp;#039;P569&amp;#039;}; end&lt;br /&gt;
	if property == &amp;#039;P119&amp;#039; then actualDateBoundariesProperties = {&amp;#039;P570&amp;#039;,&amp;#039;P569&amp;#039;}; end&lt;br /&gt;
&lt;br /&gt;
	local boundaries = nil;&lt;br /&gt;
	if actualDateBoundariesProperties ~= nil then&lt;br /&gt;
		boundaries = getTimeBoundariesFromProperties( context, actualDateBoundariesProperties );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local entriesToLookupCategory = {};&lt;br /&gt;
&lt;br /&gt;
	local circumstances = context.getSourcingCircumstances( statement );&lt;br /&gt;
	local result = &amp;#039;&amp;#039;;&lt;br /&gt;
	local baseResult = context.formatSnak( options, statement.mainsnak, circumstances );&lt;br /&gt;
	if not baseResult then&lt;br /&gt;
		return nil;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	insertFromSnak( statement.mainsnak, entriesToLookupCategory )&lt;br /&gt;
&lt;br /&gt;
	local hasAdditionalQualifiers = false;&lt;br /&gt;
	if statement.qualifiers then&lt;br /&gt;
		--parent divisions&lt;br /&gt;
		if statement.qualifiers.P131 then&lt;br /&gt;
			for i, qualifier in ipairs( statement.qualifiers.P131 ) do&lt;br /&gt;
				local parentOptions = context.cloneOptions( options );&lt;br /&gt;
				local qualifierEntityId = qualifier.datavalue.value.id;&lt;br /&gt;
				parentOptions[&amp;#039;text&amp;#039;] = getLabel( context, qualifierEntityId, boundaries );&lt;br /&gt;
				local link = context.formatSnak( parentOptions, qualifier );&lt;br /&gt;
&lt;br /&gt;
				if p.config.reverseOrder then&lt;br /&gt;
					result = link .. &amp;#039;, &amp;#039; .. result;&lt;br /&gt;
				else&lt;br /&gt;
					result = result .. &amp;#039;, &amp;#039; .. link;&lt;br /&gt;
				end&lt;br /&gt;
				insertFromSnak( qualifier, entriesToLookupCategory )&lt;br /&gt;
				hasAdditionalQualifiers = true;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		--country&lt;br /&gt;
		if statement.qualifiers.P17 then&lt;br /&gt;
			for i, qualifier in ipairs( statement.qualifiers.P17 ) do&lt;br /&gt;
				local parentOptions = context.cloneOptions( options );&lt;br /&gt;
				if qualifier.datavalue then&lt;br /&gt;
					local qualifierEntityId = qualifier.datavalue.value.id;&lt;br /&gt;
					parentOptions[ &amp;#039;text&amp;#039; ] = getLabel( context, qualifierEntityId, boundaries );&lt;br /&gt;
					local link = context.formatSnak( parentOptions, qualifier );&lt;br /&gt;
	&lt;br /&gt;
					if p.config.reverseOrder then&lt;br /&gt;
						result = link .. &amp;#039;, &amp;#039; .. result;&lt;br /&gt;
					else&lt;br /&gt;
						result = result .. &amp;#039;, &amp;#039; .. link;&lt;br /&gt;
					end&lt;br /&gt;
					insertFromSnak( qualifier, entriesToLookupCategory )&lt;br /&gt;
					hasAdditionalQualifiers = true;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if statement.mainsnak and&lt;br /&gt;
		statement.mainsnak.datavalue and&lt;br /&gt;
		statement.mainsnak.datavalue.value and&lt;br /&gt;
		statement.mainsnak.datavalue.value.id&lt;br /&gt;
	then&lt;br /&gt;
		local entityId = statement.mainsnak.datavalue.value.id;&lt;br /&gt;
		local parentSnaks = { statement.mainsnak };&lt;br /&gt;
		local parentEntityIds = { entityId };&lt;br /&gt;
&lt;br /&gt;
		if actualDateBoundariesProperties ~= nil then&lt;br /&gt;
			local filterCapitalOf = {&lt;br /&gt;
				[ entityId ] = context.getPropertyInBoundaries( context, entityId, boundaries, {&amp;#039;P1376&amp;#039;} )&lt;br /&gt;
			};&lt;br /&gt;
			if boundaries then&lt;br /&gt;
				local entityOptions = context.cloneOptions( options );&lt;br /&gt;
				entityOptions[&amp;#039;text&amp;#039;] = getLabel( context, entityId, boundaries );&lt;br /&gt;
				baseResult = context.formatSnak( entityOptions, statement.mainsnak, circumstances );&lt;br /&gt;
&lt;br /&gt;
				local parentId = entityId;&lt;br /&gt;
				while parentId ~= nil do&lt;br /&gt;
					-- get parent&lt;br /&gt;
					local newParentSnaks = getParentsInBoundariesSnak( context, parentId, boundaries );&lt;br /&gt;
					if not newParentSnaks or #newParentSnaks == 0 then&lt;br /&gt;
						parentId = nil;&lt;br /&gt;
					elseif #newParentSnaks == 1 then&lt;br /&gt;
						local parentSnak = newParentSnaks[ 1 ];&lt;br /&gt;
						parentId = parentSnak.datavalue.value.id;&lt;br /&gt;
						&lt;br /&gt;
						local hasLoop = false&lt;br /&gt;
						for _, parentEntityId in pairs(parentEntityIds) do&lt;br /&gt;
							if parentEntityId == parentId then&lt;br /&gt;
								hasLoop = true&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						if hasLoop then&lt;br /&gt;
							if p.config and p.config.catLoopInGeoChains then&lt;br /&gt;
								result = result .. p.config.catLoopInGeoChains;&lt;br /&gt;
							end&lt;br /&gt;
							break -- while parentId ~= nil do&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						table.insert( parentSnaks, parentSnak );&lt;br /&gt;
						table.insert( parentEntityIds, parentId );&lt;br /&gt;
						filterCapitalOf[ parentId ] = context.getPropertyInBoundaries( context, parentId, boundaries, { &amp;#039;P1376&amp;#039; } );&lt;br /&gt;
					else&lt;br /&gt;
						parentId = nil;&lt;br /&gt;
						if p.config and p.config.catAmbiguousGeoChains then&lt;br /&gt;
							result = result .. p.config.catAmbiguousGeoChains;&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				local ussr=false;&lt;br /&gt;
				local nado=false;&lt;br /&gt;
&lt;br /&gt;
				if not hasAdditionalQualifiers then&lt;br /&gt;
					for i = 2, #parentSnaks, 1 do&lt;br /&gt;
						local parentSnak = parentSnaks[ i ];&lt;br /&gt;
						insertFromSnak( parentSnak, entriesToLookupCategory )&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- do not output similar countries like &amp;quot;Denmark, the Kingdom of Denmark&amp;quot;&lt;br /&gt;
				local simularCountries = {&lt;br /&gt;
					[&amp;#039;Q41304&amp;#039;] = &amp;#039;Q1206012&amp;#039;, -- Weimar Republic / German Reich&lt;br /&gt;
					[&amp;#039;Q7318&amp;#039;] = &amp;#039;Q1206012&amp;#039;, -- Weimar Republic / Nazi Germany&lt;br /&gt;
					[&amp;#039;Q35&amp;#039;] = &amp;#039;Q756617&amp;#039;, -- Denmark / Danish Realm&lt;br /&gt;
					[&amp;#039;Q55&amp;#039;] = &amp;#039;Q29999&amp;#039;, -- Netherlands / Kingdom of the Netherlands&lt;br /&gt;
					[&amp;#039;Q32081&amp;#039;] = &amp;#039;Q865&amp;#039;, -- Taiwan Province / Taiwan&lt;br /&gt;
				}&lt;br /&gt;
				if (#parentSnaks &amp;gt; 1) then&lt;br /&gt;
					for smallerCountryId, largerCountryId in pairs( simularCountries ) do&lt;br /&gt;
						if parentSnaks[ #parentSnaks ].datavalue.value.id == largerCountryId&lt;br /&gt;
							and parentSnaks[ #parentSnaks - 1 ].datavalue.value.id == smallerCountryId&lt;br /&gt;
						then&lt;br /&gt;
							table.remove( parentSnaks, #parentSnaks );&lt;br /&gt;
							table.remove( parentEntityIds, #parentEntityIds );&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- optimization for capital regions&lt;br /&gt;
				if (#parentSnaks &amp;gt; 3) then&lt;br /&gt;
					if parentSnaks[ #parentSnaks - 2 ].datavalue.value.id == &amp;#039;Q23939248&amp;#039; --Greater London, Greater London&lt;br /&gt;
						and parentSnaks[ #parentSnaks - 3 ].datavalue.value.id == &amp;#039;Q23306&amp;#039;&lt;br /&gt;
					then&lt;br /&gt;
						table.remove( parentSnaks, #parentSnaks - 2 );&lt;br /&gt;
						table.remove( parentEntityIds, #parentEntityIds - 2 );&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if (#parentSnaks &amp;gt; 2) then&lt;br /&gt;
					if parentSnaks[ #parentSnaks - 1 ].datavalue.value.id == &amp;#039;Q1490&amp;#039; --Tokyo, Tokyo&lt;br /&gt;
						and parentSnaks[ #parentSnaks - 2 ].datavalue.value.id == &amp;#039;Q7473516&amp;#039;&lt;br /&gt;
					then&lt;br /&gt;
						local parentSnak = parentSnaks[ 2 ];&lt;br /&gt;
						local parentOptions = context.cloneOptions( options );&lt;br /&gt;
						parentOptions[&amp;#039;text&amp;#039;] = getLabel( context, parentEntityIds[ 2 ], boundaries );&lt;br /&gt;
	&lt;br /&gt;
						baseResult = context.formatSnak( parentOptions, parentSnak );&lt;br /&gt;
elseif parentSnaks[ #parentSnaks - 1 ].datavalue.value.id == &amp;#039;Q633490&amp;#039; --Tadjik districts of Republican Subordination&lt;br /&gt;
					then&lt;br /&gt;
						table.remove( parentSnaks, #parentSnaks - 1 );&lt;br /&gt;
						table.remove( parentEntityIds, #parentEntityIds - 1 );&lt;br /&gt;
					elseif parentSnaks[ #parentSnaks - 2 ].datavalue.value.id == &amp;#039;Q633490&amp;#039; --Tadjik SSR districts of Republican Subordination&lt;br /&gt;
					then&lt;br /&gt;
						table.remove( parentSnaks, #parentSnaks - 2 );&lt;br /&gt;
						table.remove( parentEntityIds, #parentEntityIds - 2 );&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- do not output (maternity) hospitals, houses and streets but do it for manor and English country houses&lt;br /&gt;
				local unignoredTypes = {&lt;br /&gt;
					&amp;#039;Q879050&amp;#039;, -- manor house&lt;br /&gt;
					&amp;#039;Q1343246&amp;#039;, -- English country house&lt;br /&gt;
				}&lt;br /&gt;
				local ignoredTypes = {&lt;br /&gt;
					&amp;#039;Q3947&amp;#039;, -- house&lt;br /&gt;
					&amp;#039;Q16917&amp;#039;, -- hospital&lt;br /&gt;
					&amp;#039;Q34442&amp;#039;, -- road&lt;br /&gt;
					&amp;#039;Q79007&amp;#039;, -- street&lt;br /&gt;
					&amp;#039;Q174782&amp;#039;, -- square&lt;br /&gt;
					&amp;#039;Q958822&amp;#039;, -- maternity hospital&lt;br /&gt;
					&amp;#039;Q1059324&amp;#039;, -- university hospital&lt;br /&gt;
					&amp;#039;Q2087181&amp;#039;, -- historic house museum&lt;br /&gt;
					&amp;#039;Q18629950&amp;#039;, -- private clinic&lt;br /&gt;
					&amp;#039;Q64578911&amp;#039;, -- former hospital&lt;br /&gt;
				}&lt;br /&gt;
				if (#parentSnaks &amp;gt; 1) then&lt;br /&gt;
					local p31 = mw.wikibase.getAllStatements( parentEntityIds[ 1 ], &amp;#039;P31&amp;#039; );&lt;br /&gt;
					local doignore = true;&lt;br /&gt;
					for _, iOf in ipairs( p31 ) do&lt;br /&gt;
						for _, unignoredTypeId in ipairs( unignoredTypes ) do&lt;br /&gt;
							if ( iOf.mainsnak.datavalue.value.id == unignoredTypeId ) then&lt;br /&gt;
								doignore = false;&lt;br /&gt;
								unignoredTypes = {};&lt;br /&gt;
								ignoredTypes = {};&lt;br /&gt;
								break;&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
&lt;br /&gt;
					if (doignore) then&lt;br /&gt;
						for _, iOf in ipairs( p31 ) do&lt;br /&gt;
							for _, ignoredTypeId in ipairs( ignoredTypes ) do&lt;br /&gt;
								if ( iOf.mainsnak.datavalue.value.id == ignoredTypeId ) then&lt;br /&gt;
									local parentSnak = parentSnaks[ 2 ];&lt;br /&gt;
									local parentOptions = context.cloneOptions( options );&lt;br /&gt;
									parentOptions[&amp;#039;text&amp;#039;] = getLabel( context, parentEntityIds[ 2 ], boundaries );&lt;br /&gt;
	&lt;br /&gt;
									baseResult = context.formatSnak( parentOptions, parentSnak );&lt;br /&gt;
									unignoredTypes = {};&lt;br /&gt;
									ignoredTypes = {};&lt;br /&gt;
									break;&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				do&lt;br /&gt;
					local i = #parentSnaks;&lt;br /&gt;
&lt;br /&gt;
					if (i == 2) then&lt;br /&gt;
						nado=true;&lt;br /&gt;
					end&lt;br /&gt;
&lt;br /&gt;
                    local claims = parentEntityIds[ i ].claims;&lt;br /&gt;
					while ( i &amp;gt; 1 ) do&lt;br /&gt;
						-- do not ouput constituent countries like England or Russian SFSR&lt;br /&gt;
						if (ussr) then&lt;br /&gt;
							if parentSnaks[ i ] ~= nil then&lt;br /&gt;
								local p31 = mw.wikibase.getAllStatements(parentEntityIds[ i ], &amp;#039;P31&amp;#039;);&lt;br /&gt;
								for _, iOf in pairs (p31) do&lt;br /&gt;
									if (iOf.mainsnak.datavalue.value[&amp;#039;numeric-id&amp;#039;] == 236036) or (iOf.mainsnak.datavalue.value[&amp;#039;numeric-id&amp;#039;] == 3336843) or (iOf.mainsnak.datavalue.value[&amp;#039;numeric-id&amp;#039;] == 12959600) or (iOf.mainsnak.datavalue.value[&amp;#039;numeric-id&amp;#039;] == 56219758) or (iOf.mainsnak.datavalue.value[&amp;#039;numeric-id&amp;#039;] == 15304003) or (iOf.mainsnak.datavalue.value[&amp;#039;numeric-id&amp;#039;] == 66724388) or (iOf.mainsnak.datavalue.value[&amp;#039;numeric-id&amp;#039;] == 671370) then&lt;br /&gt;
										for _capitalId, capitalSnaks in pairs( filterCapitalOf ) do&lt;br /&gt;
											if #capitalSnaks &amp;gt; 0 then&lt;br /&gt;
												for __, capitalSnak in pairs( capitalSnaks ) do&lt;br /&gt;
													if parentSnaks[ i ] ~= nil then&lt;br /&gt;
														if	capitalSnak.datavalue and &lt;br /&gt;
														parentSnaks[ i ].datavalue.value.id == capitalSnak.datavalue.value.id then&lt;br /&gt;
															nado=true;&lt;br /&gt;
															break;&lt;br /&gt;
														end&lt;br /&gt;
													end&lt;br /&gt;
												end&lt;br /&gt;
											end&lt;br /&gt;
										end&lt;br /&gt;
										table.remove( parentSnaks, i );&lt;br /&gt;
										table.remove( parentEntityIds, i );&lt;br /&gt;
										break;&lt;br /&gt;
									end&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							ussr=false;&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						ussr=true;&lt;br /&gt;
						local prevEntityId = parentEntityIds[ i - 1 ];&lt;br /&gt;
						-- TODO: use English labels, if there is no current language labels&lt;br /&gt;
						local prevLabel = getLabel( context, prevEntityId, boundaries ) or &amp;#039;&amp;#039;;&lt;br /&gt;
						local nextEntityId = parentEntityIds[ i ];&lt;br /&gt;
						local nextLabel = getLabel( context, nextEntityId, boundaries ) or &amp;#039;&amp;#039;;&lt;br /&gt;
						if p.config and p.config.hideSameLabels == true and prevLabel == nextLabel then&lt;br /&gt;
							-- do not output same label twice (NY, NY, USA)&lt;br /&gt;
							table.remove( parentSnaks, i );&lt;br /&gt;
							table.remove( parentEntityIds, i );&lt;br /&gt;
						elseif p.config and p.config.hidePartOfLabels == true and isPartOfNext( prevLabel, &amp;#039; &amp;#039; .. nextLabel ) then&lt;br /&gt;
							-- do not output same label if it&amp;#039;s part of previos&lt;br /&gt;
							table.remove( parentSnaks, i - 1 );&lt;br /&gt;
							table.remove( parentEntityIds, i - 1 );&lt;br /&gt;
						elseif p.config and p.config.hideUnitsForCapitals == true then&lt;br /&gt;
							-- do not ouput items whose capital is the first item&lt;br /&gt;
							local capitalId = nil;&lt;br /&gt;
							for _capitalId, capitalSnaks in pairs( filterCapitalOf ) do&lt;br /&gt;
								if #capitalSnaks &amp;gt; 0 then&lt;br /&gt;
									for __, capitalSnak in pairs( capitalSnaks ) do&lt;br /&gt;
										if parentSnaks[ i ] ~= nil then&lt;br /&gt;
											if	capitalSnak.datavalue and &lt;br /&gt;
											parentSnaks[ i ].datavalue.value.id == capitalSnak.datavalue.value.id then&lt;br /&gt;
												capitalId = _capitalId;&lt;br /&gt;
												break;&lt;br /&gt;
											end&lt;br /&gt;
										end&lt;br /&gt;
									end&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
&lt;br /&gt;
							if (capitalId ~= nil or i ~= #parentSnaks) then&lt;br /&gt;
								table.remove( parentSnaks, 1 );&lt;br /&gt;
								table.remove( parentEntityIds, 1 );&lt;br /&gt;
							end&lt;br /&gt;
&lt;br /&gt;
							if (capitalId ~= nil and nado3) then&lt;br /&gt;
								if i == #parentSnaks then&lt;br /&gt;
									i = i - 1;&lt;br /&gt;
								end&lt;br /&gt;
&lt;br /&gt;
								while i &amp;gt; 1 and parentEntityIds[ i ] ~= capitalId do&lt;br /&gt;
									table.remove( parentSnaks, i );&lt;br /&gt;
									table.remove( parentEntityIds, i );&lt;br /&gt;
									i = i - 1;&lt;br /&gt;
								end&lt;br /&gt;
&lt;br /&gt;
								nado3=false;&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
&lt;br /&gt;
						i = i - 1;&lt;br /&gt;
&lt;br /&gt;
						if (i == 2) then&lt;br /&gt;
							table.remove( parentSnaks, i+1);&lt;br /&gt;
							table.remove( parentEntityIds, i+1);&lt;br /&gt;
						end&lt;br /&gt;
						if (i == 1) and (nado == true) then&lt;br /&gt;
							table.remove( parentSnaks, 1);&lt;br /&gt;
							table.remove( parentEntityIds, 1);&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if (#parentSnaks &amp;gt; 1) then&lt;br /&gt;
						local parentSnak = parentSnaks[ 2 ];&lt;br /&gt;
&lt;br /&gt;
						local parentOptions = context.cloneOptions( options );&lt;br /&gt;
						parentOptions[&amp;#039;text&amp;#039;] = getLabel( context, parentEntityIds[ 2 ], boundaries );&lt;br /&gt;
&lt;br /&gt;
						if (baseResult == context.formatSnak( parentOptions, parentSnak )) then&lt;br /&gt;
							baseResult = &amp;#039;&amp;#039;;&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				if isSkipTopLevel( parentEntityIds[ #parentEntityIds ] ) then&lt;br /&gt;
					table.remove( parentSnaks, #parentEntityIds );&lt;br /&gt;
					table.remove( parentEntityIds, #parentEntityIds );&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				if not hasAdditionalQualifiers then&lt;br /&gt;
					for i = 2, #parentSnaks, 1 do&lt;br /&gt;
						local parentSnak = parentSnaks[ i ];&lt;br /&gt;
&lt;br /&gt;
						local parentOptions = context.cloneOptions( options );&lt;br /&gt;
						parentOptions[&amp;#039;text&amp;#039;] = getLabel( context, parentEntityIds[ i ], boundaries );&lt;br /&gt;
&lt;br /&gt;
						local comma;&lt;br /&gt;
						if ((baseResult == &amp;#039;&amp;#039;) and (i == 2)) then&lt;br /&gt;
							comma = &amp;#039;&amp;#039;;&lt;br /&gt;
						else&lt;br /&gt;
							comma = &amp;#039;, &amp;#039;;&lt;br /&gt;
						end&lt;br /&gt;
&lt;br /&gt;
						if p.config.reverseOrder then&lt;br /&gt;
							result = context.formatSnak( parentOptions, parentSnak ) .. comma .. result;&lt;br /&gt;
						else&lt;br /&gt;
							result = result .. comma .. context.formatSnak( parentOptions, parentSnak );&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if options[ &amp;#039;thisLocationOnly&amp;#039; ] then&lt;br /&gt;
		result = baseResult;&lt;br /&gt;
	elseif p.config.reverseOrder then&lt;br /&gt;
		result = result .. baseResult;&lt;br /&gt;
	else&lt;br /&gt;
		result = baseResult .. result;&lt;br /&gt;
	end&lt;br /&gt;
	if options.references then&lt;br /&gt;
		result = result .. context.formatRefs( options, statement );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if categorizeByPlace then&lt;br /&gt;
		if property == &amp;#039;P19&amp;#039; then result = result .. getCategory( &amp;#039;P1464&amp;#039;, entriesToLookupCategory ); end&lt;br /&gt;
		if property == &amp;#039;P20&amp;#039; then result = result .. getCategory( &amp;#039;P1465&amp;#039;, entriesToLookupCategory ); end&lt;br /&gt;
		if property == &amp;#039;P119&amp;#039; then result = result .. getCategory( &amp;#039;P1791&amp;#039;, entriesToLookupCategory ); end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- append entity id from snak to result&lt;br /&gt;
function insertFromSnak( snak, result )&lt;br /&gt;
	if not categorizeByPlace then&lt;br /&gt;
		return;&lt;br /&gt;
	end&lt;br /&gt;
	if snak and&lt;br /&gt;
		snak.datavalue and&lt;br /&gt;
		snak.datavalue.type == &amp;#039;wikibase-entityid&amp;#039; and&lt;br /&gt;
		snak.datavalue.value and&lt;br /&gt;
		snak.datavalue.value[ &amp;#039;entity-type&amp;#039; ] == &amp;#039;item&amp;#039;&lt;br /&gt;
	then&lt;br /&gt;
		table.insert( result, snak.datavalue.value.id );&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getCategory( propertyId, entriesToLookupCategoryFor )&lt;br /&gt;
	for _, placeId in pairs( entriesToLookupCategoryFor ) do&lt;br /&gt;
		local claims = mw.wikibase.getBestStatements(placeId, propertyId);&lt;br /&gt;
&lt;br /&gt;
		if claims then&lt;br /&gt;
			for _, claim in pairs( claims ) do&lt;br /&gt;
				if claim.mainsnak and&lt;br /&gt;
					claim.mainsnak and&lt;br /&gt;
					claim.mainsnak.datavalue and&lt;br /&gt;
					claim.mainsnak.datavalue.type == &amp;#039;wikibase-entityid&amp;#039;&lt;br /&gt;
				then&lt;br /&gt;
					local catEntityId = claim.mainsnak.datavalue.value.id;&lt;br /&gt;
					local catSitelink = mw.wikibase.getSitelink(catEntityId);&lt;br /&gt;
					if (catSitelink) then&lt;br /&gt;
						return &amp;#039;[[&amp;#039; .. catSitelink .. &amp;#039;]]&amp;#039;;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;&amp;#039;;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local historicNamesProperties = { &amp;#039;P1813&amp;#039;, &amp;#039;P1448&amp;#039;, &amp;#039;P1705&amp;#039; };&lt;br /&gt;
&lt;br /&gt;
local langCode = mw.language.getContentLanguage():getCode();&lt;br /&gt;
local historicNamesPropertySelectors = {&lt;br /&gt;
		P1813 = &amp;#039;P1813[language:&amp;#039; .. langCode .. &amp;#039;][!P3831,P3831:Q105690470]&amp;#039;,&lt;br /&gt;
		P1448 = &amp;#039;P1448[language:&amp;#039; .. langCode .. &amp;#039;][!P3831,P3831:Q105690470]&amp;#039;,&lt;br /&gt;
		P1705 = &amp;#039;P1705[language:&amp;#039; .. langCode .. &amp;#039;][!P3831,P3831:Q105690470]&amp;#039;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
-- get current of historic name of place&lt;br /&gt;
function getLabel( context, entityId, boundaries )&lt;br /&gt;
	if not entityId then&lt;br /&gt;
		return nil;&lt;br /&gt;
	end&lt;br /&gt;
	if (type(entityId) ~= &amp;#039;string&amp;#039;) then error(&amp;#039;incorrect type of entityId argument&amp;#039;); end;&lt;br /&gt;
&lt;br /&gt;
    local label = nil;&lt;br /&gt;
&lt;br /&gt;
	-- name from properties&lt;br /&gt;
	local results = context.getPropertyInBoundaries( context, entityId, boundaries,&lt;br /&gt;
		historicNamesProperties, historicNamesPropertySelectors);&lt;br /&gt;
&lt;br /&gt;
	for r, result in pairs( results ) do&lt;br /&gt;
		if result.datavalue and&lt;br /&gt;
			result.datavalue.value and&lt;br /&gt;
			result.datavalue.value.text&lt;br /&gt;
		then&lt;br /&gt;
			label = result.datavalue.value.text;&lt;br /&gt;
			break;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    -- name from label&lt;br /&gt;
    if label == nil then&lt;br /&gt;
		label = mw.wikibase.getLabel( entityId );&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return label;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.getLabel = getLabel;&lt;br /&gt;
&lt;br /&gt;
local function calculateEndDateTimestamp( context, options, statement )&lt;br /&gt;
	if not context then error( &amp;#039;context not specified&amp;#039; ) end;&lt;br /&gt;
	if not options then error( &amp;#039;options not specified&amp;#039; ) end;&lt;br /&gt;
	if not options.entity then error( &amp;#039;options.entity missing&amp;#039; ) end;&lt;br /&gt;
	if not statement then error( &amp;#039;statement not specified&amp;#039; ) end;&lt;br /&gt;
&lt;br /&gt;
	if statement.qualifiers and statement.qualifiers.P582 then&lt;br /&gt;
		for i, qualifier in ipairs( statement.qualifiers.P582 ) do&lt;br /&gt;
			local parsedTime = context.parseTimeFromSnak( qualifier );&lt;br /&gt;
			if parsedTime then&lt;br /&gt;
				return parsedTime;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- check death day... do we have it at all?&lt;br /&gt;
	for h, propertyId in pairs( { &amp;quot;P570&amp;quot;, &amp;quot;P577&amp;quot;, &amp;quot;P576&amp;quot; } ) do&lt;br /&gt;
		local dateClaims = context.selectClaims( options, propertyId );&lt;br /&gt;
		if dateClaims then&lt;br /&gt;
			for i, statement in ipairs( dateClaims ) do&lt;br /&gt;
				local parsedTime = context.parseTimeFromSnak( statement.mainsnak );&lt;br /&gt;
				if parsedTime then&lt;br /&gt;
					return parsedTime;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- TODO: check other &amp;quot;end&amp;quot; properties&lt;br /&gt;
&lt;br /&gt;
	-- no death day&lt;br /&gt;
	return os.time() * 1000;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>Буквица&gt;Сидик из ПТУ</name></author>
	</entry>
</feed>