<?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%3AWDBase</id>
	<title>Модуль:WDBase - История изменений</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%3AWDBase"/>
	<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:WDBase&amp;action=history"/>
	<updated>2026-04-24T19:50:08Z</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:WDBase&amp;diff=238449&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:WDBase&amp;diff=238449&amp;oldid=prev"/>
		<updated>2025-07-27T15:36:39Z</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-238448:rev-238449 --&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:WDBase&amp;diff=238448&amp;oldid=prev</id>
		<title>Буквица&gt;The Fox Bot: Защитил страницу Модуль:WDBase: критический шаблон или модуль: согласно Служебная:Постоянная ссылка/143835923#Промежуточный итог ([Редактирование=только автоподтверждённые] (бессрочно) [Переименование=только автоподтверждённые] (бессрочно))</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:WDBase&amp;diff=238448&amp;oldid=prev"/>
		<updated>2025-03-05T16:12:23Z</updated>

		<summary type="html">&lt;p&gt;Защитил страницу &lt;a href=&quot;/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WDBase&quot; title=&quot;Модуль:WDBase&quot;&gt;Модуль:WDBase&lt;/a&gt;: &lt;a href=&quot;/w/index.php?title=%D0%92%D0%9F:%D0%9A%D0%A8&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;ВП:КШ (страница не существует)&quot;&gt;критический шаблон или модуль&lt;/a&gt;: согласно &lt;a href=&quot;/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%9F%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0/143835923#Промежуточный_итог&quot; title=&quot;Служебная:Постоянная ссылка/143835923&quot;&gt;Служебная:Постоянная ссылка/143835923&lt;/a&gt; ([Редактирование=только автоподтверждённые] (бессрочно) [Переименование=только автоподтверждённые] (бессрочно))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- The documentation for the module should be written in English in the LuaDoc&lt;br /&gt;
-- format to ease updating the module between different Wikimedia projects.&lt;br /&gt;
-- The localized version of the documentation can be added to the documentation&lt;br /&gt;
-- page of the module.&lt;br /&gt;
&lt;br /&gt;
require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
p.P_NAME_WORK_LANG = &amp;#039;P407&amp;#039;&lt;br /&gt;
p.P_EDITION_FOR = &amp;#039;P629&amp;#039;&lt;br /&gt;
p.P_OBJ_NAMED_AS = &amp;#039;P1932&amp;#039;&lt;br /&gt;
p.P_ORDINAL_NUM = &amp;#039;P1545&amp;#039;&lt;br /&gt;
&lt;br /&gt;
p.Q_MULTILANG = &amp;#039;Q20923490&amp;#039;&lt;br /&gt;
&lt;br /&gt;
local defaultLangObj = mw.getContentLanguage()&lt;br /&gt;
local defaultLang = defaultLangObj:getCode()&lt;br /&gt;
&lt;br /&gt;
local fallbackLang = &amp;#039;en&amp;#039;&lt;br /&gt;
&lt;br /&gt;
function p.statements(entity, property, cache)&lt;br /&gt;
	if cache then&lt;br /&gt;
		local entityCache = cache[entity]&lt;br /&gt;
		if entityCache then&lt;br /&gt;
			local props = entityCache.props or entityCache&lt;br /&gt;
			local statements = props[property]&lt;br /&gt;
			if statements then&lt;br /&gt;
				return statements&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local statements = mw.wikibase.getBestStatements(entity, property)&lt;br /&gt;
	if not statements or next(statements) == nil then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return statements&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.statementsByProperties(entity, properties)&lt;br /&gt;
	local orderedStatements = {}&lt;br /&gt;
	local statements = {}&lt;br /&gt;
	for _, property in ipairs(properties) do&lt;br /&gt;
		local currStatements = mw.wikibase.getBestStatements(entity, property)&lt;br /&gt;
		if currStatements and next(currStatements) ~= nil then&lt;br /&gt;
			for _, statement in ipairs(currStatements) do&lt;br /&gt;
				local num&lt;br /&gt;
				local qualifiers = statement.qualifiers&lt;br /&gt;
				if qualifiers then&lt;br /&gt;
					local qualifierSnaks = qualifiers[p.P_ORDINAL_NUM]&lt;br /&gt;
					if qualifierSnaks then&lt;br /&gt;
						local datavalue = qualifierSnaks[1].datavalue&lt;br /&gt;
						if datavalue and datavalue.type == &amp;#039;string&amp;#039; then&lt;br /&gt;
							num = tonumber(datavalue.value)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if num then&lt;br /&gt;
					orderedStatements[num] = statement&lt;br /&gt;
				else&lt;br /&gt;
					table.insert(statements, statement)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if next(orderedStatements) == nil then&lt;br /&gt;
		return statements&lt;br /&gt;
	elseif next(statements) == nil then&lt;br /&gt;
		return orderedStatements&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- We assume that all statements must be either ordered or unordered, so&lt;br /&gt;
	-- all other cases must be fixed in Wikidata, and the code below allowed&lt;br /&gt;
	-- to be slow (rare exceptional cases)&lt;br /&gt;
	local j = 1&lt;br /&gt;
	for i = 1, table.getn(orderedStatements) do&lt;br /&gt;
		if orderedStatements[i] == nil then&lt;br /&gt;
			orderedStatements[i] = statements[j]&lt;br /&gt;
			j = j + 1&lt;br /&gt;
			if statements[j] == nil then&lt;br /&gt;
				break;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for i = j, table.getn(statements) do&lt;br /&gt;
		table.insert(statements, statements[i])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return orderedStatements&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.valueBySnak(snak)&lt;br /&gt;
	local datavalue = snak.datavalue&lt;br /&gt;
	if not datavalue then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if datavalue.type == &amp;#039;monolingualtext&amp;#039; then&lt;br /&gt;
		return datavalue.value.text, datavalue.value.language&lt;br /&gt;
	elseif datavalue.type == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
		return datavalue.value.id&lt;br /&gt;
	elseif datavalue.type == &amp;#039;string&amp;#039; then&lt;br /&gt;
		return datavalue.value&lt;br /&gt;
	elseif datavalue.type == &amp;#039;time&amp;#039; then&lt;br /&gt;
		return p.dateFromDatavalue(datavalue)&lt;br /&gt;
	elseif datavalue.type == &amp;#039;quantity&amp;#039; then&lt;br /&gt;
		local unitEntity&lt;br /&gt;
		if datavalue.value.unit then&lt;br /&gt;
			unitEntity = datavalue.value.unit:gsub(&amp;#039;^.+/([^/]+)$&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		return datavalue.value.amount, unitEntity&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.valueByStatement(statement)&lt;br /&gt;
	local snak = statement.mainsnak&lt;br /&gt;
	if not snak then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return p.valueBySnak(snak)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.textByStatement(statement, lang)&lt;br /&gt;
	local datavalue = statement.mainsnak.datavalue&lt;br /&gt;
	if not datavalue then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if datavalue.type == &amp;#039;monolingualtext&amp;#039; then&lt;br /&gt;
		return datavalue.value.text, datavalue.value.language&lt;br /&gt;
	elseif datavalue.type == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
		local entity = datavalue.value.id&lt;br /&gt;
		if lang then&lt;br /&gt;
			return mw.wikibase.getLabelByLang(entity, lang), lang&lt;br /&gt;
		else&lt;br /&gt;
			return mw.wikibase.getLabelWithLang(entity)&lt;br /&gt;
		end&lt;br /&gt;
	elseif datavalue.type == &amp;#039;string&amp;#039; then&lt;br /&gt;
		return datavalue.value&lt;br /&gt;
	elseif datavalue.type == &amp;#039;time&amp;#039; then&lt;br /&gt;
		return p.dateToStr(p.dateFromDatavalue(datavalue))&lt;br /&gt;
	elseif datavalue.value.amount == &amp;#039;quantity&amp;#039; then&lt;br /&gt;
		local unit&lt;br /&gt;
		local valueLang&lt;br /&gt;
		if lang then&lt;br /&gt;
			unit = mw.wikibase.getLabelByLang(entity, lang)&lt;br /&gt;
			valueLang = lang&lt;br /&gt;
		else&lt;br /&gt;
			unit, valueLang = mw.wikibase.getLabelWithLang(entity)&lt;br /&gt;
		end&lt;br /&gt;
		return datavalue.value.amount .. &amp;#039; &amp;#039; .. datavalue.value.unit, valueLang&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.value(entity, property)&lt;br /&gt;
	local statements = p.statements(entity, property)&lt;br /&gt;
	if not statements then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return p.valueByStatement(statements[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.text(entity, property, lang)&lt;br /&gt;
	local statements = p.statements(entity, property)&lt;br /&gt;
	if not statements then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return p.textByStatement(statements[1], lang)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.valueByQualifier(entity, property, qualifier, qualifierValue)&lt;br /&gt;
	local statements = p.statements(entity, property)&lt;br /&gt;
	if not statements then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, statement in ipairs(statements) do&lt;br /&gt;
		if statement.mainsnak and statement.qualifiers then&lt;br /&gt;
			local currQualifiers = statement.qualifiers[qualifier]&lt;br /&gt;
			if currQualifiers and currQualifiers[1] then&lt;br /&gt;
				local currQualifier = currQualifiers[1]&lt;br /&gt;
				local value = p.valueBySnak(currQualifier)&lt;br /&gt;
				if value == qualifierValue then&lt;br /&gt;
					return p.valueByStatement(statement)&lt;br /&gt;
				end&lt;br /&gt;
			end&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.tryFilterSnaksByLang(snaks, lang)&lt;br /&gt;
	if not lang then&lt;br /&gt;
		lang = defaultLang&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local suitableValueInCurrLang = {}&lt;br /&gt;
	local suitableValueInFallbackLang = {}&lt;br /&gt;
	local suitableValue = {}&lt;br /&gt;
	for _, snak in ipairs(snaks) do&lt;br /&gt;
		local datavalue = snak.datavalue&lt;br /&gt;
		if datavalue.type == &amp;#039;monolingualtext&amp;#039; then&lt;br /&gt;
			if datavalue.value.language == lang then&lt;br /&gt;
				table.insert(suitableValue, snak)&lt;br /&gt;
			elseif not suitableValueInCurrLang then&lt;br /&gt;
				if datavalue.value.language == fallbackLang then&lt;br /&gt;
					table.insert(suitableValueInCurrLang, snak)&lt;br /&gt;
				end&lt;br /&gt;
			elseif not suitableValueInFallbackLang then&lt;br /&gt;
				if datavalue.value.language == fallbackLang then&lt;br /&gt;
					table.insert(suitableValueInFallbackLang, snak)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		elseif datavalue.type == &amp;#039;string&amp;#039; and not suitableValue then&lt;br /&gt;
			table.insert(suitableValue, snak)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	if next(suitableValue) ~= nil then&lt;br /&gt;
		return suitableValue&lt;br /&gt;
	elseif next(suitableValueInCurrLang) ~= nil then&lt;br /&gt;
		return suitableValueInCurrLang&lt;br /&gt;
	elseif next(suitableValueInFallbackLang) ~= nil then&lt;br /&gt;
		return suitableValueInFallbackLang&lt;br /&gt;
	else&lt;br /&gt;
		return snaks&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.tryFilterStatementsByLang(statements, lang, forceLang)&lt;br /&gt;
	if not lang then&lt;br /&gt;
		lang = defaultLang&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local suitableValueInCurrLang = {}&lt;br /&gt;
	local suitableValueInFallbackLang = {}&lt;br /&gt;
	local suitableValue = {}&lt;br /&gt;
	for _, statement in ipairs(statements) do&lt;br /&gt;
		local datavalue = statement.mainsnak.datavalue&lt;br /&gt;
		if datavalue.type == &amp;#039;monolingualtext&amp;#039; then&lt;br /&gt;
			if datavalue.value.language == lang then&lt;br /&gt;
				table.insert(suitableValue, statement)&lt;br /&gt;
			elseif not forceLang then&lt;br /&gt;
				if not suitableValueInCurrLang then&lt;br /&gt;
					if datavalue.value.language == fallbackLang then&lt;br /&gt;
						table.insert(suitableValueInCurrLang, statement)&lt;br /&gt;
					end&lt;br /&gt;
				elseif not suitableValueInFallbackLang then&lt;br /&gt;
					if datavalue.value.language == fallbackLang then&lt;br /&gt;
						table.insert(suitableValueInFallbackLang, statement)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		elseif datavalue.type == &amp;#039;string&amp;#039; and not suitableValue then&lt;br /&gt;
			table.insert(suitableValue, statement)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	if next(suitableValue) ~= nil then&lt;br /&gt;
		return suitableValue&lt;br /&gt;
	elseif next(suitableValueInCurrLang) ~= nil then&lt;br /&gt;
		return suitableValueInCurrLang&lt;br /&gt;
	elseif next(suitableValueInFallbackLang) ~= nil then&lt;br /&gt;
		return suitableValueInFallbackLang&lt;br /&gt;
	elseif not forceLang then&lt;br /&gt;
		return statements&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.filterStatementsByUnit(statements, unit)&lt;br /&gt;
	local filteredStatements = {}&lt;br /&gt;
	for _, statement in ipairs(statements) do&lt;br /&gt;
		local snak = statement.mainsnak&lt;br /&gt;
		if snak then&lt;br /&gt;
			local datavalue = snak.datavalue&lt;br /&gt;
			if datavalue and datavalue.type == &amp;#039;quantity&amp;#039; then&lt;br /&gt;
				local currUnit = datavalue.value.unit&lt;br /&gt;
				if currUnit then&lt;br /&gt;
					currUnit = currUnit:match(&amp;#039;^.*/([^/]+)&amp;#039;)&lt;br /&gt;
					if currUnit == unit then&lt;br /&gt;
						table.insert(filteredStatements, statement)&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 next(filteredStatements) == nil then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return filteredStatements&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.tryTextByLang(entity, property, lang)&lt;br /&gt;
	local statements = p.statements(entity, property)&lt;br /&gt;
	if not statements then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	statements = p.tryFilterStatementsByLang(statements, lang, false)&lt;br /&gt;
	return p.textByStatement(statements[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.textByLang(entity, property, lang)&lt;br /&gt;
	local statements = p.statements(entity, property)&lt;br /&gt;
	if not statements then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	statements = p.tryFilterStatementsByLang(statements, lang, true)&lt;br /&gt;
	if not statements then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return p.textByStatement(statements[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.searchStatementByValue(statements, value)&lt;br /&gt;
	for _, statement in ipairs(statements) do&lt;br /&gt;
		local datavalue = statement.mainsnak.datavalue&lt;br /&gt;
		if datavalue.type == &amp;#039;string&amp;#039; then&lt;br /&gt;
			if datavalue.value == value then&lt;br /&gt;
				return statement&lt;br /&gt;
			end&lt;br /&gt;
		elseif datavalue.type == &amp;#039;monolingualtext&amp;#039; then&lt;br /&gt;
			if datavalue.value.text == value then&lt;br /&gt;
				return statement&lt;br /&gt;
			end&lt;br /&gt;
		elseif datavalue.type == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
			if datavalue.value.id == value then&lt;br /&gt;
				return statement&lt;br /&gt;
			end&lt;br /&gt;
		elseif datavalue.type == &amp;#039;quantity&amp;#039; then&lt;br /&gt;
			if tonumber(datavalue.value.amount) == value then&lt;br /&gt;
				return statement&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.statementByValue(entity, property, value)&lt;br /&gt;
	local statements = p.statements(entity, property)&lt;br /&gt;
	if not statements then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return p.searchStatementByValue(statements, value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.statementQualifier(statement, quailiferProperty)&lt;br /&gt;
	if not statement.qualifiers then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local qualifiers = statement.qualifiers[quailiferProperty]&lt;br /&gt;
	if not qualifiers then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return p.valueBySnak(qualifiers[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.resolveParent(entity)&lt;br /&gt;
	local statements = p.statements(entity, p.P_EDITION_FOR)&lt;br /&gt;
	if not statements then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local datavalue = statements[1].mainsnak.datavalue&lt;br /&gt;
	if datavalue.type == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
		return datavalue.value.id&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Get a wikilink to a page describing the given Wikidata entity&lt;br /&gt;
-- The function returns a wikilink to a page corresponding to the Wikidata&lt;br /&gt;
-- entity. The Wikilink will lead to the page in the local wiki project.&lt;br /&gt;
-- If the text of the wikilink is not specified, then the label&lt;br /&gt;
-- of the Wikidata entity will be used.&lt;br /&gt;
-- @param entity The QID of the Wikidata entity.&lt;br /&gt;
-- @text text The text of the resulting wikilink (optional).&lt;br /&gt;
-- @returns The code of the resulting Wikilink.&lt;br /&gt;
-- &lt;br /&gt;
function p.wikilink(entity, text)&lt;br /&gt;
	local title = mw.wikibase.getSitelink(entity)&lt;br /&gt;
	if not title then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local wikilink&lt;br /&gt;
	if text and text ~= title then&lt;br /&gt;
		wikilink = &amp;#039;[[&amp;#039; .. title .. &amp;#039;|&amp;#039; .. text .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		wikilink = &amp;#039;[[&amp;#039; .. title .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return wikilink, entity&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Converts Wikidata snak data value containing a date to a date struct&lt;br /&gt;
-- The function returns a struct with fields corresponding to the year, month,&lt;br /&gt;
-- day of the month, hour, minute and second of the date specified with respect&lt;br /&gt;
-- to the precision of the snak data value date.&lt;br /&gt;
-- If the Wikidata snak data value type is not the date type then the function&lt;br /&gt;
-- returns nil. &lt;br /&gt;
-- @param datavalue A Wikidata snak data value of the date type.&lt;br /&gt;
-- @returns The date in struct format or nil.&lt;br /&gt;
-- &lt;br /&gt;
function p.dateFromDatavalue(datavalue)&lt;br /&gt;
	if datavalue.type ~= &amp;#039;time&amp;#039; then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local precision = datavalue.value.precision&lt;br /&gt;
&lt;br /&gt;
	local date = {}&lt;br /&gt;
	date.timestamp = datavalue.value.time&lt;br /&gt;
	local sign&lt;br /&gt;
	sign, date.year, date.month, date.day, date.hour, date.minute, date.second = string.match(date.timestamp, &amp;#039;([+-])(%d+)-(%d+)-(%d+)T(%d+):(%d+):(%d+)&amp;#039;)&lt;br /&gt;
	date.year = tonumber(date.year)&lt;br /&gt;
	date.month = tonumber(date.month)&lt;br /&gt;
	date.day = tonumber(date.day)&lt;br /&gt;
	date.hour = tonumber(date.hour)&lt;br /&gt;
	date.minute = tonumber(date.minute)&lt;br /&gt;
	date.second = tonumber(date.second)&lt;br /&gt;
	if sign == &amp;#039;-&amp;#039; then&lt;br /&gt;
		date.year = -date.year&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if precision &amp;lt; 14 then&lt;br /&gt;
		date.second = nil&lt;br /&gt;
	end&lt;br /&gt;
	if precision &amp;lt; 13 then&lt;br /&gt;
		date.minute = nil&lt;br /&gt;
	end&lt;br /&gt;
	if precision &amp;lt; 12 then&lt;br /&gt;
		date.hour = nil&lt;br /&gt;
	end&lt;br /&gt;
	if precision &amp;lt; 11 then&lt;br /&gt;
		date.day = nil&lt;br /&gt;
	end&lt;br /&gt;
	if precision &amp;lt; 10 then&lt;br /&gt;
		date.month = nil&lt;br /&gt;
	end&lt;br /&gt;
	if precision == 8 then&lt;br /&gt;
		date.decade = date.year&lt;br /&gt;
	end&lt;br /&gt;
	if precision == 7 then&lt;br /&gt;
		date.century = date.year / 100&lt;br /&gt;
	end&lt;br /&gt;
	if precision == 6 then&lt;br /&gt;
		date.millenium = date.year / 1000&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return date&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.dateToStr(date, lang)&lt;br /&gt;
	local langObj = mw.getLanguage(lang)&lt;br /&gt;
	if date.second then&lt;br /&gt;
		return langObj:formatDate(&amp;#039;d xg Y H:i:s&amp;#039;, date.timestamp)&lt;br /&gt;
	elseif date.minute then&lt;br /&gt;
		return langObj:formatDate(&amp;#039;d xg Y H:i&amp;#039;, date.timestamp)&lt;br /&gt;
	elseif date.hour then&lt;br /&gt;
		return langObj:formatDate(&amp;#039;d xg Y H:00&amp;#039;, date.timestamp)&lt;br /&gt;
	elseif date.day then&lt;br /&gt;
		return langObj:formatDate(&amp;#039;d xg Y&amp;#039;, date.timestamp)&lt;br /&gt;
	elseif date.month then&lt;br /&gt;
		return langObj:formatDate(&amp;#039;F Y&amp;#039;, date.timestamp)&lt;br /&gt;
	elseif date.year then&lt;br /&gt;
		return langObj:formatDate(&amp;#039;Y&amp;#039;, date.timestamp)&lt;br /&gt;
	end&lt;br /&gt;
	return date.timestamp&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.instanceOf(entity, property, ofEntities)&lt;br /&gt;
	local statements = p.statements(entity, property)&lt;br /&gt;
	if not statements then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for i=1, table.getn(statements) do&lt;br /&gt;
		local statement = statements[i]&lt;br /&gt;
		if statement.mainsnak then&lt;br /&gt;
			local datavalue = statement.mainsnak.datavalue&lt;br /&gt;
			if datavalue and datavalue.type == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
				local currEntity = datavalue.value.id&lt;br /&gt;
				for j=1, table.getn(ofEntities) do&lt;br /&gt;
					if currEntity == ofEntities[i] then&lt;br /&gt;
						return currEntity&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;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.dataBySnak(snak, lang, cache)&lt;br /&gt;
	local datavalue = snak.datavalue&lt;br /&gt;
	if not datavalue then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local data = {}&lt;br /&gt;
&lt;br /&gt;
	if datavalue.type == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
		data.entity = datavalue.value.id&lt;br /&gt;
		if lang then&lt;br /&gt;
			local cachedFound = false&lt;br /&gt;
			if cache then&lt;br /&gt;
				local cached = cache[data.entity]&lt;br /&gt;
				if cached and cached.label then&lt;br /&gt;
					local label = cached.label[self.lang]&lt;br /&gt;
					if label then&lt;br /&gt;
						cachedFound = true&lt;br /&gt;
						data.value = label&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if not cachedFound then&lt;br /&gt;
				data.value = mw.wikibase.getLabelByLang(data.entity, lang)&lt;br /&gt;
			end&lt;br /&gt;
			data.lang = lang&lt;br /&gt;
			data.fromLabel = true&lt;br /&gt;
		else&lt;br /&gt;
			data.value, data.lang = mw.wikibase.getLabelWithLang(data.entity)&lt;br /&gt;
			data.fromLabel = true&lt;br /&gt;
		end&lt;br /&gt;
	elseif datavalue.type == &amp;#039;monolingualtext&amp;#039; then&lt;br /&gt;
		data.value = datavalue.value.text&lt;br /&gt;
		data.lang = datavalue.value.language&lt;br /&gt;
	elseif datavalue.type == &amp;#039;time&amp;#039; then&lt;br /&gt;
		data.value = p.dateFromDatavalue(datavalue)&lt;br /&gt;
	elseif datavalue.type == &amp;#039;quantity&amp;#039; then&lt;br /&gt;
		data.value = tonumber(datavalue.value.amount)&lt;br /&gt;
		data.unitEntity = datavalue.value.unit&lt;br /&gt;
		if data.unitEntity then&lt;br /&gt;
			data.unitEntity = data.unitEntity:match(&amp;#039;^.*/([^/]+)&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		data.value = datavalue.value&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.dataByStatement(statement, lang, cache, novalueQualifier)&lt;br /&gt;
	local snak = statement.mainsnak&lt;br /&gt;
	if not snak then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if not snak.datavalue then&lt;br /&gt;
		if not novalueQualifier then&lt;br /&gt;
			novalueQualifier = p.P_OBJ_NAMED_AS&lt;br /&gt;
		end&lt;br /&gt;
		if statement.qualifiers then&lt;br /&gt;
			local qualifierSnaks = statement.qualifiers[novalueQualifier]&lt;br /&gt;
			if qualifierSnaks then&lt;br /&gt;
				return p.dataBySnak(qualifierSnaks[1], lang, cache)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return p.dataBySnak(snak, lang, cache)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.dataByEntity(entity, lang, cache)&lt;br /&gt;
	local value, valueLang&lt;br /&gt;
	if lang then&lt;br /&gt;
		local cachedFound = false&lt;br /&gt;
		if cache then&lt;br /&gt;
			local cached = cache[entity]&lt;br /&gt;
			if cached and cached.label then&lt;br /&gt;
				local label = cached.label[lang]&lt;br /&gt;
				if label then&lt;br /&gt;
					cachedFound = true&lt;br /&gt;
					value = label&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if not cachedFound then&lt;br /&gt;
			value = mw.wikibase.getLabelByLang(entity, lang)&lt;br /&gt;
		end&lt;br /&gt;
		valueLang = lang&lt;br /&gt;
	else&lt;br /&gt;
		value, valueLang = mw.wikibase.getLabelWithLang(entity)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return { value = value, lang = valueLang, entity = entity, fromLabel = true }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Буквица&gt;The Fox Bot</name></author>
	</entry>
</feed>