<?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%2Fchronology</id>
	<title>Модуль:Wikidata/chronology - История изменений</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%2Fchronology"/>
	<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/chronology&amp;action=history"/>
	<updated>2026-04-27T18:40:23Z</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/chronology&amp;diff=238415&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/chronology&amp;diff=238415&amp;oldid=prev"/>
		<updated>2025-07-27T15:36:29Z</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-238414:rev-238415 --&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/chronology&amp;diff=238414&amp;oldid=prev</id>
		<title>Буквица&gt;Oleg Yunakov: Защитил страницу Модуль:Wikidata/chronology: критический шаблон или модуль: https://ru.wikipedia.org/w/index.php?title=Википедия:Установка_защиты&amp;oldid=117401039#Шаблоны ([Редактирование=администраторы и инженеры] (бессрочно) [Переименование=администраторы и инженеры] (бессрочно))</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/chronology&amp;diff=238414&amp;oldid=prev"/>
		<updated>2021-10-24T16:22:28Z</updated>

		<summary type="html">&lt;p&gt;Защитил страницу &lt;a href=&quot;/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Wikidata/chronology&quot; title=&quot;Модуль:Wikidata/chronology&quot;&gt;Модуль:Wikidata/chronology&lt;/a&gt;: критический шаблон или модуль: https://ru.wikipedia.org/w/index.php?title=Википедия:Установка_защиты&amp;amp;oldid=117401039#Шаблоны ([Редактирование=администраторы и инженеры] (бессрочно) [Переименование=администраторы и инженеры] (бессрочно))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {} -- p stands for package&lt;br /&gt;
&lt;br /&gt;
-- technical functions for takeAdjacentNumbersFromStrings&lt;br /&gt;
function isYear(number) -- TODO: settings not hardcoded&lt;br /&gt;
	return number &amp;gt;= 1800 and number &amp;lt;= 2100&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function isAr(number)&lt;br /&gt;
	return number &amp;gt;= 0 and number &amp;lt; 100&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function notTooFar(number1, number2, maximalPeriod)&lt;br /&gt;
	return number2 - number1 &amp;gt; 0 and number2 - number1 &amp;lt;= maximalPeriod&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- takes two strings and returns either two substrings that form the only difference between them or nil&lt;br /&gt;
-- considers several possible formats of substrings given in options.formats&lt;br /&gt;
function takeAdjacentNumbersFromStrings(options, string1, string2)&lt;br /&gt;
	if type(string1) == &amp;#039;string&amp;#039; and type(string2) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		local formats = options.formats or &amp;#039;&amp;#039; -- TODO: not repeat with properties&lt;br /&gt;
		if formats == &amp;#039;&amp;#039; then&lt;br /&gt;
			formats = &amp;#039;year, year/ar, year/year&amp;#039;&lt;br /&gt;
		elseif formats == &amp;#039;-&amp;#039; then&lt;br /&gt;
			formats = &amp;#039;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		local formats = mw.text.split(formats, &amp;#039;, ?&amp;#039;)&lt;br /&gt;
		&lt;br /&gt;
		local line = &amp;#039;!&amp;#039; .. string1 .. &amp;#039;!!&amp;#039; .. string2.. &amp;#039;!&amp;#039; -- -- TODO: without hacks&lt;br /&gt;
		local maximalPeriod = tonumber(options.maximalPeriod) or 5 -- TODO: here or in main function?&lt;br /&gt;
		&lt;br /&gt;
		for _, format in pairs(formats) do&lt;br /&gt;
			if format == &amp;#039;year&amp;#039; or format == &amp;#039;number&amp;#039; then&lt;br /&gt;
				local match = {mw.ustring.match(line, &amp;#039;^(.*%D)(%d+)(%D.*)%1(%d+)%3$&amp;#039;)}&lt;br /&gt;
				if #match &amp;gt; 0 then&lt;br /&gt;
					local number1 = tonumber(match[2])&lt;br /&gt;
					local number2 = tonumber(match[4])&lt;br /&gt;
					&lt;br /&gt;
					if notTooFar(number1, number2, maximalPeriod) then&lt;br /&gt;
						if (format == &amp;#039;year&amp;#039; and isYear(number1) and isYear(number2))&lt;br /&gt;
							or (format == &amp;#039;number&amp;#039;)&lt;br /&gt;
						then&lt;br /&gt;
							return {number1, number2}&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			elseif format == &amp;#039;year/ar&amp;#039; or format == &amp;#039;year/year&amp;#039; then&lt;br /&gt;
				local match = {mw.ustring.match(line, &amp;#039;^(.*%D)((%d+)[-–\/](%d+))(%D.*)%1((%d+)\/(%d+))%5$&amp;#039;)}&lt;br /&gt;
				if #match &amp;gt; 0 then&lt;br /&gt;
					local period1 = match[2]&lt;br /&gt;
					local period1_start = tonumber(match[3])&lt;br /&gt;
					local period1_end = tonumber(match[4])&lt;br /&gt;
					local period2 = match[6]&lt;br /&gt;
					local period2_start = tonumber(match[7])&lt;br /&gt;
					local period2_end = tonumber(match[8])&lt;br /&gt;
					&lt;br /&gt;
					if notTooFar(period1_start, period2_start, maximalPeriod) and isYear(period1_start) and isYear(period2_start)&lt;br /&gt;
						and period2_start - period1_start == period2_end - period1_end&lt;br /&gt;
					then&lt;br /&gt;
						if (format == &amp;#039;year/ar&amp;#039; and isAr(period1_end) and isAr(period2_end))&lt;br /&gt;
							or (format == &amp;#039;year/year&amp;#039; and isYear(period1_end) and isYear(period2_end))&lt;br /&gt;
						then&lt;br /&gt;
							return {period1, period2}&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;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- takes two Wikidata entities and returns either two strings or nil&lt;br /&gt;
-- considers sitelinks and labels in the local langauge and in English&lt;br /&gt;
function takeAdjacentNumbersFromEntities(options, entity1, entity2)&lt;br /&gt;
	if entity1 and entity2 then&lt;br /&gt;
		local adjacentNumbers = nil&lt;br /&gt;
		&lt;br /&gt;
		local languageCodes = {mw.getContentLanguage():getCode(), &amp;#039;en&amp;#039;}&lt;br /&gt;
		for _, languageCode in pairs(languageCodes) do&lt;br /&gt;
			local wikiCode = languageCode .. &amp;#039;wiki&amp;#039;&lt;br /&gt;
			local sitelink1 = entity1:getSitelink(wikiCode)&lt;br /&gt;
			local sitelink2 = entity2:getSitelink(wikiCode)&lt;br /&gt;
			adjacentNumbers = takeAdjacentNumbersFromStrings(options, sitelink1, sitelink2)&lt;br /&gt;
			if adjacentNumbers then&lt;br /&gt;
				return adjacentNumbers&lt;br /&gt;
			end&lt;br /&gt;
		&lt;br /&gt;
			local label1 = entity1:getLabel(languageCode) -- TODO: get rid of fallback?&lt;br /&gt;
			local label2 = entity2:getLabel(languageCode)&lt;br /&gt;
			adjacentNumbers = takeAdjacentNumbersFromStrings(options, label1, label2)&lt;br /&gt;
			if adjacentNumbers then&lt;br /&gt;
				return adjacentNumbers&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 formatAdjacentSnak(context, options, snak)&lt;br /&gt;
	local direction = options.direction or &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	if snak and snak.datavalue and snak.datavalue.value and snak.datavalue.value.id then&lt;br /&gt;
		local mainText = nil&lt;br /&gt;
		&lt;br /&gt;
		local adjacentEntity = mw.wikibase.getEntity(snak.datavalue.value.id)&lt;br /&gt;
		if direction == &amp;#039;P155&amp;#039; then -- previous&lt;br /&gt;
			local adjacentNumbers = takeAdjacentNumbersFromEntities(options, adjacentEntity, options.entity) -- or reverse order&lt;br /&gt;
			if adjacentNumbers then&lt;br /&gt;
				mainText = adjacentNumbers[1] -- or 2&lt;br /&gt;
			end&lt;br /&gt;
		elseif direction == &amp;#039;P156&amp;#039; then -- next&lt;br /&gt;
			local adjacentNumbers = takeAdjacentNumbersFromEntities(options, options.entity, adjacentEntity)&lt;br /&gt;
			if adjacentNumbers then&lt;br /&gt;
				mainText = adjacentNumbers[2]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- options should not be changed, as they are reused for P155 and P156&lt;br /&gt;
		local optionsCopy = {}&lt;br /&gt;
		for k, v in pairs(options) do&lt;br /&gt;
			optionsCopy[k] = v&lt;br /&gt;
		end&lt;br /&gt;
		if (not optionsCopy.text) and mainText then&lt;br /&gt;
			local prefix = options.prefix or &amp;#039;&amp;#039;&lt;br /&gt;
			local postfix = options.postfix or &amp;#039;&amp;#039;&lt;br /&gt;
			optionsCopy.text = prefix .. mainText .. postfix&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local link = context.formatSnak(optionsCopy, snak)&lt;br /&gt;
		if mainText or (options.formats and options.formats == &amp;#039;-&amp;#039;) then&lt;br /&gt;
			return link&lt;br /&gt;
		else&lt;br /&gt;
			return link .. &amp;#039;[[Категория:Википедия:Статьи с несокращаемой хронологией]]&amp;#039;&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 is available from outside, see documentation&lt;br /&gt;
function p.formatAdjacentProperty(context, options)&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;
&lt;br /&gt;
	if options.value == &amp;#039;-&amp;#039; then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if options.value then&lt;br /&gt;
		return options.value&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local properties = options.property or &amp;#039;&amp;#039; -- TODO: properties vs. property?&lt;br /&gt;
	if properties == &amp;#039;&amp;#039; then&lt;br /&gt;
		properties = &amp;#039;Q&amp;#039;&lt;br /&gt;
	elseif properties == &amp;#039;-&amp;#039; then&lt;br /&gt;
		properties = &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local properties = mw.text.split(properties, &amp;#039;, ?&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	local direction = options.direction or &amp;#039;&amp;#039; -- TODO: not repeating inside&lt;br /&gt;
	&lt;br /&gt;
	local formattedClaims = {}&lt;br /&gt;
&lt;br /&gt;
	for _, property in pairs(properties) do&lt;br /&gt;
		if property == &amp;#039;Q&amp;#039; then&lt;br /&gt;
			local claims = context.selectClaims(options, direction)&lt;br /&gt;
			if claims then&lt;br /&gt;
				for _, claim in pairs(claims) do&lt;br /&gt;
					if claim.mainsnak then&lt;br /&gt;
						local link = formatAdjacentSnak(context, options, claim.mainsnak)&lt;br /&gt;
						if link and link ~= &amp;#039;&amp;#039; then&lt;br /&gt;
							local formattedClaim = &amp;#039;&amp;lt;span class=&amp;quot;wikidata-claim&amp;quot; data-wikidata-property-id=&amp;quot;&amp;#039; .. direction .. &amp;#039;&amp;quot; data-wikidata-claim-id=&amp;quot;&amp;#039; .. claim.id .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. link .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
							table.insert(formattedClaims, formattedClaim)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		elseif mw.ustring.match(property, &amp;#039;^P%d+$&amp;#039;) then&lt;br /&gt;
			local claims = context.selectClaims(options, property)&lt;br /&gt;
			if claims then&lt;br /&gt;
				for _, claim in pairs(claims) do&lt;br /&gt;
					if claim.qualifiers and claim.qualifiers[direction] then&lt;br /&gt;
						for _, snak in pairs(claim.qualifiers[direction]) do&lt;br /&gt;
							local link = formatAdjacentSnak(context, options, snak)&lt;br /&gt;
							if link and link ~= &amp;#039;&amp;#039; then&lt;br /&gt;
								local formattedClaim = &amp;#039;&amp;lt;span class=&amp;quot;wikidata-claim&amp;quot; data-wikidata-property-id=&amp;quot;&amp;#039; .. property .. &amp;#039;&amp;quot; data-wikidata-claim-id=&amp;quot;&amp;#039; .. claim.id .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. link .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
								table.insert(formattedClaims, formattedClaim)&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;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- from wikidata.selectClaims&lt;br /&gt;
	if options.limit and options.limit ~= &amp;#039;&amp;#039; and options.limit ~= &amp;#039;-&amp;#039;  then&lt;br /&gt;
		local limit = tonumber(options.limit, 10);&lt;br /&gt;
		while #formattedClaims &amp;gt; limit do&lt;br /&gt;
			table.remove(formattedClaims);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- from wikidata.formatPropertyDefault&lt;br /&gt;
	local out = mw.text.listToText(formattedClaims, options.separator, options.conjunction)&lt;br /&gt;
	if out ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		if options.before then&lt;br /&gt;
			out = options.before .. out&lt;br /&gt;
		end&lt;br /&gt;
		if options.after then&lt;br /&gt;
			out = out .. options.after&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Буквица&gt;Oleg Yunakov</name></author>
	</entry>
</feed>