<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fa">
	<id>https://source.islamical.org/index.php?action=history&amp;feed=atom&amp;title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86%3AHeader%2Fyear</id>
	<title>پودمان:Header/year - تاریخچهٔ نسخه‌ها</title>
	<link rel="self" type="application/atom+xml" href="https://source.islamical.org/index.php?action=history&amp;feed=atom&amp;title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86%3AHeader%2Fyear"/>
	<link rel="alternate" type="text/html" href="https://source.islamical.org/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Header/year&amp;action=history"/>
	<updated>2026-11-10T00:10:51Z</updated>
	<subtitle>تاریخچهٔ نسخه‌ها برای این صفحه در ویکی</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://source.islamical.org/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Header/year&amp;diff=128&amp;oldid=prev</id>
		<title>Mojtabakd: اصلاح فضای نام ناموجود</title>
		<link rel="alternate" type="text/html" href="https://source.islamical.org/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Header/year&amp;diff=128&amp;oldid=prev"/>
		<updated>2026-11-04T00:51:57Z</updated>

		<summary type="html">&lt;p&gt;اصلاح فضای نام ناموجود&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&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;fa&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;نسخهٔ ۴ نوامبر ۲۰۲۶، ساعت ۰۰:۵۱&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l627&quot;&gt;خط ۶۲۷:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;خط ۶۲۷:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			year_args.nocat = (&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			year_args.nocat = (&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				yesno(args.disambiguation) -- disambiguations never categorise&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				yesno(args.disambiguation) -- disambiguations never categorise&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				or not current_title:inNamespaces(0&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;, 114&lt;/del&gt;) -- only categorise in mainspace and Translation&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				or not current_title:inNamespaces(0) -- only categorise in mainspace and Translation&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				or current_title.isSubpage -- only categorise if this is a base page&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				or current_title.isSubpage -- only categorise if this is a base page&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key sourcewiki:diff:1.41:old-126:rev-128:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Mojtabakd</name></author>
	</entry>
	<entry>
		<id>https://source.islamical.org/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Header/year&amp;diff=126&amp;oldid=prev</id>
		<title>Mojtabakd: ایجاد پودمان</title>
		<link rel="alternate" type="text/html" href="https://source.islamical.org/index.php?title=%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:Header/year&amp;diff=126&amp;oldid=prev"/>
		<updated>2026-11-04T00:46:48Z</updated>

		<summary type="html">&lt;p&gt;ایجاد پودمان&lt;/p&gt;
&lt;p&gt;&lt;b&gt;صفحهٔ تازه&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[=[&lt;br /&gt;
Construct the year span&lt;br /&gt;
&lt;br /&gt;
Accepts an optional |calendar= parameter: &amp;#039;Miladi&amp;#039; (Gregorian),&lt;br /&gt;
&amp;#039;Khorshidi&amp;#039; (Solar Hijri, default), or &amp;#039;Qamari&amp;#039; (Lunar Hijri). Only affects&lt;br /&gt;
how a manually-typed |year= is labelled; Wikidata-derived years are always&lt;br /&gt;
forced to Gregorian regardless of this parameter/default, since Wikidata&lt;br /&gt;
only stores proleptic Gregorian dates.&lt;br /&gt;
--]=]&lt;br /&gt;
&lt;br /&gt;
require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {} --p stands for package&lt;br /&gt;
&lt;br /&gt;
local yesno = require(&amp;#039;پودمان:Yesno&amp;#039;)&lt;br /&gt;
local TableTools = require(&amp;#039;پودمان:TableTools&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Year properties:&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
	year = integer,&lt;br /&gt;
	precision = integer,&lt;br /&gt;
	circa = boolean,&lt;br /&gt;
	bce = boolean,&lt;br /&gt;
&lt;br /&gt;
	uncertain = boolean,&lt;br /&gt;
	unknown = boolean,&lt;br /&gt;
	unrecognised = boolean,&lt;br /&gt;
&lt;br /&gt;
	display = string,&lt;br /&gt;
&lt;br /&gt;
	start_year = year,&lt;br /&gt;
	end_year = year,&lt;br /&gt;
	year_list = year&lt;br /&gt;
}&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
--[=[ Precision: &lt;br /&gt;
	0 - billion years&lt;br /&gt;
	1 - hundred million years,&lt;br /&gt;
	2 - ten million years,&lt;br /&gt;
	3 - million years,&lt;br /&gt;
	4 - hundred thousand years,&lt;br /&gt;
	5 - ten thousand years,&lt;br /&gt;
	6 - millenia,&lt;br /&gt;
	7 - centuries,&lt;br /&gt;
	8 - decades,&lt;br /&gt;
	9 - years,&lt;br /&gt;
	10 - months,&lt;br /&gt;
	11 - days&lt;br /&gt;
	12 - hours&lt;br /&gt;
	13 - minutes&lt;br /&gt;
	14 - seconds&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
-- Convert Latin digits to Persian digits; only used for final display&lt;br /&gt;
local function to_persian_digits(n)&lt;br /&gt;
	local digit_map = {&lt;br /&gt;
		[&amp;#039;0&amp;#039;] = &amp;#039;۰&amp;#039;, [&amp;#039;1&amp;#039;] = &amp;#039;۱&amp;#039;, [&amp;#039;2&amp;#039;] = &amp;#039;۲&amp;#039;, [&amp;#039;3&amp;#039;] = &amp;#039;۳&amp;#039;, [&amp;#039;4&amp;#039;] = &amp;#039;۴&amp;#039;,&lt;br /&gt;
		[&amp;#039;5&amp;#039;] = &amp;#039;۵&amp;#039;, [&amp;#039;6&amp;#039;] = &amp;#039;۶&amp;#039;, [&amp;#039;7&amp;#039;] = &amp;#039;۷&amp;#039;, [&amp;#039;8&amp;#039;] = &amp;#039;۸&amp;#039;, [&amp;#039;9&amp;#039;] = &amp;#039;۹&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
	return (tostring(n):gsub(&amp;#039;%d&amp;#039;, digit_map))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Convert Persian digits to Latin digits, so editors who type the year using Persian numerals are also supported&lt;br /&gt;
local function from_persian_digits(str)&lt;br /&gt;
	if not str then&lt;br /&gt;
		return str&lt;br /&gt;
	end&lt;br /&gt;
	local digit_map = {&lt;br /&gt;
		[&amp;#039;۰&amp;#039;] = &amp;#039;0&amp;#039;, [&amp;#039;۱&amp;#039;] = &amp;#039;1&amp;#039;, [&amp;#039;۲&amp;#039;] = &amp;#039;2&amp;#039;, [&amp;#039;۳&amp;#039;] = &amp;#039;3&amp;#039;, [&amp;#039;۴&amp;#039;] = &amp;#039;4&amp;#039;,&lt;br /&gt;
		[&amp;#039;۵&amp;#039;] = &amp;#039;5&amp;#039;, [&amp;#039;۶&amp;#039;] = &amp;#039;6&amp;#039;, [&amp;#039;۷&amp;#039;] = &amp;#039;7&amp;#039;, [&amp;#039;۸&amp;#039;] = &amp;#039;8&amp;#039;, [&amp;#039;۹&amp;#039;] = &amp;#039;9&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
	local result = str&lt;br /&gt;
	for persian, latin in pairs(digit_map) do&lt;br /&gt;
		result = string.gsub(result, persian, latin)&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local currentyear = {&lt;br /&gt;
	year = tonumber(os.date(&amp;#039;%Y&amp;#039;)),&lt;br /&gt;
	precision = 9,&lt;br /&gt;
	circa = false,&lt;br /&gt;
	bce = false,&lt;br /&gt;
	display = to_persian_digits(os.date(&amp;#039;%Y&amp;#039;))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local unknownyear = {&lt;br /&gt;
	unknown = true,&lt;br /&gt;
	display = &amp;#039;نامشخص&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function year_less_than(year1, year2)&lt;br /&gt;
	if year1 == year2 then&lt;br /&gt;
		return false&lt;br /&gt;
	elseif not year1 or not year2 then&lt;br /&gt;
		return year1 == nil&lt;br /&gt;
	elseif year1.bce ~= year2.bce then&lt;br /&gt;
		return year1.bce&lt;br /&gt;
	end&lt;br /&gt;
	if year1.bce then&lt;br /&gt;
		return year1.year &amp;gt; year2.year&lt;br /&gt;
	else&lt;br /&gt;
		return year1.year &amp;lt; year2.year&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function year_greater_than(year1, year2)&lt;br /&gt;
	if year1 == year2 then&lt;br /&gt;
		return false&lt;br /&gt;
	elseif not year1 or not year2 then&lt;br /&gt;
		return year2 == nil&lt;br /&gt;
	elseif year1.bce ~= year2.bce then&lt;br /&gt;
		return year2.bce&lt;br /&gt;
	end&lt;br /&gt;
	if year1.bce then&lt;br /&gt;
		return year1.year &amp;lt; year2.year&lt;br /&gt;
	else&lt;br /&gt;
		return year1.year &amp;gt; year2.year&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function year_equal(year1, year2)&lt;br /&gt;
	if year1 == year2 then&lt;br /&gt;
		return true&lt;br /&gt;
	elseif not year1 or not year2 then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	year1.bce = year2.bce == true&lt;br /&gt;
	year1.bce = year2.bce == true&lt;br /&gt;
	return year1.bce == year2.bce and year1.year == year2.year&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function pad_number(n, pad)&lt;br /&gt;
	n = tostring(n)&lt;br /&gt;
	return string.rep(&amp;#039;0&amp;#039;, pad - string.len(n)) .. n&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Validate the calendar parameter. Returns (normalised_value, was_invalid).&lt;br /&gt;
-- Falls back to Solar Hijri (Khorshidi) if unset, blank, or unrecognised.&lt;br /&gt;
-- Note: Wikidata-derived years always force Gregorian regardless of this default;&lt;br /&gt;
-- see the &amp;#039;effective_calendar&amp;#039; handling in p.construct_year.&lt;br /&gt;
local function normalize_calendar(calendar)&lt;br /&gt;
	local valid_calendars = {&lt;br /&gt;
		[&amp;#039;میلادی&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;خورشیدی&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;قمری&amp;#039;] = true&lt;br /&gt;
	}&lt;br /&gt;
	if not calendar or mw.text.trim(calendar) == &amp;#039;&amp;#039; then&lt;br /&gt;
		return &amp;#039;خورشیدی&amp;#039;, false&lt;br /&gt;
	end&lt;br /&gt;
	calendar = mw.text.trim(calendar)&lt;br /&gt;
	if valid_calendars[calendar] then&lt;br /&gt;
		return calendar, false&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;خورشیدی&amp;#039;, true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Abbreviated era/calendar marker shown next to the year in the header display.&lt;br /&gt;
local calendar_display_abbrev = {&lt;br /&gt;
	[&amp;#039;میلادی&amp;#039;] = &amp;#039; م.&amp;#039;,&lt;br /&gt;
	[&amp;#039;خورشیدی&amp;#039;] = &amp;#039; ه‍.ش&amp;#039;,&lt;br /&gt;
	[&amp;#039;قمری&amp;#039;] = &amp;#039; ه‍.ق&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Era/calendar marker shown next to the year in the header display.&lt;br /&gt;
-- All three calendars are always marked explicitly now (no more implicit/silent&lt;br /&gt;
-- default), so a range only needs to suppress the marker on its first half when&lt;br /&gt;
-- both halves share the exact same era - see the suppress_era flag below.&lt;br /&gt;
local function display_era_suffix(bce, calendar)&lt;br /&gt;
	if bce then&lt;br /&gt;
		return &amp;#039; پیش از میلاد&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return calendar_display_abbrev[calendar] or &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Era/calendar marker shown in the year category name; unlike the display&lt;br /&gt;
-- version, the calendar name is always spelled out, including for Gregorian&lt;br /&gt;
local function category_era_suffix(bce, calendar)&lt;br /&gt;
	if bce then&lt;br /&gt;
		return &amp;#039; پیش از میلاد&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039; (&amp;#039; .. (calendar or &amp;#039;میلادی&amp;#039;) .. &amp;#039;)&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_year_text(year, precision)&lt;br /&gt;
	if not tonumber(year) then&lt;br /&gt;
		return year&lt;br /&gt;
	elseif precision &amp;lt; 6 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	year = tonumber(year)&lt;br /&gt;
&lt;br /&gt;
	if precision == 6 then&lt;br /&gt;
		local millennium = (year - year % 1000)/1000 + 1&lt;br /&gt;
		return &amp;#039;هزاره &amp;#039; .. to_persian_digits(millennium)&lt;br /&gt;
	elseif precision == 7 then&lt;br /&gt;
		local century = (year - year % 100)/100 + 1&lt;br /&gt;
		return &amp;#039;سده &amp;#039; .. to_persian_digits(century)&lt;br /&gt;
	elseif precision == 8 then&lt;br /&gt;
		local decade = year - year % 10&lt;br /&gt;
		return &amp;#039;دهه &amp;#039; .. to_persian_digits(decade)&lt;br /&gt;
	else&lt;br /&gt;
		return to_persian_digits(year)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function format_year_for_display(year, calendar)&lt;br /&gt;
	if not year then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local start_year = year.start_year and TableTools.shallowClone(year.start_year)&lt;br /&gt;
	local end_year = year.end_year and TableTools.shallowClone(year.end_year)&lt;br /&gt;
&lt;br /&gt;
	if year.year then&lt;br /&gt;
		local suffix = (not year.suppress_era) and display_era_suffix(year.bce, calendar) or &amp;#039;&amp;#039;&lt;br /&gt;
		return (year.circa and &amp;#039;حدود &amp;#039; or &amp;#039;&amp;#039;) .. get_year_text(year.year, year.precision + (year.circa and 1 or 0)) .. suffix&lt;br /&gt;
	elseif start_year or end_year then&lt;br /&gt;
		if start_year and end_year then&lt;br /&gt;
			-- Same era on both sides (e.g. both Gregorian, or both BCE): show the&lt;br /&gt;
			-- marker only once, on the end year. Different eras: show both, to disambiguate.&lt;br /&gt;
			if start_year.bce == end_year.bce then&lt;br /&gt;
				start_year.suppress_era = true&lt;br /&gt;
			end&lt;br /&gt;
			if start_year.circa then&lt;br /&gt;
				end_year.circa = false&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return table.concat({format_year_for_display(start_year, calendar) or &amp;#039;&amp;#039;, format_year_for_display(end_year, calendar) or &amp;#039;&amp;#039;}, &amp;#039;–&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function format_year_list_for_display(years, calendar)&lt;br /&gt;
	local year_displays = {}&lt;br /&gt;
	for _, year in ipairs(years) do&lt;br /&gt;
		table.insert(year_displays, year.display or format_year_for_display(year, calendar))&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(year_displays, &amp;#039;/&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function substrings_all_equal(years, i)&lt;br /&gt;
	local substrings = {}&lt;br /&gt;
	for _, year in ipairs(years) do&lt;br /&gt;
		table.insert(substrings, string.sub(year, 1, i))&lt;br /&gt;
	end&lt;br /&gt;
	return #(TableTools.removeDuplicates(substrings)) &amp;lt;= 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_containing_year_category(years_to_categorize)&lt;br /&gt;
	local years = {}&lt;br /&gt;
	for _, year in ipairs(TableTools.shallowClone(years_to_categorize)) do&lt;br /&gt;
		if not year.year or not year.precision then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(years, year)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #years == 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local bce = years[1].bce&lt;br /&gt;
	for _, year in ipairs(years) do&lt;br /&gt;
		year.bce = year.bce == true&lt;br /&gt;
		if bce ~= year.bce then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local precisions = {}&lt;br /&gt;
	for _, year in ipairs(years) do&lt;br /&gt;
		table.insert(precisions, year.precision)&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(precisions)&lt;br /&gt;
&lt;br /&gt;
	local n_length = 0&lt;br /&gt;
	for _, year in ipairs(years) do&lt;br /&gt;
		n_length = math.max(n_length, string.len(year.year))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local padded_years = {}&lt;br /&gt;
	for _, year in ipairs(years) do&lt;br /&gt;
		table.insert(padded_years, pad_number(year.year, n_length))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local shared_digits = 1&lt;br /&gt;
	while shared_digits &amp;lt;= n_length and substrings_all_equal(padded_years, shared_digits) do&lt;br /&gt;
		shared_digits = shared_digits + 1&lt;br /&gt;
	end&lt;br /&gt;
	shared_digits = shared_digits - 1&lt;br /&gt;
	local range_precision = math.min(precisions[1], 9 - n_length + shared_digits)&lt;br /&gt;
&lt;br /&gt;
	return get_year_text(years[1].year, range_precision)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function categorise_year(args)&lt;br /&gt;
	local cats = {}&lt;br /&gt;
&lt;br /&gt;
	if not args.input_year and args.year then&lt;br /&gt;
		table.insert(cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;آثار با سال از ویکی‌داده&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	elseif not args.input_year then&lt;br /&gt;
		table.insert(cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;آثار بی‌تاریخ&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	elseif args.input_year and not tonumber(from_persian_digits(args.input_year)) then&lt;br /&gt;
		table.insert(cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;آثار با تاریخ‌های غیرعددی&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.unrecognised then&lt;br /&gt;
		table.insert(cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;آثار با قالب تاریخ نامعتبر&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local year = args.year or {}&lt;br /&gt;
	local start_year = year.start_year or (year.end_year ~= nil and unknownyear) or {}&lt;br /&gt;
	local end_year = year.end_year or (year.start_year ~= nil and currentyear) or {}&lt;br /&gt;
	start_year.bce = start_year.bce == true&lt;br /&gt;
	end_year.bce = end_year.bce == true&lt;br /&gt;
	local year_list = year.year_list or {}&lt;br /&gt;
&lt;br /&gt;
	local precisions = {}&lt;br /&gt;
	table.insert(precisions, year.precision)&lt;br /&gt;
	table.insert(precisions, start_year.precision)&lt;br /&gt;
	table.insert(precisions, end_year.precision)&lt;br /&gt;
	table.sort(precisions)&lt;br /&gt;
&lt;br /&gt;
	if year.uncertain or start_year.uncertain or end_year.uncertain or year.circa or start_year.circa or end_year.circa or #(year_list) &amp;gt; 1 or (precisions[1] and precisions[1] &amp;lt; 9) then&lt;br /&gt;
		table.insert(cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;آثار با تاریخ نامعین&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if year.unknown or start_year.unknown or end_year.unknown then&lt;br /&gt;
		table.insert(cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;آثار با تاریخ نامشخص&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if start_year.year and end_year.year and year_greater_than(start_year, end_year) then&lt;br /&gt;
		table.insert(cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;آثار با ترتیب نادرست تاریخ آغاز و پایان&amp;#039; .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- single year&lt;br /&gt;
	local year_for_cat&lt;br /&gt;
	local year_for_cat_bce&lt;br /&gt;
	if year.year then&lt;br /&gt;
		year_for_cat = get_year_text(year.year, year.precision)&lt;br /&gt;
		year_for_cat_bce = year.bce&lt;br /&gt;
	-- date range&lt;br /&gt;
	elseif start_year.year and end_year.year and start_year.bce == end_year.bce then&lt;br /&gt;
		year_for_cat = get_containing_year_category({start_year, end_year})&lt;br /&gt;
		year_for_cat_bce = start_year.bce&lt;br /&gt;
	elseif #year_list &amp;gt; 0 then&lt;br /&gt;
		year_for_cat = get_containing_year_category(year_list)&lt;br /&gt;
		year_for_cat_bce = year_list[1] and year_list[1].bce&lt;br /&gt;
	end&lt;br /&gt;
	if year_for_cat then&lt;br /&gt;
		table.insert(cats, &amp;#039;[[رده:&amp;#039; .. &amp;#039;آثار &amp;#039; .. year_for_cat .. category_era_suffix(year_for_cat_bce, args.calendar) .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(cats)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_year_from_single_statement(statement)&lt;br /&gt;
	local snak = statement.mainsnak&lt;br /&gt;
	if not snak or not snak.datavalue or not snak.datavalue.value or not snak[&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;][&amp;#039;time&amp;#039;] or not snak.datavalue.value.precision then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local precision = snak.datavalue.value.precision&lt;br /&gt;
	if precision &amp;lt; 6 then&lt;br /&gt;
		-- precision is less than a millennium&lt;br /&gt;
		return {&lt;br /&gt;
			precision = precision,&lt;br /&gt;
			display = string.gsub(mw.wikibase.formatValue(statement.mainsnak), &amp;#039;^&amp;lt;span&amp;gt;(.*)&amp;lt;/span&amp;gt;$&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local start_years = {}&lt;br /&gt;
	local end_years = {}&lt;br /&gt;
	local start_year, end_year&lt;br /&gt;
	local circa = false&lt;br /&gt;
&lt;br /&gt;
	if statement.qualifiers then&lt;br /&gt;
		-- Check if date is approximate&lt;br /&gt;
		-- P1480 = sourcing circumstances, Q5727902 = circa&lt;br /&gt;
		if statement.qualifiers.P1480 then&lt;br /&gt;
			for _, qualifier in ipairs(statement.qualifiers.P1480) do&lt;br /&gt;
				if qualifier.datavalue and qualifier.datavalue.value.id == &amp;#039;Q5727902&amp;#039; then&lt;br /&gt;
					circa = true&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if circa then&lt;br /&gt;
			precision = precision - 1&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- P580 = start time&lt;br /&gt;
		if statement.qualifiers.P580 then&lt;br /&gt;
			for k, v in pairs(statement.qualifiers.P580) do&lt;br /&gt;
				table.insert(start_years, get_year_from_single_statement({mainsnak = v}))&lt;br /&gt;
			end&lt;br /&gt;
			start_years = TableTools.compressSparseArray(TableTools.removeDuplicates(start_years))&lt;br /&gt;
			table.sort(start_years, year_less_than)&lt;br /&gt;
			start_year = start_years[1]&lt;br /&gt;
			if #start_years &amp;gt; 1 then&lt;br /&gt;
				start_year.uncertain = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- P582 = end time&lt;br /&gt;
		if statement.qualifiers.P582 then&lt;br /&gt;
			for k, v in pairs(statement.qualifiers.P582) do&lt;br /&gt;
				table.insert(end_years, get_year_from_single_statement({mainsnak = v}))&lt;br /&gt;
			end&lt;br /&gt;
			end_years = TableTools.compressSparseArray(TableTools.removeDuplicates(end_years))&lt;br /&gt;
			table.sort(end_years, year_less_than)&lt;br /&gt;
			end_year = end_years[1]&lt;br /&gt;
			if #end_years &amp;gt; 1 then&lt;br /&gt;
				end_year.uncertain = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- extract the year from the timestamp&lt;br /&gt;
	-- example timestamps: +2016-10-05T00:00:00Z, -1752-00-00T00:00:00Z&lt;br /&gt;
	local year&lt;br /&gt;
	local bce = false&lt;br /&gt;
	local split = mw.text.split(snak[&amp;#039;datavalue&amp;#039;][&amp;#039;value&amp;#039;][&amp;#039;time&amp;#039;], &amp;#039;-&amp;#039;, true)&lt;br /&gt;
	if split[1] == &amp;#039;&amp;#039; then&lt;br /&gt;
		year = tonumber(split[2])&lt;br /&gt;
		bce = true&lt;br /&gt;
	else&lt;br /&gt;
		year = tonumber(split[1])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- malformed timestamp&lt;br /&gt;
	if not year then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local year_data = {&lt;br /&gt;
		year = (not start_year and not end_year and year) or nil,&lt;br /&gt;
		circa = circa,&lt;br /&gt;
		bce = bce,&lt;br /&gt;
		uncertain = (start_year and start_year.year ~= year) or circa,&lt;br /&gt;
		precision = precision,&lt;br /&gt;
		start_year = start_year,&lt;br /&gt;
		end_year = end_year&lt;br /&gt;
	}&lt;br /&gt;
	-- Wikidata dates are always Gregorian&lt;br /&gt;
	year_data.display = format_year_for_display(year_data, &amp;#039;میلادی&amp;#039;)&lt;br /&gt;
	return year_data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_wikidata_year(args)&lt;br /&gt;
	-- Fetch entity object for Wikidata item connected to the current page&lt;br /&gt;
	-- Let manually-specified Wikidata ID override if given and valid&lt;br /&gt;
	if not (args.wikidata and mw.wikibase.isValidEntityId(args.wikidata)) then&lt;br /&gt;
		args.wikidata = mw.wikibase.getEntityIdForCurrentPage()&lt;br /&gt;
	end&lt;br /&gt;
	if not args.wikidata then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local item = mw.wikibase.getEntity(args.wikidata)&lt;br /&gt;
	if not item then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local statements = item:getBestStatements(&amp;#039;P577&amp;#039;) -- publication date&lt;br /&gt;
	if #statements == 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local years = {}&lt;br /&gt;
	for _, statement in ipairs(statements) do&lt;br /&gt;
		local year_data = get_year_from_single_statement(statement)&lt;br /&gt;
		table.insert(years, year_data)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	years = TableTools.compressSparseArray(TableTools.removeDuplicates(years))&lt;br /&gt;
&lt;br /&gt;
	if #years == 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif #years == 1 then&lt;br /&gt;
		return years[1]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return {&lt;br /&gt;
		uncertain = true,&lt;br /&gt;
		year_list = years,&lt;br /&gt;
		-- Wikidata dates are always Gregorian&lt;br /&gt;
		display = format_year_list_for_display(years, &amp;#039;میلادی&amp;#039;)&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_year(year, calendar)&lt;br /&gt;
	if not year then&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif year == &amp;#039;?&amp;#039; or year == &amp;#039;؟&amp;#039; or string.lower(year) == &amp;#039;unknown&amp;#039; or year == &amp;#039;نامشخص&amp;#039; or year == &amp;#039;ناشناس&amp;#039; then&lt;br /&gt;
		return unknownyear&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local input_year = year&lt;br /&gt;
	year = from_persian_digits(year)&lt;br /&gt;
&lt;br /&gt;
	local circa = false&lt;br /&gt;
	-- Lua patterns can&amp;#039;t do ^c(irca)?(%s|%.|/)* because they don&amp;#039;t do alternation or apply quantifiers to groups&lt;br /&gt;
	if string.match(year, &amp;#039;^circa&amp;#039;) or string.match(year, &amp;#039;^c%.&amp;#039;) or string.match(year, &amp;#039;^c%s*/&amp;#039;) or string.match(year, &amp;#039;^حدود&amp;#039;) then&lt;br /&gt;
		circa = true&lt;br /&gt;
		year = string.gsub(string.gsub(string.gsub(string.gsub(year, &amp;#039;^circa%s*&amp;#039;, &amp;#039;&amp;#039;), &amp;#039;^c%.%s*&amp;#039;, &amp;#039;&amp;#039;), &amp;#039;^c%s*/%s*&amp;#039;, &amp;#039;&amp;#039;), &amp;#039;^حدود%s*&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local bce = false&lt;br /&gt;
	if string.match(year, &amp;#039;BC[E]?$&amp;#039;) or string.match(year, &amp;#039;پیش از میلاد$&amp;#039;) then&lt;br /&gt;
		bce = true&lt;br /&gt;
		year = string.gsub(string.gsub(year, &amp;#039;%s*BC[E]?$&amp;#039;, &amp;#039;&amp;#039;), &amp;#039;%s*پیش از میلاد$&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if string.match(year, &amp;#039;/&amp;#039;) then&lt;br /&gt;
		local year_split = mw.text.split(year, &amp;#039;/&amp;#039;)&lt;br /&gt;
		local years = {}&lt;br /&gt;
		for _, opt in ipairs(year_split) do&lt;br /&gt;
			if opt ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				local y = parse_year(opt, calendar)&lt;br /&gt;
				y.bce = y.bce or bce&lt;br /&gt;
				y.circa = y.circa or circa&lt;br /&gt;
				table.insert(years, y)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if #years &amp;gt; 1 then&lt;br /&gt;
			return {&lt;br /&gt;
				uncertain = true,&lt;br /&gt;
				year_list = years,&lt;br /&gt;
				display = format_year_list_for_display(years, calendar)&lt;br /&gt;
			}&lt;br /&gt;
		elseif #years == 1 then&lt;br /&gt;
			return years[1]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local start_year, end_year&lt;br /&gt;
	year = string.gsub(string.gsub(year, &amp;#039;%-&amp;#039;, &amp;#039;–&amp;#039;), &amp;#039;—&amp;#039;, &amp;#039;–&amp;#039;)&lt;br /&gt;
	if string.match(year, &amp;#039;^[^–]*–[^–]*$&amp;#039;) then&lt;br /&gt;
		local year_range = mw.text.split(year, &amp;#039;–&amp;#039;)&lt;br /&gt;
		start_year = mw.text.trim(year_range[1])&lt;br /&gt;
		end_year = mw.text.trim(year_range[2])&lt;br /&gt;
		if start_year == &amp;#039;&amp;#039; then&lt;br /&gt;
			start_year = nil&lt;br /&gt;
		else&lt;br /&gt;
			start_year = parse_year(start_year, calendar)&lt;br /&gt;
			start_year.circa = start_year.circa or circa&lt;br /&gt;
			start_year.bce = start_year.bce or bce&lt;br /&gt;
		end&lt;br /&gt;
		if end_year == &amp;#039;&amp;#039; then&lt;br /&gt;
			end_year = nil&lt;br /&gt;
		else&lt;br /&gt;
			end_year = parse_year(end_year, calendar)&lt;br /&gt;
			end_year.circa = end_year.circa or circa&lt;br /&gt;
			end_year.bce = end_year.bce or bce&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local precision&lt;br /&gt;
&lt;br /&gt;
	if tonumber(year) then&lt;br /&gt;
		precision = 9&lt;br /&gt;
	-- Check if it looks like a decade&lt;br /&gt;
	elseif string.match(year, &amp;#039;^%d*0s$&amp;#039;) or string.match(year, &amp;#039;^دهه%s*%d+$&amp;#039;) then&lt;br /&gt;
		precision = 8&lt;br /&gt;
		year = string.gsub(string.gsub(year, &amp;#039;^(%d*0)s$&amp;#039;, &amp;#039;%1&amp;#039;), &amp;#039;^دهه%s*(%d+)$&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
	-- Or a century&lt;br /&gt;
	elseif string.match(year, &amp;#039;^%d+[a-z]* century$&amp;#039;) or string.match(year, &amp;#039;^سده%s*%d+$&amp;#039;) or string.match(year, &amp;#039;^قرن%s*%d+$&amp;#039;) then&lt;br /&gt;
		precision = 7&lt;br /&gt;
		year = string.gsub(string.gsub(string.gsub(year, &amp;#039;^(%d+)[a-z]* century$&amp;#039;, &amp;#039;%1&amp;#039;), &amp;#039;^سده%s*(%d+)$&amp;#039;, &amp;#039;%1&amp;#039;), &amp;#039;^قرن%s*(%d+)$&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
		year = 100 * (tonumber(year) - 1)&lt;br /&gt;
	-- Or a millennium&lt;br /&gt;
	elseif string.match(year, &amp;#039;^%d+[a-z]* millennium$&amp;#039;) or string.match(year, &amp;#039;^هزاره%s*%d+$&amp;#039;) then&lt;br /&gt;
		precision = 6&lt;br /&gt;
		year = string.gsub(string.gsub(year, &amp;#039;^(%d+)[a-z]* millennium&amp;#039;, &amp;#039;%1&amp;#039;), &amp;#039;^هزاره%s*(%d+)$&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
		year = 1000 * (tonumber(year) - 1)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if circa and precision then&lt;br /&gt;
		precision = precision - 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if tonumber(year) then&lt;br /&gt;
		local data = {&lt;br /&gt;
			year = tonumber(year),&lt;br /&gt;
			bce = bce,&lt;br /&gt;
			circa = circa,&lt;br /&gt;
			precision = precision&lt;br /&gt;
		}&lt;br /&gt;
		data[&amp;#039;display&amp;#039;] = format_year_for_display(data, calendar)&lt;br /&gt;
		return data&lt;br /&gt;
	elseif start_year or end_year then&lt;br /&gt;
		return {&lt;br /&gt;
			start_year = start_year,&lt;br /&gt;
			end_year = end_year,&lt;br /&gt;
			display = format_year_for_display({start_year = start_year, end_year = end_year}, calendar)&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return {&lt;br /&gt;
		unrecognised = true,&lt;br /&gt;
		display = input_year&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.construct_year(args)&lt;br /&gt;
	local current_title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
	local calendar, invalid_calendar = normalize_calendar(args.calendar)&lt;br /&gt;
&lt;br /&gt;
	local year_args = {&lt;br /&gt;
		year = args.year,&lt;br /&gt;
		noprint = yesno(args.noyear) or false,&lt;br /&gt;
		wikidata = args.wikidata&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	year_args.nocat = yesno(args.noyearcat)&lt;br /&gt;
	if year_args.nocat == nil then&lt;br /&gt;
		if args.testing then&lt;br /&gt;
			year_args.nocat = false&lt;br /&gt;
		else&lt;br /&gt;
			year_args.nocat = (&lt;br /&gt;
				yesno(args.disambiguation) -- disambiguations never categorise&lt;br /&gt;
				or not current_title:inNamespaces(0, 114) -- only categorise in mainspace and Translation&lt;br /&gt;
				or current_title.isSubpage -- only categorise if this is a base page&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- calendar only applies to a manually-typed |year=; Wikidata-derived years are forced to Gregorian&lt;br /&gt;
	local year_data = parse_year(year_args.year, calendar)&lt;br /&gt;
	local effective_calendar = calendar&lt;br /&gt;
	if not year_data then&lt;br /&gt;
		year_data = get_wikidata_year(year_args)&lt;br /&gt;
		effective_calendar = &amp;#039;میلادی&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local cats = &amp;#039;&amp;#039;&lt;br /&gt;
	if not year_args.nocat then&lt;br /&gt;
		cats = categorise_year({input_year = year_args.year, year = year_data, calendar = effective_calendar})&lt;br /&gt;
		if invalid_calendar then&lt;br /&gt;
			cats = cats .. &amp;#039;[[رده:&amp;#039; .. &amp;#039;صفحه‌های دارای پارامتر calendar نامعتبر&amp;#039; .. &amp;#039;]]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args.testing then&lt;br /&gt;
		cats = mw.text.nowiki(cats) .. cats&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if year_args.noprint or not year_data or not year_data.display then&lt;br /&gt;
		return cats&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local year_span = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;wst-header-year-text&amp;#039;)&lt;br /&gt;
		:wikitext(year_data.display)&lt;br /&gt;
		:allDone()&lt;br /&gt;
&lt;br /&gt;
	return &amp;#039; (&amp;#039; .. tostring(year_span) .. &amp;#039;)&amp;#039; .. cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Mojtabakd</name></author>
	</entry>
</feed>