<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://wiki.maoism.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AWikidata%2FPlaces</id>
	<title>Модуль:Wikidata/Places - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.maoism.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AWikidata%2FPlaces"/>
	<link rel="alternate" type="text/html" href="http://wiki.maoism.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Wikidata/Places&amp;action=history"/>
	<updated>2026-05-15T09:27:48Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.maoism.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Wikidata/Places&amp;diff=1281&amp;oldid=prev</id>
		<title>Maoism archivist: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="http://wiki.maoism.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Wikidata/Places&amp;diff=1281&amp;oldid=prev"/>
		<updated>2020-10-15T08:07:13Z</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;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 11:07, 15 октября 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&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;/table&gt;</summary>
		<author><name>Maoism archivist</name></author>
	</entry>
	<entry>
		<id>http://wiki.maoism.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Wikidata/Places&amp;diff=1280&amp;oldid=prev</id>
		<title>wiki&gt;Adamant.pwn: datavalue может быть явно указанный no value</title>
		<link rel="alternate" type="text/html" href="http://wiki.maoism.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Wikidata/Places&amp;diff=1280&amp;oldid=prev"/>
		<updated>2020-09-04T22:10:06Z</updated>

		<summary type="html">&lt;p&gt;datavalue может быть явно указанный no value&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( 'Module:WikidataSelectors' );&lt;br /&gt;
local Flags = require( 'Module:Wikidata/Flags' );&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 = '[[Категория:Википедия:Страницы с неоднозначными геоцепочками]]',&lt;br /&gt;
		catLoopInGeoChains = '[[Категория:Википедия:Страницы с зацикливающимися геоцепочками]]',&lt;br /&gt;
		catWikibaseError = '[[Категория:Википедия:Страницы с ошибками скриптов, использующих Викиданные]]'&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 getTimeBoundariesFromQualifiers( context, statement, qualifierId )&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;
	if statement.qualifiers and statement.qualifiers[qualifierId] then&lt;br /&gt;
		for _, qualifier in pairs( statement.qualifiers[qualifierId] ) do&lt;br /&gt;
			local boundaries = context.parseTimeBoundariesFromSnak( qualifier );&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;
	end&lt;br /&gt;
&lt;br /&gt;
	if not left or not right then&lt;br /&gt;
		return nil;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return { left, right };&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getParentsInBoundariesSnakImpl( context, entityId, boundaries, propertyIds, selectors )&lt;br /&gt;
	local results = {};&lt;br /&gt;
&lt;br /&gt;
	if not propertyIds or #propertyIds == 0 then&lt;br /&gt;
		return results;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, propertyId in ipairs( propertyIds ) do&lt;br /&gt;
		if (not string.match( propertyId, '^P%d+$' )) then error('Incorrect propertyId: ' + propertyId); end&lt;br /&gt;
		local selector;&lt;br /&gt;
		if (selectors ~= nil) then&lt;br /&gt;
			selector = selectors[propertyId] or propertyId;&lt;br /&gt;
		else&lt;br /&gt;
			selector = propertyId;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local entityClaims = {};&lt;br /&gt;
		entityClaims[propertyId] = mw.wikibase.getAllStatements( entityId, propertyId );&lt;br /&gt;
&lt;br /&gt;
		local filteredClaims = WDS.filter( entityClaims, selector .. '[rank:preferred, rank:normal]' );&lt;br /&gt;
		if filteredClaims then&lt;br /&gt;
			for _, claim in pairs( filteredClaims ) do&lt;br /&gt;
				if not boundaries or not propertyIds or #propertyIds == 0 then&lt;br /&gt;
					table.insert( results, claim.mainsnak );&lt;br /&gt;
				else&lt;br /&gt;
					local startBoundaries = getTimeBoundariesFromQualifiers( context, claim, 'P580' );&lt;br /&gt;
					local endBoundaries = getTimeBoundariesFromQualifiers( context, claim, 'P582' );&lt;br /&gt;
		&lt;br /&gt;
					if ( startBoundaries == nil or startBoundaries[2] &amp;lt;= boundaries[1] ) and&lt;br /&gt;
						( endBoundaries == nil or endBoundaries[1] &amp;gt;= boundaries[2] )&lt;br /&gt;
					then&lt;br /&gt;
						table.insert( results, claim.mainsnak );&lt;br /&gt;
					end &lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if #results &amp;gt; 0 then&lt;br /&gt;
			break;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return results;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getParentsInBoundariesSnak( context, entityId, boundaries )&lt;br /&gt;
	if not entityId then error('entityId must be specified'); end&lt;br /&gt;
	if type(entityId) ~= 'string' then error('entityId must be string'); end&lt;br /&gt;
	if not boundaries then error('boundaries must be specified'); end&lt;br /&gt;
	if type(boundaries) ~= 'table' then error('boundaries must be table'); end&lt;br /&gt;
&lt;br /&gt;
	local results = getParentsInBoundariesSnakImpl( context, entityId, boundaries, {'P131'} ) -- located in&lt;br /&gt;
	if not results or #results == 0 then&lt;br /&gt;
		results = getParentsInBoundariesSnakImpl( context, entityId, boundaries, {'P17'} ) -- country&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for r, result in pairs( results ) do&lt;br /&gt;
		if result.snaktype ~= 'value' 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;
&lt;br /&gt;
	local actualDateBoundariesProperties = nil;&lt;br /&gt;
	if property == 'P19' then actualDateBoundariesProperties = {'P569','P570'}; end&lt;br /&gt;
	if property == 'P20' then actualDateBoundariesProperties = {'P570','P569'}; end&lt;br /&gt;
	if property == 'P119' then actualDateBoundariesProperties = {'P570','P569'}; end&lt;br /&gt;
	if property == 'P159' then actualDateBoundariesProperties = {'P576'}; 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;
		if (boundaries == nil) and (property == 'P159') then&lt;br /&gt;
			boundaries = {os.time() * 1000, os.time() * 1000};&lt;br /&gt;
		end&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 = '';&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;
				if qualifier.datavalue then&lt;br /&gt;
					local parentOptions = context.cloneOptions( options );&lt;br /&gt;
					local qualifierEntityId = qualifier.datavalue.value.id;&lt;br /&gt;
					parentOptions['text'] = 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 .. ', ' .. result;&lt;br /&gt;
					else&lt;br /&gt;
						result = result .. ', ' .. 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;
&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;
				if qualifier.datavalue then&lt;br /&gt;
					local parentOptions = context.cloneOptions( options );&lt;br /&gt;
					local qualifierEntityId = qualifier.datavalue.value.id;&lt;br /&gt;
					parentOptions[ 'text' ] = 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 .. ', ' .. result;&lt;br /&gt;
					else&lt;br /&gt;
						result = result .. ', ' .. 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 ] = getParentsInBoundariesSnakImpl( context, entityId, boundaries, {'P1376'} )&lt;br /&gt;
			};&lt;br /&gt;
			if boundaries then&lt;br /&gt;
				local entityOptions = context.cloneOptions( options );&lt;br /&gt;
				entityOptions['text'] = 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 ] = getParentsInBoundariesSnakImpl( context, parentId, boundaries, { 'P1376' } );&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;
&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;
				if (#parentSnaks &amp;gt; 1) then&lt;br /&gt;
					if ((parentSnaks[ #parentSnaks ].datavalue.value['numeric-id'] == 756617) and (parentSnaks[ #parentSnaks-1 ].datavalue.value['numeric-id'] == 35)) or ((parentSnaks[ #parentSnaks ].datavalue.value['numeric-id'] == 29999) and (parentSnaks[ #parentSnaks-1 ].datavalue.value['numeric-id'] == 55)) 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;
&lt;br /&gt;
				do&lt;br /&gt;
					local capofstate = false;&lt;br /&gt;
					local i = #parentSnaks;&lt;br /&gt;
					while i &amp;gt; 1 do&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 '';&lt;br /&gt;
						local nextEntityId = parentEntityIds[ i ];&lt;br /&gt;
						local nextLabel = getLabel( context, nextEntityId, boundaries ) or '';&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, ' ' .. nextLabel ) then&lt;br /&gt;
							-- do not output same label if it'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 ].datavalue.value.id == capitalSnak.datavalue.value.id then&lt;br /&gt;
											capitalId = _capitalId;&lt;br /&gt;
											if (i == #parentSnaks) then&lt;br /&gt;
												capofstate = true;&lt;br /&gt;
											end&lt;br /&gt;
											break;&lt;br /&gt;
										end&lt;br /&gt;
									end&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							if capitalId ~= nil then&lt;br /&gt;
								if i == #parentSnaks then&lt;br /&gt;
									i = i - 1;&lt;br /&gt;
								end&lt;br /&gt;
								-- always ouput constituent countries like England or Russian SFSR&lt;br /&gt;
								if (i == (#parentSnaks-1)) and (capofstate == false) then&lt;br /&gt;
									local p31 = mw.wikibase.getAllStatements(parentEntityIds[ i ], 'P31');&lt;br /&gt;
										for _, iOf in pairs (p31) do&lt;br /&gt;
											if (iOf.mainsnak.datavalue.value['numeric-id'] == 236036) or (iOf.mainsnak.datavalue.value['numeric-id'] == 3336843) or (iOf.mainsnak.datavalue.value['numeric-id'] == 12959600) or (iOf.mainsnak.datavalue.value['numeric-id'] == 56219758) or (iOf.mainsnak.datavalue.value['numeric-id'] == 15304003) or (iOf.mainsnak.datavalue.value['numeric-id'] == 66724388) then&lt;br /&gt;
												i = i - 1;&lt;br /&gt;
										end&lt;br /&gt;
									end&lt;br /&gt;
								end&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;
							end&lt;br /&gt;
						end&lt;br /&gt;
						i = i - 1;&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['text'] = getLabel( context, parentEntityIds[ i ], boundaries );&lt;br /&gt;
&lt;br /&gt;
						if p.config.reverseOrder then&lt;br /&gt;
							result = context.formatSnak( parentOptions, parentSnak ) .. ', ' .. result;&lt;br /&gt;
						else&lt;br /&gt;
							result = result .. ', ' .. 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[ 'thisLocationOnly' ] 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 == 'P19' then result = result .. getCategory( 'P1464', entriesToLookupCategory ); end&lt;br /&gt;
		if property == 'P20' then result = result .. getCategory( 'P1465', entriesToLookupCategory ); end&lt;br /&gt;
		if property == 'P119' then result = result .. getCategory( 'P1791', 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 == 'wikibase-entityid' and&lt;br /&gt;
		snak.datavalue.value and&lt;br /&gt;
		snak.datavalue.value[ 'entity-type' ] == 'item'&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;
	if mw.title.getCurrentTitle().namespace == 0 then&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 == 'wikibase-entityid'&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 '[[' .. catSitelink .. ']]';&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;
	return '';&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local historicNamesProperties = { 'P1813', 'P1448', 'P1705' };&lt;br /&gt;
&lt;br /&gt;
local langCode = mw.language.getContentLanguage():getCode();&lt;br /&gt;
local historicNamesPropertySelectors = {&lt;br /&gt;
		P1813 = 'P1813[language:' .. langCode .. ']',&lt;br /&gt;
		P1448 = 'P1448[language:' .. langCode .. ']',&lt;br /&gt;
		P1705 = 'P1705[language:' .. langCode .. ']'&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) ~= 'string') then error('incorrect type of entityId argument'); end;&lt;br /&gt;
&lt;br /&gt;
    local label = nil;&lt;br /&gt;
&lt;br /&gt;
	-- name from properties&lt;br /&gt;
	local results = getParentsInBoundariesSnakImpl( 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( 'context not specified' ) end;&lt;br /&gt;
	if not options then error( 'options not specified' ) end;&lt;br /&gt;
	if not options.entity then error( 'options.entity missing' ) end;&lt;br /&gt;
	if not statement then error( 'statement not specified' ) 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;
local function deleteTwinAncestors( countryEntityId, propertyId ) --do not display countries which have twin ancestors&lt;br /&gt;
	local badTwins&lt;br /&gt;
	if ( countryEntityId == 'Q174193' ) then				--Great Britain and Ireland&lt;br /&gt;
		badTwins = {'Q145'}									--Great Brirani &amp;amp; NI&lt;br /&gt;
    elseif ( countryEntityId == 'Q161885' ) then			--Great Britain&lt;br /&gt;
		badTwins = {'Q174193'}								--Great Britain and Ireland&lt;br /&gt;
	elseif ( countryEntityId == 'Q43287' ) then				--German Impire&lt;br /&gt;
		badTwins = {'Q41304', 'Q7318', 'Q2415901', 'Q183'}	--Weimar Republic or Nazi Germany or Allied-occupied Germany or Germany&lt;br /&gt;
	elseif ( countryEntityId == 'Q41304' ) then				--Weimar Republic&lt;br /&gt;
		badTwins = {'Q7318', 'Q2415901', 'Q183'}			--Nazi Germany or Allied-occupied Germany or Germany&lt;br /&gt;
	elseif ( countryEntityId == 'Q7318' ) then				--Nazi Germany&lt;br /&gt;
		badTwins = {'Q2415901', 'Q183'}						--Allied-occupied Germany or Germany&lt;br /&gt;
    elseif ( countryEntityId == 'Q2415901' ) then			--Allied-occupied Germany&lt;br /&gt;
		badTwins = {'Q183'}									--Germany&lt;br /&gt;
	elseif ( countryEntityId == 'Q838261' ) then			--FR of Yugoslavia&lt;br /&gt;
		badTwins = {'Q37024'}								--Serbia &amp;amp; Montenegro&lt;br /&gt;
	else&lt;br /&gt;
		return true;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local listforcheck&lt;br /&gt;
	if propertyId == 'P1532' then&lt;br /&gt;
		listforcheck = mw.wikibase.getAllStatements( mw.wikibase.getEntityIdForCurrentPage(), propertyId );&lt;br /&gt;
	else&lt;br /&gt;
		listforcheck = mw.wikibase.getBestStatements( mw.wikibase.getEntityIdForCurrentPage(), propertyId );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, claim in pairs( listforcheck ) do&lt;br /&gt;
		if ( claim and claim.mainsnak&lt;br /&gt;
			and claim.mainsnak.datavalue&lt;br /&gt;
			and claim.mainsnak.datavalue.value&lt;br /&gt;
			and claim.mainsnak.datavalue.value.id ) then&lt;br /&gt;
			local actualId = claim.mainsnak.datavalue.value.id;&lt;br /&gt;
			for index, value in ipairs(badTwins) do&lt;br /&gt;
				if ( value == actualId ) then&lt;br /&gt;
            		return false;&lt;br /&gt;
        		end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true; &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatCountryClaimWithFlag( context, options, statement )&lt;br /&gt;
	if not context then error('context not specified') end;&lt;br /&gt;
	if not options then error('options not specified') end;&lt;br /&gt;
	if not options.entity then error('options.entity is missing') end;&lt;br /&gt;
	if not statement then error('statement not specified') end;&lt;br /&gt;
&lt;br /&gt;
	if not statement.mainsnak or&lt;br /&gt;
		not statement.mainsnak.datavalue or&lt;br /&gt;
		not statement.mainsnak.datavalue.value or&lt;br /&gt;
		not statement.mainsnak.datavalue.value.id&lt;br /&gt;
	then&lt;br /&gt;
		local result = context.formatStatementDefault( context, options, statement );&lt;br /&gt;
		if not result then&lt;br /&gt;
			return '';&lt;br /&gt;
		end&lt;br /&gt;
		return '&amp;lt;span class=&amp;quot;country-name&amp;quot;&amp;gt;' .. result .. '&amp;lt;/span&amp;gt;';&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local countryEntityId = statement.mainsnak.datavalue.value.id;&lt;br /&gt;
	local endDateTimestamp = calculateEndDateTimestamp( context, options, statement );&lt;br /&gt;
	local boundaries = getTimeBoundariesFromProperties( context, {'P570', 'P577', 'P571'} );&lt;br /&gt;
&lt;br /&gt;
	if deleteTwinAncestors( countryEntityId, string.upper(options.property) ) then&lt;br /&gt;
&lt;br /&gt;
		local countryOptions = context.cloneOptions( options );&lt;br /&gt;
		if not countryOptions['text'] or countryOptions['text'] == '' then&lt;br /&gt;
			countryOptions['text'] = getLabel( context, countryEntityId, boundaries );&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local flag = Flags.getFlag( context, countryEntityId, endDateTimestamp );	&lt;br /&gt;
		if flag then&lt;br /&gt;
			return flag .. '&amp;amp;nbsp;&amp;lt;span class=&amp;quot;country-name&amp;quot;&amp;gt;' ..&lt;br /&gt;
				context.formatStatementDefault( context, countryOptions, statement ) ..&lt;br /&gt;
				'&amp;lt;/span&amp;gt;';&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return '&amp;lt;span class=&amp;quot;country-name&amp;quot;&amp;gt;' ..&lt;br /&gt;
			context.formatStatementDefault( context, countryOptions, statement ) ..&lt;br /&gt;
			'&amp;lt;/span&amp;gt;';&lt;br /&gt;
	else&lt;br /&gt;
		return nil;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>wiki&gt;Adamant.pwn</name></author>
	</entry>
</feed>