<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://wiki.theeum.com/index.php?action=history&amp;feed=atom&amp;title=%EB%AA%A8%EB%93%88%3ANavseasoncats</id>
	<title>모듈:Navseasoncats - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.theeum.com/index.php?action=history&amp;feed=atom&amp;title=%EB%AA%A8%EB%93%88%3ANavseasoncats"/>
	<link rel="alternate" type="text/html" href="https://wiki.theeum.com/index.php?title=%EB%AA%A8%EB%93%88:Navseasoncats&amp;action=history"/>
	<updated>2026-05-13T02:48:50Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://wiki.theeum.com/index.php?title=%EB%AA%A8%EB%93%88:Navseasoncats&amp;diff=7993&amp;oldid=prev</id>
		<title>HyunJongSu: &quot;모듈:Navseasoncats&quot; 문서를 보호했습니다 ([편집=관리자만 허용] (무기한) [이동=관리자만 허용] (무기한))</title>
		<link rel="alternate" type="text/html" href="https://wiki.theeum.com/index.php?title=%EB%AA%A8%EB%93%88:Navseasoncats&amp;diff=7993&amp;oldid=prev"/>
		<updated>2023-05-01T12:30:57Z</updated>

		<summary type="html">&lt;p&gt;&amp;quot;&lt;a href=&quot;/wiki/%EB%AA%A8%EB%93%88:Navseasoncats&quot; title=&quot;모듈:Navseasoncats&quot;&gt;모듈:Navseasoncats&lt;/a&gt;&amp;quot; 문서를 보호했습니다 ([편집=관리자만 허용] (무기한) [이동=관리자만 허용] (무기한))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2023년 5월 1일 (월) 21:30 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ko&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(차이 없음)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>HyunJongSu</name></author>
	</entry>
	<entry>
		<id>https://wiki.theeum.com/index.php?title=%EB%AA%A8%EB%93%88:Navseasoncats&amp;diff=7992&amp;oldid=prev</id>
		<title>HyunJongSu: 새 문서: local p = {}  local errors = &#039;&#039; local nexistingcats = 0 local currtitle = mw.title.getCurrentTitle() local testcases = (currtitle.subpageText == &#039;시험장&#039;) local navborder = true --whether or not a border is displayed   --========================================================================== --                      Utility &amp; category functions                         --==========================================================================  --Error message h...</title>
		<link rel="alternate" type="text/html" href="https://wiki.theeum.com/index.php?title=%EB%AA%A8%EB%93%88:Navseasoncats&amp;diff=7992&amp;oldid=prev"/>
		<updated>2023-05-01T12:30:51Z</updated>

		<summary type="html">&lt;p&gt;새 문서: local p = {}  local errors = &amp;#039;&amp;#039; local nexistingcats = 0 local currtitle = mw.title.getCurrentTitle() local testcases = (currtitle.subpageText == &amp;#039;시험장&amp;#039;) local navborder = true --whether or not a border is displayed   --&lt;a href=&quot;/index.php?title=%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;========================================================================== (없는 문서)&quot;&gt;==========================================================================&lt;/a&gt; --&lt;a href=&quot;/index.php?title=Utility_%26_category_functions&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Utility &amp;amp; category functions (없는 문서)&quot;&gt;Utility &amp;amp; category functions                        &lt;/a&gt; --&lt;a href=&quot;/index.php?title=%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;========================================================================== (없는 문서)&quot;&gt;==========================================================================&lt;/a&gt;  --Error message h...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local errors = &amp;#039;&amp;#039;&lt;br /&gt;
local nexistingcats = 0&lt;br /&gt;
local currtitle = mw.title.getCurrentTitle()&lt;br /&gt;
local testcases = (currtitle.subpageText == &amp;#039;시험장&amp;#039;)&lt;br /&gt;
local navborder = true --whether or not a border is displayed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
--[[                      Utility &amp;amp; category functions                        ]]&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
&lt;br /&gt;
--Error message handling&lt;br /&gt;
function errorclass( msg )&lt;br /&gt;
	return mw.text.tag( &amp;#039;span&amp;#039;, {class=&amp;#039;error mw-ext-cite-error&amp;#039;}, &amp;#039;&amp;lt;b&amp;gt;Error!&amp;lt;/b&amp;gt; &amp;#039;..string.gsub(msg, &amp;#039;&amp;amp;#&amp;#039;, &amp;#039;&amp;amp;amp;#&amp;#039;) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Returns a colon if on a testcase subpage&lt;br /&gt;
function testcasecolon()&lt;br /&gt;
	if testcases then return &amp;#039;:&amp;#039; end&lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Consolidate avoidance checks&lt;br /&gt;
function avoidself()&lt;br /&gt;
	return (currtitle.text ~= &amp;#039;Navseasoncats&amp;#039; and          --avoid self&lt;br /&gt;
			currtitle.text ~= &amp;#039;시간 분류 둘러보기&amp;#039; and      --avoid self&lt;br /&gt;
			currtitle.text ~= &amp;#039;시간 분류 둘러보기/설명문서&amp;#039; and      --avoid self&lt;br /&gt;
			currtitle.text ~= &amp;#039;Navseasoncats/sandbox&amp;#039; and  --avoid self&lt;br /&gt;
			(currtitle.nsText ~= &amp;#039;틀&amp;#039; or testcases)) --avoid nested transclusion errors (i.e. {{Infilmdecade}})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Failure handling&lt;br /&gt;
function failedcat( errors, sortkey )&lt;br /&gt;
	if avoidself() then&lt;br /&gt;
		return (errors or &amp;#039;&amp;#039;)..&amp;#039;&amp;amp;#42;&amp;amp;#42;&amp;amp;#42;Navseasoncats failed to generate navbox***&amp;#039;..&lt;br /&gt;
			   &amp;#039;[[&amp;#039;..testcasecolon()..&amp;#039;:시간 분류 둘러보기 - 둘러보기 상자 생성 실패|&amp;#039;..(sortkey or &amp;#039;O&amp;#039;)..&amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Check for nav*() navigational isolation (not necessarily an error)&lt;br /&gt;
function isolatedcat()&lt;br /&gt;
	if nexistingcats == 0 and avoidself() then&lt;br /&gt;
		return &amp;#039;[[&amp;#039;..testcasecolon()..&amp;#039;Category:시간 분류 둘러보기 - 외톨이]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Check for navhyphen default gap size + isolatedcat() (not necessarily an error)&lt;br /&gt;
function defaultgapcat( bool )&lt;br /&gt;
	if bool and nexistingcats == 0 and avoidself() then&lt;br /&gt;
		--using &amp;quot;nexistingcats &amp;gt; 0&amp;quot; isn&amp;#039;t as useful, since the default gap size obviously worked&lt;br /&gt;
		return &amp;#039;[[&amp;#039;..testcasecolon()..&amp;#039;Category:Navseasoncats default season gap size]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Similar to {{LinkCatIfExists2}}: make a piped link to a category, if it exists;&lt;br /&gt;
--if it doesn&amp;#039;t exist, just display the greyed link title without linking&lt;br /&gt;
function catlink( catname, disp )&lt;br /&gt;
	catname = mw.text.trim(catname or &amp;#039;&amp;#039;)&lt;br /&gt;
	disp    = mw.text.trim(disp or &amp;#039;&amp;#039;)&lt;br /&gt;
	local grey = &amp;#039;#888&amp;#039;&lt;br /&gt;
	local displaytext = catname&lt;br /&gt;
	if disp ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		--use &amp;#039;disp&amp;#039; parameter instead, and strip any trailing disambiguator&lt;br /&gt;
		displaytext = mw.ustring.gsub(disp, &amp;#039;%s+%(.+$&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local catpage = mw.title.new( catname, &amp;#039;Category&amp;#039; )&lt;br /&gt;
	if catpage.exists then&lt;br /&gt;
		--TODO?: ignore cat #Rs: see 2019 link on nav @ Category:2018 Asian Games&lt;br /&gt;
		--isRedirect did not change expensive function count (b/c catname passed instead of id?),&lt;br /&gt;
		--but isRedirect also did not recognize {{Category redirect}},&lt;br /&gt;
		--and it&amp;#039;s not worth calling &amp;amp; parsing getContent, so TODONT&lt;br /&gt;
		nexistingcats = nexistingcats + 1&lt;br /&gt;
		return &amp;#039;[[:Category:&amp;#039;..catname..&amp;#039;|&amp;#039;..displaytext..&amp;#039;]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;lt;span style=&amp;quot;color:&amp;#039;..grey..&amp;#039;&amp;quot;&amp;gt;&amp;#039;..displaytext..&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--12 -&amp;gt; 12th, etc.&lt;br /&gt;
--Used in navordinal() only&lt;br /&gt;
function addord( i )&lt;br /&gt;
	if tonumber(i) then&lt;br /&gt;
		local s = tostring(i)&lt;br /&gt;
		&lt;br /&gt;
		local tens = string.match(s, &amp;#039;1%d$&amp;#039;)&lt;br /&gt;
		if    tens then return s..&amp;#039;th&amp;#039; end&lt;br /&gt;
		&lt;br /&gt;
		local  ones = string.match(s, &amp;#039;%d$&amp;#039;)&lt;br /&gt;
		if     ones == &amp;#039;1&amp;#039; then return s..&amp;#039;st&amp;#039;&lt;br /&gt;
		elseif ones == &amp;#039;2&amp;#039; then return s..&amp;#039;nd&amp;#039;&lt;br /&gt;
		elseif ones == &amp;#039;3&amp;#039; then return s..&amp;#039;rd&amp;#039; end&lt;br /&gt;
		&lt;br /&gt;
		return s..&amp;#039;th&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Returns an unsigned string of the 1-4 digit decade ending in &amp;quot;0&amp;quot;, else error&lt;br /&gt;
--Used in navdecade() only&lt;br /&gt;
function sterilizedec( decade )&lt;br /&gt;
	if decade == nil then return nil end&lt;br /&gt;
	&lt;br /&gt;
	local dec = string.match(decade, &amp;#039;^[-%+]?(%d?%d?%d?0)$&amp;#039;) or &lt;br /&gt;
				string.match(decade, &amp;#039;^[-%+]?(%d?%d?%d?0)[^%d]&amp;#039;)&lt;br /&gt;
	if dec then&lt;br /&gt;
		return dec&lt;br /&gt;
	else&lt;br /&gt;
		local decade_fixed234 = string.match(decade, &amp;#039;^[-%+]?(%d%d?%d?)%d[^%d]&amp;#039;) or&lt;br /&gt;
								string.match(decade, &amp;#039;^[-%+]?(%d%d?%d?)%d$&amp;#039;)&lt;br /&gt;
		local decade_fixed1   = string.match(decade, &amp;#039;^[-%+]?(%d)[^%d]&amp;#039;) or&lt;br /&gt;
								string.match(decade, &amp;#039;^[-%+]?(%d)$&amp;#039;)&lt;br /&gt;
		if decade_fixed234 then&lt;br /&gt;
			return decade_fixed234..&amp;#039;0&amp;#039;&lt;br /&gt;
		elseif decade_fixed1 then&lt;br /&gt;
			return &amp;#039;0&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			errors = &amp;#039;sterilizedec() error&amp;#039;&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
--[[                   Formerly separated templates/modules                   ]]&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[============================={{  navyear  }}==============================]]&lt;br /&gt;
&lt;br /&gt;
function navyear( firstpart, year, lastpart, minimumyear, maximumyear )&lt;br /&gt;
	--- if true then&lt;br /&gt;
	--- 	return &amp;#039;@&amp;#039; .. firstpart .. &amp;#039;@&amp;#039; .. year .. &amp;#039;@&amp;#039; .. lastpart .. &amp;#039;@&amp;#039;&lt;br /&gt;
	--- end&lt;br /&gt;
	--Expects a PAGENAME of the form &amp;quot;Some sequential 1760 example cat&amp;quot;, where &lt;br /&gt;
	--	{{{1}}}=Some sequential&lt;br /&gt;
	--	{{{2}}}=1760&lt;br /&gt;
	--	{{{3}}}=example cat&lt;br /&gt;
	--	{{{4}}}=1758 (&amp;#039;min&amp;#039; year parameter; optional)&lt;br /&gt;
	--	{{{5}}}=1800 (&amp;#039;max&amp;#039; year parameter; optional)&lt;br /&gt;
	year = tonumber(year) or tonumber(mw.ustring.match(year or &amp;#039;&amp;#039;, &amp;#039;^%s*(%d*)&amp;#039;))&lt;br /&gt;
	local minyear = tonumber(string.match(minimumyear or &amp;#039;&amp;#039;, &amp;#039;-?%d+&amp;#039;)) or -9999    --allow +/- qualifier&lt;br /&gt;
	local maxyear = tonumber(string.match(maximumyear or &amp;#039;&amp;#039;, &amp;#039;-?%d+&amp;#039;)) or  9999    --allow +/- qualifier&lt;br /&gt;
	if string.match(minimumyear or &amp;#039;&amp;#039;, &amp;#039;BC&amp;#039;) then minyear = -math.abs(minyear) end --allow BC qualifier (AD otherwise assumed)&lt;br /&gt;
	if string.match(maximumyear or &amp;#039;&amp;#039;, &amp;#039;BC&amp;#039;) then maxyear = -math.abs(maxyear) end --allow BC qualifier (AD otherwise assumed)&lt;br /&gt;
&lt;br /&gt;
 	local temporal = mw.ustring.match(lastpart, &amp;#039;년&amp;#039;) or&lt;br /&gt;
					 mw.ustring.match(lastpart, &amp;#039;세기&amp;#039;) or &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	if year == nil then&lt;br /&gt;
		errors = errorclass(&amp;#039;Function navyear can\&amp;#039;t recognize the year sent to its 2nd parameter.&amp;#039;)&lt;br /&gt;
		return failedcat(errors, &amp;#039;Y&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--AD/BC switches &amp;amp; vars&lt;br /&gt;
	local parentBC = mw.ustring.match(firstpart, &amp;#039;기원전 $&amp;#039;) --following the &amp;quot;1 BC&amp;quot; convention for all years BC&lt;br /&gt;
	firstpart  = mw.ustring.gsub(firstpart,  &amp;#039;기원전 $&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	local BCe = parentBC or &amp;#039;기원전 &amp;#039; --&amp;quot;BC&amp;quot; default&lt;br /&gt;
	&lt;br /&gt;
	local switchADBC = 1                 --  1=AD parent&lt;br /&gt;
	if parentBC then switchADBC = -1 end -- -1=BC parent; possibly adjusted later&lt;br /&gt;
	local Y = 0 --secondary iterator for AD-on-a-BC-parent&lt;br /&gt;
	&lt;br /&gt;
	if minyear &amp;gt; year*switchADBC then minyear = year*switchADBC end --input error; minyear should be &amp;lt;= parent&lt;br /&gt;
	if maxyear &amp;lt; year*switchADBC then maxyear = year*switchADBC end --input error; maxyear should be &amp;gt;= parent&lt;br /&gt;
	--determine interyear gap size to condense special category types, if possible&lt;br /&gt;
	local ygapdefault = 1 --assume/start at the most common case: 2001, 2002, etc.&lt;br /&gt;
	local ygap = ygapdefault&lt;br /&gt;
	if string.match(lastpart, &amp;#039;presidential&amp;#039;) then&lt;br /&gt;
		local ygap1, ygap2 = ygapdefault, ygapdefault --need to determine previous &amp;amp; next year gaps indepedently&lt;br /&gt;
		local ygap1_success, ygap2_success = false, false&lt;br /&gt;
		&lt;br /&gt;
		local prevseason = nil&lt;br /&gt;
		while ygap1 &amp;lt;= 5 do --Czech Republic, Poland, Sri Lanka, etc. have 5-year terms&lt;br /&gt;
			prevseason = firstpart..&amp;#039; &amp;#039;..(year-ygap1)..&amp;#039; &amp;#039;..lastpart&lt;br /&gt;
			if mw.title.new(prevseason, &amp;#039;Category&amp;#039;).exists then&lt;br /&gt;
				ygap1_success = true&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			ygap1 = ygap1 + 1&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local nextseason = nil&lt;br /&gt;
		while ygap2 &amp;lt;= 5 do --Czech Republic, Poland, Sri Lanka, etc. have 5-year terms&lt;br /&gt;
			nextseason = firstpart..&amp;#039; &amp;#039;..(year+ygap2)..&amp;#039; &amp;#039;..lastpart&lt;br /&gt;
			if mw.title.new(nextseason, &amp;#039;Category&amp;#039;).exists then&lt;br /&gt;
				ygap2_success = true&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			ygap2 = ygap2 + 1&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if ygap1_success and ygap2_success then&lt;br /&gt;
			if ygap1 == ygap2 then ygap = ygap1 end&lt;br /&gt;
		elseif ygap1_success then  ygap = ygap1&lt;br /&gt;
		elseif ygap2_success then  ygap = ygap2&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--begin navyears&lt;br /&gt;
	local navy = &amp;#039;{| class=&amp;quot;toccolours hlist&amp;quot; style=&amp;quot;text-align: center; margin: auto;&amp;quot;\n&amp;#039;..&amp;#039;|\n&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	local i = -5&lt;br /&gt;
	while i &amp;lt;= 5 do&lt;br /&gt;
		local y = year + i*ygap*switchADBC&lt;br /&gt;
		local BCdisp = &amp;#039;&amp;#039;&lt;br /&gt;
		local ADdisp = &amp;#039;&amp;#039;&lt;br /&gt;
		if i ~= 0 then --left/right navy&lt;br /&gt;
			&lt;br /&gt;
			local AD = &amp;#039;&amp;#039;&lt;br /&gt;
			local BC = &amp;#039;&amp;#039;&lt;br /&gt;
			if year &amp;gt;= 1 and not parentBC then --parent = 1-10 AD&lt;br /&gt;
				if y &amp;lt;= 0 then&lt;br /&gt;
					BC = BCe&lt;br /&gt;
					y = math.abs(y - 1) --skip y = 0 (DNE)&lt;br /&gt;
				end&lt;br /&gt;
			elseif parentBC then&lt;br /&gt;
				if switchADBC == -1 then --displayed y is in the BC regime&lt;br /&gt;
					if y &amp;gt;= 1 then     --the common case&lt;br /&gt;
						BC = BCe&lt;br /&gt;
					elseif y == 0 then --switch from BC to AD regime&lt;br /&gt;
						switchADBC = 1&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if switchADBC == 1 then --displayed y is now in the AD regime&lt;br /&gt;
					Y = Y + 1 --skip y = 0 (DNE)&lt;br /&gt;
					y = Y     --easiest solution: start another iterator for these AD ys displayed on a BC year parent&lt;br /&gt;
					if y == 1 then&lt;br /&gt;
						ADdisp = &amp;#039;후 &amp;#039;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if BC ~= &amp;#039;&amp;#039; and year &amp;lt;= 5 then --only show &amp;#039;BC&amp;#039; for parent years &amp;lt;= 5: saves room, easier to read,&lt;br /&gt;
				BCdisp = &amp;#039;전 &amp;#039;          --and 6 is the first/last nav year that doesn&amp;#039;t need a disambiguator;&lt;br /&gt;
			end                            --the center/parent year will always show BC, so no need to show it another 10x&lt;br /&gt;
			&lt;br /&gt;
			--populate left/right navy&lt;br /&gt;
			local ysign = y --use y for display &amp;amp; ysign for logic&lt;br /&gt;
			if BC ~= &amp;#039;&amp;#039; then ysign = -ysign end&lt;br /&gt;
			if (minyear &amp;lt;= ysign) and (ysign &amp;lt;= maxyear) then -- ex: 1758, 1759, 1761, 1762, 1763, 1764, 1765&lt;br /&gt;
				navy = navy..&amp;#039;*&amp;#039;..catlink( firstpart..BC..y..lastpart, ADdisp..BCdisp..y )..&amp;#039;\n&amp;#039;&lt;br /&gt;
			else -- ex: 1755, 1756, 1757&lt;br /&gt;
				navy = navy..&amp;#039;*&amp;lt;span style=&amp;quot;visibility:hidden&amp;quot;&amp;gt;&amp;#039;..BCdisp..y..&amp;#039;&amp;lt;/span&amp;gt;\n&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		else --center navy; ex: 1760&lt;br /&gt;
			if parentBC then BCdisp = BCe end&lt;br /&gt;
			navy = navy..&amp;#039;*&amp;lt;b&amp;gt;&amp;#039;..BCdisp..year..temporal..&amp;#039;&amp;lt;/b&amp;gt;\n&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return navy..&amp;#039;|}&amp;#039;..isolatedcat()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[============================{{  navdecade  }}=============================]]&lt;br /&gt;
&lt;br /&gt;
function navdecade( firstpart, decade, lastpart, mindecade, maxdecade )&lt;br /&gt;
	--Expects a PAGENAME of the form &amp;quot;Some sequential 2000 example cat&amp;quot;, where &lt;br /&gt;
	--	{{{1}}}=Some sequential&lt;br /&gt;
	--	{{{2}}}=2000&lt;br /&gt;
	--	{{{3}}}=example cat&lt;br /&gt;
	--and&lt;br /&gt;
	--	{{{4}}}=1800 (&amp;#039;min&amp;#039; decade parameter; optional)&lt;br /&gt;
	--	{{{5}}}=2020 (&amp;#039;max&amp;#039; decade parameter; optional; defaults to next decade)&lt;br /&gt;
	&lt;br /&gt;
	--sterilize dec&lt;br /&gt;
	local dec = sterilizedec(decade)&lt;br /&gt;
	if errors ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		errors = errorclass(&amp;#039;Function navdecade was sent &amp;quot;&amp;#039;..(decade or &amp;#039;&amp;#039;)..&amp;#039;&amp;quot; as its 2nd parameter, &amp;#039;..&lt;br /&gt;
							&amp;#039;but expects a 1 to 4-digit year ending in &amp;quot;0&amp;quot;.&amp;#039;)&lt;br /&gt;
		return failedcat(errors, &amp;#039;D&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local ndec = tonumber(dec)&lt;br /&gt;
	&lt;br /&gt;
	--sterilize mindecade &amp;amp; determine AD/BC&lt;br /&gt;
	local mindefault = &amp;#039;-9999&amp;#039;&lt;br /&gt;
	local mindec = sterilizedec(mindecade) --returns a tostring(unsigned int), or nil + error&lt;br /&gt;
	if mindec then&lt;br /&gt;
		if string.match(mindecade, &amp;#039;-%d&amp;#039;) or &lt;br /&gt;
		   string.match(mindecade, &amp;#039;BC&amp;#039;) or&lt;br /&gt;
		   mw.ustring.match(mindecade, &amp;#039;기원전&amp;#039;)&lt;br /&gt;
		then&lt;br /&gt;
			mindec = &amp;#039;-&amp;#039;..mindec --better +/-0 behavior with strings (0-initialized int == &amp;quot;-0&amp;quot; string...)&lt;br /&gt;
		end&lt;br /&gt;
	elseif errors ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		errors = errorclass(&amp;#039;Function navdecade was sent &amp;quot;&amp;#039;..(mindecade or &amp;#039;&amp;#039;)..&amp;#039;&amp;quot; as its 4th parameter, &amp;#039;..&lt;br /&gt;
							&amp;#039;but expects a 1 to 4-digit year ending in &amp;quot;0&amp;quot;, the earliest decade to be shown.&amp;#039;)&lt;br /&gt;
		return failedcat(errors, &amp;#039;E&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		mindec = mindefault --tonumber() later, after error checks&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--sterilize maxdecade &amp;amp; determine AD/BC&lt;br /&gt;
	local maxdefault = &amp;#039;9999&amp;#039;&lt;br /&gt;
	local maxdec = sterilizedec(maxdecade) --returns a tostring(unsigned int), or nil + error&lt;br /&gt;
	if maxdec then&lt;br /&gt;
		if string.match(maxdecade, &amp;#039;-%d&amp;#039;) or &lt;br /&gt;
		   string.match(maxdecade, &amp;#039;BC&amp;#039;)&lt;br /&gt;
		then                     --better +/-0 behavior with strings (0-initialized int == &amp;quot;-0&amp;quot; string...),&lt;br /&gt;
			maxdec = &amp;#039;-&amp;#039;..maxdec --but a &amp;quot;-0&amp;quot; string -&amp;gt; tonumber() -&amp;gt; tostring() = &amp;quot;-0&amp;quot;,&lt;br /&gt;
		end                      --and a  &amp;quot;0&amp;quot; string -&amp;gt; tonumber() -&amp;gt; tostring() =  &amp;quot;0&amp;quot;&lt;br /&gt;
	elseif errors ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		errors = errorclass(&amp;#039;Function navdecade was sent &amp;quot;&amp;#039;..(maxdecade or &amp;#039;&amp;#039;)..&amp;#039;&amp;quot; as its 5th parameter, &amp;#039;..&lt;br /&gt;
							&amp;#039;but expects a 1 to 4-digit year ending in &amp;quot;0&amp;quot;, the highest decade to be shown.&amp;#039;)&lt;br /&gt;
		return failedcat(errors, &amp;#039;F&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		maxdec = maxdefault&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local tspace = &amp;#039; &amp;#039; --assume trailing space for &amp;quot;1950s in X&amp;quot;-type cats&lt;br /&gt;
	if string.match(lastpart, &amp;#039;^-&amp;#039;) then tspace = &amp;#039;&amp;#039; end --DNE for &amp;quot;1970s-related&amp;quot;-type cats&lt;br /&gt;
	&lt;br /&gt;
	--AD/BC switches &amp;amp; vars&lt;br /&gt;
	&lt;br /&gt;
	local parentBC = mw.ustring.match(firstpart, &amp;#039;기원전 $&amp;#039;) --following the &amp;quot;0s BC&amp;quot; convention for all years BC&lt;br /&gt;
	firstpart = mw.ustring.gsub(firstpart, &amp;#039;기원전 $&amp;#039;, &amp;#039;&amp;#039;) --handle BC separately; AD never used&lt;br /&gt;
	--TODO?: handle BCE, but only if it exists in the wild&lt;br /&gt;
	&lt;br /&gt;
	local dec0to40AD = (ndec &amp;gt;= 0 and ndec &amp;lt;= 40 and not parentBC) --special behavior in this range&lt;br /&gt;
	local switchADBC = 1                 --  1=AD parent&lt;br /&gt;
	if parentBC then switchADBC = -1 end -- -1=BC parent; possibly adjusted later&lt;br /&gt;
	local BCdisp = &amp;#039;&amp;#039;&lt;br /&gt;
	local D = -math.huge --secondary switch &amp;amp; iterator for AD/BC transition&lt;br /&gt;
	&lt;br /&gt;
	--check non-default min/max more carefully; determine right-offset&lt;br /&gt;
	local roffset = 0&lt;br /&gt;
	if mindec ~= mindefault then&lt;br /&gt;
		if tonumber(mindec) &amp;gt; ndec*switchADBC then&lt;br /&gt;
			mindec = tostring(ndec*switchADBC) --input error; mindec should be &amp;lt;= parent&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if maxdec ~= maxdefault then --a non-default max will override offsetting behavior&lt;br /&gt;
		if tonumber(maxdec) &amp;lt; ndec*switchADBC then&lt;br /&gt;
			maxdec = tostring(ndec*switchADBC) --input error; maxdec should be &amp;gt;= parent&lt;br /&gt;
		end&lt;br /&gt;
	--else --offset only if max == maxdefault&lt;br /&gt;
	elseif mw.ustring.match(lastpart, &amp;#039;를 배경으로 한&amp;#039;) == nil then&lt;br /&gt;
		local thisyear = mw.getContentLanguage():formatDate( &amp;#039;Y&amp;#039; )&lt;br /&gt;
		local nthisdecade = tonumber(string.match(thisyear, &amp;#039;^%d%d%d&amp;#039;)..&amp;#039;0&amp;#039;)&lt;br /&gt;
		local diff = nthisdecade - ndec*switchADBC --in 2019: diff=30 for 1980; diff=0 for 2010; diff = -20 for 2030&lt;br /&gt;
		if diff &amp;lt; 0 then diff = 0 end  --always show at least 1 decade ahead for present-decade+ cats&lt;br /&gt;
		if diff &amp;gt;= 0 and diff &amp;lt;= 30 then&lt;br /&gt;
			roffset = 40 - diff --in 2019: offset=10 for 1980; offset=40 for 2010; offset=40 for 2030&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local nmindec = tonumber(mindec) --similar behavior to navyear &amp;amp; navordinal&lt;br /&gt;
	local nmaxdec = tonumber(maxdec) --similar behavior to navordinal&lt;br /&gt;
	&lt;br /&gt;
	--begin navdecade&lt;br /&gt;
	local bnb = &amp;#039;&amp;#039; --border/no border&lt;br /&gt;
	if navborder == false then --for embedding in {{Navseasoncats with decades below year}}&lt;br /&gt;
		bnb = &amp;#039; border-style: none; background-color: transparent;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local navd = &amp;#039;{| class=&amp;quot;toccolours hlist&amp;quot; style=&amp;quot;text-align: center; margin: auto;&amp;#039;..bnb..&amp;#039;&amp;quot;\n&amp;#039;..&amp;#039;|\n&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	local i = (-50 - roffset)&lt;br /&gt;
	while i &amp;lt;= (50 - roffset) do&lt;br /&gt;
		local d = ndec + i*switchADBC&lt;br /&gt;
		&lt;br /&gt;
		if i ~= 0 then --left/right navd&lt;br /&gt;
			local BC = &amp;#039;&amp;#039;&lt;br /&gt;
			BCdisp = &amp;#039;&amp;#039;&lt;br /&gt;
			if dec0to40AD then&lt;br /&gt;
				if D &amp;lt; -10 then&lt;br /&gt;
					d = math.abs(d + 10) --b/c 2 &amp;quot;0s&amp;quot; decades exist: &amp;quot;0s BC&amp;quot; &amp;amp; &amp;quot;0s&amp;quot; (AD)&lt;br /&gt;
					BC = &amp;#039;기원전 &amp;#039;&lt;br /&gt;
					if d == 0 then&lt;br /&gt;
						D = -10 --track 1st d = 0 use (BC)&lt;br /&gt;
					end&lt;br /&gt;
				elseif D &amp;gt;= -10 then&lt;br /&gt;
					D = D + 10 --now iterate from 0s AD&lt;br /&gt;
					d = D      --2nd d = 0 use&lt;br /&gt;
				end&lt;br /&gt;
			elseif parentBC then&lt;br /&gt;
				if switchADBC == -1 then --parentBC looking at the BC side (the common case)&lt;br /&gt;
					BC = &amp;#039;기원전 &amp;#039;&lt;br /&gt;
					if d == 0 then     --prepare to switch to the AD side on the next iteration&lt;br /&gt;
						switchADBC = 1 --1st d = 0 use (BC)&lt;br /&gt;
						D = -10        --prep&lt;br /&gt;
					end&lt;br /&gt;
				elseif switchADBC == 1 then --switched to the AD side&lt;br /&gt;
					D = D + 10 --now iterate from 0s AD&lt;br /&gt;
					d = D      --2nd d = 0 use (on first use)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if BC ~= &amp;#039;&amp;#039; and ndec &amp;lt;= 50 then&lt;br /&gt;
				BCdisp = &amp;#039;전 &amp;#039; --show BC for all BC decades whenever a &amp;quot;0s&amp;quot; is displayed on the nav&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			--populate left/right navd&lt;br /&gt;
			local hidden = &amp;#039;*&amp;lt;span style=&amp;quot;visibility:hidden&amp;quot;&amp;gt;&amp;#039;..BCdisp..d..&amp;#039;&amp;lt;/span&amp;gt;\n&amp;#039;&lt;br /&gt;
			local shown = &amp;#039;*&amp;#039;..catlink( firstpart..BC..d..&amp;#039;년대&amp;#039;..lastpart, BCdisp..d..&amp;#039;&amp;#039; )..&amp;#039;\n&amp;#039;&lt;br /&gt;
			local dsign = d --use d for display &amp;amp; dsign for logic&lt;br /&gt;
			if BC ~= &amp;#039;&amp;#039; then dsign = -dsign end&lt;br /&gt;
			if (nmindec &amp;lt;= dsign) and (dsign &amp;lt;= nmaxdec) then&lt;br /&gt;
				if dsign == 0 and (nmindec == 0 or nmaxdec == 0) then --distinguish b/w -0 (BC) &amp;amp; 0 (AD)&lt;br /&gt;
					--&amp;quot;zoom in&amp;quot; on +/- 0 and turn dsign/min/max temporarily into +/- 1 for easier processing&lt;br /&gt;
					local zsign, zmin, zmax = 1, nmindec, nmaxdec&lt;br /&gt;
					if BC ~= &amp;#039;&amp;#039; then zsign = -1 end&lt;br /&gt;
					if     mindec == &amp;#039;-0&amp;#039; then zmin = -1&lt;br /&gt;
					elseif mindec ==  &amp;#039;0&amp;#039; then zmin =  1 end&lt;br /&gt;
					if     maxdec == &amp;#039;-0&amp;#039; then zmax = -1&lt;br /&gt;
					elseif maxdec ==  &amp;#039;0&amp;#039; then zmax =  1 end&lt;br /&gt;
					&lt;br /&gt;
					if (zmin &amp;lt;= zsign) and (zsign &amp;lt;= zmax) then&lt;br /&gt;
						navd = navd..shown&lt;br /&gt;
					else&lt;br /&gt;
						navd = navd..hidden&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					navd = navd..shown --the common case&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				navd = navd..hidden&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
		else --center navd&lt;br /&gt;
			if D &amp;gt;= -10 then&lt;br /&gt;
				D = D + 10 --housekeeping b/w left/right sides&lt;br /&gt;
			end&lt;br /&gt;
			if parentBC then&lt;br /&gt;
				BCdisp = &amp;#039;기원전 &amp;#039;&lt;br /&gt;
				if ndec == 0 then&lt;br /&gt;
					switchADBC = 1 --next element will be 0s AD&lt;br /&gt;
					D = -10 --for this special case, D is still -inf&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				BCdisp = &amp;#039;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
			navd = navd..&amp;#039;*&amp;lt;b&amp;gt;&amp;#039;..BCdisp..dec..&amp;#039;년대&amp;#039;..&amp;#039;&amp;lt;/b&amp;gt;\n&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		i = i + 10&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return navd..&amp;#039;|}&amp;#039;..isolatedcat()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[============================{{  navhyphen  }}=============================]]&lt;br /&gt;
&lt;br /&gt;
function navhyphen( start, hyph, ish, firstpart, lastpart, minseas, maxseas, testgap )&lt;br /&gt;
	--Expects a PAGENAME of the form &amp;quot;Some sequential 2015–16 example cat&amp;quot;, where &lt;br /&gt;
	--	{{{1}}}=2015&lt;br /&gt;
	--	{{{2}}}=–&lt;br /&gt;
	--	{{{3}}}=16 (for &amp;quot;1999-2000&amp;quot;, &amp;quot;2000&amp;quot; must be truncated so {{{3}}} is &amp;quot;00&amp;quot;)&lt;br /&gt;
	--	{{{4}}}=Some sequential&lt;br /&gt;
	--	{{{5}}}=example cat&lt;br /&gt;
	--  {{{6}}}=1800 (&amp;#039;min&amp;#039; starting season shown; optional)&lt;br /&gt;
	--  {{{7}}}=1999 (&amp;#039;max&amp;#039; starting season shown; optional; 1999 will show 1999-00)&lt;br /&gt;
	--  {{{8}}}=0 (testcasegap parameter for easier testing; optional)&lt;br /&gt;
	&lt;br /&gt;
	--sterilize start&lt;br /&gt;
	if string.match(start or &amp;#039;&amp;#039;, &amp;#039;^%d%d?%d?%d?$&amp;#039;) == nil then --1-4 digits, AD only&lt;br /&gt;
		local start_fixed = mw.ustring.match(start or &amp;#039;&amp;#039;, &amp;#039;^%s*(%d%d?%d?%d?)%D&amp;#039;)&lt;br /&gt;
		if start_fixed then&lt;br /&gt;
			start = start_fixed&lt;br /&gt;
		else&lt;br /&gt;
			errors = errorclass(&amp;#039;Function navhyphen can\&amp;#039;t recognize the number &amp;quot;&amp;#039;..(start or &amp;#039;&amp;#039;)..&amp;#039;&amp;quot; &amp;#039;..&lt;br /&gt;
								&amp;#039;in the first part of the &amp;quot;season&amp;quot; that was passed to it. &amp;#039;..&lt;br /&gt;
								&amp;#039;For e.g. &amp;quot;2015–16&amp;quot;, &amp;quot;2015&amp;quot; is expected via &amp;quot;|2015|–|16|&amp;quot;.&amp;#039;)&lt;br /&gt;
			return failedcat(errors, &amp;#039;H&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local nstart = tonumber(start)&lt;br /&gt;
	&lt;br /&gt;
	--en dash check&lt;br /&gt;
	local endashcat = &amp;#039;&amp;#039;&lt;br /&gt;
	if hyph ~= &amp;#039;–&amp;#039; then&lt;br /&gt;
		endashcat = &amp;#039;[[Category:Navseasoncats range not using en dash]]&amp;#039; --nav still processable, but track&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--sterilize ish (e.g. &amp;quot;01&amp;quot; part of &amp;quot;2001&amp;quot;; &amp;quot;2&amp;quot; part of &amp;quot;12&amp;quot;)&lt;br /&gt;
	if string.match(ish or &amp;#039;&amp;#039;, &amp;#039;^%d?%d$&amp;#039;) == nil then --expecting 1 or 2 digits&lt;br /&gt;
		if string.match(ish or &amp;#039;&amp;#039;, &amp;#039;^%d%d%d&amp;#039;) then&lt;br /&gt;
			errors = errorclass(&amp;#039;The second part of the season passed to function navhyphen should only be one or two digits, not &amp;quot;&amp;#039;..(ish or &amp;#039;&amp;#039;)..&amp;#039;&amp;quot;. &amp;#039;..&lt;br /&gt;
								&amp;#039;E.g. &amp;quot;1999-2000&amp;quot; should be cut down to &amp;quot;1999-00&amp;quot;.&amp;#039;)&lt;br /&gt;
			return failedcat(errors, &amp;#039;I&amp;#039;)..endashcat&lt;br /&gt;
		end&lt;br /&gt;
		local ish_fixed = mw.ustring.match(ish or &amp;#039;&amp;#039;, &amp;#039;^%s*(%d?%d)%D&amp;#039;)&lt;br /&gt;
		if ish_fixed then&lt;br /&gt;
			ish = ish_fixed&lt;br /&gt;
		else&lt;br /&gt;
			errors = errorclass(&amp;#039;Function navhyphen can\&amp;#039;t recognize the number &amp;quot;&amp;#039;..(ish or &amp;#039;&amp;#039;)..&amp;#039;&amp;quot; &amp;#039;..&lt;br /&gt;
								&amp;#039;in the second part of the &amp;quot;season&amp;quot; that was passed to it. &amp;#039;..&lt;br /&gt;
								&amp;#039;For e.g. &amp;quot;2015–16&amp;quot;, &amp;quot;16&amp;quot; is expected via &amp;quot;|2015|–|16|&amp;quot;.&amp;#039;)&lt;br /&gt;
			return failedcat(errors, &amp;#039;J&amp;#039;)..endashcat&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local nish = tonumber(ish)&lt;br /&gt;
	&lt;br /&gt;
	--sterilize min/max&lt;br /&gt;
	local nminseas = tonumber(minseas) or -9999 --not yet implemented; pending discussion&lt;br /&gt;
	local nmaxseas = tonumber(maxseas) or  9999 --not yet implemented; pending discussion&lt;br /&gt;
	&lt;br /&gt;
	--error check start &amp;amp; ish together&lt;br /&gt;
	if string.len(start) &amp;gt;= 2 and string.len(ish) ~= 2 then&lt;br /&gt;
		errors = errorclass(&amp;#039;The second part of the season passed to function navhyphen should be two digits, not &amp;quot;&amp;#039;..ish..&amp;#039;&amp;quot;.&amp;#039;)&lt;br /&gt;
		return failedcat(errors, &amp;#039;K&amp;#039;)..endashcat&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--calculate intRAseason size/term length &amp;amp; finishing year&lt;br /&gt;
	local t = 1&lt;br /&gt;
	while t &amp;lt;= 10 do --1~4 iterations should be enough&lt;br /&gt;
		local nfinish = nstart + t --use switchADBC to flip this sign to work for years BC&lt;br /&gt;
		if string.match(nfinish, &amp;#039;%d?%d$&amp;#039;) == ish then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		if t == 10 then&lt;br /&gt;
			errors = errorclass(&amp;#039;Function navhyphen can\&amp;#039;t determine a reasonable term length for &amp;quot;&amp;#039;..start..hyph..ish..&amp;#039;&amp;quot;.&amp;#039;)&lt;br /&gt;
			return failedcat(errors, &amp;#039;L&amp;#039;)..endashcat&lt;br /&gt;
		end&lt;br /&gt;
		t = t + 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--calculate intERseason gap size&lt;br /&gt;
	local hgapdefault = 0 --assume &amp;amp; start at the most common case: 2001–02, 2002–03, etc.&lt;br /&gt;
	local hgap = hgapdefault&lt;br /&gt;
	local hgap_success = false&lt;br /&gt;
	while hgap &amp;lt;= 5 do --verify&lt;br /&gt;
		local prevseason = firstpart..&amp;#039; &amp;#039;..(nstart-t-hgap)..hyph..string.match(nstart-hgap, &amp;#039;%d?%d$&amp;#039;)..&amp;#039; &amp;#039;..lastpart&lt;br /&gt;
		local nextseason = firstpart..&amp;#039; &amp;#039;..(nstart+t+hgap)..hyph..string.match(nstart+2*t+hgap, &amp;#039;%d?%d$&amp;#039;)..&amp;#039; &amp;#039;..lastpart&lt;br /&gt;
		if mw.title.new(prevseason, &amp;#039;Category&amp;#039;).exists or   --use &amp;#039;or&amp;#039;, in case we&amp;#039;re at the edge of the cat structure,&lt;br /&gt;
		   mw.title.new(nextseason, &amp;#039;Category&amp;#039;).exists then --or we hit a &amp;quot;–00&amp;quot;/&amp;quot;–2000&amp;quot; situation on one side&lt;br /&gt;
			hgap_success = true&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		hgap = hgap + 1&lt;br /&gt;
	end&lt;br /&gt;
	if hgap_success == false then&lt;br /&gt;
		hgap = tonumber(testgap) or hgapdefault --tracked via defaultgapcat()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--begin navhyphen&lt;br /&gt;
	local navh = &amp;#039;{| class=&amp;quot;toccolours hlist&amp;quot; style=&amp;quot;text-align: center; margin: auto;&amp;quot;\n&amp;#039;..&amp;#039;|\n&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	local i = -3&lt;br /&gt;
	while i &amp;lt;= 3 do&lt;br /&gt;
		local from = nstart + i*(t+hgap)&lt;br /&gt;
		local to   = tostring(from+t)&lt;br /&gt;
		local todisp = string.match(to, &amp;#039;%d?%d$&amp;#039;)&lt;br /&gt;
		local tolink = todisp&lt;br /&gt;
		if tolink == &amp;#039;00&amp;#039; then&lt;br /&gt;
			tolink = to&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--populate navh&lt;br /&gt;
		local shown = &amp;#039;*&amp;#039;..catlink( firstpart..&amp;#039; &amp;#039;..from..hyph..tolink..&amp;#039; &amp;#039;..lastpart, &lt;br /&gt;
													from..hyph..todisp )..&amp;#039;\n&amp;#039;&lt;br /&gt;
		local hidden = &amp;#039;*&amp;lt;span style=&amp;quot;visibility:hidden&amp;quot;&amp;gt;&amp;#039;..from..hyph..todisp..&amp;#039;&amp;lt;/span&amp;gt;\n&amp;#039;&lt;br /&gt;
		if i ~= 0 then --left/right navh&lt;br /&gt;
			if from &amp;gt;= 0 then&lt;br /&gt;
				navh =	navh..shown&lt;br /&gt;
			else&lt;br /&gt;
				navh = navh..hidden&lt;br /&gt;
			end&lt;br /&gt;
		else --center navh&lt;br /&gt;
			navh = navh..&amp;#039;*&amp;lt;b&amp;gt;&amp;#039;..start..hyph..ish..&amp;#039;&amp;lt;/b&amp;gt;\n&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return navh..&amp;#039;|}&amp;#039;..isolatedcat()..defaultgapcat(not hgap_success)..endashcat&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[============================{{  navordinal  }}============================]]&lt;br /&gt;
&lt;br /&gt;
function navordinal( firstpart, ord, lastpart, minimumord, maximumord )&lt;br /&gt;
	local nord = tonumber(ord)&lt;br /&gt;
	local minord = tonumber(string.match(minimumord or &amp;#039;&amp;#039;, &amp;#039;(-?%d+)[snrt]?[tdh]?&amp;#039;)) or -9999 --allow full ord &amp;amp; +/- qualifier&lt;br /&gt;
	local maxord = tonumber(string.match(maximumord or &amp;#039;&amp;#039;, &amp;#039;(-?%d+)[snrt]?[tdh]?&amp;#039;)) or  9999 --allow full ord &amp;amp; +/- qualifier&lt;br /&gt;
	if string.match(minimumord or &amp;#039;&amp;#039;, &amp;#039;BC&amp;#039;) then minord = -math.abs(minord) end --allow BC qualifier (AD otherwise assumed)&lt;br /&gt;
	if string.match(maximumord or &amp;#039;&amp;#039;, &amp;#039;BC&amp;#039;) then maxord = -math.abs(maxord) end --allow BC qualifier (AD otherwise assumed)&lt;br /&gt;
	&lt;br /&gt;
	local temporal = string.match(lastpart, &amp;#039;century&amp;#039;) or&lt;br /&gt;
					 string.match(lastpart, &amp;#039;millennium&amp;#039;) or &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	local tspace = &amp;#039; &amp;#039; --assume a trailing space after ordinal&lt;br /&gt;
	if string.match(lastpart, &amp;#039;^-&amp;#039;) then tspace = &amp;#039;&amp;#039; end --DNE for &amp;quot;19th-century&amp;quot;-type cats&lt;br /&gt;
	&lt;br /&gt;
	--AD/BC switches &amp;amp; vars&lt;br /&gt;
	&lt;br /&gt;
	local ordBCElastparts = { --needed for parent = AD 1-5, when the BC/E format is unknown&lt;br /&gt;
		--lists the lastpart of valid BCE cats&lt;br /&gt;
		--&amp;quot;BCE&amp;quot; removed to match both AD &amp;amp; BCE cats; easier &amp;amp; faster than multiple string.match()s&lt;br /&gt;
		[&amp;#039;-century Hebrew people&amp;#039;] = &amp;#039;BCE&amp;#039;, --WP:CFD/Log/2016 June 21#Category:11th-century BC Hebrew people&lt;br /&gt;
		[&amp;#039;-century Jews&amp;#039;]          = &amp;#039;BCE&amp;#039;, --co-nominated&lt;br /&gt;
		[&amp;#039;-century Judaism&amp;#039;]       = &amp;#039;BCE&amp;#039;, --co-nominated&lt;br /&gt;
		[&amp;#039;-century rabbis&amp;#039;]        = &amp;#039;BCE&amp;#039;, --co-nominated&lt;br /&gt;
	}&lt;br /&gt;
	local parentBC = mw.ustring.match(lastpart, &amp;#039;%s(BCE?)&amp;#039;)       --&amp;quot;1st-century BC&amp;quot; format&lt;br /&gt;
	local lastpartNoBC = mw.ustring.gsub(lastpart, &amp;#039;%sBCE?&amp;#039;, &amp;#039;&amp;#039;)  --easier than splitting lastpart up in 2; AD never used&lt;br /&gt;
	local BCe = parentBC or ordBCElastparts[lastpartNoBC] or &amp;#039;BC&amp;#039; --&amp;quot;BC&amp;quot; default&lt;br /&gt;
	&lt;br /&gt;
	local switchADBC = 1                 --  1=AD parent&lt;br /&gt;
	if parentBC then switchADBC = -1 end -- -1=BC parent; possibly adjusted later&lt;br /&gt;
	local O = 0 --secondary iterator for AD-on-a-BC-parent&lt;br /&gt;
	&lt;br /&gt;
	if not temporal and minord &amp;lt; 1 then minord = 1 end --nothing before &amp;quot;1st parliament&amp;quot;, etc.&lt;br /&gt;
	if minord &amp;gt; nord*switchADBC then minord = nord*switchADBC end --input error; minord should be &amp;lt;= parent&lt;br /&gt;
	if maxord &amp;lt; nord*switchADBC then maxord = nord*switchADBC end --input error; maxord should be &amp;gt;= parent&lt;br /&gt;
	&lt;br /&gt;
	--determine right-offset, to not show unnecessary future millenia&lt;br /&gt;
	local roffset = 0&lt;br /&gt;
	if temporal and nord &amp;lt;= 3 then&lt;br /&gt;
		if string.match(lastpartNoBC, &amp;#039;millennium &amp;#039;) and --only offset &amp;quot;1st millennium BC in Egypt&amp;quot; to &amp;quot;3rd-millennium people&amp;quot;-type cats&lt;br /&gt;
		   string.match(lastpartNoBC, &amp;#039;millennium in fiction&amp;#039;) == nil and --except these, which extend &amp;gt; 4th millennium&lt;br /&gt;
		   maxord == 9999 --only apply if max unspecified&lt;br /&gt;
		then&lt;br /&gt;
			if not parentBC and nord &amp;lt;= 3 then --1st, 2nd, &amp;amp; 3rd millennium parents&lt;br /&gt;
				roffset = nord + 1&lt;br /&gt;
			elseif parentBC and nord == 1 then --1st millennium BC only&lt;br /&gt;
				roffset = 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--begin navordinal&lt;br /&gt;
	local navo = &amp;#039;{| class=&amp;quot;toccolours hlist&amp;quot; style=&amp;quot;text-align: center; margin: auto;&amp;quot;\n&amp;#039;..&amp;#039;|\n&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	local i = (-5 - roffset)&lt;br /&gt;
	while i &amp;lt;= (5 - roffset) do&lt;br /&gt;
		local o = nord + i*switchADBC&lt;br /&gt;
		local BC = &amp;#039;&amp;#039;&lt;br /&gt;
		local BCdisp = &amp;#039;&amp;#039;&lt;br /&gt;
		if i ~= 0 then --left/right navo&lt;br /&gt;
			&lt;br /&gt;
			if parentBC then&lt;br /&gt;
				if switchADBC == -1 then --parentBC looking at the BC side&lt;br /&gt;
					if o &amp;gt;= 1 then     --the common case&lt;br /&gt;
						BC = &amp;#039; &amp;#039;..BCe&lt;br /&gt;
					elseif o == 0 then --switch to the AD side&lt;br /&gt;
						BC = &amp;#039;&amp;#039;&lt;br /&gt;
						switchADBC = 1&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if switchADBC == 1 then --displayed o is now in the AD regime&lt;br /&gt;
					O = O + 1 --skip o = 0 (DNE)&lt;br /&gt;
					o = O     --easiest solution: start another iterator for these AD o&amp;#039;s displayed on a BC year parent&lt;br /&gt;
				end&lt;br /&gt;
			elseif o &amp;lt;= 0 then --parentAD looking at BC side&lt;br /&gt;
				BC = &amp;#039; &amp;#039;..BCe&lt;br /&gt;
				o = math.abs(o - 1) --skip o = 0 (DNE)&lt;br /&gt;
			end&lt;br /&gt;
			if BC ~= &amp;#039;&amp;#039; and nord &amp;lt;= 5 then --only show &amp;#039;BC&amp;#039; for parent ords &amp;lt;= 5: saves room, easier to read,&lt;br /&gt;
				BCdisp = &amp;#039; &amp;#039;..BCe          --and 6 is the first/last nav ord that doesn&amp;#039;t need a disambiguator;&lt;br /&gt;
			end                            --the center/parent ord will always show BC, so no need to show it another 10x&lt;br /&gt;
			&lt;br /&gt;
			--populate left/right navo&lt;br /&gt;
			local oth = addord(o)&lt;br /&gt;
			local osign = o --use o for display &amp;amp; osign for logic&lt;br /&gt;
			if BC ~= &amp;#039;&amp;#039; then osign = -osign end&lt;br /&gt;
			local hidden = &amp;#039;*&amp;lt;span style=&amp;quot;visibility:hidden&amp;quot;&amp;gt;&amp;#039;..oth..&amp;#039;&amp;lt;/span&amp;gt;\n&amp;#039;&lt;br /&gt;
			if temporal then --e.g. &amp;quot;3rd-century BC&amp;quot;&lt;br /&gt;
				if (minord &amp;lt;= osign) and (osign &amp;lt;= maxord) then&lt;br /&gt;
					local lastpart = lastpartNoBC --lest we recursively add multiple &amp;quot;BC&amp;quot;s&lt;br /&gt;
					if BC ~= &amp;#039;&amp;#039; then&lt;br /&gt;
						lastpart = string.gsub(lastpart, temporal, temporal..BC) --replace BC if needed&lt;br /&gt;
					end&lt;br /&gt;
					navo = navo..&amp;#039;*&amp;#039;..catlink( firstpart..&amp;#039; &amp;#039;..oth..tspace..lastpart, oth..BCdisp )..&amp;#039;\n&amp;#039;&lt;br /&gt;
				else&lt;br /&gt;
					navo = navo..hidden&lt;br /&gt;
				end&lt;br /&gt;
			elseif BC == &amp;#039;&amp;#039; and minord &amp;lt;= osign and osign &amp;lt;= maxord then --e.g. &amp;gt;= &amp;quot;1st parliament&amp;quot;&lt;br /&gt;
				navo = navo..&amp;#039;*&amp;#039;..catlink( firstpart..&amp;#039; &amp;#039;..oth..tspace..lastpart, oth )..&amp;#039;\n&amp;#039;&lt;br /&gt;
			else --either out-of-range (hide), or non-temporal + BC = something might be wrong (2nd X parliament BC?); handle exceptions if/as they arise&lt;br /&gt;
				navo = navo..hidden&lt;br /&gt;
			end&lt;br /&gt;
		else --center navo&lt;br /&gt;
			if parentBC then BC = &amp;#039; &amp;#039;..BCe end&lt;br /&gt;
			navo = navo..&amp;#039;*&amp;lt;b&amp;gt;&amp;#039;..addord(o)..BC..&amp;#039;&amp;lt;/b&amp;gt;\n&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return navo..&amp;#039;|}&amp;#039;..isolatedcat()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[============================{{  var_season  }}============================]]&lt;br /&gt;
&lt;br /&gt;
function var_season( pn )&lt;br /&gt;
	--Extracts e.g. 2015–16, 3rd, 2000s, or 1999 out of a string&lt;br /&gt;
	local pagename = currtitle.baseText&lt;br /&gt;
	if pn and pn ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		pagename = pn&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local cpagename = &amp;#039;Category:&amp;#039;..pagename --limited-Lua-regex workaround&lt;br /&gt;
	&lt;br /&gt;
	local season  = mw.ustring.match(cpagename, &amp;#039;[:%s](%d+[–-]%d+)%s&amp;#039;) or --split in 2 b/c %f[%s$] doesn&amp;#039;t work&lt;br /&gt;
					mw.ustring.match(cpagename, &amp;#039;[:%s](%d+[–-]%d+)$&amp;#039;)&lt;br /&gt;
					&lt;br /&gt;
	local ordinal = mw.ustring.match(cpagename, &amp;#039;[:%s](%d+[snrt][tdh])[-%s]&amp;#039;) or&lt;br /&gt;
					mw.ustring.match(cpagename, &amp;#039;[:%s](%d+[snrt][tdh])$&amp;#039;)&lt;br /&gt;
					&lt;br /&gt;
	local decade  = mw.ustring.match(cpagename, &amp;#039;[:%s](%d+년대)[-%s를]&amp;#039;) or&lt;br /&gt;
					mw.ustring.match(cpagename, &amp;#039;[:%s](%d+년대)$&amp;#039;)&lt;br /&gt;
					&lt;br /&gt;
	local year    = mw.ustring.match(cpagename, &amp;#039;[:%s](%d+)[년세%s]&amp;#039;) or&lt;br /&gt;
					mw.ustring.match(cpagename, &amp;#039;[:%s](%d+)$&amp;#039;)&lt;br /&gt;
					&lt;br /&gt;
	local all4 = (season or &amp;#039;&amp;#039;)..&amp;#039;,&amp;#039;..(ordinal or &amp;#039;&amp;#039;)..&amp;#039;,&amp;#039;..(decade or &amp;#039;&amp;#039;)..&amp;#039;,&amp;#039;..(year or &amp;#039;&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	if (season == nil and ordinal == nil and decade == nil and year == nil) or&lt;br /&gt;
		string.match(all4, &amp;#039;%d%d%d%d%d&amp;#039;)&lt;br /&gt;
	then&lt;br /&gt;
		errors = errorclass(&amp;#039;Function var_season can\&amp;#039;t recognize a season, ordinal, decade, nor year for category &amp;quot;&amp;#039;..pagename..&amp;#039;&amp;quot;.&amp;#039;)&lt;br /&gt;
		return failedcat(errors, &amp;#039;S&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--return in order of decreasing complexity&lt;br /&gt;
	if season  then return season  end&lt;br /&gt;
	if ordinal then return ordinal end&lt;br /&gt;
	if decade  then return decade  end&lt;br /&gt;
	if year    then return year    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
--[[                                   Main                                   ]]&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
&lt;br /&gt;
function p.navseasoncats( frame )&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local dby         = args[&amp;#039;decade-below-year&amp;#039;] --used by {{Navseasoncats with decades below year}}&lt;br /&gt;
	local cat         = args[&amp;#039;cat&amp;#039;] --&amp;#039;testcase&amp;#039; alias&lt;br /&gt;
	local testcase    = args[&amp;#039;testcase&amp;#039;]&lt;br /&gt;
	local testcasegap = args[&amp;#039;testcasegap&amp;#039;]&lt;br /&gt;
	local minyear = args[&amp;#039;min&amp;#039;]&lt;br /&gt;
	local maxyear = args[&amp;#039;max&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
	if dby then&lt;br /&gt;
		navborder = false&lt;br /&gt;
		dby = string.gsub(dby, &amp;#039;&amp;amp;#32;&amp;#039;, &amp;#039; &amp;#039;) --unicodify forced whitespace&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local paramtracking = &amp;#039;&amp;#039;&lt;br /&gt;
	if currtitle.nsText == &amp;#039;Category&amp;#039; then&lt;br /&gt;
		if cat      then paramtracking = paramtracking..&amp;#039;[[Category:시간 분류 둘러보기 - cat 인수 사용]]&amp;#039; end&lt;br /&gt;
		if testcase then paramtracking = paramtracking..&amp;#039;[[Category:시간 분류 둘러보기 - testcase 인수 사용]]&amp;#039; end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local pagename = testcase or cat or dby or currtitle.baseText&lt;br /&gt;
	&lt;br /&gt;
	local varseason = var_season(pagename)&lt;br /&gt;
	if errors ~= &amp;#039;&amp;#039; then return varseason..paramtracking end --some error checking in var_season()&lt;br /&gt;
	&lt;br /&gt;
	local firstpart, lastpart = string.match(pagename, &amp;#039;^(.*)&amp;#039;..varseason..&amp;#039;(.*)$&amp;#039;)&lt;br /&gt;
	-- firstpart = mw.text.trim(firstpart or &amp;#039;&amp;#039;)&lt;br /&gt;
	-- lastpart  = mw.text.trim(lastpart or &amp;#039;&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	local start = string.match(varseason, &amp;#039;^%d+&amp;#039;)&lt;br /&gt;
	local hyphen, finish = mw.ustring.match(varseason, &amp;#039;%d([–-])(%d+)&amp;#039;) --ascii 150 &amp;amp; 45 (ndash &amp;amp; keyboard hyphen); mw req&amp;#039;d&lt;br /&gt;
	&lt;br /&gt;
	--determine the appropriate nav function&lt;br /&gt;
	if hyphen and finish then                             --e.g. &amp;quot;2015–16&amp;quot;&lt;br /&gt;
		local ish = string.match(finish, &amp;#039;%d?%d$&amp;#039;)        --in case  &amp;quot;1999–2000&amp;quot;, &amp;quot;1–4&amp;quot;&lt;br /&gt;
		return navhyphen( start, hyphen, ish, firstpart, lastpart, minyear, maxyear, testcasegap )..paramtracking&lt;br /&gt;
		&lt;br /&gt;
	elseif string.match(varseason, &amp;#039;%d[snrt][tdh]$&amp;#039;) then --e.g. &amp;quot;4th&amp;quot;&lt;br /&gt;
		return navordinal( firstpart, start, lastpart, minyear, maxyear )..paramtracking&lt;br /&gt;
		&lt;br /&gt;
	elseif string.match(varseason, &amp;#039;%d년대$&amp;#039;) then           --e.g. &amp;quot;0s&amp;quot;, &amp;quot;2010s&amp;quot;&lt;br /&gt;
		return navdecade( firstpart, start, lastpart, minyear, maxyear )..paramtracking&lt;br /&gt;
		&lt;br /&gt;
	elseif string.match(varseason, &amp;#039;^%d+$&amp;#039;) then          --e.g. &amp;quot;500&amp;quot; or &amp;quot;2001&amp;quot;&lt;br /&gt;
		return navyear( firstpart, start, lastpart, minyear, maxyear )..paramtracking&lt;br /&gt;
		&lt;br /&gt;
	else                                                  --malformed&lt;br /&gt;
		errors = errorclass(&amp;#039;Failed to determine the appropriate nav function from malformed season &amp;quot;&amp;#039;..varseason..&amp;#039;&amp;quot;. &amp;#039;)&lt;br /&gt;
		return failedcat(errors, &amp;#039;N&amp;#039;)..paramtracking&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>HyunJongSu</name></author>
	</entry>
</feed>