<?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%2FJts1882%2FBiota_infobox%2FAutotaxobox</id>
	<title>Module:Sandbox/Jts1882/Biota infobox/Autotaxobox - 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%2FJts1882%2FBiota_infobox%2FAutotaxobox"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Jts1882/Biota_infobox/Autotaxobox&amp;action=history"/>
	<updated>2026-05-11T16:30:16Z</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/Jts1882/Biota_infobox/Autotaxobox&amp;diff=145638&amp;oldid=prev</id>
		<title>imported&gt;Jts1882: Jts1882 moved page Module:Sandbox/Jts1882/Biota Infobox/Autotaxobox to Module:Sandbox/Jts1882/Biota infobox/Autotaxobox without leaving a redirect: case consistency in naming</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Jts1882/Biota_infobox/Autotaxobox&amp;diff=145638&amp;oldid=prev"/>
		<updated>2019-02-05T16:06:44Z</updated>

		<summary type="html">&lt;p&gt;Jts1882 moved page &lt;a href=&quot;/index.php?title=Module:Sandbox/Jts1882/Biota_Infobox/Autotaxobox&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module:Sandbox/Jts1882/Biota Infobox/Autotaxobox (page does not exist)&quot;&gt;Module:Sandbox/Jts1882/Biota Infobox/Autotaxobox&lt;/a&gt; to &lt;a href=&quot;/research/Module:Sandbox/Jts1882/Biota_infobox/Autotaxobox&quot; title=&quot;Module:Sandbox/Jts1882/Biota infobox/Autotaxobox&quot;&gt;Module:Sandbox/Jts1882/Biota infobox/Autotaxobox&lt;/a&gt; without leaving a redirect: case consistency in naming&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
This module provides support to the automated taxobox system – the templates&lt;br /&gt;
Automatic taxobox, Speciesbox, Subspeciesbox, Infraspeciesbox, etc.&lt;br /&gt;
&lt;br /&gt;
In particular it provides a way of traversing the taxonomic hierarchy encoded&lt;br /&gt;
in taxonomy templates (templates with names of the form&lt;br /&gt;
&amp;quot;Template:Taxonomy/TAXON_NAME&amp;quot;) without causing template expansion depth errors.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local TaxonItalics = require(&amp;#039;Module:TaxonItalics&amp;#039;) -- use a function from Module:TaxonItalics to italicize a taxon name&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[=========================================================================&lt;br /&gt;
Limit the maximum depth of a taxonomic hierarchy that can be traversed;&lt;br /&gt;
avoids excessive processing time and protects against incorrectly set up&lt;br /&gt;
hierarchies, e.g. loops.&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
local MaxSearchLevels = 100&lt;br /&gt;
&lt;br /&gt;
function p.getMaxSearchLevels()&lt;br /&gt;
	return MaxSearchLevels&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[========================== taxoboxColour ================================&lt;br /&gt;
Determines the correct colour for a taxobox, by searching up the taxonomic&lt;br /&gt;
hierarchy from the supplied taxon for the first taxon (other than&lt;br /&gt;
&amp;#039;incertae sedis&amp;#039;) that sets a taxobox colour. It is assumed that a valid&lt;br /&gt;
taxobox colour is defined using CSS rgb() syntax.&lt;br /&gt;
If no taxon that sets a taxobox colour is found, then &amp;#039;transparent&amp;#039; is&lt;br /&gt;
returned unless the taxonomic hierarchy is too deep, when the error colour is&lt;br /&gt;
returned.&lt;br /&gt;
Usage: {{#invoke:Autotaxobox|taxoboxColour|TAXON}}&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.taxoboxColour(frame)&lt;br /&gt;
	local currTaxon = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local i = 1 -- count levels processed&lt;br /&gt;
	local searching = currTaxon ~= &amp;#039;&amp;#039; -- still searching for a colour?&lt;br /&gt;
	local foundICTaxon = false -- record whether &amp;#039;incertae sedis&amp;#039; found&lt;br /&gt;
	local colour = &amp;#039;&amp;#039; -- default is no colour&lt;br /&gt;
	while searching and i &amp;lt;= MaxSearchLevels do&lt;br /&gt;
		local plainCurrTaxon = p.stripExtra(currTaxon) -- remove trailing text after /&lt;br /&gt;
		if string.lower(plainCurrTaxon) == &amp;#039;incertae sedis&amp;#039; then&lt;br /&gt;
			foundICTaxon = true&lt;br /&gt;
		else&lt;br /&gt;
			local possibleColour = frame:expandTemplate{ title = &amp;#039;Template:Taxobox colour&amp;#039;, args = { plainCurrTaxon } }&lt;br /&gt;
			if string.sub(possibleColour,1,3) == &amp;#039;rgb&amp;#039; then&lt;br /&gt;
				colour = possibleColour&lt;br /&gt;
				searching = false&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if searching then&lt;br /&gt;
			local ok, parent = p.getTaxonInfoItem(frame, currTaxon, &amp;#039;parent&amp;#039;)&lt;br /&gt;
			if ok and parent ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				currTaxon = parent&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			else&lt;br /&gt;
				searching = false -- run off the top of the hierarchy or tried to use non-existent taxonomy template&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if colour ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		return colour&lt;br /&gt;
	elseif foundICTaxon then&lt;br /&gt;
		return frame:expandTemplate{ title = &amp;#039;Template:Taxobox colour&amp;#039;, args = { &amp;#039;incertae sedis&amp;#039; } }&lt;br /&gt;
	elseif searching then&lt;br /&gt;
		-- hierarchy exceeds MaxSearchLevels levels&lt;br /&gt;
		return frame:expandTemplate{ title = &amp;#039;Template:Taxobox/Error colour&amp;#039;, args = { } }&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;transparent&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[=========================== taxoboxList =================================&lt;br /&gt;
Returns the rows of taxa in an automated taxobox, based on the taxonomic&lt;br /&gt;
hierarchy for the supplied taxon.&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:Autotaxobox|taxoboxList|TAXON&lt;br /&gt;
|display_taxa = the number of taxa *above* TAXON to force to be displayed&lt;br /&gt;
|authority = taxonomic authority for TAXON&lt;br /&gt;
|parent_authority = taxonomic authority for TAXON&amp;#039;s parent&lt;br /&gt;
|gparent_authority = taxonomic authority for TAXON&amp;#039;s grandparent&lt;br /&gt;
|ggparent_authority = taxonomic authority for TAXON&amp;#039;s greatgrandparent&lt;br /&gt;
|ggparent_authority = taxonomic authority for TAXON&amp;#039;s greatgreatgrandparent&lt;br /&gt;
|bold_first = &amp;#039;bold&amp;#039; to bold TAXON in its row&lt;br /&gt;
}}&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.taxoboxList(frame)&lt;br /&gt;
	local currTaxon = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local displayN = (tonumber(frame.args[&amp;#039;display_taxa&amp;#039;]) or 1) + 1&lt;br /&gt;
	local auth = frame.args[&amp;#039;authority&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local parentAuth = frame.args[&amp;#039;parent_authority&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local gParentAuth = frame.args[&amp;#039;gparent_authority&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local ggParentAuth = frame.args[&amp;#039;ggparent_authority&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local gggParentAuth = frame.args[&amp;#039;gggparent_authority&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local boldFirst = frame.args[&amp;#039;bold_first&amp;#039;] or &amp;#039;link&amp;#039; -- values &amp;#039;link&amp;#039; or &amp;#039;bold&amp;#039;&lt;br /&gt;
	local taxonTable = p.makeTable(frame, currTaxon)&lt;br /&gt;
	local res = &amp;#039;&amp;#039;&lt;br /&gt;
	-- display all taxa above possible greatgreatgrandparent&lt;br /&gt;
	for i = taxonTable.n, 6, -1 do&lt;br /&gt;
		res = res .. frame:expandTemplate{ title = &amp;#039;Template:Taxobox/showtaxon&amp;#039;, args = { taxonTable[i], fc = tostring(displayN &amp;gt;= i) } }&lt;br /&gt;
	end&lt;br /&gt;
	-- display greatgreatgrandparent, if it exists&lt;br /&gt;
	if taxonTable.n &amp;gt;= 5 then&lt;br /&gt;
		res = res .. frame:expandTemplate{ title = &amp;#039;Template:Taxobox/showtaxon&amp;#039;, args = { taxonTable[5], authority = gggParentAuth, fc = tostring(displayN &amp;gt;= 5) } }&lt;br /&gt;
	end&lt;br /&gt;
	-- display greatgrandparent, if it exists; force the display if an infrataxon is below&lt;br /&gt;
	if taxonTable.n &amp;gt;= 4 then&lt;br /&gt;
		local force = tostring(displayN &amp;gt;= 4) or&lt;br /&gt;
		              frame.expandTemplate{ title = &amp;#039;Template:Infrataxon()&amp;#039;, args = { taxonTable[3] } } == &amp;#039;true&amp;#039; or&lt;br /&gt;
		              frame.expandTemplate{ title = &amp;#039;Template:Infrataxon()&amp;#039;, args = { taxonTable[2] } } == &amp;#039;true&amp;#039;&lt;br /&gt;
		res = res .. frame:expandTemplate{ title = &amp;#039;Template:Taxobox/showtaxon&amp;#039;, args = { taxonTable[4], authority = ggParentAuth, fc = tostring(force) } }&lt;br /&gt;
	end&lt;br /&gt;
	-- display grandparent, if it exists; force the display if an infrataxon is below&lt;br /&gt;
	if taxonTable.n &amp;gt;= 3 then&lt;br /&gt;
		local force = tostring(displayN &amp;gt;= 3) or&lt;br /&gt;
                      frame.expandTemplate{ title = &amp;#039;Template:Infrataxon()&amp;#039;, args = { taxonTable[2] } } == &amp;#039;true&amp;#039;&lt;br /&gt;
        res = res .. frame:expandTemplate{ title = &amp;#039;Template:Taxobox/showtaxon&amp;#039;, args = { taxonTable[3], authority = gParentAuth, fc = tostring(force) } }&lt;br /&gt;
	end&lt;br /&gt;
	-- display parent, if it exists&lt;br /&gt;
	if taxonTable.n &amp;gt;= 2 then&lt;br /&gt;
		res = res .. frame:expandTemplate{ title = &amp;#039;Template:Taxobox/showtaxon&amp;#039;, args = { taxonTable[2], authority = parentAuth, fc = tostring(displayN &amp;gt;= 2) } }&lt;br /&gt;
	end&lt;br /&gt;
	-- display target taxon&lt;br /&gt;
	res = res .. frame:expandTemplate{ title = &amp;#039;Template:Taxobox/showtaxon&amp;#039;, args = { taxonTable[1], authority = auth, fc = &amp;#039;true&amp;#039;, format = boldFirst  } }&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[========================== taxonomyList =================================&lt;br /&gt;
Returns the cells of the taxonomy table displayed on the right hand side of&lt;br /&gt;
&amp;quot;Template:Taxonomy....&amp;quot; pages.&lt;br /&gt;
Usage: {{#invoke:Autotaxobox|taxonomyList|TAXON}}&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.taxonomyList(frame)&lt;br /&gt;
	local currTaxon = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	if currTaxon == &amp;#039;&amp;#039; then return &amp;#039;| ||ERROR: no taxon supplied\n|-&amp;#039; end&lt;br /&gt;
	local taxonTable = p.makeTable(frame, currTaxon)&lt;br /&gt;
	local rankTable = p.getRankTable()&lt;br /&gt;
	local lastRankVal = 1000000&lt;br /&gt;
	local orderOk&lt;br /&gt;
	local res = &amp;#039;&amp;#039;&lt;br /&gt;
	for i = taxonTable.n, 1, -1 do&lt;br /&gt;
		-- check ranks are in right order in the hierarchy&lt;br /&gt;
		local ok, rank = p.getTaxonInfoItem(frame, taxonTable[i], &amp;#039;rank&amp;#039;)&lt;br /&gt;
		local currRankVal = rankTable[string.lower(rank)]&lt;br /&gt;
		if currRankVal then&lt;br /&gt;
			orderOk = currRankVal &amp;lt; lastRankVal&lt;br /&gt;
			if orderOk then lastRankVal = currRankVal end&lt;br /&gt;
		else&lt;br /&gt;
			orderOk = true&lt;br /&gt;
		end&lt;br /&gt;
		-- now return a row of the taxonomy table with anomalous ranks marked&lt;br /&gt;
		local errorStr = &amp;#039;&amp;#039;&lt;br /&gt;
		if not orderOk then errorStr = &amp;#039;true&amp;#039; end&lt;br /&gt;
		res = res .. frame:expandTemplate{ title = &amp;#039;Template:Taxonomy links&amp;#039;, args = { taxonTable[i], error = errorStr } }&lt;br /&gt;
	end&lt;br /&gt;
	-- if the last row has an anomalous rank, put the page in the error-tracking category; category statements don&amp;#039;t work&lt;br /&gt;
	-- inside tables, so need to close the current table first and then open a dummy one (close is in Template:Taxonomy key)&lt;br /&gt;
	if not orderOk then&lt;br /&gt;
		res = res .. &amp;#039;\n|}\n[[Category:Taxonomy templates showing anomalous ranks]]\n{|\n&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[========================= callTaxonomyKey ===============================&lt;br /&gt;
Prepares for, and then calls, Template:Taxonomy key to display a taxonomy&lt;br /&gt;
template page. It does this by building up the information the template&lt;br /&gt;
requires, following one &amp;#039;same as&amp;#039; link, if required.&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:Autotaxobox|callTaxonomyKey&lt;br /&gt;
|parent=&lt;br /&gt;
|rank=&lt;br /&gt;
|extinct=&lt;br /&gt;
|always_display=&lt;br /&gt;
|link_target=value of &amp;#039;link&amp;#039; parameter in taxonomy template&lt;br /&gt;
|link_text=value of parameter 2 in taxonomy template&lt;br /&gt;
|same_as=&lt;br /&gt;
}}&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
local SAME_AS = 7&lt;br /&gt;
local PARENT = 1&lt;br /&gt;
local RANK = 2&lt;br /&gt;
local LINK_TARGET = 3&lt;br /&gt;
local LINK_TEXT = 4&lt;br /&gt;
local ALWAYS_DISPLAY = 5&lt;br /&gt;
local EXTINCT = 6&lt;br /&gt;
local REFS = 8&lt;br /&gt;
&lt;br /&gt;
function p.callTaxonomyKey(frame)&lt;br /&gt;
	local parent = frame.args[&amp;#039;parent&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local rank = frame.args[&amp;#039;rank&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local extinct = string.lower(frame.args[&amp;#039;extinct&amp;#039;]) or &amp;#039;&amp;#039;&lt;br /&gt;
	local alwaysDisplay = string.lower(frame.args[&amp;#039;always_display&amp;#039;]) or &amp;#039;&amp;#039;&lt;br /&gt;
	local linkTarget = frame.args[&amp;#039;link_target&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local linkText = frame.args[&amp;#039;link_text&amp;#039;] or &amp;#039;&amp;#039; -- this is the &amp;quot;raw&amp;quot; link text, and can be &amp;#039;&amp;#039;&lt;br /&gt;
	local refs = frame.args[&amp;#039;refs&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local sameAsTaxon = frame.args[&amp;#039;same_as&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	if sameAsTaxon ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		-- try using the &amp;#039;same as&amp;#039; taxon; it&amp;#039;s an error if it doesn&amp;#039;t exist&lt;br /&gt;
		local ok, sameAsInfoStr = pcall(frame.expandTemplate, frame, { title = &amp;#039;Template:Taxonomy/&amp;#039; .. sameAsTaxon, args = {[&amp;#039;machine code&amp;#039;] = &amp;#039;all&amp;#039; } })&lt;br /&gt;
		if ok then&lt;br /&gt;
			local sameAsInfo = mw.text.split(sameAsInfoStr, &amp;#039;$&amp;#039;, true)&lt;br /&gt;
			--&amp;#039;same as&amp;#039; taxon&amp;#039;s taxonomy template must not have a &amp;#039;same as&amp;#039; link&lt;br /&gt;
			if sameAsInfo[SAME_AS] == &amp;#039;&amp;#039; then&lt;br /&gt;
				if parent == &amp;#039;&amp;#039; then parent = sameAsInfo[PARENT] end&lt;br /&gt;
				if rank == &amp;#039;&amp;#039; then rank = sameAsInfo[RANK] end&lt;br /&gt;
				if extinct == &amp;#039;&amp;#039; then extinct = string.lower(sameAsInfo[EXTINCT]) end&lt;br /&gt;
				if alwaysDisplay == &amp;#039;&amp;#039; then alwaysDisplay = string.lower(sameAsInfo[ALWAYS_DISPLAY]) end&lt;br /&gt;
				if linkTarget == &amp;#039;&amp;#039; then linkTarget = sameAsInfo[LINK_TARGET] end&lt;br /&gt;
				if linkText == &amp;#039;&amp;#039; then linkText = sameAsInfo[LINK_TEXT] end&lt;br /&gt;
				if refs == &amp;#039;&amp;#039; and parent == sameAsInfo[PARENT] then refs = sameAsInfo[REFS] end&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;#039;&amp;lt;span style=&amp;quot;color:red; font-size:1.1em&amp;quot;&amp;gt;Error: attempt to follow two &amp;quot;same as&amp;quot; links&amp;lt;/span&amp;gt;: &amp;lt;code&amp;gt;same_as = &amp;#039; .. sameAsTaxon .. &amp;#039;&amp;lt;/code&amp;gt;, but [[Template:Taxonomy/&amp;#039; .. sameAsTaxon .. &amp;#039;]] also has a&amp;lt;code&amp;gt;same_as&amp;lt;/code&amp;gt; parameter.&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return frame:expandTemplate{ title = &amp;#039;Template:Taxonomy key/missing template&amp;#039;, args = {taxon=sameAsTaxon, msg=&amp;#039;given as the value of &amp;lt;code&amp;gt;same as&amp;lt;/code&amp;gt;&amp;#039;} }&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local link = linkTarget&lt;br /&gt;
	if linkText ~= &amp;#039;&amp;#039; and linkText ~= linkTarget then link = link .. &amp;quot;|&amp;quot; .. linkText end&lt;br /&gt;
	return frame:expandTemplate{ title = &amp;#039;Template:Taxonomy key&amp;#039;,&lt;br /&gt;
			args = {parent=parent, rank=rank, extinct=extinct, always_display=alwaysDisplay, link_target=linkTarget, link=link, refs=refs, same_as=sameAsTaxon} }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[============================ taxonInfo ==================================&lt;br /&gt;
Extracts and returns information from Template:Taxonomy/TAXON, following&lt;br /&gt;
one &amp;#039;same as&amp;#039; link if required.&lt;br /&gt;
Usage: {{#invoke:Autotaxobox|taxonInfo|TAXON|ITEM}}&lt;br /&gt;
ITEM is one of: &amp;#039;parent&amp;#039;, &amp;#039;rank&amp;#039;, &amp;#039;link target&amp;#039;, &amp;#039;link text&amp;#039;, &amp;#039;link&amp;#039;, &amp;#039;extinct&amp;#039;,&lt;br /&gt;
&amp;#039;always display&amp;#039;, &amp;#039;refs&amp;#039;, &amp;#039;same as&amp;#039; or &amp;#039;all&amp;#039;.&lt;br /&gt;
If ITEM is not specified, the default is &amp;#039;all&amp;#039; – all values in a single string&lt;br /&gt;
separated by &amp;#039;$&amp;#039;.&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.taxonInfo(frame)&lt;br /&gt;
	local taxon = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local item = frame.args[2] or &amp;#039;&amp;#039;&lt;br /&gt;
	if item == &amp;#039;&amp;#039; then item = &amp;#039;all&amp;#039; end&lt;br /&gt;
	local ok, info = p.getTaxonInfoItem(frame, taxon, item)&lt;br /&gt;
	return info&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[============================ taxonLink ==================================&lt;br /&gt;
Returns a wikilink to a taxon, if required including &amp;#039;†&amp;#039; before it and&lt;br /&gt;
&amp;#039; (?)&amp;#039; after it, and optionally italicized or bolded without a wikilink.&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:Autotaxobox|taxonLink&lt;br /&gt;
|taxon=           : having &amp;#039;/?&amp;#039; at the end triggers the output of &amp;#039; (?)&amp;#039;&lt;br /&gt;
|extinct=         : &amp;#039;yes&amp;#039; or &amp;#039;true&amp;#039; trigger the output of &amp;#039;†&amp;#039;&lt;br /&gt;
|bold=            : &amp;#039;yes&amp;#039; makes the core output bold and not wikilinked&lt;br /&gt;
|italic=          : &amp;#039;yes&amp;#039; makes the core output italic&lt;br /&gt;
|link_target=     : target for the wikilink&lt;br /&gt;
link_text=        : text of the wikilink (may be same as link_target), without †, italics, etc.&lt;br /&gt;
}}&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.taxonLink(frame)&lt;br /&gt;
	local taxon = frame.args[&amp;#039;taxon&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local extinct = string.lower(frame.args[&amp;#039;extinct&amp;#039;] or &amp;#039;&amp;#039;)&lt;br /&gt;
	local bold = frame.args[&amp;#039;bold&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local italic = frame.args[&amp;#039;italic&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local linkTarget = frame.args[&amp;#039;link_target&amp;#039;] or &amp;#039;&amp;#039;&lt;br /&gt;
	local linkText = frame.args[&amp;#039;link_text&amp;#039;] or frame.args[&amp;#039;plain_link_text&amp;#039;] or &amp;#039;&amp;#039; --temporarily allow alternative args&lt;br /&gt;
	-- if link text is missing, try to find a replacement&lt;br /&gt;
	if linkText == &amp;#039;&amp;#039; then&lt;br /&gt;
		if string.find(taxon, &amp;#039;Incertae sedis&amp;#039;, 1, true) then&lt;br /&gt;
			linkText = &amp;quot;&amp;#039;&amp;#039;incertae sedis&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
			linkTarget = &amp;#039;Incertae sedis&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			linkText = p.stripExtra(taxon)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if linkTarget == &amp;#039;&amp;#039; then linkTarget = linkText end&lt;br /&gt;
	if italic == &amp;#039;yes&amp;#039; then linkText = TaxonItalics.italicizeTaxonName(linkText, false) end&lt;br /&gt;
	local link = &amp;#039;&amp;#039;&lt;br /&gt;
	if bold == &amp;#039;yes&amp;#039; then link = &amp;#039;&amp;lt;b&amp;gt;&amp;#039; .. linkText .. &amp;#039;&amp;lt;/b&amp;gt;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		if linkTarget == linkText then link = linkText&lt;br /&gt;
		else link = linkTarget .. &amp;#039;|&amp;#039; .. linkText&lt;br /&gt;
		end&lt;br /&gt;
		link = &amp;#039;[[&amp;#039; .. link .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if (extinct == &amp;#039;yes&amp;#039; or extinct == &amp;#039;true&amp;#039;) and not string.find(link, &amp;#039;†&amp;#039;, 1, true) then&lt;br /&gt;
		link = &amp;#039;&amp;lt;span style=&amp;quot;font-style:normal;font-weight:normal;&amp;quot;&amp;gt;†&amp;lt;/span&amp;gt;&amp;#039; .. link&lt;br /&gt;
	end&lt;br /&gt;
	if string.sub(taxon, -2) == &amp;#039;/?&amp;#039; and not string.find(link, &amp;#039;?&amp;#039;, 1, true) then&lt;br /&gt;
		link = link .. &amp;#039;&amp;lt;span style=&amp;quot;font-style:normal;font-weight:normal;&amp;quot;&amp;gt; (?)&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return link&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[========================== showRankTable ================================&lt;br /&gt;
Returns a wikitable showing the ranks and their values as set up by&lt;br /&gt;
getRankTable().&lt;br /&gt;
Usage: {{#invoke:Autotaxobox|showRankTable}}&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
&lt;br /&gt;
function p.showRankTable(frame)&lt;br /&gt;
	local rankTable = p.getRankTable()&lt;br /&gt;
	local res = &amp;#039;{| class=&amp;quot;wikitable sortable&amp;quot;\n|+ Ranks checked in taxonomy templates\n! Rank !! Shown as !! Value\n&amp;#039;&lt;br /&gt;
	for k, v in pairs(rankTable) do&lt;br /&gt;
		local rankShown = frame:expandTemplate{ title = &amp;#039;Template:Anglicise rank&amp;#039;, args = { k } }&lt;br /&gt;
		res = res .. &amp;#039;|-\n|&amp;#039; .. k .. &amp;#039;||&amp;#039; .. rankShown .. &amp;#039;||&amp;#039; .. v .. &amp;#039;\n&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return res .. &amp;#039;|}\n&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[============================== find =====================================&lt;br /&gt;
Returns the taxon above the specified taxon with a given rank.&lt;br /&gt;
Usage: {{#invoke:Autotaxobox|find|TAXON|RANK}}&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
&lt;br /&gt;
function p.find(frame)&lt;br /&gt;
	local currTaxon = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	if currTaxon == &amp;#039;&amp;#039; then return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;no taxon supplied&amp;lt;/span&amp;gt;&amp;#039; end&lt;br /&gt;
	local rank = frame.args[2] or &amp;#039;&amp;#039;&lt;br /&gt;
	if rank == &amp;#039;&amp;#039; then return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;no rank supplied&amp;lt;/span&amp;gt;&amp;#039; end&lt;br /&gt;
	local inHierarchy = true -- still in the taxonomic hierarchy or off the top?&lt;br /&gt;
	local searching = true -- still searching&lt;br /&gt;
	while inHierarchy and searching do&lt;br /&gt;
		local ok, parent = p.getTaxonInfoItem(frame, currTaxon, &amp;#039;parent&amp;#039;)&lt;br /&gt;
			if ok and parent ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			currTaxon = parent&lt;br /&gt;
			local ok, currRank = p.getTaxonInfoItem(frame, currTaxon, &amp;#039;rank&amp;#039;)&lt;br /&gt;
			if currRank == rank then&lt;br /&gt;
				searching = false&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			inHierarchy = false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if inHierarchy and not searching then return currTaxon&lt;br /&gt;
	else return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;rank not found&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[=============================== nth =====================================&lt;br /&gt;
External utility function primarily intended for use in checking and debugging.&lt;br /&gt;
Returns the nth level above a taxon in a taxonomic hierarchy, where the taxon&lt;br /&gt;
itself is counted as the first level.&lt;br /&gt;
Usage: {{#invoke:Autotaxobox|nth|TAXON|n=N}}&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.nth(frame)&lt;br /&gt;
	local currTaxon = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	if currTaxon == &amp;#039;&amp;#039; then return &amp;#039;ERROR: no taxon supplied&amp;#039; end&lt;br /&gt;
	local n = tonumber(frame.args[&amp;#039;n&amp;#039;] or 1)&lt;br /&gt;
	if n &amp;gt; MaxSearchLevels then&lt;br /&gt;
		return &amp;#039;Exceeded maximum number of levels allowed (&amp;#039; .. MaxSearchLevels .. &amp;#039;)&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local i = 1&lt;br /&gt;
	local inHierarchy = true -- still in the taxonomic hierarchy or off the top?&lt;br /&gt;
	while i &amp;lt; n and inHierarchy do&lt;br /&gt;
		local ok, parent = p.getTaxonInfoItem(frame, currTaxon, &amp;#039;parent&amp;#039;)&lt;br /&gt;
			if ok and parent ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			currTaxon = parent&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		else&lt;br /&gt;
			inHierarchy = false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if inHierarchy then return currTaxon&lt;br /&gt;
	else return &amp;#039;Level &amp;#039; .. n .. &amp;#039; is past the top of the taxonomic hierarchy&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[============================= nLevels ===================================&lt;br /&gt;
External utility function primarily intended for use in checking and debugging.&lt;br /&gt;
Returns number of levels in a taxonomic hierarchy, starting from&lt;br /&gt;
the supplied taxon as level 1.&lt;br /&gt;
Usage: {{#invoke:Autotaxobox|nLevels|TAXON}}&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.nLevels(frame)&lt;br /&gt;
	local currTaxon = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	if currTaxon == &amp;#039;&amp;#039; then return &amp;#039;ERROR: no taxon supplied&amp;#039; end&lt;br /&gt;
	local i = 1&lt;br /&gt;
	local inHierarchy = true -- still in the taxonomic hierarchy or off the top?&lt;br /&gt;
	while inHierarchy and i &amp;lt; MaxSearchLevels  do&lt;br /&gt;
		local ok, parent = p.getTaxonInfoItem(frame, currTaxon, &amp;#039;parent&amp;#039;)&lt;br /&gt;
		if ok and parent ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			currTaxon = parent&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		else&lt;br /&gt;
			inHierarchy = false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if inHierarchy then return MaxSearchLevels .. &amp;#039;+&amp;#039;&lt;br /&gt;
	else return i&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[============================= listAll ===================================&lt;br /&gt;
External utility function primarily intended for use in checking and debugging.&lt;br /&gt;
Returns a comma separated list of a taxonomic hierarchy, starting from&lt;br /&gt;
the supplied taxon.&lt;br /&gt;
Usage: {{#invoke:Autotaxobox|listAll|TAXON}}&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
function p.listAll(frame)&lt;br /&gt;
	local currTaxon = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	if currTaxon == &amp;#039;&amp;#039; then return &amp;#039;ERROR: no taxon supplied&amp;#039; end&lt;br /&gt;
	return p.listTaxa(p.makeTable(frame, currTaxon))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[=========================================================================&lt;br /&gt;
Internal functions&lt;br /&gt;
=============================================================================]]&lt;br /&gt;
&lt;br /&gt;
--[[= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =&lt;br /&gt;
Internal utility function to strip off any extra parts of a taxon name, i.e.&lt;br /&gt;
anything after a &amp;#039;/&amp;#039;. Thus &amp;quot;Felidae/?&amp;quot; would be reduced to &amp;quot;Felidae&amp;quot;.&lt;br /&gt;
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =]]&lt;br /&gt;
function p.stripExtra(taxonName)&lt;br /&gt;
	local i = string.find(taxonName,&amp;#039;/&amp;#039;)&lt;br /&gt;
	if i then&lt;br /&gt;
		return string.sub(taxonName,1,i-1)&lt;br /&gt;
	else&lt;br /&gt;
		return taxonName&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =&lt;br /&gt;
Internal utility function to convert a taxon table to a comma-separated list.&lt;br /&gt;
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =]]&lt;br /&gt;
function p.listTaxa(taxonTable)&lt;br /&gt;
	local lst = taxonTable[1]&lt;br /&gt;
	for i = 2, taxonTable.n, 1 do&lt;br /&gt;
		lst = lst .. &amp;#039;, &amp;#039; .. taxonTable[i]&lt;br /&gt;
	end&lt;br /&gt;
	return lst&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =&lt;br /&gt;
Internal utility function to extract an item of information from a &lt;br /&gt;
taxonomy template, following one &amp;#039;same as&amp;#039; link if required.&lt;br /&gt;
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =]]&lt;br /&gt;
function p.getTaxonInfoItem(frame, taxon, item)&lt;br /&gt;
	-- item == &amp;#039;link&amp;#039; is a special case&lt;br /&gt;
	if item == &amp;#039;link&amp;#039; then&lt;br /&gt;
		return p.getTaxonInfoLink(frame, taxon)&lt;br /&gt;
	end&lt;br /&gt;
	local ok, info&lt;br /&gt;
	-- item == &amp;#039;dagger&amp;#039; is another special case&lt;br /&gt;
	if item == &amp;#039;dagger&amp;#039; then&lt;br /&gt;
		ok, info = p.getTaxonInfoItem(frame, taxon, &amp;#039;extinct&amp;#039;)&lt;br /&gt;
		if ok then&lt;br /&gt;
			if info == &amp;#039;yes&amp;#039; or info == &amp;#039;true&amp;#039; then&lt;br /&gt;
				info = &amp;#039;&amp;amp;dagger;&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				info = &amp;#039;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	-- item ~= &amp;#039;link&amp;#039; or &amp;#039;dagger&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		ok, info = pcall(frame.expandTemplate, frame, { title = &amp;#039;Template:Taxonomy/&amp;#039; .. taxon, args = {[&amp;#039;machine code&amp;#039;] = item } })&lt;br /&gt;
		if ok then&lt;br /&gt;
			if info == &amp;#039;&amp;#039; then&lt;br /&gt;
				-- try &amp;#039;same as&amp;#039;&lt;br /&gt;
				local sameAsTaxon = frame:expandTemplate{ title = &amp;#039;Template:Taxonomy/&amp;#039; .. taxon, args = {[&amp;#039;machine code&amp;#039;] = &amp;#039;same as&amp;#039; } }&lt;br /&gt;
				if sameAsTaxon ~= &amp;#039;&amp;#039; then&lt;br /&gt;
					ok, info = pcall(frame.expandTemplate, frame, { title = &amp;#039;Template:Taxonomy/&amp;#039; .. sameAsTaxon, args = {[&amp;#039;machine code&amp;#039;] = item } })&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if ok then&lt;br /&gt;
		-- if item is &amp;#039;link_text&amp;#039; check whether &amp;#039;(?)&amp;#039; needs to be added&lt;br /&gt;
		if item == &amp;#039;link_text&amp;#039; and string.sub(taxon, -2) == &amp;#039;/?&amp;#039; and not string.find(info, &amp;#039;?&amp;#039;, 1, true) then&lt;br /&gt;
			info = info .. &amp;#039;&amp;lt;span style=&amp;quot;font-style:normal;font-weight:normal;&amp;quot;&amp;gt; (?)&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		info = &amp;#039;[[Template:Taxonomy/&amp;#039; .. taxon .. &amp;#039;]]&amp;#039; --error indicator in code before conversion to Lua&lt;br /&gt;
	end&lt;br /&gt;
	return ok, info&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getTaxonInfoLink(frame, taxon)&lt;br /&gt;
	local ok, linkText, linkTarget&lt;br /&gt;
	local link = &amp;#039;&amp;#039;&lt;br /&gt;
	ok, linkText = p.getTaxonInfoItem(frame, taxon, &amp;#039;link_text&amp;#039;)&lt;br /&gt;
	if ok then&lt;br /&gt;
		ok, linkTarget = p.getTaxonInfoItem(frame, taxon, &amp;#039;link_target&amp;#039;)&lt;br /&gt;
		if ok then&lt;br /&gt;
			if linkText == linkTarget then link = linkText&lt;br /&gt;
			else link = linkTarget .. &amp;#039;|&amp;#039; .. linkText&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ok, link&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =&lt;br /&gt;
Internal utility function to return a table (array) constructed from a&lt;br /&gt;
taxonomic hierarchy stored in &amp;quot;Template:Taxonomy/...&amp;quot; templates.&lt;br /&gt;
TABLE.n holds the total number of taxa; TABLE[1]..TABLE[TABLE.n] the taxon&lt;br /&gt;
names.&lt;br /&gt;
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =]]&lt;br /&gt;
function p.makeTable(frame, currTaxon)&lt;br /&gt;
	local i = 1&lt;br /&gt;
	local inHierarchy = true -- still in the taxonomic hierarchy or off the top?&lt;br /&gt;
	local taxonTable = {}&lt;br /&gt;
	taxonTable[1] = currTaxon;&lt;br /&gt;
	while i &amp;lt; MaxSearchLevels and inHierarchy do&lt;br /&gt;
		local ok, parent = p.getTaxonInfoItem(frame, currTaxon, &amp;#039;parent&amp;#039;)&lt;br /&gt;
		if ok and parent ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			currTaxon = parent&lt;br /&gt;
			i = i + 1&lt;br /&gt;
			taxonTable[i] = currTaxon&lt;br /&gt;
		else&lt;br /&gt;
			inHierarchy = false -- run off the top of the hierarchy or tried to use non-existent taxonomy template&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	taxonTable.n = i&lt;br /&gt;
	return taxonTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =&lt;br /&gt;
Internal utility function to set up a table of numerical values corresponding&lt;br /&gt;
to &amp;#039;Linnaean&amp;#039; ranks, with upper ranks having higher values. In a valid&lt;br /&gt;
taxonomic hierarchy, a lower rank should never have a higher value than a&lt;br /&gt;
higher rank. The actual numerical values are arbitrary so long as they are&lt;br /&gt;
ordered.&lt;br /&gt;
The ranks should correspond to those in Template:Anglicise ranks.&lt;br /&gt;
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =]]&lt;br /&gt;
function p.getRankTable()&lt;br /&gt;
	return {&lt;br /&gt;
		classis = 1400,&lt;br /&gt;
		cohort = 1100,&lt;br /&gt;
		divisio = 1500,&lt;br /&gt;
		domain = 1700,&lt;br /&gt;
		familia = 800,&lt;br /&gt;
		forma = 100,&lt;br /&gt;
		genus = 600,&lt;br /&gt;
		grandordo = 1005,&lt;br /&gt;
		[&amp;#039;grandordo-mb&amp;#039;] = 1002,&lt;br /&gt;
		infraclassis = 1397,&lt;br /&gt;
		infralegio = 1197,&lt;br /&gt;
		infraordo = 997,&lt;br /&gt;
		infraphylum = 1497,&lt;br /&gt;
		infraregnum = 1597,&lt;br /&gt;
		infratribus = 697,&lt;br /&gt;
		legio = 1200,&lt;br /&gt;
		magnordo = 1006,&lt;br /&gt;
		microphylum = 1495,&lt;br /&gt;
		micrordo = 995,&lt;br /&gt;
		mirordo = 1004,&lt;br /&gt;
		[&amp;#039;mirordo-mb&amp;#039;] = 1001,&lt;br /&gt;
		nanophylum = 1494,&lt;br /&gt;
		nanordo = 994,&lt;br /&gt;
		ordo = 1000,&lt;br /&gt;
		parafamilia = 800,&lt;br /&gt;
		parvclassis = 1396; -- same as subterclassis&lt;br /&gt;
		parvordo = 996,&lt;br /&gt;
		phylum = 1500,&lt;br /&gt;
		regnum = 1600,&lt;br /&gt;
		sectio = 500,&lt;br /&gt;
		--series = 400, used too inconsistently to check&lt;br /&gt;
		species = 300,&lt;br /&gt;
		subclassis = 1398,&lt;br /&gt;
		subcohort = 1098,&lt;br /&gt;
		subdivisio = 1498,&lt;br /&gt;
		subfamilia = 798,&lt;br /&gt;
		subgenus = 598,&lt;br /&gt;
		sublegio = 1198,&lt;br /&gt;
		subordo = 998,&lt;br /&gt;
		subphylum = 1498,&lt;br /&gt;
		subregnum = 1598,&lt;br /&gt;
		subsectio = 498,&lt;br /&gt;
		subspecies = 298,&lt;br /&gt;
		subterclassis = 1396; -- same as parvclassis&lt;br /&gt;
		subtribus = 698,&lt;br /&gt;
		superclassis = 1403,&lt;br /&gt;
		supercohort = 1103,&lt;br /&gt;
		superdivisio = 1503,&lt;br /&gt;
		superdomain = 1703,&lt;br /&gt;
		superfamilia = 803,&lt;br /&gt;
		superlegio = 1203,&lt;br /&gt;
		superordo = 1003,&lt;br /&gt;
		superphylum = 1503,&lt;br /&gt;
		superregnum = 1603,&lt;br /&gt;
		supertribus = 703,&lt;br /&gt;
		tribus = 700,&lt;br /&gt;
		varietas = 200,&lt;br /&gt;
		zoodivisio = 1300,&lt;br /&gt;
		zoosectio = 900,&lt;br /&gt;
		zoosubdivisio = 1298,&lt;br /&gt;
		zoosubsectio = 898,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Jts1882</name></author>
	</entry>
</feed>