<?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%3AWikidataChart</id>
	<title>Модуль:WikidataChart - История изменений</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%3AWikidataChart"/>
	<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:WikidataChart&amp;action=history"/>
	<updated>2026-06-02T21:43:58Z</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:WikidataChart&amp;diff=238407&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:WikidataChart&amp;diff=238407&amp;oldid=prev"/>
		<updated>2025-07-27T15:36:27Z</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-238406:rev-238407 --&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:WikidataChart&amp;diff=238406&amp;oldid=prev</id>
		<title>Буквица&gt;Oleg Yunakov: Защитил страницу Модуль:WikidataChart: критический шаблон или модуль: https://ru.wikipedia.org/w/index.php?title=Википедия%3AУстановка_защиты&amp;type=revision&amp;diff=117522735&amp;oldid=117513789 ([Редактирование=только автоподтверждённые] (бессрочно) [Переименование=только автоподтверждённые] (бессрочно))</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:WikidataChart&amp;diff=238406&amp;oldid=prev"/>
		<updated>2021-10-31T02:12:10Z</updated>

		<summary type="html">&lt;p&gt;Защитил страницу &lt;a href=&quot;/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:WikidataChart&quot; title=&quot;Модуль:WikidataChart&quot;&gt;Модуль:WikidataChart&lt;/a&gt;: критический шаблон или модуль: https://ru.wikipedia.org/w/index.php?title=Википедия%3AУстановка_защиты&amp;amp;type=revision&amp;amp;diff=117522735&amp;amp;oldid=117513789 ([Редактирование=только автоподтверждённые] (бессрочно) [Переименование=только автоподтверждённые] (бессрочно))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local graph = require(&amp;quot;Модуль:Graph&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.plot(frame)&lt;br /&gt;
	local property = frame.args[1] or error(&amp;quot;Wikidata property to chart required&amp;quot;)&lt;br /&gt;
	local xQualifier = frame.args[2] or error(&amp;quot;Wikidata qualifier for x axis required&amp;quot;)&lt;br /&gt;
	local yIds = mw.text.split(frame.args[&amp;quot;pageIds&amp;quot;] or &amp;quot;&amp;quot;, &amp;quot;,&amp;quot;, true)&lt;br /&gt;
	local xStart = frame.args[&amp;quot;xStart&amp;quot;]&lt;br /&gt;
	local xEnd = frame.args[&amp;quot;xEnd&amp;quot;]&lt;br /&gt;
	local precision = tonumber(frame.args[&amp;quot;precision&amp;quot;])&lt;br /&gt;
	&lt;br /&gt;
	-- собрать данные&lt;br /&gt;
	local series = { captions = {}, points = {} }&lt;br /&gt;
	for seriesIdx, id in ipairs(yIds) do&lt;br /&gt;
		if id == &amp;quot;&amp;quot; then id = nil end&lt;br /&gt;
		local entity = mw.wikibase.getEntity(id)&lt;br /&gt;
		&lt;br /&gt;
		local labels = entity.labels or {}&lt;br /&gt;
		series.captions[seriesIdx] = (labels.ru or labels.en or {}).value or id&lt;br /&gt;
&lt;br /&gt;
		local property = entity.claims[property]&lt;br /&gt;
		for _, item in ipairs(property) do&lt;br /&gt;
			if item.qualifiers and item.qualifiers[xQualifier] and item.qualifiers[xQualifier][1] then&lt;br /&gt;
				local qualifier = item.qualifiers[xQualifier][1]&lt;br /&gt;
				if qualifier.snaktype ~= &amp;quot;value&amp;quot; or qualifier.datatype ~= &amp;quot;time&amp;quot; then&lt;br /&gt;
					error(&amp;quot;&amp;#039;xQualifier&amp;#039; parameter must be a time&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				local x = applyPrecision(mw.text.trim(qualifier.datavalue.value.time, &amp;quot;+&amp;quot;), precision)&lt;br /&gt;
				&lt;br /&gt;
				if (not xStart or x &amp;gt;= xStart) and (not xEnd or string.sub(x, 1, #xEnd) &amp;lt;= xEnd) and qualifier.datavalue.value.precision &amp;gt;= (precision or 0) then&lt;br /&gt;
					local mainsnak = item.mainsnak&lt;br /&gt;
					if mainsnak.snaktype ~= &amp;quot;value&amp;quot; or mainsnak.datatype ~= &amp;quot;quantity&amp;quot; then&lt;br /&gt;
						error(&amp;quot;&amp;#039;property&amp;#039; parameter must be numeric&amp;quot;)&lt;br /&gt;
					end&lt;br /&gt;
					local y = tonumber(mainsnak.datavalue.value.amount)&lt;br /&gt;
	&lt;br /&gt;
					if not series.points[x] then series.points[x] = {} end&lt;br /&gt;
					series.points[x][seriesIdx] = y&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- сортировать значения x&lt;br /&gt;
	local xValues = {}&lt;br /&gt;
	for k in pairs(series.points) do table.insert(xValues, k) end&lt;br /&gt;
	table.sort(xValues)&lt;br /&gt;
&lt;br /&gt;
	local chartArgs =&lt;br /&gt;
	{&lt;br /&gt;
		type = &amp;quot;line&amp;quot;,&lt;br /&gt;
		xType = &amp;quot;date&amp;quot;,&lt;br /&gt;
		xAxisTitle = mw.wikibase.label(xQualifier),&lt;br /&gt;
		x = table.concat(xValues, &amp;quot;,&amp;quot;),&lt;br /&gt;
		yType = &amp;quot;number&amp;quot;,&lt;br /&gt;
		yAxisTitle = mw.wikibase.label(property)&lt;br /&gt;
	}&lt;br /&gt;
	-- Legenden/Reihentitel setzen&lt;br /&gt;
	for seriesIdx, caption in ipairs(series.captions) do&lt;br /&gt;
		chartArgs[&amp;quot;y&amp;quot; .. seriesIdx] = &amp;quot;&amp;quot;&lt;br /&gt;
		chartArgs[&amp;quot;y&amp;quot; .. seriesIdx .. &amp;quot;Title&amp;quot;] = caption&lt;br /&gt;
	end&lt;br /&gt;
	-- установить значения&lt;br /&gt;
	local seriesCount = #series.captions&lt;br /&gt;
	for _, x in ipairs(xValues) do&lt;br /&gt;
		yValues = series.points[x]&lt;br /&gt;
		for seriesIdx = 1, seriesCount do&lt;br /&gt;
			chartArgs[&amp;quot;y&amp;quot; .. seriesIdx] = chartArgs[&amp;quot;y&amp;quot; .. seriesIdx] .. &amp;quot;,&amp;quot; .. (yValues[seriesIdx] or &amp;quot;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- удалить разделители в начале&lt;br /&gt;
	for seriesIdx, _ in ipairs(series.captions) do&lt;br /&gt;
		chartArgs[&amp;quot;y&amp;quot; .. seriesIdx] = mw.ustring.sub(chartArgs[&amp;quot;y&amp;quot; .. seriesIdx], 2)&lt;br /&gt;
	end&lt;br /&gt;
	-- передать параметры диаграммы (все параметры, начинающиеся с chart_, передаются непосредственно в модуль графа без префикса)&lt;br /&gt;
	for k, v in pairs(frame.args) do&lt;br /&gt;
		local chartParam = string.match(k, &amp;quot;^chart_(.+)&amp;quot;)&lt;br /&gt;
		if chartParam then chartArgs[chartParam] = v end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return graph.chart({ args = chartArgs })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.plotWrapper(frame)&lt;br /&gt;
	return p.plot(frame:getParent())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function applyPrecision(date, precision)&lt;br /&gt;
	if not precision then precision = math.huge end&lt;br /&gt;
&lt;br /&gt;
	local _, _, year, month, day, hour, minute, second, timezone = string.find(date, &amp;quot;^(.?%d+)-(%d+)-(%d+)T(%d+):(%d+):(%d+)(.+)$&amp;quot;)&lt;br /&gt;
	if precision &amp;lt; 14 then second = &amp;quot;00&amp;quot; end&lt;br /&gt;
	if precision &amp;lt; 13 then minute = &amp;quot;00&amp;quot; end&lt;br /&gt;
	if precision &amp;lt; 12 then hour = &amp;quot;00&amp;quot; end&lt;br /&gt;
	if precision &amp;lt; 11 or day == &amp;quot;00&amp;quot; then day = &amp;quot;01&amp;quot; end&lt;br /&gt;
	if precision &amp;lt; 10 or month == &amp;quot;00&amp;quot; then month = &amp;quot;01&amp;quot; end&lt;br /&gt;
	return year .. &amp;quot;-&amp;quot; .. month .. &amp;quot;-&amp;quot; .. day .. &amp;quot;T&amp;quot; .. hour .. &amp;quot;:&amp;quot; .. minute .. &amp;quot;:&amp;quot; .. second .. timezone&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>