<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ACategory_described_in_year</id>
	<title>Module:Category described in year - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ACategory_described_in_year"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Category_described_in_year&amp;action=history"/>
	<updated>2026-06-15T02:44:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:Category_described_in_year&amp;diff=471194&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Category_described_in_year&amp;diff=471194&amp;oldid=prev"/>
		<updated>2021-07-15T20:54:45Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require('Module:No globals')&lt;br /&gt;
local commonsLink = require('Module:Commons link')&lt;br /&gt;
&lt;br /&gt;
local conf = require( 'Module:Category described in year/conf' ) --configuration module&lt;br /&gt;
&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
--[[                             Local functions                              ]]&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
&lt;br /&gt;
local function addOrd( i ) --12 -&amp;gt; 12th, etc.&lt;br /&gt;
	if tonumber(i) then&lt;br /&gt;
		local s = tostring(i)&lt;br /&gt;
		local  tens = string.match(s, '1%d$')&lt;br /&gt;
		local  ones = string.match(s,  '%d$')&lt;br /&gt;
		if     tens        then return s..'th'&lt;br /&gt;
		elseif ones == '1' then return s..'st'&lt;br /&gt;
		elseif ones == '2' then return s..'nd'&lt;br /&gt;
		elseif ones == '3' then return s..'rd'&lt;br /&gt;
		elseif ones ~= nil then return s..'th'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isNilOrEmpty( thing )&lt;br /&gt;
	return (thing == nil or thing == '')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
--[[                            External function                             ]]&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
&lt;br /&gt;
function p.autodetect( frame )&lt;br /&gt;
	local currentTitle = mw.title.getCurrentTitle()&lt;br /&gt;
	local parentArg = frame:getParent().args[1] --accept 1 unnamed category parameter if not in category namespace; required for testing/doc/etc. purposes&lt;br /&gt;
	local header = ' ' --header template(s), nav bar, and category description text; whitespace-initialized for convenience&lt;br /&gt;
	local nav = nil&lt;br /&gt;
	local portal = nil --for {{Portal|...}}&lt;br /&gt;
	local commons = nil --for {{Commons|...}}&lt;br /&gt;
	local wikispecies = nil --for {{Wikispecies|...}}&lt;br /&gt;
	local description = nil&lt;br /&gt;
	local toc = nil&lt;br /&gt;
	local categories = {}&lt;br /&gt;
	local trackingCategories = {&lt;br /&gt;
		[1] = '', --placeholder for [[Category:Described in year unknown category]]&lt;br /&gt;
		[2] = '', --placeholder for [[Category:Described in year error]]&lt;br /&gt;
	}&lt;br /&gt;
	local outString = nil&lt;br /&gt;
	local bConfError = false&lt;br /&gt;
	&lt;br /&gt;
	--prelim namespace/title determination&lt;br /&gt;
	local currCat = nil&lt;br /&gt;
	local currQID = nil&lt;br /&gt;
	if currentTitle.namespace == 14 then --category namespace&lt;br /&gt;
		currCat = currentTitle.text --without namespace nor interwiki prefixes&lt;br /&gt;
		currQID = mw.wikibase.getEntityIdForCurrentPage()&lt;br /&gt;
	else&lt;br /&gt;
		if parentArg then&lt;br /&gt;
			currCat = mw.ustring.gsub(parentArg, 'Category:', '')&lt;br /&gt;
			currQID = mw.wikibase.getEntityIdForTitle('Category:' .. currCat)&lt;br /&gt;
		else --currQID &amp;amp; currCat both nil&lt;br /&gt;
			if currentTitle.fullText ~= 'Template:Category described in year' then --ignore self...&lt;br /&gt;
				trackingCategories[2] = '[[Category:Described in year error|P]]' --missing a category parameter outside category namespace&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--find commons &amp;amp; wikispecies link(s); produce {{Commons and category}} and/or {{Wikispecies}} template(s)&lt;br /&gt;
	if currQID then&lt;br /&gt;
		if commonsLink._hasGallery(currQID) or commonsLink._hasCategory(currQID) then&lt;br /&gt;
			commons = frame:expandTemplate{ title = 'Commons and category', args = { qid=currQID }}&lt;br /&gt;
		end&lt;br /&gt;
		local currEntity = mw.wikibase.getEntity(currQID)&lt;br /&gt;
		if currEntity then&lt;br /&gt;
			--check &amp;quot;Other sites&amp;quot; sitelinks for Wikispecies&lt;br /&gt;
			local currSiteLinks = currEntity.sitelinks&lt;br /&gt;
			if currSiteLinks then&lt;br /&gt;
				local currSpeciesWiki = currEntity.sitelinks.specieswiki&lt;br /&gt;
				if currSpeciesWiki then&lt;br /&gt;
					local currSpeciesWikiTitle = currSpeciesWiki.title&lt;br /&gt;
					if currSpeciesWikiTitle then&lt;br /&gt;
						wikispecies = frame:expandTemplate{ title = 'Wikispecies', args = { currSpeciesWikiTitle } }&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end --if currQID then&lt;br /&gt;
	&lt;br /&gt;
	--[[======================================================================]]&lt;br /&gt;
	--[[                                 Main                                 ]]&lt;br /&gt;
	--[[======================================================================]]&lt;br /&gt;
	if currCat then&lt;br /&gt;
		&lt;br /&gt;
		--determine current/related/adjacent cats' properties/vars/etc.&lt;br /&gt;
		local currGroup = mw.ustring.match(currCat, '^([%w ]+) described in') --Bacteria/Plants/etc.&lt;br /&gt;
		if isNilOrEmpty(currGroup) then currGroup = mw.ustring.match(currCat, '^([%w ]+) by year of formal description') end&lt;br /&gt;
		if conf[currGroup] == nil then conf[currGroup] = conf['Default'] end --default to Default&lt;br /&gt;
		local currYDCF = nil --possible future values: year/decade/century/formal&lt;br /&gt;
		local currYear = mw.ustring.match(currCat, 'described in (%d%d%d%d)$')&lt;br /&gt;
		local currDeca = mw.ustring.match(currCat, 'described in the (%d%d%d%d)s$') --deprecated&lt;br /&gt;
		local currCent = mw.ustring.match(currCat, 'described in the (%d+)[snrt][tdh] century$')&lt;br /&gt;
		local currFrml = mw.ustring.match(currCat, 'by year of (formal) description$')&lt;br /&gt;
		local parentCent = nil --used with currYear&lt;br /&gt;
		local minYear = tonumber(conf[currGroup].minyear)&lt;br /&gt;
		if minYear == nil or &lt;br /&gt;
		  (minYear and (minYear &amp;lt;= 1700 or minYear &amp;gt;= 2000)) then&lt;br /&gt;
			minYear = 1758 --default to 1758 per ICZN Art. 5&lt;br /&gt;
		end&lt;br /&gt;
		if currYear then&lt;br /&gt;
			currYDCF = 'year'&lt;br /&gt;
			if mw.ustring.match(currYear, '^%d%d00') then --1900 in 19th century&lt;br /&gt;
				parentCent = mw.ustring.match(currYear, '^%d%d')&lt;br /&gt;
			else --1901 in 20th century&lt;br /&gt;
				parentCent = 1 + mw.ustring.match(currYear, '^%d%d')&lt;br /&gt;
			end&lt;br /&gt;
		elseif currDeca then&lt;br /&gt;
			currYDCF = 'decade'&lt;br /&gt;
			bConfError = true&lt;br /&gt;
			trackingCategories[2] = '[[Category:Described in year error|D]]' --invalid decade-parent (deprecated)&lt;br /&gt;
		elseif currCent then&lt;br /&gt;
			currYDCF = 'century'&lt;br /&gt;
		elseif currFrml then&lt;br /&gt;
			currYDCF = 'formal'&lt;br /&gt;
		else&lt;br /&gt;
			bConfError = true&lt;br /&gt;
			trackingCategories[2] = '[[Category:Described in year error|N]]' --invalid category name&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--conf error checkng (missing keys)&lt;br /&gt;
		--Numeric sortkeys are unfortunately grouped together under &amp;quot;0-9&amp;quot;.&lt;br /&gt;
		--Check phab T203355 (Magic word to force category number headings instead of 0-9).&lt;br /&gt;
		if bConfError == false then&lt;br /&gt;
			if conf[currGroup] == nil then&lt;br /&gt;
				bConfError = true&lt;br /&gt;
				trackingCategories[2] = '[[Category:Described in year error|1]]' --group (Bacteria/Plants/etc.) key missing from conf&lt;br /&gt;
			elseif conf[currGroup][currYDCF] == nil then&lt;br /&gt;
				bConfError = true&lt;br /&gt;
				trackingCategories[2] = '[[Category:Described in year error|2]]' --year/century/formal key missing&lt;br /&gt;
			else&lt;br /&gt;
				if conf[currGroup][currYDCF].description == nil then&lt;br /&gt;
					bConfError = true&lt;br /&gt;
					trackingCategories[2] = '[[Category:Described in year error|3]]' --description key missing&lt;br /&gt;
				end&lt;br /&gt;
				if conf[currGroup][currYDCF].parent1 == nil then&lt;br /&gt;
					bConfError = true&lt;br /&gt;
					trackingCategories[2] = '[[Category:Described in year error|4]]' --parent key missing&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if bConfError == false then&lt;br /&gt;
			--produce portal&lt;br /&gt;
			if currGroup == 'Fossil taxa' or currGroup == 'Fossil parataxa' then&lt;br /&gt;
				portal = frame:expandTemplate{ title = 'Portal', args = { 'Paleontology' } }&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			--produce description, evaluate %variables%&lt;br /&gt;
			description = conf[currGroup][currYDCF].description&lt;br /&gt;
			if mw.ustring.match(description, '%%year%%') then&lt;br /&gt;
				if currYear then description = mw.ustring.gsub(description, '%%year%%', currYear) --&amp;quot;2011&amp;quot;&lt;br /&gt;
				else description = mw.ustring.gsub(description, '%%year%%', 'this year') end&lt;br /&gt;
			end&lt;br /&gt;
			if mw.ustring.match(description, '%%century%%') then&lt;br /&gt;
				if currCent then description = mw.ustring.gsub(description, '%%century%%', addOrd(currCent)) --&amp;quot;21st&amp;quot;&lt;br /&gt;
				else description = mw.ustring.gsub(description, '%%century%%', 'this century') end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			--produce toc&lt;br /&gt;
-- {{CatAutoTOC}} now provided via [[Template:Category described in year]]&lt;br /&gt;
--[[&lt;br /&gt;
			if mw.site.stats.pagesInCategory(currCat, 'pages') &amp;gt;= conf['tocmin'] then --expensive&lt;br /&gt;
				local args = { numerals = 'no' }&lt;br /&gt;
				toc = frame:expandTemplate{ title = 'Category TOC', args = args }&lt;br /&gt;
			end&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
			--produce cats &amp;amp; navs&lt;br /&gt;
			local iparent = 1&lt;br /&gt;
			local parenti = 'parent' .. iparent&lt;br /&gt;
			local sortkeyi = 'sortkey' .. iparent&lt;br /&gt;
			while conf[currGroup][currYDCF][parenti] do&lt;br /&gt;
				local parent = conf[currGroup][currYDCF][parenti]&lt;br /&gt;
				local sortkey = conf[currGroup][currYDCF][sortkeyi]&lt;br /&gt;
				&lt;br /&gt;
				--[[========================== Year ==========================]]&lt;br /&gt;
				if currYDCF == 'year' then&lt;br /&gt;
					if nav == nil then&lt;br /&gt;
						local args = { min = minYear }&lt;br /&gt;
						if parentArg and currentTitle.namespace ~= 14 then&lt;br /&gt;
							args['testcase'] = parentArg&lt;br /&gt;
						end&lt;br /&gt;
						nav = frame:expandTemplate{ title = 'Navseasoncats', args = args }&lt;br /&gt;
					end&lt;br /&gt;
					if parent == 'century' then&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = currYear end --default to currYear&lt;br /&gt;
						categories[iparent] = '[[Category:'..currGroup..' described in the '..addOrd(parentCent)..' century|'..sortkey..']]'&lt;br /&gt;
					elseif parent == 'biology' then&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = '' --default to none&lt;br /&gt;
						else sortkey = '|'..sortkey end&lt;br /&gt;
						if tonumber(currYear) &amp;lt; 1865 then&lt;br /&gt;
							categories[iparent] = '[[Category:'..currYear..' in science'..sortkey..']]' --biology cat structure doesn't exist pre-1865, as of 10/2018&lt;br /&gt;
						else&lt;br /&gt;
							categories[iparent] = '[[Category:'..currYear..' in biology'..sortkey..']]' --if/when all biology cats exists, merge this elseif with 'paleontology'&lt;br /&gt;
						end&lt;br /&gt;
					elseif parent == 'paleontology' then&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = '' --default to none&lt;br /&gt;
						else sortkey = '|'..sortkey end&lt;br /&gt;
						categories[iparent] = '[[Category:'..currYear..' in '..parent..sortkey..']]'&lt;br /&gt;
					elseif parent == 'environment' then&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = '' --default to none&lt;br /&gt;
						else sortkey = '|'..sortkey end&lt;br /&gt;
						categories[iparent] = '[[Category:'..currYear..' in the environment'..sortkey..']]'&lt;br /&gt;
					elseif mw.ustring.match(parent, '^%u[%l ]+') then --e.g. Animals/Insects/Fossil taxa&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = '' --default to none&lt;br /&gt;
						else sortkey = '|'..sortkey end&lt;br /&gt;
						categories[iparent] = '[[Category:'..parent..' described in '..currYear..sortkey..']]'&lt;br /&gt;
					else&lt;br /&gt;
						trackingCategories[2] = '[[Category:Described in year error|Y]]' --invalid year-parent&lt;br /&gt;
					end&lt;br /&gt;
					&lt;br /&gt;
				--[[======================== Century =========================]]&lt;br /&gt;
				elseif currYDCF == 'century' then&lt;br /&gt;
					if nav == nil then&lt;br /&gt;
						local args = {}&lt;br /&gt;
						if parentArg and currentTitle.namespace ~= 14 then&lt;br /&gt;
							args['testcase'] = parentArg&lt;br /&gt;
						end&lt;br /&gt;
						nav = frame:expandTemplate{ title = 'Container category' } .. &lt;br /&gt;
							  frame:expandTemplate{ title = 'Navseasoncats', args = args }&lt;br /&gt;
					end&lt;br /&gt;
					if parent == 'formal' then&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = addOrd(currCent) end --default to currCent&lt;br /&gt;
						categories[iparent] = '[[Category:'..currGroup..' by year of formal description|'..sortkey..']]'&lt;br /&gt;
					elseif parent == 'biology' then&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = '' --default to none&lt;br /&gt;
						else sortkey = '|'..sortkey end&lt;br /&gt;
						if tonumber(currCent) &amp;lt; 19 then&lt;br /&gt;
							categories[iparent] = '[[Category:'..addOrd(currCent)..' century in science'..sortkey..']]' --biology cat structure doesn't exist pre-1865, as of 10/2018&lt;br /&gt;
						else&lt;br /&gt;
							categories[iparent] = '[[Category:'..addOrd(currCent)..' century in biology'..sortkey..']]' --if/when all biology cats exists, merge this elseif with 'paleontology'&lt;br /&gt;
						end&lt;br /&gt;
					elseif parent == 'paleontology' then&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = '' --default to none&lt;br /&gt;
						else sortkey = '|'..sortkey end&lt;br /&gt;
						categories[iparent] = '[[Category:'..addOrd(currCent)..' century in '..parent..sortkey..']]'&lt;br /&gt;
					elseif parent == 'environment' then&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = '' --default to none&lt;br /&gt;
						else sortkey = '|'..sortkey end&lt;br /&gt;
						categories[iparent] = '[[Category:'..addOrd(currCent)..' century in the environment'..sortkey..']]'&lt;br /&gt;
					elseif mw.ustring.match(parent, '^%u[%l ]+') then --e.g. Animals/Insects/Fossil taxa&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = '' --default to none&lt;br /&gt;
						else sortkey = '|'..sortkey end&lt;br /&gt;
						categories[iparent] = '[[Category:'..parent..' described in the '..addOrd(currCent)..' century'..sortkey..']]'&lt;br /&gt;
					else&lt;br /&gt;
						trackingCategories[2] = '[[Category:Described in year error|C]]' --invalid century-parent&lt;br /&gt;
					end&lt;br /&gt;
					&lt;br /&gt;
				--[[======================== Formal ==========================]]&lt;br /&gt;
				elseif currYDCF == 'formal' then&lt;br /&gt;
					if nav == nil then&lt;br /&gt;
						nav = frame:expandTemplate{ title = 'Container category' }&lt;br /&gt;
					end&lt;br /&gt;
					if parent == 'Group' then&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = ' Year' end --default to &amp;quot; Year&amp;quot;&lt;br /&gt;
						categories[iparent] = '[[Category:'..currGroup..'|'..sortkey..']]'&lt;br /&gt;
					elseif parent == 'Animals' or parent == 'Insects' or parent == 'Molluscs' then&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = ' ' end --default to &amp;quot; &amp;quot;&lt;br /&gt;
						categories[iparent] = '[[Category:'..parent..' by year of formal description|'..sortkey..']]'&lt;br /&gt;
					elseif parent == 'Species' or parent == 'Taxa' or parent == 'Fossil taxa' then&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = '' --default to none&lt;br /&gt;
						else sortkey = '|'..sortkey end&lt;br /&gt;
						categories[iparent] = '[[Category:'..parent..' by year of formal description'..sortkey..']]'&lt;br /&gt;
					elseif parent == 'paleontology' then&lt;br /&gt;
						if isNilOrEmpty(sortkey) then sortkey = ' ' end --default to &amp;quot; &amp;quot;&lt;br /&gt;
						categories[iparent] = '[[Category:Paleontology by year|'..sortkey..']]'&lt;br /&gt;
					else&lt;br /&gt;
						trackingCategories[2] = '[[Category:Described in year error|F]]' --invalid formal-parent&lt;br /&gt;
					end&lt;br /&gt;
					&lt;br /&gt;
				--[[========================= Error ==========================]]&lt;br /&gt;
				else&lt;br /&gt;
					trackingCategories[2] = '[[Category:Described in year error|U]]' --unknown configuration&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				iparent = iparent + 1&lt;br /&gt;
				parenti = 'parent' .. iparent&lt;br /&gt;
				sortkeyi = 'sortkey' .. iparent&lt;br /&gt;
			end --while conf[currGroup][currYDCF][parenti] do&lt;br /&gt;
		end --if bConfError == false then&lt;br /&gt;
		&lt;br /&gt;
		--check for non-existent cats&lt;br /&gt;
		for _, category in pairs(categories) do&lt;br /&gt;
			local cat = mw.ustring.match(category, '%[%[Category:([%w%s]+)')&lt;br /&gt;
			if mw.title.new(cat, 14).exists == false then&lt;br /&gt;
				trackingCategories[1] = '[[Category:Described in year unknown category]]'&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
	end --if currCat then&lt;br /&gt;
	&lt;br /&gt;
	--build header &amp;amp; rem surrounding whitespace&lt;br /&gt;
	if nav then header = nav end&lt;br /&gt;
	if portal then header = header .. portal end&lt;br /&gt;
	if commons then header = header .. commons end&lt;br /&gt;
	if wikispecies then header = header .. wikispecies end&lt;br /&gt;
	if description and description ~= '' then&lt;br /&gt;
		header = header .. description&lt;br /&gt;
	elseif portal or commons or wikispecies then &lt;br /&gt;
		header = mw.ustring.gsub(header, '&amp;lt;br ?/?&amp;gt;', '')&lt;br /&gt;
	end&lt;br /&gt;
	if toc then header = header .. '&amp;lt;br /&amp;gt;' .. toc end&lt;br /&gt;
	header = mw.text.trim(header)&lt;br /&gt;
	header = mw.ustring.gsub(header, '^&amp;lt;br /&amp;gt;', '')&lt;br /&gt;
	header = mw.ustring.gsub(header, '&amp;lt;br /&amp;gt;$', '')&lt;br /&gt;
	&lt;br /&gt;
	--append header to outString&lt;br /&gt;
	if outString then outString = outString .. header&lt;br /&gt;
	else outString = header end&lt;br /&gt;
	&lt;br /&gt;
	--append cats to outString&lt;br /&gt;
	if currentTitle.namespace == 14 then --category namespace&lt;br /&gt;
		if table.maxn(categories) &amp;gt; 0 then outString = outString .. table.concat(categories) end&lt;br /&gt;
		outString = outString .. table.concat(trackingCategories)&lt;br /&gt;
	else&lt;br /&gt;
		if table.maxn(categories) &amp;gt; 0 then --might be 0 if there's an error before setting cats&lt;br /&gt;
			outString = outString .. '&amp;lt;br /&amp;gt;' .. mw.ustring.gsub(table.concat(categories, '&amp;lt;br /&amp;gt;'), '%[%[', '[[:')&lt;br /&gt;
		end&lt;br /&gt;
		outString = outString .. '&amp;lt;br /&amp;gt;' .. mw.ustring.gsub(table.concat(trackingCategories, '&amp;lt;br /&amp;gt;'), '%[%[', '[[:')&lt;br /&gt;
		outString = mw.ustring.gsub(outString, '&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;', '&amp;lt;br /&amp;gt;') --produced by empty ('') first/consecutive tracking cat/s&lt;br /&gt;
		outString = mw.ustring.gsub(outString, '&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;', '&amp;lt;br /&amp;gt;') --jic (use while loop if #trackingCategories &amp;gt;= 3 or 4)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return outString&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>