<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.stiles.casa/index.php?action=history&amp;feed=atom&amp;title=Module%3AEFloras</id>
	<title>Module:EFloras - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stiles.casa/index.php?action=history&amp;feed=atom&amp;title=Module%3AEFloras"/>
	<link rel="alternate" type="text/html" href="https://wiki.stiles.casa/index.php?title=Module:EFloras&amp;action=history"/>
	<updated>2026-05-18T10:23:17Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://wiki.stiles.casa/index.php?title=Module:EFloras&amp;diff=7225&amp;oldid=prev</id>
		<title>imported&gt;MusikAnimal: Protected &quot;Module:EFloras&quot;: High-risk module ([Edit=Require autoconfirmed or confirmed access] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://wiki.stiles.casa/index.php?title=Module:EFloras&amp;diff=7225&amp;oldid=prev"/>
		<updated>2019-01-24T21:24:24Z</updated>

		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/view/Module:EFloras&quot; title=&quot;Module:EFloras&quot;&gt;Module:EFloras&lt;/a&gt;&amp;quot;: &lt;a href=&quot;/index.php?title=Stiles.casa_Wiki:High-risk_templates&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Stiles.casa Wiki:High-risk templates (page does not exist)&quot;&gt;High-risk module&lt;/a&gt; ([Edit=Require autoconfirmed or confirmed access] (indefinite))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;Module:No globals&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local data -- Load [[Module:eFloras/data]] if needed and assign to this variable.&lt;br /&gt;
&lt;br /&gt;
local function getResource(floraID)&lt;br /&gt;
	data = data or mw.loadData(&amp;quot;Module:eFloras/data&amp;quot;)&lt;br /&gt;
	return data.resources[floraID] or data.resources[tonumber(floraID)]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.resource(frame)&lt;br /&gt;
	local floraID = string.match(frame.args[1], &amp;quot;%d+&amp;quot;)&lt;br /&gt;
	if floraID == nil then&lt;br /&gt;
		return &amp;quot;&amp;lt;span style=\&amp;quot;color: red;\&amp;quot;&amp;gt;Please provide a resource number (&amp;lt;code&amp;gt;flora_id&amp;lt;/code&amp;gt;). See the list of supported resource numbers at [[Module:eFloras/doc]]&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		local familyToVolume = getResource(floraID)&lt;br /&gt;
		if familyToVolume == nil then&lt;br /&gt;
			return &amp;quot;&amp;lt;span style=\&amp;quot;color: red;\&amp;quot;&amp;gt;The resource number (&amp;lt;code&amp;gt;flora_id&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;&amp;quot; .. floraID .. &amp;quot;&amp;lt;/code&amp;gt; is not recognized. See the list of supported resource numbers at [[Module:eFloras/doc]]&amp;lt;/span&amp;gt;[[Category:Pages using eFloras template with unsupported parameter values]]&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			return familyToVolume&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._volumeName(floraID, volume, family)&lt;br /&gt;
	floraID = tonumber(floraID)&lt;br /&gt;
	&lt;br /&gt;
	if not floraID then -- floraID is not a number.&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	data = data or mw.loadData(&amp;quot;Module:eFloras/data&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if not volume then&lt;br /&gt;
		local familyToVolume = data.volumeTable[floraID]&lt;br /&gt;
		if not familyToVolume then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		volume = tonumber(familyToVolume[family])&lt;br /&gt;
	&lt;br /&gt;
		if not volume then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local floraVolumeNames = data.volumeNames and data.volumeNames[floraID]&lt;br /&gt;
	if floraVolumeNames and volume then&lt;br /&gt;
		return floraVolumeNames[volume]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.volumeName(frame)&lt;br /&gt;
	if not (frame.args[1] and (frame.args[2] or frame.args[3] or frame.args.family)) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local floraID = string.match(frame.args[1], &amp;quot;%d+&amp;quot;)&lt;br /&gt;
	local volume = tonumber(frame.args[2])&lt;br /&gt;
	local family = frame.args[3] or frame.args.family&lt;br /&gt;
	&lt;br /&gt;
	if not (floraID and (volume or family)) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return p._volumeName(floraID, volume, family)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._volumeDate(floraID, volume, family)&lt;br /&gt;
	floraID = tonumber(floraID)&lt;br /&gt;
	&lt;br /&gt;
	if not floraID then -- floraID is not a number.&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	data = data or mw.loadData(&amp;quot;Module:eFloras/data&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if not volume then&lt;br /&gt;
		local familyToVolume = data.volumeTable[floraID]&lt;br /&gt;
		if not familyToVolume then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		volume = tonumber(familyToVolume[family])&lt;br /&gt;
	&lt;br /&gt;
		if not volume then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local floraVolumeDates = data.volumeDates and data.volumeDates[floraID]&lt;br /&gt;
	if floraVolumeDates then&lt;br /&gt;
		if volume and floraVolumeDates[volume] then&lt;br /&gt;
			return floraVolumeDates[volume]&lt;br /&gt;
		else&lt;br /&gt;
			return floraVolumeDates.default&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.volumeDate(frame)&lt;br /&gt;
	if not (frame.args[1] and (frame.args[2] or frame.args[3] or frame.args.family)) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local floraID = string.match(frame.args[1], &amp;quot;%d+&amp;quot;)&lt;br /&gt;
	local volume = tonumber(frame.args[2])&lt;br /&gt;
	local family = frame.args[3] or frame.args.family&lt;br /&gt;
	&lt;br /&gt;
	if not (floraID and (volume or family)) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return p._volumeDate(floraID, volume, family)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.volume(frame)&lt;br /&gt;
	local floraID = string.match(frame.args[1], &amp;quot;%d+&amp;quot;)&lt;br /&gt;
	local family = frame.args[2] or frame.args.family&lt;br /&gt;
	data = data or mw.loadData(&amp;quot;Module:eFloras/data&amp;quot;)&lt;br /&gt;
	local familyToVolume = data.volumeTable[floraID] or data.volumeTable[tonumber(floraID)]&lt;br /&gt;
	if familyToVolume == nil then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		local volume = familyToVolume[family]&lt;br /&gt;
		if volume == &amp;quot;error&amp;quot; then&lt;br /&gt;
			return &amp;quot;19&amp;amp;ndash;21 [[Category:Pages using eFloras template with unsupported parameter values]]&amp;quot;&lt;br /&gt;
		elseif volume == nil then&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			return volume&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Italicize if name requires it.&lt;br /&gt;
function p.italicize(name)&lt;br /&gt;
	local orig = name&lt;br /&gt;
	name = string.gsub(name, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local count&lt;br /&gt;
	name, count = string.gsub(name, &amp;quot;\&amp;#039;\&amp;#039;\&amp;#039;?&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if count &amp;gt; 0 then&lt;br /&gt;
		-- A tracking method used on Wiktionary: [[wikt:Module:debug]].&lt;br /&gt;
		-- To see the results:&lt;br /&gt;
		-- [[Special:WhatLinksHere/Template:tracking/eFloras/italics or bolding]]&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		pcall(frame.expandTemplate, frame, { title = &amp;#039;tracking/eFloras/italics or bolding&amp;#039; })&lt;br /&gt;
		mw.log(&amp;quot;Italics in input to the italicize function in Module:eFloras:&amp;quot;, orig)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local rank&lt;br /&gt;
	local lowerName = name:lower()&lt;br /&gt;
	if name == &amp;quot;&amp;quot; or name == nil then&lt;br /&gt;
		return&lt;br /&gt;
	elseif string.find(name, &amp;quot;^%u%l+ae$&amp;quot;) then&lt;br /&gt;
		if string.find(name, &amp;quot;eae$&amp;quot;) then&lt;br /&gt;
			if string.find(name, &amp;quot;aceae$&amp;quot;) then&lt;br /&gt;
				rank = &amp;quot;family&amp;quot;&lt;br /&gt;
			elseif string.find(name, &amp;quot;oideae$&amp;quot;) then&lt;br /&gt;
				rank = &amp;quot;subfamily&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				rank = &amp;quot;tribe&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		elseif string.find(name, &amp;quot;inae$&amp;quot;) then&lt;br /&gt;
			rank = &amp;quot;subtribe&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	elseif string.find(lowerName, &amp;quot;subsp.&amp;quot;, 1, true) then&lt;br /&gt;
		rank = &amp;quot;subspecies&amp;quot;&lt;br /&gt;
	elseif string.find(lowerName, &amp;quot;subg.&amp;quot;, 1, true) then&lt;br /&gt;
		rank = &amp;quot;subgenus&amp;quot;&lt;br /&gt;
	elseif string.find(lowerName, &amp;quot;var.&amp;quot;, 1, true) then&lt;br /&gt;
		rank = &amp;quot;variety&amp;quot;&lt;br /&gt;
	elseif string.find(lowerName, &amp;quot;sect.&amp;quot;, 1, true) then&lt;br /&gt;
		rank = &amp;quot;section&amp;quot;&lt;br /&gt;
	elseif string.find(name, &amp;quot;^%a+%s[%a-]+$&amp;quot;) or string.find(name, &amp;quot;^%a+%s×%s[%a-]+$&amp;quot;) then&lt;br /&gt;
		rank = &amp;quot;species&amp;quot;&lt;br /&gt;
	elseif string.find(name, &amp;quot;^%u%a+$&amp;quot;) -- No one-letter genera, probably.&lt;br /&gt;
			and not string.find(name, &amp;quot;.%u&amp;quot;) then -- Uppercase letters can only appear at beginning of taxonomic name.&lt;br /&gt;
		rank = &amp;quot;genus&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not rank then&lt;br /&gt;
		mw.log(&amp;quot;Module:eFloras could not determine a taxonomic rank for the input that it received: &amp;quot; .. name)&lt;br /&gt;
		return orig&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if rank == &amp;quot;genus&amp;quot; or rank == &amp;quot;subgenus&amp;quot; or rank == &amp;quot;species&amp;quot;&lt;br /&gt;
			or rank == &amp;quot;subspecies&amp;quot; or rank == &amp;quot;variety&amp;quot; or rank == &amp;quot;section&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		name = &amp;quot;&amp;lt;i&amp;gt;&amp;quot; .. name .. &amp;quot;&amp;lt;/i&amp;gt;&amp;quot;&lt;br /&gt;
		local hybrid = &amp;quot;×&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		if name:find(&amp;quot;.&amp;quot;, 1, true) then&lt;br /&gt;
			local abbreviations = {&lt;br /&gt;
				[&amp;quot;subsp.&amp;quot;] = true, [&amp;quot;ssp.&amp;quot;] = true, [&amp;quot;var.&amp;quot;] = true, [&amp;quot;f.&amp;quot;] = true,&lt;br /&gt;
				[&amp;quot;sect.&amp;quot;] = true, [&amp;quot;subsect.&amp;quot;] = true, [&amp;quot;subg.&amp;quot;] = true,&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			local unrecognized&lt;br /&gt;
			name = name:gsub(&lt;br /&gt;
				&amp;quot;%s+(%S+%.)%s+&amp;quot;,&lt;br /&gt;
				function (abbreviation)&lt;br /&gt;
					mw.log(name, abbreviation, abbreviation:lower(), abbreviations[abbreviation:lower()])&lt;br /&gt;
					if abbreviations[abbreviation:lower()] then&lt;br /&gt;
						return &amp;quot;&amp;lt;/i&amp;gt; &amp;quot; .. abbreviation .. &amp;quot; &amp;lt;i&amp;gt;&amp;quot;&lt;br /&gt;
					else&lt;br /&gt;
						unrecognized = unrecognized or {}&lt;br /&gt;
						table.insert(unrecognized, abbreviation)&lt;br /&gt;
					end&lt;br /&gt;
				end)&lt;br /&gt;
			&lt;br /&gt;
			if unrecognized then&lt;br /&gt;
				mw.log(string.format(&amp;quot;The abbreviation%s %s %s not recognized.&amp;quot;,&lt;br /&gt;
					unrecognized[2] and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;,&lt;br /&gt;
					table.concat(&lt;br /&gt;
						unrecognized,&lt;br /&gt;
						&amp;quot;, &amp;quot;),&lt;br /&gt;
					unrecognized[2] and &amp;quot;are&amp;quot; or &amp;quot;is&amp;quot;))&lt;br /&gt;
				return orig&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		name = name:gsub(&amp;quot;%s+&amp;quot; .. hybrid .. &amp;quot;%s+&amp;quot;, &amp;quot;&amp;lt;/i&amp;gt; &amp;quot; .. hybrid .. &amp;quot; &amp;lt;i&amp;gt;&amp;quot;)&lt;br /&gt;
	end -- Else do not modify name.&lt;br /&gt;
	&lt;br /&gt;
	return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.name(frame)&lt;br /&gt;
	local name = frame.args[1]&lt;br /&gt;
	return p.italicize(name)&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
p.get_volume = p.volume&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;MusikAnimal</name></author>
	</entry>
</feed>