<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FTom.Reding%2FTools</id>
	<title>Module:Sandbox/Tom.Reding/Tools - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FTom.Reding%2FTools"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Tom.Reding/Tools&amp;action=history"/>
	<updated>2026-04-08T22:16:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Tom.Reding/Tools&amp;diff=146326&amp;oldid=prev</id>
		<title>imported&gt;Tom.Reding: +</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Tom.Reding/Tools&amp;diff=146326&amp;oldid=prev"/>
		<updated>2021-09-12T19:44:57Z</updated>

		<summary type="html">&lt;p&gt;+&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.fmttimestamp(frame)&lt;br /&gt;
	local ts = frame.args[1] --20190201223349&lt;br /&gt;
	local y  = string.sub(ts,1,4)&lt;br /&gt;
	local mo = string.sub(ts,5,6)&lt;br /&gt;
	local d  = string.sub(ts,7,8)&lt;br /&gt;
	local h  = string.sub(ts,9,10)&lt;br /&gt;
	local mi = string.sub(ts,11,12)&lt;br /&gt;
	local s  = string.sub(ts,13,14)&lt;br /&gt;
	return y..&amp;#039;-&amp;#039;..mo..&amp;#039;-&amp;#039;..d..&amp;#039;T&amp;#039;..h..&amp;#039;:&amp;#039;..mi..&amp;#039;:&amp;#039;..s --ISO 8601 format without time zone designator&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.instanceOfs(frame)&lt;br /&gt;
-- returns the &amp;#039;instance of&amp;#039;(s) (P31) of the WP page passed&lt;br /&gt;
-- good for finding exceptions in [[Category:Taxonbars on possible non-taxon pages]]&lt;br /&gt;
	local tab = &amp;#039;	&amp;#039;&lt;br /&gt;
	local resolveEntity = require( &amp;#039;Module:ResolveEntityId&amp;#039; )&lt;br /&gt;
	local title = frame.args[1]&lt;br /&gt;
	local qid = resolveEntity._id(title)&lt;br /&gt;
	local item = mw.wikibase.getEntity(qid)&lt;br /&gt;
	if item then&lt;br /&gt;
		local tInstanceOfs = {}&lt;br /&gt;
		for i, instanceOfState in pairs ( item:getBestStatements(&amp;#039;P31&amp;#039;) ) do --instance of&lt;br /&gt;
			local instanceOf = instanceOfState.mainsnak.datavalue.value.id --&amp;#039;Q...&amp;#039;&lt;br /&gt;
--			local instanceOfLabel = mw.wikibase.getLabel(instanceOf) or &amp;#039;nil&amp;#039; --plain English&lt;br /&gt;
			tInstanceOfs[#tInstanceOfs + 1] = &amp;#039;{{Q|&amp;#039;..instanceOf..&amp;#039;}}&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		if not tInstanceOfs[1] then tInstanceOfs = { &amp;#039;none found&amp;#039; } end&lt;br /&gt;
		return &amp;#039;[[&amp;#039;..title..&amp;#039;]]&amp;#039;..tab..&amp;#039;[[d:&amp;#039;..qid..&amp;#039;|&amp;#039;..qid..&amp;#039;]]&amp;#039;..tab..&amp;#039;instance of: &amp;#039;..table.concat(tInstanceOfs, &amp;#039;, &amp;#039;)..&amp;#039;&amp;lt;br/&amp;gt;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;[[&amp;#039;..title..&amp;#039;]]&amp;#039;..tab..&amp;#039;no QID found&amp;lt;br/&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.istaxon(frame)&lt;br /&gt;
-- climbs the taxon tree until a description is found&lt;br /&gt;
-- prefix &amp;#039;c&amp;#039; = child, &amp;#039;p&amp;#039; = parent&lt;br /&gt;
-- output:	[[cSitelink or cQID]]	[[cQID]]		&amp;lt;cI/O&amp;gt;	(cI/O lbl)	&amp;lt;cTaxonQID&amp;gt;	&amp;lt;cTaxon QID label&amp;gt;	[[pQID|pDescription]]:				&amp;lt;pDescription&amp;#039;s animal type&amp;gt;&lt;br /&gt;
--     ex:	[[Orthalicus nobilis]]	[[d:Q49525664]]	Q16521	(taxon)		Q7432		species				[[d:Q7104378|genus of molluscs]]:	mollusc&lt;br /&gt;
	local resolveEntity = require( &amp;#039;Module:ResolveEntityId&amp;#039; )&lt;br /&gt;
	local title = frame.args[1]&lt;br /&gt;
	local qid = resolveEntity._id(title)&lt;br /&gt;
	local item = mw.wikibase.getEntity(qid)&lt;br /&gt;
	local acceptableInstanceOf = {&lt;br /&gt;
		[&amp;#039;Q16521&amp;#039;] = &amp;#039;taxon&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q310890&amp;#039;] = &amp;#039;monotypic taxon&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q2568288&amp;#039;] = &amp;#039;ichnotaxon&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q23038290&amp;#039;] = &amp;#039;fossil taxon&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q47487597&amp;#039;] = &amp;#039;monotypic fossil taxon&amp;#039;,&lt;br /&gt;
	}&lt;br /&gt;
	local allowNonTaxons = false --if false (default), display &amp;#039;(not a taxon)&amp;#039;;&lt;br /&gt;
	local otherInstanceOf = {    --if true, allow clades, etc., as named in otherInstanceOf{}&lt;br /&gt;
		[&amp;#039;Q713623&amp;#039;] = &amp;#039;clade&amp;#039;,&lt;br /&gt;
	--	[&amp;#039;Q4886&amp;#039;] = &amp;#039;cultivar&amp;#039;, --kind of a mess&lt;br /&gt;
	}&lt;br /&gt;
	local tab = &amp;#039;	&amp;#039;&lt;br /&gt;
	if item then&lt;br /&gt;
		&lt;br /&gt;
		--find child&amp;#039;s rank&lt;br /&gt;
		local childRank, childRankLabel, species = nil&lt;br /&gt;
		local childRankState = item:getBestStatements(&amp;#039;P105&amp;#039;)[1] --taxon rank&lt;br /&gt;
		if childRankState then&lt;br /&gt;
			if childRankState.mainsnak.datavalue then&lt;br /&gt;
				childRank = childRankState.mainsnak.datavalue.value.id&lt;br /&gt;
				childRankLabel = mw.wikibase.getLabel(childRank)&lt;br /&gt;
				local speciesRanks = {&lt;br /&gt;
					[&amp;#039;Q7432&amp;#039;] = &amp;#039;species&amp;#039;,&lt;br /&gt;
					[&amp;#039;Q68947&amp;#039;] = &amp;#039;subspecies&amp;#039;,&lt;br /&gt;
					[&amp;#039;Q4886&amp;#039;] = &amp;#039;cultivar&amp;#039;,&lt;br /&gt;
					[&amp;#039;Q279749&amp;#039;] = &amp;#039;form&amp;#039;,&lt;br /&gt;
					[&amp;#039;Q630771&amp;#039;] = &amp;#039;subvariety&amp;#039;,&lt;br /&gt;
					[&amp;#039;Q767728&amp;#039;] = &amp;#039;variety&amp;#039;,&lt;br /&gt;
				--  these should all be plural; for reference only:&lt;br /&gt;
				--	[&amp;#039;Q3025161&amp;#039;] = &amp;#039;series&amp;#039;,&lt;br /&gt;
				--	[&amp;#039;Q3181348&amp;#039;] = &amp;#039;section&amp;#039;,&lt;br /&gt;
				}&lt;br /&gt;
				if speciesRanks[childRank] then&lt;br /&gt;
					species = &amp;#039;species&amp;#039; --used later as a boolean&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				childRank = &amp;#039;missing taxon rank value&amp;#039;&lt;br /&gt;
				childRankLabel = &amp;#039;-&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--find parent&amp;#039;s description; if nil, search grandparent, etc., etc.&lt;br /&gt;
		local ancestorItem = item --initialize to child&lt;br /&gt;
		local bothDescriptionsFmtd = tab..tab --parent&amp;#039;s raw descrip + child&amp;#039;s new suggested descrip&lt;br /&gt;
		local parentDescription = nil&lt;br /&gt;
		local newChildDescription = nil&lt;br /&gt;
		local oldChildDescription = item:getDescription() --different output if nil vs present&lt;br /&gt;
		if oldChildDescription == nil then&lt;br /&gt;
			while bothDescriptionsFmtd == tab..tab do&lt;br /&gt;
				local parentState = ancestorItem:getBestStatements(&amp;#039;P171&amp;#039;)[1] --parent taxon&lt;br /&gt;
				if parentState then&lt;br /&gt;
					local parentId = parentState.mainsnak.datavalue.value.id&lt;br /&gt;
					if parentId then&lt;br /&gt;
						parentDescription = mw.wikibase.getDescription(parentId)&lt;br /&gt;
						if parentDescription then&lt;br /&gt;
							local trim = mw.ustring.gsub(parentDescription, &amp;#039;^[%w%s%(%)%-,]-%s+of%s+&amp;#039;, &amp;#039;&amp;#039;) --trim to first &amp;#039; of &amp;#039; to remove taxon rank/monotypic&lt;br /&gt;
							if species then&lt;br /&gt;
								--remove &amp;#039;s&amp;#039; semi-liberally&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;^([%w]+[^s])s([, ])&amp;#039;, &amp;#039;%1%2&amp;#039;)   --birdS that ...; plantS, guava&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;^([a-z]+[^s])s$&amp;#039;, &amp;#039;%1&amp;#039;)         --birdS&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;([^a-zA-Z][a-z]+[^s])s$&amp;#039;, &amp;#039;%1&amp;#039;) --song and dance birdS&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;^([%w%-]+ [a-z]+[^s])s([, ])&amp;#039;, &amp;#039;%1%2&amp;#039;) --song birdS in ...&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;s %(fossil&amp;#039;, &amp;#039; (fossil&amp;#039;) --birdS (fossil)&lt;br /&gt;
							--	trim = mw.ustring.gsub(trim, &amp;#039;s %(&amp;#039;,  &amp;#039; (&amp;#039;)    --turn off if too liberal&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;s of &amp;#039;, &amp;#039; of &amp;#039;)  --triasic birdS of the family...&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;s in the &amp;#039;, &amp;#039; in the &amp;#039;)  --triasic birdS in the family...&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;^bacteria&amp;#039;, &amp;#039;bacterium&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;[^%w]bacteria&amp;#039;, &amp;#039;bacterium&amp;#039;)&lt;br /&gt;
								--fix special cases&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;algae&amp;#039;, &amp;#039;alga&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;cactu(%f[\0, ])&amp;#039;, &amp;#039;cactus%1&amp;#039;) --only way to combine rules with Lua&amp;#039;s shitty regex; %f doesn&amp;#039;t recognize [^s]...&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;cactuse(%f[\0, ])&amp;#039;, &amp;#039;cactus%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;carnivorou(%f[\0, ])&amp;#039;, &amp;#039;carnivorous%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;countrie(%f[\0, ])&amp;#039;, &amp;#039;countries%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;citru(%f[\0, ])&amp;#039;, &amp;#039;citrus%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;crocu(%f[\0, ])&amp;#039;, &amp;#039;crocus%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;deciduou(%f[\0, ])&amp;#039;, &amp;#039;deciduous%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;[eE]delweis(%f[\0, ])&amp;#039;, &amp;#039;edelweiss%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;fishe(%f[\0, ])&amp;#039;, &amp;#039;fish%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;flightles(%f[\0, ])&amp;#039;, &amp;#039;flightless%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;fung[iu](%f[\0, ])&amp;#039;, &amp;#039;fungus%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;[gG]enu(%f[\0, ])&amp;#039;, &amp;#039;genus%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;[gG]ras(%f[\0, ])&amp;#039;, &amp;#039;grass%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;[gG]rasse(%f[\0, ])&amp;#039;, &amp;#039;grass%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;herbaceou(%f[\0, ])&amp;#039;, &amp;#039;herbaceous%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;herbivorou(%f[\0, ])&amp;#039;, &amp;#039;herbivorous%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;[iI]ri(%f[\0, ])&amp;#039;, &amp;#039;iris%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;leeche(%f[\0, ])&amp;#039;, &amp;#039;leech%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;loache(%f[\0, ])&amp;#039;, &amp;#039;loach%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;mos(%f[\0, ])&amp;#039;, &amp;#039;moss%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;mosse(%f[\0, ])&amp;#039;, &amp;#039;moss%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;[sS]pecie(%f[\0, ])&amp;#039;, &amp;#039;species%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;venomou(%f[\0, ])&amp;#039;, &amp;#039;venomous%1&amp;#039;)&lt;br /&gt;
								trim = mw.ustring.gsub(trim, &amp;#039;viruse(%f[\0, ])&amp;#039;, &amp;#039;virus%1&amp;#039;)&lt;br /&gt;
							end&lt;br /&gt;
							trim = mw.ustring.gsub(trim, &amp;#039; %(fossil%)&amp;#039;, &amp;#039;&amp;#039;) --&amp;quot; (fossil)&amp;quot; restored later IIF instance of = fossil taxon type&lt;br /&gt;
							if trim == parentDescription then trim = &amp;#039;&amp;#039; end --nothing changed, so no need to duplicate it&lt;br /&gt;
							newChildDescription = trim --used &amp;#039;trim&amp;#039; just b/c it&amp;#039;s shorter&lt;br /&gt;
							bothDescriptionsFmtd = tab..&amp;#039;[[d:&amp;#039;..parentId..&amp;#039;|&amp;#039;..parentDescription..&amp;#039;]]:&amp;#039;..tab..newChildDescription&lt;br /&gt;
						else&lt;br /&gt;
							ancestorItem = mw.wikibase.getEntity(parentId)&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
						bothDescriptionFmtds = tab..&amp;#039;parent missing ID??&amp;#039;..tab --probably not a valid falure mode, but jic...&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					bothDescriptionsFmtd = tab..&amp;#039;no parent taxon/P171&amp;#039;..tab&lt;br /&gt;
				end&lt;br /&gt;
			end --while&lt;br /&gt;
		end --if oldChildDescription == nil&lt;br /&gt;
		&lt;br /&gt;
		--test child for instance of: taxon&lt;br /&gt;
		local j = 0&lt;br /&gt;
		for i, instanceOfState in pairs ( item:getBestStatements(&amp;#039;P31&amp;#039;) ) do --child&amp;#039;s instance of&lt;br /&gt;
			local instanceOf = instanceOfState.mainsnak.datavalue.value.id&lt;br /&gt;
			if acceptableInstanceOf[instanceOf] or &lt;br /&gt;
			  (acceptableInstanceOf[instanceOf] == nil and otherInstanceOf[instanceOf] and allowNonTaxons == true) then&lt;br /&gt;
				&lt;br /&gt;
				--extinct/fossil handling in description&lt;br /&gt;
				local instanceOfLabel = mw.wikibase.getLabel(instanceOf)&lt;br /&gt;
				if oldChildDescription == nil then&lt;br /&gt;
					--only append &amp;#039; (fossil)&amp;#039;, when needed, to items missing descrip;&lt;br /&gt;
					--retroactively making existing descriptions match their &amp;#039;instance of taxon rank&amp;#039; is a different/much larger job&lt;br /&gt;
					if instanceOfLabel == &amp;#039;fossil taxon&amp;#039; or &lt;br /&gt;
					   instanceOfLabel == &amp;#039;monotypic fossil taxon&amp;#039; or&lt;br /&gt;
					   instanceOfLabel == &amp;#039;ichnotaxon&amp;#039; then&lt;br /&gt;
						local childSaysFossil = string.match(newChildDescription, &amp;#039;extinct&amp;#039;) or&lt;br /&gt;
												string.match(newChildDescription, &amp;#039;dinosaur&amp;#039;) or&lt;br /&gt;
												string.match(newChildDescription, &amp;#039;fossil&amp;#039;)&lt;br /&gt;
						if childSaysFossil == nil then&lt;br /&gt;
							newChildDescription = newChildDescription..&amp;#039; (fossil)&amp;#039; --housekeeping&lt;br /&gt;
							bothDescriptionsFmtd = bothDescriptionsFmtd..&amp;#039; (fossil)&amp;#039; --goes to output&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					bothDescriptionsFmtd = tab..&amp;#039;-&amp;#039;..tab..&amp;#039;child has description: &amp;#039;..oldChildDescription&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				--output for successful items&lt;br /&gt;
				local title_qid = &amp;#039;[[&amp;#039;..title..&amp;#039;]]&amp;#039;..tab..&amp;#039;[[d:&amp;#039;..qid..&amp;#039;|&amp;#039;..qid..&amp;#039;]]&amp;#039;&lt;br /&gt;
				if childRank == nil then childRank = &amp;#039;UNRANKED&amp;#039; end&lt;br /&gt;
				if childRankLabel == nil then &lt;br /&gt;
					if childRank == &amp;#039;UNRANKED&amp;#039; then childRankLabel = &amp;#039;UNRANKED&amp;#039; &lt;br /&gt;
					else childRankLabel = &amp;#039;MISSING LABEL&amp;#039; end&lt;br /&gt;
				end&lt;br /&gt;
				local cRank_cLabel_pDescrip = childRank..tab..childRankLabel..bothDescriptionsFmtd&lt;br /&gt;
				if instanceOfLabel == &amp;#039;taxon&amp;#039; then&lt;br /&gt;
					return title_qid..tab..instanceOf..tab..&amp;#039;(&amp;#039;..instanceOfLabel..&amp;#039;)&amp;#039;..tab..cRank_cLabel_pDescrip&lt;br /&gt;
					&lt;br /&gt;
				elseif instanceOfLabel == &amp;#039;monotypic taxon&amp;#039; then --force &amp;#039;Q16521&amp;#039; output (taxon)&lt;br /&gt;
					return title_qid..tab..&amp;#039;Q16521&amp;#039;..tab..&amp;#039;(&amp;#039;..instanceOfLabel..&amp;#039;)&amp;#039;..tab..cRank_cLabel_pDescrip&lt;br /&gt;
					&lt;br /&gt;
				elseif instanceOfLabel == &amp;#039;monotypic fossil taxon&amp;#039; then --force &amp;#039;Q23038290&amp;#039; output (fossil taxon)&lt;br /&gt;
					return title_qid..tab..&amp;#039;Q23038290&amp;#039;..tab..&amp;#039;(&amp;#039;..instanceOfLabel..&amp;#039;)&amp;#039;..tab..cRank_cLabel_pDescrip&lt;br /&gt;
					&lt;br /&gt;
				else --ichno or polytypic fossil&lt;br /&gt;
					return title_qid..tab..instanceOf..tab..&amp;#039;(&amp;#039;..instanceOfLabel..&amp;#039;)&amp;#039;..tab..cRank_cLabel_pDescrip&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			j = i&lt;br /&gt;
		end --for child&amp;#039;s instance ofs&lt;br /&gt;
		&lt;br /&gt;
		--output for failed items&lt;br /&gt;
		if j &amp;gt; 0 then&lt;br /&gt;
			return &amp;#039;[[&amp;#039;..title..&amp;#039;]]&amp;#039;..tab..&amp;#039;[[d:&amp;#039;..qid..&amp;#039;|&amp;#039;..qid..&amp;#039;]]&amp;#039;..tab..&amp;#039;instanceOf:&amp;#039;..tab..&amp;#039;(not a taxon)&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;#039;[[&amp;#039;..title..&amp;#039;]]&amp;#039;..tab..&amp;#039;[[d:&amp;#039;..qid..&amp;#039;|&amp;#039;..qid..&amp;#039;]]&amp;#039;..tab..&amp;#039;instanceOf:&amp;#039;..tab..&amp;#039;(not a taxon? no instanceOf)&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
	else&lt;br /&gt;
		--output for failed items&lt;br /&gt;
		if qid then&lt;br /&gt;
			return &amp;#039;[[&amp;#039;..title..&amp;#039;]]&amp;#039;..tab..&amp;#039;[[d:&amp;#039;..qid..&amp;#039;|&amp;#039;..qid..&amp;#039;]]&amp;#039;..tab..&amp;#039;item&amp;#039;..tab..&amp;#039;(not a taxon? item lookup failed)&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;#039;[[&amp;#039;..title.. &amp;#039;]]&amp;#039;..tab..&amp;#039;&amp;#039;..&amp;#039;Q#&amp;#039;..tab..&amp;#039;not on Wikidata OR no sitelink&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getTaxonRank(frame)&lt;br /&gt;
	local resolveEntity = require( &amp;#039;Module:ResolveEntityId&amp;#039; )&lt;br /&gt;
	local title = frame.args[1]&lt;br /&gt;
	local qid = resolveEntity._id(title)&lt;br /&gt;
	local item = mw.wikibase.getEntity(qid)&lt;br /&gt;
	local taxonRanks = {&lt;br /&gt;
		[&amp;#039;Q7432&amp;#039;] = &amp;#039;species&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q34740&amp;#039;] = &amp;#039;genus&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q35409&amp;#039;] = &amp;#039;family&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q36602&amp;#039;] = &amp;#039;order&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q37517&amp;#039;] = &amp;#039;class&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q38348&amp;#039;] = &amp;#039;phylum&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q2007442&amp;#039;] = &amp;#039;infraclass&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q2136103&amp;#039;] = &amp;#039;superfamily&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q227936&amp;#039;] = &amp;#039;tribe&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q2455704&amp;#039;] = &amp;#039;subfamily&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q2889003&amp;#039;] = &amp;#039;infraorder&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q3238261&amp;#039;] = &amp;#039;subgenus&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q5867051&amp;#039;] = &amp;#039;subclass&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q5867959&amp;#039;] = &amp;#039;suborder&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q5868144&amp;#039;] = &amp;#039;superorder&amp;#039;,&lt;br /&gt;
		[&amp;#039;Q68947&amp;#039;] = &amp;#039;subspecies&amp;#039;,&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if qid then&lt;br /&gt;
		if item then&lt;br /&gt;
			local tab = &amp;#039;&amp;amp;#09;&amp;#039;&lt;br /&gt;
			local rankState = item:getBestStatements(&amp;#039;P105&amp;#039;)[1] --taxon rank&lt;br /&gt;
			if rankState then&lt;br /&gt;
				local rank = rankState.mainsnak.datavalue.value.id&lt;br /&gt;
				if rank then&lt;br /&gt;
					if taxonRanks[rank] then return taxonRanks[rank]&lt;br /&gt;
					else return rank end&lt;br /&gt;
				else return &amp;#039;No rank found&amp;#039; end&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;#039;rankState not found&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;#039;Item not found&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;QID not found&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Tom.Reding</name></author>
	</entry>
</feed>