<?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%2FBoundaries</id>
	<title>Модуль:Wikidata/Boundaries - История изменений</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%2FBoundaries"/>
	<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/Boundaries&amp;action=history"/>
	<updated>2026-05-12T11:59:24Z</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/Boundaries&amp;diff=238399&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/Boundaries&amp;diff=238399&amp;oldid=prev"/>
		<updated>2025-07-27T15:36:25Z</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-238398:rev-238399 --&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/Boundaries&amp;diff=238398&amp;oldid=prev</id>
		<title>Буквица&gt;Putnik: frame?</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/Boundaries&amp;diff=238398&amp;oldid=prev"/>
		<updated>2017-04-29T21:42:01Z</updated>

		<summary type="html">&lt;p&gt;frame?&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local WDS = require( &amp;#039;Module:WikidataSelectors&amp;#039; );&lt;br /&gt;
local p = {};&lt;br /&gt;
&lt;br /&gt;
local function min( prev, next )&lt;br /&gt;
	if ( prev == nil ) then return next;&lt;br /&gt;
	elseif ( prev &amp;gt; next ) then return next;&lt;br /&gt;
	else return prev; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function max( prev, next )&lt;br /&gt;
	if ( prev == nil ) then return next;&lt;br /&gt;
	elseif ( prev &amp;lt; next ) then return next;&lt;br /&gt;
	else return prev; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getTimeBoundariesFromProperty( frame, context, propertyId )&lt;br /&gt;
	mw.log( &amp;#039;Get time boundaries for &amp;#039; .. propertyId .. &amp;#039;...&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	local dateClaims = WDS.filter( context.entity.claims, propertyId );&lt;br /&gt;
	if ( not dateClaims or #dateClaims == 0 ) then return nil; end&lt;br /&gt;
	mw.log( &amp;#039;Get time boundaries for &amp;#039; .. propertyId .. &amp;#039;... Got &amp;#039; .. #dateClaims .. &amp;#039; date claim(s)&amp;#039;);&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;
	mw.log( &amp;#039;Time boundaries for &amp;#039; .. propertyId .. &amp;#039; are &amp;#039; .. left .. &amp;#039; and &amp;#039; .. right );&lt;br /&gt;
	return { left, right };&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getTimeBoundariesFromProperties( frame, context, propertyIds )&lt;br /&gt;
	for _, propertyId in ipairs( propertyIds ) do&lt;br /&gt;
		local result = p.getTimeBoundariesFromProperty( frame, 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;
function p.getTimeBoundariesFromQualifier( frame, 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;
	mw.logObject( statement, &amp;#039;statement&amp;#039; )&lt;br /&gt;
	mw.logObject( qualifierId, &amp;#039;qualifierId&amp;#039; )&lt;br /&gt;
	if ( statement.qualifiers and statement.qualifiers[qualifierId] ) then&lt;br /&gt;
		mw.logObject( statement.qualifiers[qualifierId], &amp;#039;statement.qualifiers[qualifierId]&amp;#039; )&lt;br /&gt;
		for _, qualifier in pairs( statement.qualifiers[qualifierId] ) do&lt;br /&gt;
			local boundaries = context.parseTimeBoundariesFromSnak( qualifier );&lt;br /&gt;
			mw.logObject( qualifier, &amp;#039;qualifier&amp;#039; )&lt;br /&gt;
			mw.logObject( boundaries, &amp;#039;boundaries&amp;#039; )&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;
function p.getTimeBoundariesFromQualifiers( frame, context, statement, qualifierIds )&lt;br /&gt;
	for _, qualifierId in ipairs( qualifierIds ) do&lt;br /&gt;
		local result = p.getTimeBoundariesFromQualifier( frame, context, statement, qualifierId );&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;
function p.getParentsInBoundariesSnakImpl( frame, context, entity, boundaries, propertyIds )&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;
	if entity.claims then&lt;br /&gt;
		for _, propertyId in ipairs( propertyIds ) do&lt;br /&gt;
			local filteredClaims = WDS.filter( entity.claims, propertyId .. &amp;#039;[rank:preferred, rank:normal]&amp;#039; );&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, &amp;#039;P580&amp;#039; );&lt;br /&gt;
						local endBoundaries = getTimeBoundariesFromQualifiers( context, claim, &amp;#039;P582&amp;#039; );&lt;br /&gt;
			&lt;br /&gt;
						if ( (startBoundaries == nil or startBoundaries[2] &amp;lt;= boundaries[1] )&lt;br /&gt;
								and ( endBoundaries == nil or endBoundaries[1] &amp;gt;= boundaries[2] ) ) 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;
	end&lt;br /&gt;
&lt;br /&gt;
	return results;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getParentsInBoundariesSnak( frame, context, entity, boundaries )&lt;br /&gt;
	if ( not entity ) then error(&amp;#039;entity must be specified&amp;#039;); end&lt;br /&gt;
	if ( type(entity) ~= &amp;#039;table&amp;#039; ) then error(&amp;#039;entity must be table&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 = p.getParentsInBoundariesSnakImpl( frame, context, entity, boundaries, {&amp;#039;P131&amp;#039;} ) -- located in&lt;br /&gt;
	if not results or #results == 0 then&lt;br /&gt;
		results = p.getParentsInBoundariesSnakImpl( frame, context, entity, 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 = &amp;#039;Q&amp;#039; .. result.datavalue.value[&amp;#039;numeric-id&amp;#039;];&lt;br /&gt;
		if ( resultId == entity.id ) 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;
-- get current of historic name of place&lt;br /&gt;
function p.getLabel( frame, context, entity, boundaries )&lt;br /&gt;
	if not entity then&lt;br /&gt;
		return nil;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local lang = mw.language.getContentLanguage();&lt;br /&gt;
	local langCode = lang:getCode();&lt;br /&gt;
&lt;br /&gt;
	-- name from label&lt;br /&gt;
	-- TODO: lang:getFallbackLanguages()&lt;br /&gt;
	local label = nil;&lt;br /&gt;
	if entity.labels then&lt;br /&gt;
		if entity.labels[langCode] and entity.labels[langCode].value then&lt;br /&gt;
			label = entity.labels[langCode].value;&lt;br /&gt;
		elseif entity.labels.en and entity.labels.en.value then&lt;br /&gt;
			label = entity.labels.en.value;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- name from properties&lt;br /&gt;
	local results = p.getParentsInBoundariesSnakImpl( frame, context, entity, boundaries, {&lt;br /&gt;
		&amp;#039;P1813[language:&amp;#039; .. langCode .. &amp;#039;]&amp;#039;,&lt;br /&gt;
		&amp;#039;P1448[language:&amp;#039; .. langCode .. &amp;#039;]&amp;#039;,&lt;br /&gt;
		&amp;#039;P1705[language:&amp;#039; .. langCode .. &amp;#039;]&amp;#039;&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	for r, result in pairs( results ) do&lt;br /&gt;
		if result.datavalue&lt;br /&gt;
				and result.datavalue.value&lt;br /&gt;
				and result.datavalue.value.text 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;
	return label;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>Буквица&gt;Putnik</name></author>
	</entry>
</feed>