<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://www.vigyanwiki.in/index.php?action=history&amp;feed=atom&amp;title=Module%3ATaxonbar</id>
	<title>Module:Taxonbar - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.vigyanwiki.in/index.php?action=history&amp;feed=atom&amp;title=Module%3ATaxonbar"/>
	<link rel="alternate" type="text/html" href="https://www.vigyanwiki.in/index.php?title=Module:Taxonbar&amp;action=history"/>
	<updated>2026-05-09T06:11:56Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://www.vigyanwiki.in/index.php?title=Module:Taxonbar&amp;diff=188460&amp;oldid=prev</id>
		<title>Indicwiki: 1 revision imported from :alpha:Module:Taxonbar</title>
		<link rel="alternate" type="text/html" href="https://www.vigyanwiki.in/index.php?title=Module:Taxonbar&amp;diff=188460&amp;oldid=prev"/>
		<updated>2023-06-19T10:11:00Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported from &lt;a href=&quot;https://alpha.indicwiki.in/index.php?title=Module:Taxonbar&quot; class=&quot;extiw&quot; title=&quot;alpha:Module:Taxonbar&quot;&gt;alpha:Module:Taxonbar&lt;/a&gt;&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;en-GB&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 15:41, 19 June 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en-GB&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Indicwiki</name></author>
	</entry>
	<entry>
		<id>https://www.vigyanwiki.in/index.php?title=Module:Taxonbar&amp;diff=188459&amp;oldid=prev</id>
		<title>alpha&gt;Sandeep: Created page with &quot;require('strict')  local conf = require( 'Module:Taxonbar/conf' ) --configuration module local TaxonItalics = require( 'Module:TaxonItalics' ) --use a function to conditionall...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.vigyanwiki.in/index.php?title=Module:Taxonbar&amp;diff=188459&amp;oldid=prev"/>
		<updated>2022-12-14T10:59:30Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;require(&amp;#039;strict&amp;#039;)  local conf = require( &amp;#039;Module:Taxonbar/conf&amp;#039; ) --configuration module local TaxonItalics = require( &amp;#039;Module:TaxonItalics&amp;#039; ) --use a function to conditionall...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require('strict')&lt;br /&gt;
&lt;br /&gt;
local conf = require( 'Module:Taxonbar/conf' ) --configuration module&lt;br /&gt;
local TaxonItalics = require( 'Module:TaxonItalics' ) --use a function to conditionally italicize taxon names&lt;br /&gt;
&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
--[[                             Local functions                              ]]&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
&lt;br /&gt;
local function isNilOrEmpty( thing )&lt;br /&gt;
	if thing == nil or thing == '' then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getIdFromWikidata( item, property )&lt;br /&gt;
	local id = nil&lt;br /&gt;
	if property == 'PWikispecies:$1' then&lt;br /&gt;
		local siteLinks = item.sitelinks&lt;br /&gt;
		if siteLinks then&lt;br /&gt;
			local speciesWiki = item.sitelinks.specieswiki&lt;br /&gt;
			if speciesWiki then&lt;br /&gt;
				id = speciesWiki.title&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return id&lt;br /&gt;
	elseif item.claims[property] == nil then&lt;br /&gt;
		return id&lt;br /&gt;
	end&lt;br /&gt;
	--[[ this code picks up deprecated values on wikidata; better to use getBestStatements&lt;br /&gt;
	for _, statement in pairs( item.claims[property] ) do&lt;br /&gt;
		if statement.mainsnak.datavalue then&lt;br /&gt;
			id = statement.mainsnak.datavalue.value&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	]]&lt;br /&gt;
	local statements = item:getBestStatements(property)[1] &lt;br /&gt;
	if statements and&lt;br /&gt;
	   statements.mainsnak and&lt;br /&gt;
	   statements.mainsnak.datavalue and&lt;br /&gt;
	   statements.mainsnak.datavalue.value&lt;br /&gt;
	then&lt;br /&gt;
		id = statements.mainsnak.datavalue.value&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return id&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLink( property, db, val )&lt;br /&gt;
	local link, returnVal = '', {}&lt;br /&gt;
	&lt;br /&gt;
	returnVal.isError = false&lt;br /&gt;
	&lt;br /&gt;
	if mw.ustring.find( val, '//' ) then&lt;br /&gt;
		link = val&lt;br /&gt;
	else&lt;br /&gt;
		if type(property) == 'number' and property &amp;gt; 0 then&lt;br /&gt;
			local entityObject = mw.wikibase.getEntity('P'..property)&lt;br /&gt;
			local dataType&lt;br /&gt;
			&lt;br /&gt;
			if entityObject then dataType = entityObject.datatype&lt;br /&gt;
			else returnVal.isError = true end&lt;br /&gt;
			&lt;br /&gt;
			if dataType == 'external-id' then&lt;br /&gt;
				local formatterURL = nil&lt;br /&gt;
				if property == 3746 or --Wildflowers of Israel&lt;br /&gt;
				   property == 3795 or --Flora of Israel Online&lt;br /&gt;
				   property == 5397    --Tierstimmenarchiv&lt;br /&gt;
				then&lt;br /&gt;
					formatterURL = entityObject:getBestStatements('P1630')[2] --use 2nd formatterURL for English version&lt;br /&gt;
				end&lt;br /&gt;
				if formatterURL == nil then formatterURL = entityObject:getBestStatements('P1630')[1] end --default to [1]&lt;br /&gt;
				if formatterURL then&lt;br /&gt;
					if formatterURL.mainsnak.datavalue and formatterURL.mainsnak.datavalue.value then --nil check for ABA&lt;br /&gt;
						link = formatterURL.mainsnak.datavalue.value&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if db == 'bow' then -- for birds of world which uses eBird identifier&lt;br /&gt;
					link = 'https://birdsoftheworld.org/bow/species/$1'&lt;br /&gt;
				end&lt;br /&gt;
			elseif dataType == 'url' then&lt;br /&gt;
				local subjectItem = entityObject:getBestStatements('P1629')[1]&lt;br /&gt;
				if subjectItem then&lt;br /&gt;
					local officialWebsite = mw.wikibase.getEntity(subjectItem.mainsnak.datavalue.value.id):getBestStatements('P856')[1]&lt;br /&gt;
					if officialWebsite then	link = officialWebsite.mainsnak.datavalue.value end&lt;br /&gt;
				end&lt;br /&gt;
			elseif dataType == 'string' then&lt;br /&gt;
				local formatterURL = entityObject:getBestStatements('P1630')[1]&lt;br /&gt;
				if formatterURL then&lt;br /&gt;
					link = formatterURL.mainsnak.datavalue.value&lt;br /&gt;
				else&lt;br /&gt;
					local subjectItem = entityObject:getBestStatements('P1629')[1]&lt;br /&gt;
					if subjectItem then&lt;br /&gt;
						local officialWebsite = mw.wikibase.getEntity(subjectItem.mainsnak.datavalue.value.id):getBestStatements('P856')[1]&lt;br /&gt;
						if officialWebsite then	link = officialWebsite.mainsnak.datavalue.value end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				returnVal.isError = true&lt;br /&gt;
			end&lt;br /&gt;
		elseif type(property) == 'string' then&lt;br /&gt;
			link = property&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--local valurl = val&lt;br /&gt;
		local valurl = mw.uri.encode( val, 'PATH' )&lt;br /&gt;
		valurl = string.gsub (valurl, '%%2F', '/') --escape '/' (e.g. issue with P5354); see wikidata T128078 and https://gerrit.wikimedia.org/r/c/mediawiki/extensions/Wikibase/+/664820/3/lib/includes/PropertyInfoSnakUrlExpander.php&lt;br /&gt;
		&lt;br /&gt;
		if type(property) == 'number' then&lt;br /&gt;
			--doublecheck language for Wildflowers of Israel ID&lt;br /&gt;
			if property == 3746 then link = mw.ustring.gsub(link, '/hebrew/', '/english/') end&lt;br /&gt;
			--format spaces in PfaF binomials, e.g. &amp;quot;Elaeagnus x ebbingei&amp;quot;&lt;br /&gt;
			if property == 4301 then valurl = mw.ustring.gsub(valurl, '%%20', '+') end&lt;br /&gt;
		end&lt;br /&gt;
		valurl = mw.ustring.gsub(valurl,'%%','%%%%')&lt;br /&gt;
		link = mw.ustring.gsub(link, '$1', valurl)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	link = mw.ustring.gsub(link, '^[Hh][Tt][Tt][Pp]([Ss]?)&amp;amp;#58;//', 'http%1://') --fix wikidata URL&lt;br /&gt;
	val = mw.ustring.match(val, '([^=/]*)/?$') --get display name from end of URL&lt;br /&gt;
	if mw.ustring.find( link, '//' ) then&lt;br /&gt;
		returnVal.text = '['..link..' '..mw.text.encode(mw.uri.decode(val, 'PATH'),'%[%]')..']'&lt;br /&gt;
	elseif link == '' then&lt;br /&gt;
		returnVal.text = val&lt;br /&gt;
	else&lt;br /&gt;
		returnVal.text = '&amp;lt;span class=&amp;quot;external&amp;quot;&amp;gt;[['..link..'|'..val..']]&amp;lt;/span&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	return returnVal&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function createRow( id, label, rawValue, link, withUid )&lt;br /&gt;
	if link then&lt;br /&gt;
		local outStr = '*&amp;lt;span style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;'..label..' &amp;lt;span'&lt;br /&gt;
		if withUid then outStr = outStr..' class=&amp;quot;uid&amp;quot;' end&lt;br /&gt;
		return outStr..'&amp;gt;'..link..'&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;\n'&lt;br /&gt;
	else&lt;br /&gt;
		return '* '..mw.text.tag('span', {class='error'}, 'The identifier '..id..' '..rawValue..' is not valid.')..'\n'&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function copyTable(inTable)&lt;br /&gt;
	if type(inTable) ~= 'table' then return inTable end&lt;br /&gt;
	local outTable = setmetatable({}, getmetatable(inTable))&lt;br /&gt;
	for key, value in pairs (inTable) do outTable[copyTable(key)] = copyTable(value) end&lt;br /&gt;
	return outTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
--[[                                   Main                                   ]]&lt;br /&gt;
--[[==========================================================================]]&lt;br /&gt;
&lt;br /&gt;
function p.authorityControlTaxon( frame )&lt;br /&gt;
	local resolveEntity = require( 'Module:ResolveEntityId' )&lt;br /&gt;
	local parentArgs = copyTable(frame:getParent().args)&lt;br /&gt;
	local currentTitle = mw.title.getCurrentTitle()&lt;br /&gt;
	local currentEntityId = mw.wikibase.getEntityIdForCurrentPage()&lt;br /&gt;
	&lt;br /&gt;
	local stringArgs = false&lt;br /&gt;
	local fromTitleCount, firstRow, rowCount = 1, 0, 0&lt;br /&gt;
	local outString, errors = '', ''&lt;br /&gt;
	local iFroms = 0 --integer size of tFroms, b/c Lua&lt;br /&gt;
	local tFroms = {} --non-sequential table of unique froms&lt;br /&gt;
	local tCats = {&lt;br /&gt;
		'[[Category:Taxonbars without from parameter]]',&lt;br /&gt;
		'[[Category:Taxonbars desynced from Wikidata]]',&lt;br /&gt;
		'', -- [3] placeholder for [[Category:Taxonbar pages requiring a Wikidata item]]&lt;br /&gt;
		'', -- [4] placeholder for [[Category:Taxonbars on possible non-taxon pages]]&lt;br /&gt;
		'', -- [5] placeholder for [[Category:Taxonbars with invalid from parameters]]&lt;br /&gt;
		'', -- [6] placeholder for [[Category:Taxonbars with duplicate from parameters]]&lt;br /&gt;
		'', -- [7] placeholder for [[Category:Taxonbars with from2 matching article title]]&lt;br /&gt;
		'', -- [8] placeholder for [[Category:Taxonbars with from2 matching article title &amp;amp; QID]]&lt;br /&gt;
		'', -- [9] placeholder for [[Category:Taxonbars with manual taxon IDs]] --renamed 'using' -&amp;gt; 'with'&lt;br /&gt;
		'', --[10] placeholder for [[Category:Taxonbars with manual taxon IDs identical to Wikidata]]&lt;br /&gt;
		'', --[11] placeholder for [[Category:Taxonbars with manual taxon IDs differing from Wikidata]]&lt;br /&gt;
		'', --[12] placeholder for [[Category:Taxonbars with unknown parameters]]&lt;br /&gt;
		'', --[13] placeholder for [[Category:Taxonbars with unnamed parameters]]&lt;br /&gt;
		'', --[14] placeholder for [[Category:Taxonbars with multiple manual Wikidata items]] --renamed 'using' -&amp;gt; 'with'&lt;br /&gt;
		'', --[15] placeholder for [[Category:Taxonbars with automatically added basionyms]]&lt;br /&gt;
		'', --[16] placeholder for [[Category:Taxonbars with automatically added original combinations]]&lt;br /&gt;
		'', --[17] placeholder for [[Category:Taxonbars with automatically added monotypic genera]]&lt;br /&gt;
		'', --[18] placeholder for [[Category:Taxonbars of monotypic species missing genera]]&lt;br /&gt;
		'', --[19] placeholder for [[Category:Taxonbars without primary Wikidata taxon IDs]]&lt;br /&gt;
		'', --[20] placeholder for [[Category:Taxonbars without secondary Wikidata taxon IDs]]&lt;br /&gt;
		'', --[21] placeholder for [[Category:Taxonbars with 20–24 taxon IDs]]&lt;br /&gt;
		'', --[22] placeholder for [[Category:Taxonbars with 25–29 taxon IDs]]&lt;br /&gt;
		'', --[23] placeholder for [[Category:Taxonbars with 30–34 taxon IDs]]&lt;br /&gt;
		'', --[24] placeholder for [[Category:Taxonbars with 35–39 taxon IDs]]&lt;br /&gt;
		'', --[25] placeholder for [[Category:Taxonbars with 40–44 taxon IDs]] --renamed '40+' -&amp;gt; '40–44'&lt;br /&gt;
		'', --[26] placeholder for [[Category:Taxonbars with 45+ taxon IDs]] --new&lt;br /&gt;
	}&lt;br /&gt;
	local acceptableInstanceOf_Strict = {&lt;br /&gt;
		['Q16521'] = 'taxon',                      --strict&lt;br /&gt;
		['Q310890'] = 'monotypic taxon',           --strict&lt;br /&gt;
		['Q98961713'] = 'extinct taxon',           --strict&lt;br /&gt;
		['Q2568288'] = 'ichnotaxon',               --strict&lt;br /&gt;
		['Q23038290'] = 'fossil taxon',            --strict&lt;br /&gt;
		['Q47487597'] = 'monotypic fossil taxon',  --strict&lt;br /&gt;
	}&lt;br /&gt;
	local acceptableInstanceOf_All = {&lt;br /&gt;
		['Q16521'] = 'taxon',                      --strict&lt;br /&gt;
		['Q310890'] = 'monotypic taxon',           --strict&lt;br /&gt;
		['Q98961713'] = 'extinct taxon',           --strict&lt;br /&gt;
		['Q2568288'] = 'ichnotaxon',               --strict&lt;br /&gt;
		['Q23038290'] = 'fossil taxon',            --strict&lt;br /&gt;
		['Q47487597'] = 'monotypic fossil taxon',  --strict&lt;br /&gt;
		['Q42621'] = 'hybrid',                     --lax&lt;br /&gt;
		['Q235536'] = 'incertae sedis',            --lax&lt;br /&gt;
		['Q713623'] = 'clade',                     --lax&lt;br /&gt;
		['Q848328'] = 'serotype',                  --lax&lt;br /&gt;
		['Q857968'] = 'candidatus',                --lax&lt;br /&gt;
		['Q17487588'] = 'unavailable combination', --lax&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	--Assess the page's relationship with Wikidata&lt;br /&gt;
	local currentItem = nil&lt;br /&gt;
	if currentTitle.namespace == 10 then --i.e. Module:Taxonbar/sandbox, Template:Taxonbar/doc, etc.&lt;br /&gt;
		if resolveEntity._id(parentArgs['from']) then&lt;br /&gt;
			currentItem = mw.wikibase.getEntity(parentArgs['from'])&lt;br /&gt;
		end&lt;br /&gt;
		if currentItem == nil then&lt;br /&gt;
			if resolveEntity._id(parentArgs['from1']) then&lt;br /&gt;
				currentItem = mw.wikibase.getEntity(parentArgs['from1'])&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	elseif resolveEntity._id(currentEntityId) then&lt;br /&gt;
		currentItem = mw.wikibase.getEntity(currentEntityId)&lt;br /&gt;
	else --currentEntityId == nil/unresolvable&lt;br /&gt;
		tCats[3] = '[[Category:Taxonbar pages requiring a Wikidata item]]'&lt;br /&gt;
	end&lt;br /&gt;
	if currentItem then&lt;br /&gt;
		tCats[4] = '[[Category:Taxonbars on possible non-taxon pages]]' --unset if acceptable found&lt;br /&gt;
		for _, instanceOfState in pairs ( currentItem:getBestStatements('P31') ) do --instance of&lt;br /&gt;
			local instanceOf = instanceOfState.mainsnak.datavalue.value.id&lt;br /&gt;
			if acceptableInstanceOf_All[instanceOf] then&lt;br /&gt;
				tCats[4] = ''&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--Cleanup args&lt;br /&gt;
	for k, v in pairs( frame:getParent().args ) do&lt;br /&gt;
		if type(k) == 'string' then&lt;br /&gt;
			--make args case insensitive&lt;br /&gt;
			local lowerk = mw.ustring.lower(k)&lt;br /&gt;
			if isNilOrEmpty( parentArgs[lowerk] ) then&lt;br /&gt;
				parentArgs[k] = nil&lt;br /&gt;
				parentArgs[lowerk] = v&lt;br /&gt;
			end&lt;br /&gt;
			--remap abc to abc1&lt;br /&gt;
			if mw.ustring.find(lowerk,'%d$') == nil then --if no number at end of param&lt;br /&gt;
				if isNilOrEmpty( parentArgs[lowerk..'1'] ) then&lt;br /&gt;
					parentArgs[lowerk] = nil&lt;br /&gt;
					lowerk = lowerk..'1'&lt;br /&gt;
					parentArgs[lowerk] = v&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if v and v ~= '' then&lt;br /&gt;
				--remap 'for' to 'title'&lt;br /&gt;
				if mw.ustring.sub(lowerk,1,3) == 'for' then&lt;br /&gt;
					local forTitle = mw.ustring.gsub(lowerk,'^for','title',1)&lt;br /&gt;
					if isNilOrEmpty( parentArgs[forTitle] ) then&lt;br /&gt;
						parentArgs[lowerk] = nil&lt;br /&gt;
						lowerk = forTitle&lt;br /&gt;
						parentArgs[lowerk] = v&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				--find highest from or title param&lt;br /&gt;
				if mw.ustring.sub(lowerk,1,4) == 'from' then&lt;br /&gt;
					local fromNumber = tonumber(mw.ustring.sub(lowerk,5,-1))&lt;br /&gt;
					if fromNumber and fromNumber &amp;gt;= fromTitleCount then fromTitleCount = fromNumber end&lt;br /&gt;
					--look for duplicate froms while we're here&lt;br /&gt;
					if mw.ustring.find(v, '^Q%d') then&lt;br /&gt;
						if tFroms[v] then&lt;br /&gt;
							tCats[6] = '[[Category:Taxonbars with duplicate from parameters]]'&lt;br /&gt;
							tFroms[v] = tFroms[v] + 1&lt;br /&gt;
						else&lt;br /&gt;
							tFroms[v] = 1&lt;br /&gt;
							iFroms = iFroms + 1&lt;br /&gt;
						end&lt;br /&gt;
						if iFroms == 2 then&lt;br /&gt;
							tCats[14] = '[[Category:Taxonbars with multiple manual Wikidata items]]'&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				elseif mw.ustring.sub(lowerk,1,5) == 'title' then&lt;br /&gt;
					local titleNumber = tonumber(mw.ustring.sub(lowerk,4,-1))&lt;br /&gt;
					if titleNumber and titleNumber &amp;gt;= fromTitleCount then fromTitleCount = titleNumber end&lt;br /&gt;
				elseif mw.ustring.lower(v) ~= 'no' then&lt;br /&gt;
					stringArgs = true&lt;br /&gt;
					tCats[9] = '[[Category:Taxonbars with manual taxon IDs]]'&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end --if type(k) == 'string'&lt;br /&gt;
	end --for&lt;br /&gt;
	&lt;br /&gt;
	--Check for unknown parameters&lt;br /&gt;
	--create knowns list&lt;br /&gt;
	local acceptableArgs = { from = true, } --master list of l/c acceptable args&lt;br /&gt;
	for _, d in pairs( conf.databases ) do&lt;br /&gt;
		if d[1] ~= 'Wikidata' then --made obsolete by from&lt;br /&gt;
			acceptableArgs[mw.ustring.lower(d[1])] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, a in pairs( conf.aliases ) do&lt;br /&gt;
		acceptableArgs[mw.ustring.lower(a[1])] = true&lt;br /&gt;
	end&lt;br /&gt;
	--create trimmed parents list&lt;br /&gt;
	local baseParentArgs = {} --condensed list of l/c parent args w/o trailing #s&lt;br /&gt;
	for k, _ in pairs( parentArgs ) do&lt;br /&gt;
		if type(k) == 'string' then&lt;br /&gt;
			local lowerk = mw.ustring.lower(k)&lt;br /&gt;
			local base = mw.ustring.gsub(lowerk, '[%d]*$', '')&lt;br /&gt;
			baseParentArgs[base] = true&lt;br /&gt;
		elseif type(k) == 'number' then&lt;br /&gt;
			tCats[13] = '[[Category:Taxonbars with unnamed parameters|'..k..']]'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	--compare lists and spit out unknowns&lt;br /&gt;
	local unknownParams = {}&lt;br /&gt;
	for k, _ in pairs( baseParentArgs ) do&lt;br /&gt;
		if acceptableArgs[k] == nil then&lt;br /&gt;
			tCats[12] = '[[Category:Taxonbars with unknown parameters|'..k..']]'&lt;br /&gt;
			unknownParams[#unknownParams + 1] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	--warn if unknown(s) present&lt;br /&gt;
	if #unknownParams &amp;gt; 0 then&lt;br /&gt;
		local plural = 's'&lt;br /&gt;
		local itthem = 'them'&lt;br /&gt;
		if #unknownParams == 1 then&lt;br /&gt;
			plural = ''&lt;br /&gt;
			itthem = 'it'&lt;br /&gt;
		end&lt;br /&gt;
		errors = errors..require('Module:If preview')._warning({&lt;br /&gt;
			mw.ustring.format(&lt;br /&gt;
				'Unknown parameter%s &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt;. Please correct %s or consider adding %s to Wikidata.',&lt;br /&gt;
				plural,&lt;br /&gt;
				table.concat(unknownParams, '&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;'),&lt;br /&gt;
				itthem,&lt;br /&gt;
				itthem&lt;br /&gt;
			)&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--Append basionym to arg list, if not already provided&lt;br /&gt;
	if currentItem then&lt;br /&gt;
		local currentBasState = currentItem:getBestStatements('P566')[1] --basionym&lt;br /&gt;
		if currentBasState then&lt;br /&gt;
			local basionymId = currentBasState.mainsnak.datavalue.value.id&lt;br /&gt;
			if basionymId and resolveEntity._id(basionymId) and tFroms[basionymId] == nil then&lt;br /&gt;
				--check that basionym is a strict instance of taxon&lt;br /&gt;
				local basionymItem = mw.wikibase.getEntity(basionymId)&lt;br /&gt;
				if basionymItem then&lt;br /&gt;
					for _, instanceOfState in pairs ( basionymItem:getBestStatements('P31') ) do --instance of&lt;br /&gt;
						local instanceOf = instanceOfState.mainsnak.datavalue.value.id&lt;br /&gt;
						if acceptableInstanceOf_Strict[instanceOf] then&lt;br /&gt;
							--housekeeping&lt;br /&gt;
							tFroms[basionymId] = 1&lt;br /&gt;
							iFroms = iFroms + 1&lt;br /&gt;
							fromTitleCount = fromTitleCount + 1&lt;br /&gt;
							--append basionym &amp;amp; track&lt;br /&gt;
							parentArgs['from'..fromTitleCount] = basionymId&lt;br /&gt;
							tCats[15] = '[[Category:Taxonbars with automatically added basionyms]]'&lt;br /&gt;
							break&lt;br /&gt;
	end	end	end	end	end	end&lt;br /&gt;
	&lt;br /&gt;
	--Append original combination to arg list, if not already provided&lt;br /&gt;
	if currentItem then&lt;br /&gt;
		local currentOCState = currentItem:getBestStatements('P1403')[1] --original combination&lt;br /&gt;
		if currentOCState then&lt;br /&gt;
			local orcoId = currentOCState.mainsnak.datavalue.value.id&lt;br /&gt;
			if orcoId and resolveEntity._id(orcoId) and tFroms[orcoId] == nil then&lt;br /&gt;
				--check that orco is a strict instance of taxon&lt;br /&gt;
				local orcoItem = mw.wikibase.getEntity(orcoId)&lt;br /&gt;
				if orcoItem then&lt;br /&gt;
					for _, instanceOfState in pairs ( orcoItem:getBestStatements('P31') ) do --instance of&lt;br /&gt;
						local instanceOf = instanceOfState.mainsnak.datavalue.value.id&lt;br /&gt;
						if acceptableInstanceOf_Strict[instanceOf] then&lt;br /&gt;
							--housekeeping&lt;br /&gt;
							tFroms[orcoId] = 1&lt;br /&gt;
							iFroms = iFroms + 1&lt;br /&gt;
							fromTitleCount = fromTitleCount + 1&lt;br /&gt;
							--append orco &amp;amp; track&lt;br /&gt;
							parentArgs['from'..fromTitleCount] = orcoId&lt;br /&gt;
							tCats[16] = '[[Category:Taxonbars with automatically added original combinations]]'&lt;br /&gt;
							break&lt;br /&gt;
	end	end	end	end	end	end&lt;br /&gt;
	&lt;br /&gt;
	--Append monotypic genus/species to arg list of monotypic species/genus, if not already provided&lt;br /&gt;
	if currentItem then&lt;br /&gt;
		for _, instanceOfState in pairs ( currentItem:getBestStatements('P31') ) do --instance of&lt;br /&gt;
			local taxonRank = nil&lt;br /&gt;
			local parentItem = nil&lt;br /&gt;
			local parentTaxon = nil&lt;br /&gt;
			local parentTaxonRank = nil&lt;br /&gt;
			local parentMonoGenus = nil --holy grail/tbd&lt;br /&gt;
			local instanceOf = instanceOfState.mainsnak.datavalue.value.id&lt;br /&gt;
			if instanceOf and (instanceOf == 'Q310890' or instanceOf == 'Q47487597') then --monotypic/fossil taxon&lt;br /&gt;
				local taxonRankState = currentItem:getBestStatements('P105')[1] --taxon rank&lt;br /&gt;
				if taxonRankState then taxonRank = taxonRankState.mainsnak.datavalue.value.id end&lt;br /&gt;
				&lt;br /&gt;
				if taxonRank and taxonRank == 'Q7432' then --species&lt;br /&gt;
					--is monotypic species; add genus&lt;br /&gt;
					local parentTaxonState = currentItem:getBestStatements('P171')[1] --parent taxon&lt;br /&gt;
					if parentTaxonState then parentTaxon = parentTaxonState.mainsnak.datavalue.value.id end&lt;br /&gt;
					--confirm parent taxon rank == genus &amp;amp; monotypic&lt;br /&gt;
					if parentTaxon and resolveEntity._id(parentTaxon) then&lt;br /&gt;
						parentItem = mw.wikibase.getEntity(parentTaxon)&lt;br /&gt;
						if parentItem then&lt;br /&gt;
							local parentTaxonRankState = parentItem:getBestStatements('P105')[1] --taxon rank&lt;br /&gt;
							if parentTaxonRankState then parentTaxonRank = parentTaxonRankState.mainsnak.datavalue.value.id end&lt;br /&gt;
							if parentTaxonRank and parentTaxonRank == 'Q34740' then --parent == genus&lt;br /&gt;
								for _, parentInstanceOfState in pairs ( parentItem:getBestStatements('P31') ) do --instance of&lt;br /&gt;
									local parentInstanceOf = parentInstanceOfState.mainsnak.datavalue.value.id &lt;br /&gt;
									if parentInstanceOf and&lt;br /&gt;
									  (parentInstanceOf == 'Q310890' or parentInstanceOf == 'Q47487597') then --monotypic/fossil taxon&lt;br /&gt;
										parentMonoGenus = parentTaxon --confirmed&lt;br /&gt;
										break&lt;br /&gt;
									end&lt;br /&gt;
								end&lt;br /&gt;
								if parentMonoGenus and tFroms[parentMonoGenus] == nil then&lt;br /&gt;
									--housekeeping&lt;br /&gt;
									tFroms[parentMonoGenus] = 1&lt;br /&gt;
									iFroms = iFroms + 1&lt;br /&gt;
									fromTitleCount = fromTitleCount + 1&lt;br /&gt;
									--append monotypic genus &amp;amp; track&lt;br /&gt;
									parentArgs['from'..fromTitleCount] = parentMonoGenus&lt;br /&gt;
									tCats[17] = '[[Category:Taxonbars with automatically added monotypic genera]]'&lt;br /&gt;
									break&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if parentMonoGenus == nil or tFroms[parentMonoGenus] == nil then&lt;br /&gt;
						tCats[18] = '[[Category:Taxonbars of monotypic species missing genera]]'&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
				elseif taxonRank and taxonRank == 'Q34740' then --genus&lt;br /&gt;
					--TODO:&lt;br /&gt;
					--is monotypic genus; add species (no way to easily find these (yet?))&lt;br /&gt;
					--...&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
			end&lt;br /&gt;
		end --for&lt;br /&gt;
	end --if currentItem&lt;br /&gt;
	&lt;br /&gt;
	--Setup navbox&lt;br /&gt;
	local navboxParams = {&lt;br /&gt;
		name  = 'Taxonbar',&lt;br /&gt;
		bodyclass = 'hlist',&lt;br /&gt;
		listclass = '',&lt;br /&gt;
		groupstyle = 'text-align: left;',&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for f = 1, fromTitleCount, 1&lt;br /&gt;
	do&lt;br /&gt;
		local elements, title = {}, nil&lt;br /&gt;
		--cleanup parameters&lt;br /&gt;
		if parentArgs['from'..f] == '' then parentArgs['from'..f] = nil end&lt;br /&gt;
		if parentArgs['title'..f] == '' then parentArgs['title'..f] = nil end&lt;br /&gt;
		--remap aliases&lt;br /&gt;
		for _, a in pairs( conf.aliases ) do&lt;br /&gt;
			local alias, name = mw.ustring.lower(a[1]), mw.ustring.lower(a[2])&lt;br /&gt;
			if parentArgs[alias..f] and parentArgs[name..f] == nil then&lt;br /&gt;
				parentArgs[name..f] = parentArgs[alias..f]&lt;br /&gt;
				parentArgs[alias..f] = nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		--Fetch Wikidata item&lt;br /&gt;
		local from = resolveEntity._id(parentArgs['from'..f])&lt;br /&gt;
		local item = mw.wikibase.getEntity(from)&lt;br /&gt;
		local label = nil&lt;br /&gt;
		if type(item) == 'table' then&lt;br /&gt;
			local statements = item:getBestStatements('P225')[1] --taxon name&lt;br /&gt;
			if statements then&lt;br /&gt;
				local datavalue = statements.mainsnak.datavalue&lt;br /&gt;
				if datavalue then&lt;br /&gt;
					label = datavalue.value&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			label = label or item:getLabel()&lt;br /&gt;
		else&lt;br /&gt;
			if parentArgs['from'..f] then&lt;br /&gt;
				tCats[1] = ''&lt;br /&gt;
				tCats[5] = '[[Category:Taxonbars with invalid from parameters]]'&lt;br /&gt;
				errors = errors..mw.text.tag('strong', {class='error'}, 'Error: &amp;quot;'..&lt;br /&gt;
				         parentArgs['from'..f]..'&amp;quot; is not a valid Wikidata entity ID.&amp;lt;br /&amp;gt;')				&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if label and label ~= '' then&lt;br /&gt;
			title = mw.title.new(label)&lt;br /&gt;
		end&lt;br /&gt;
		if title == nil and parentArgs['title'..f] then&lt;br /&gt;
			title = mw.title.new(parentArgs['title'..f])&lt;br /&gt;
		end&lt;br /&gt;
		if title == nil and f == 1 then&lt;br /&gt;
			title = currentTitle&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if title then&lt;br /&gt;
			if isNilOrEmpty( parentArgs['wikidata'..f] ) and &lt;br /&gt;
			   (title.namespace == 0) then&lt;br /&gt;
				if parentArgs['from'..f] then&lt;br /&gt;
					parentArgs['wikidata'..f] = parentArgs['from'..f]&lt;br /&gt;
				elseif item then&lt;br /&gt;
					parentArgs['wikidata'..f] = item.id&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if title.namespace == 0 or stringArgs then --only in mainspace or if manual overrides exist&lt;br /&gt;
				local sourceCount = 0&lt;br /&gt;
				for _, params in pairs( conf.databases ) do&lt;br /&gt;
					params[1] = mw.ustring.lower(params[1])&lt;br /&gt;
					local propId = params[3]&lt;br /&gt;
					--Wikidata fallback if requested&lt;br /&gt;
					if (item and item.claims) and&lt;br /&gt;
					   (type(propId) == 'string' or (type(propId) == 'number' and propId &amp;gt; 0)) then&lt;br /&gt;
						local wikidataId = getIdFromWikidata( item, 'P'..propId )&lt;br /&gt;
						local v = parentArgs[params[1]..f]&lt;br /&gt;
						if wikidataId then&lt;br /&gt;
							if isNilOrEmpty(v) then&lt;br /&gt;
								parentArgs[params[1]..f] = wikidataId&lt;br /&gt;
							else&lt;br /&gt;
								if v and v ~= 'no' and v ~= wikidataId then&lt;br /&gt;
									tCats[11] = '[[Category:Taxonbars with manual taxon IDs differing from Wikidata]]'&lt;br /&gt;
								elseif v and v == wikidataId then&lt;br /&gt;
									tCats[10] = '[[Category:Taxonbars with manual taxon IDs identical to Wikidata]]'&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					local val = parentArgs[params[1]..f]&lt;br /&gt;
					if val and val ~= '' and mw.ustring.lower(val) ~= 'no' then&lt;br /&gt;
						if type(propId) == 'number' then&lt;br /&gt;
							if propId &amp;lt; 0 then propId = -propId end --allow link&lt;br /&gt;
							if propId &amp;gt; 0 then --link&lt;br /&gt;
								table.insert( elements, createRow( params[1], params[2]..':', val, getLink( propId, params[1], val ).text, true ) )&lt;br /&gt;
							else --propId == 0; no link&lt;br /&gt;
								table.insert( elements, createRow( params[1], params[2]..':', val, val, true ) )&lt;br /&gt;
							end&lt;br /&gt;
						else&lt;br /&gt;
							table.insert( elements, createRow( params[1], params[2]..':', val, getLink( propId, params[1], val ).text, true ) )&lt;br /&gt;
						end&lt;br /&gt;
						if params[1] ~= 'wikidata' and params[1] ~= 'wikispecies' then&lt;br /&gt;
							sourceCount = sourceCount + 1&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end --for&lt;br /&gt;
				&lt;br /&gt;
				if     sourceCount &amp;gt;= 45 then tCats[26] = '[[Category:Taxonbars with 45+ taxon IDs]]'&lt;br /&gt;
				elseif sourceCount &amp;gt;= 40 then tCats[25] = '[[Category:Taxonbars with 40–44 taxon IDs]]' --endashes&lt;br /&gt;
				elseif sourceCount &amp;gt;= 35 then tCats[24] = '[[Category:Taxonbars with 35–39 taxon IDs]]'&lt;br /&gt;
				elseif sourceCount &amp;gt;= 30 then tCats[23] = '[[Category:Taxonbars with 30–34 taxon IDs]]'&lt;br /&gt;
				elseif sourceCount &amp;gt;= 25 then tCats[22] = '[[Category:Taxonbars with 25–29 taxon IDs]]'&lt;br /&gt;
				elseif sourceCount &amp;gt;= 20 then tCats[21] = '[[Category:Taxonbars with 20–24 taxon IDs]]'&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				--Generate navbox title&lt;br /&gt;
				if sourceCount &amp;gt; 0 then&lt;br /&gt;
					rowCount = rowCount + 1&lt;br /&gt;
					if firstRow == 0 then firstRow = f end&lt;br /&gt;
					--set title from wikidata if it doesn't exist&lt;br /&gt;
					if isNilOrEmpty( parentArgs['title'..f] ) then&lt;br /&gt;
						parentArgs['noTitle'..f] = true&lt;br /&gt;
						parentArgs['title'..f] = title.text&lt;br /&gt;
					end&lt;br /&gt;
					--if it exists now, set row heading to title&lt;br /&gt;
					if not isNilOrEmpty( parentArgs['title'..f] ) then&lt;br /&gt;
						navboxParams['group'..f] = TaxonItalics.italicizeTaxonName(parentArgs['title'..f], false)&lt;br /&gt;
					else&lt;br /&gt;
						navboxParams['group'..f] = ''&lt;br /&gt;
					end&lt;br /&gt;
					navboxParams['list'..f] = table.concat( elements )&lt;br /&gt;
				elseif currentEntityId and (currentEntityId == parentArgs['from'..f] or fromTitleCount == 1) then&lt;br /&gt;
					tCats[19] = '[[Category:Taxonbars without primary Wikidata taxon IDs]]'&lt;br /&gt;
				else&lt;br /&gt;
					tCats[20] = '[[Category:Taxonbars without secondary Wikidata taxon IDs]]'&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				--Categorize&lt;br /&gt;
				if not isNilOrEmpty( parentArgs['from'..f] ) then&lt;br /&gt;
					tCats[1] = '' --blank &amp;quot;missing from&amp;quot; if 'from' exists&lt;br /&gt;
					if parentArgs['from'..f] == currentEntityId then&lt;br /&gt;
						tCats[2] = '' --blank &amp;quot;desynced&amp;quot; if 'from' matches current page&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if tCats[1] ~= '' then&lt;br /&gt;
					tCats[2] = '' --cannot be &amp;quot;desynced&amp;quot; if no 'from' params&lt;br /&gt;
				end&lt;br /&gt;
			end --if title.namespace == 0 or stringArgs&lt;br /&gt;
		end --if title&lt;br /&gt;
	end --for f = 1, fromTitleCount, 1&lt;br /&gt;
	&lt;br /&gt;
	if rowCount &amp;gt; 0 then&lt;br /&gt;
		local Navbox = require('Module:Navbox')&lt;br /&gt;
		if rowCount &amp;gt; 1 then&lt;br /&gt;
			--remove duplicates and don't bother moving page title to top&lt;br /&gt;
			local rowIDs = {}&lt;br /&gt;
			for f = 1,fromTitleCount,1&lt;br /&gt;
			do&lt;br /&gt;
				if not isNilOrEmpty( parentArgs['title'..f] ) then&lt;br /&gt;
					if rowIDs[parentArgs['wikidata'..f]] then --remove duplicate&lt;br /&gt;
						navboxParams['group'..f] = nil&lt;br /&gt;
						navboxParams['list'..f] = nil&lt;br /&gt;
					else&lt;br /&gt;
						rowIDs[parentArgs['wikidata'..f]] = true&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if parentArgs['title'..2] and parentArgs['title'..2] == currentTitle.text then&lt;br /&gt;
				if currentItem and parentArgs['from'..2] == currentItem['id'] then&lt;br /&gt;
					tCats[8] = '[[Category:Taxonbars with from2 matching article title &amp;amp; QID]]'&lt;br /&gt;
				else&lt;br /&gt;
					tCats[7] = '[[Category:Taxonbars with from2 matching article title]]'&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			--adjust navbox for number of rows&lt;br /&gt;
			navboxParams['title'] = '[[Help:Taxon identifiers|Taxon identifiers]]'&lt;br /&gt;
			if rowCount &amp;gt;= 4 then&lt;br /&gt;
				navboxParams['navbar'] = 'plain'&lt;br /&gt;
			else&lt;br /&gt;
				navboxParams['state'] = 'off'&lt;br /&gt;
				navboxParams['navbar'] = 'off'&lt;br /&gt;
			end&lt;br /&gt;
		elseif parentArgs['noTitle'..firstRow] then&lt;br /&gt;
			navboxParams['group'..firstRow] = '[[Help:Taxon identifiers|Taxon identifiers]]'&lt;br /&gt;
		else&lt;br /&gt;
			navboxParams['group'..firstRow] = '[[Help:Taxon identifiers|Taxon identifiers]]&amp;lt;br /&amp;gt;'..navboxParams['group'..firstRow]&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--return navbox&lt;br /&gt;
		outString = Navbox._navbox(navboxParams)&lt;br /&gt;
	end --if rowCount &amp;gt; 0&lt;br /&gt;
	&lt;br /&gt;
	--Add categories&lt;br /&gt;
	if string.sub(currentTitle.subpageText,1,9) == 'testcases' then parentArgs['demo'] = true end&lt;br /&gt;
	if not isNilOrEmpty( parentArgs['demo'] ) then&lt;br /&gt;
		outString = outString..mw.text.nowiki(table.concat(tCats))..'&amp;lt;br /&amp;gt;'&lt;br /&gt;
	elseif currentTitle.namespace == 0 then&lt;br /&gt;
		outString = outString..table.concat(tCats)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return outString..errors&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>alpha&gt;Sandeep</name></author>
	</entry>
</feed>