<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://the-democratika.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ABiota_infobox%2Fparam</id>
	<title>Module:Biota infobox/param - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://the-democratika.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ABiota_infobox%2Fparam"/>
	<link rel="alternate" type="text/html" href="https://the-democratika.com/wiki/index.php?title=Module:Biota_infobox/param&amp;action=history"/>
	<updated>2026-04-04T21:06:02Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://the-democratika.com/wiki/index.php?title=Module:Biota_infobox/param&amp;diff=10453&amp;oldid=prev</id>
		<title>&gt;MusikBot II: Protected &quot;Module:Biota infobox/param&quot;: High-risk template or module: 262 transclusions (more info) ([Edit=Require autoconfirmed or confirmed access] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://the-democratika.com/wiki/index.php?title=Module:Biota_infobox/param&amp;diff=10453&amp;oldid=prev"/>
		<updated>2023-12-08T18:00:28Z</updated>

		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/wiki/index.php/Module:Biota_infobox/param&quot; title=&quot;Module:Biota infobox/param&quot;&gt;Module:Biota infobox/param&lt;/a&gt;&amp;quot;: &lt;a href=&quot;https://en.wikipedia.org/wiki/High-risk_templates&quot; class=&quot;extiw&quot; title=&quot;wikipedia:High-risk templates&quot;&gt;High-risk template or module&lt;/a&gt;: 262 transclusions (&lt;a href=&quot;/wiki/index.php?title=User:MusikBot_II/TemplateProtector&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:MusikBot II/TemplateProtector (page does not exist)&quot;&gt;more info&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;strict&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local templateArgs = {}&lt;br /&gt;
local info = {}&lt;br /&gt;
&lt;br /&gt;
local paramData = require( &amp;#039;Module:Biota infobox/data&amp;#039; ) -- contains the taxon ranks in order&lt;br /&gt;
&lt;br /&gt;
-- call parameter checking independently of taxobox display&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	p._getArgs(frame)&lt;br /&gt;
	return info.parameterCategory &lt;br /&gt;
end&lt;br /&gt;
-- get parameters for calling function&lt;br /&gt;
function p.getArgs(frame, args, localinfo)&lt;br /&gt;
	templateArgs = args&lt;br /&gt;
	info = localinfo&lt;br /&gt;
	 p._getArgs(frame)&lt;br /&gt;
end&lt;br /&gt;
-- get the arguments and check them in vaious ways&lt;br /&gt;
function p._getArgs(frame)&lt;br /&gt;
	local parents = mw.getCurrentFrame():getParent()&lt;br /&gt;
    local tempArgs={} -- local copy of arguments that will be checked (empty, aliases, invalid)&lt;br /&gt;
    &lt;br /&gt;
    -- get copy of parent arguments, aliasing spaces for underscores&lt;br /&gt;
	for k,v in pairs(parents.args) do&lt;br /&gt;
		if type (k) == &amp;#039;string&amp;#039; then            -- no positional parameters &lt;br /&gt;
			--v = v:match(&amp;#039;^%s*(.-)%s*$&amp;#039;)       -- include trimming (only needed for positional parameters)&lt;br /&gt;
			if v and (v ~= &amp;quot;&amp;quot;) then             -- check for content&lt;br /&gt;
				local j = k:gsub( &amp;quot; &amp;quot;, &amp;quot;_&amp;quot;)     -- substitute spaces with underscore (aliases)&lt;br /&gt;
				tempArgs[j]=v                   -- parents.args[k]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- do we need to check frame args?&lt;br /&gt;
	for k,v in pairs(frame.args) do&lt;br /&gt;
		if v and v ~= &amp;quot;&amp;quot; then                  --check for content&lt;br /&gt;
			tempArgs[k]=v &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- parameters that can be set without a value, e.g. |extinct= &lt;br /&gt;
	if parents.args[&amp;#039;extinct&amp;#039;] and parents.args[&amp;#039;extinct&amp;#039;] == &amp;quot;&amp;quot; then templateArgs[&amp;#039;extinct&amp;#039;] = &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	if parents.args[&amp;#039;auto&amp;#039;] or frame.args[&amp;#039;auto&amp;#039;] then &lt;br /&gt;
		info.auto = parents.args[&amp;#039;auto&amp;#039;]  or frame.args[&amp;#039;auto&amp;#039;]   -- keep template parameters seperate from control flow arguments&lt;br /&gt;
	end&lt;br /&gt;
	if parents.args[&amp;#039;db&amp;#039;] or frame.args[&amp;#039;db&amp;#039;] then &lt;br /&gt;
		info.db = parents.args[&amp;#039;db&amp;#039;]  or frame.args[&amp;#039;db&amp;#039;]   -- keep template parameters seperate from control flow arguments&lt;br /&gt;
	end	&lt;br /&gt;
    p.preprocessArgs(tempArgs) -- check aliases, check valid parameters for calling template&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.preprocessArgs(tempArgs) -- handles aliases ajc validates parameters&lt;br /&gt;
	info.parameterCategory = &amp;quot;&amp;quot;     -- initialise empty string for tracking categories&lt;br /&gt;
	p.aliasParams(tempArgs)         -- check parameters for aliases&lt;br /&gt;
    p.validateParams(tempArgs)      -- check parameters for invalid parameters (from allowed list)&lt;br /&gt;
	p._checkParameters(tempArgs)    -- check manual taxon ranks, orphaned parameters and invalid combinations&lt;br /&gt;
end&lt;br /&gt;
--[[ -------------------------------------------------------------------&lt;br /&gt;
     function p.aliasParams(tempArgs)&lt;br /&gt;
         -- alias of spaces to underscores handled in getArgs()&lt;br /&gt;
         -- uses alias list from the data subpage (param.aliasmap)&lt;br /&gt;
         -- e.g. local aliasMap = {  [&amp;#039;fossil_range&amp;#039;] = &amp;#039;temporal_range&amp;#039;,  &lt;br /&gt;
		                             [&amp;#039;colour_as&amp;#039;] = &amp;#039;color_as&amp;#039;, ... }&lt;br /&gt;
]]&lt;br /&gt;
function p.aliasParams(tempArgs)&lt;br /&gt;
&lt;br /&gt;
    -- change parameters using alias map&lt;br /&gt;
    for k,v in pairs(paramData.aliasMap) do&lt;br /&gt;
		if tempArgs[k] then                 -- if templateArgs has parameter with alias name&lt;br /&gt;
			tempArgs[v] = tempArgs[k];	    -- create new element with alias&amp;#039; value as key&lt;br /&gt;
			tempArgs[k] = nil;			    -- delete the alias&lt;br /&gt;
		end    &lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    --[[ alias: change parameters using spaces instead of underscores&lt;br /&gt;
	local localArgs = {} -- Note: adding new keys while iterating over a table gives unpredictable results&lt;br /&gt;
    for k,v in pairs(templateArgs) do&lt;br /&gt;
       if type(k)==&amp;#039;string&amp;#039; then&lt;br /&gt;
			local j,n = string.gsub(k, &amp;quot; &amp;quot;, &amp;quot;_&amp;quot;)               -- substitute spaces&lt;br /&gt;
			if n &amp;gt; 0 then --if j ~= k then      -- if substitution made&lt;br /&gt;
				localArgs[j] = v	            -- create new key with underscore&lt;br /&gt;
			    localArgs[k] = nil;			    -- delete old key with space &lt;br /&gt;
	        else &lt;br /&gt;
	        	localArgs[k] = v&lt;br /&gt;
        	end&lt;br /&gt;
		end&lt;br /&gt;
	end	&lt;br /&gt;
    templateArgs = localArgs -- now copy the corrected table&lt;br /&gt;
	--templateArgs[&amp;#039;debug&amp;#039;] = mw.dumpObject (templateArgs)&lt;br /&gt;
    --]]&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
--[[ -------------------------------------------------------------------------------------------&lt;br /&gt;
	function p.validateParams(tempArgs)&lt;br /&gt;
	    - uses list of valid parametere accepted by template (from data subpage)&lt;br /&gt;
	        params.validList = {&lt;br /&gt;
						automatictaxobox = params.validAutomatictaxobox,&lt;br /&gt;
						speciesbox       = params.validSpeciesbox,&lt;br /&gt;
						subspeciesbox    = params.validSubspeciesbox,&lt;br /&gt;
					    infraspeciesbox  = params.validInfraspeciesbox,	}&lt;br /&gt;
	    - invalid parameters are retaining in tempArgs&lt;br /&gt;
]]&lt;br /&gt;
function p.validateParams(tempArgs)&lt;br /&gt;
&lt;br /&gt;
	local validParamsList = paramData.validList[info.auto]&lt;br /&gt;
	&lt;br /&gt;
    if type(validParamsList) == &amp;#039;table&amp;#039; then      -- if checklist for valid parameters&lt;br /&gt;
	    for k,v in pairs(validParamsList) do&lt;br /&gt;
	       if tempArgs[v] then                    -- v contains the name of valid parameter key&lt;br /&gt;
	       	   templateArgs[v] = tempArgs[v]&lt;br /&gt;
	       	   tempArgs[v] = nil                  -- delete so only invalid arguments left in tempArgs&lt;br /&gt;
	       end                                    -- TODO use these for tracking categories (partially done)&lt;br /&gt;
	    end&lt;br /&gt;
	    &lt;br /&gt;
	    tempArgs[&amp;#039;auto&amp;#039;] = nil                    -- this if not on tracking list but used internally&lt;br /&gt;
	    if #tempArgs  then                        -- table  not empty -- if next(tempArgs) ~= nil then&lt;br /&gt;
		    templateArgs[&amp;#039;debug&amp;#039;] =  mw.dumpObject(tempArgs) &lt;br /&gt;
		    info.parameterCategory = info.parameterCategory .. &amp;quot;[[Category:Automatic taxobox with unsupported parameters]]&amp;quot;&lt;br /&gt;
		end	&lt;br /&gt;
&lt;br /&gt;
   else -- checklist for valid parameters not available for this option&lt;br /&gt;
	    for k,v in pairs(tempArgs) do&lt;br /&gt;
	    	templateArgs[k] = v&lt;br /&gt;
        end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    --DISABLE the parameter checking is currently being call from the template (this is temporary)&lt;br /&gt;
    -- this function checks for bad combinations (e.g. genus without species)&lt;br /&gt;
    --info.parameterCategory = p._checkParameters(frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------- CATEGORY FUNCTIONS --------------------------------&lt;br /&gt;
-- function for external invoke&lt;br /&gt;
function p.checkParameters(frame)&lt;br /&gt;
    p.getArgs(frame) -- populates templateArgs[] with parameters, after alias checking and validation of supported parameters&lt;br /&gt;
                     -- then calls p._checkParameters for addition parameter checking &lt;br /&gt;
    &lt;br /&gt;
    return info.parameterCategory -- return tracking categories&lt;br /&gt;
end&lt;br /&gt;
-- function that checks for extraneous parameters&lt;br /&gt;
function p._checkParameters(tempArgs)&lt;br /&gt;
    &lt;br /&gt;
    local categoryString = &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    -- (1) check for speciesbox with taxon and (genus or species)&lt;br /&gt;
    if info.auto == &amp;quot;speciesbox&amp;quot; then&lt;br /&gt;
	    if templateArgs[&amp;#039;taxon&amp;#039;] and (templateArgs[&amp;#039;genus&amp;#039;] or templateArgs[&amp;#039;species&amp;#039;]) then&lt;br /&gt;
	    	categoryString = categoryString .. &amp;quot;[[Category:Speciesboxes using taxon with genus or species parameters]]&amp;quot;&lt;br /&gt;
	    end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- (2) check for manual taxobox parameters&lt;br /&gt;
	for k,v in pairs(paramData.taxonRanks) do --run through manual taxobox parameter list&lt;br /&gt;
		&lt;br /&gt;
		if v == &amp;#039;genus&amp;#039; then break end -- don&amp;#039;t check at genus and below&lt;br /&gt;
		&lt;br /&gt;
		if tempArgs[v] then -- use tempArgs as these won&amp;#039;t have been validated (produces redundant category?)&lt;br /&gt;
		   	categoryString = categoryString .. &amp;quot;[[Category:Automatic taxoboxes using manual rank parameters]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local orphan = false&lt;br /&gt;
	local dependentParams = { &lt;br /&gt;
		image_caption =  &amp;#039;image&amp;#039;,   image_alt = &amp;#039;image&amp;#039;,   image_upright = &amp;#039;image&amp;#039;, image_width = &amp;#039;image&amp;#039;,&lt;br /&gt;
		image2_caption =  &amp;#039;image2&amp;#039;, image2_alt = &amp;#039;image2&amp;#039;, image2_upright = &amp;#039;image2&amp;#039;, image2_width = &amp;#039;image2&amp;#039;,&lt;br /&gt;
		range_map_caption = &amp;#039;range_map&amp;#039;, range_map_alt = &amp;#039;range_map&amp;#039;,   range_map_upright = &amp;#039;range_map&amp;#039;, range_map_width = &amp;#039;range_map&amp;#039;,&lt;br /&gt;
		range_map2_caption = &amp;#039;range_map2&amp;#039;, range_map2_alt = &amp;#039;range_map2&amp;#039;,   range_map2_upright = &amp;#039;range_map2&amp;#039;, range_map2_width = &amp;#039;range_map2&amp;#039;,&lt;br /&gt;
		range_map3_caption = &amp;#039;range_map3&amp;#039;, range_map3_alt = &amp;#039;range_map3&amp;#039;,   range_map3_upright = &amp;#039;range_map3&amp;#039;, range_map3_width = &amp;#039;range_map3&amp;#039;,&lt;br /&gt;
		range_map4_caption = &amp;#039;range_map4&amp;#039;, range_map4_alt = &amp;#039;range_map4&amp;#039;,   range_map4_upright = &amp;#039;range_map4&amp;#039;, range_map4_width = &amp;#039;range_map4&amp;#039;,&lt;br /&gt;
	}&lt;br /&gt;
	for k,v in pairs(dependentParams) do&lt;br /&gt;
	    if templateArgs[k] and not templateArgs[v] then orphan = true end&lt;br /&gt;
	    --templateArgs[k] = nil -- delete orphaned variable&lt;br /&gt;
	end&lt;br /&gt;
	if orphan then &lt;br /&gt;
		categoryString = categoryString .. &amp;quot;[[Category:Automatic taxoboxes with orphaned dependent parameters]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- paraphyletic groups using manual taxonomy&lt;br /&gt;
	--categoryString = categoryString .. &amp;quot;[[Category:&amp;quot; .. mw.getCurrentFrame():getParent():getTitle()  ..&amp;quot;]]&amp;quot;&lt;br /&gt;
	if mw.getCurrentFrame():getParent():getTitle() == &amp;quot;Template:Paraphyletic group&amp;quot; then&lt;br /&gt;
		if info.auto ~= &amp;quot;yes&amp;quot; and info.auto ~= &amp;quot;virus&amp;quot; and info.auto ~= &amp;quot;virusbox&amp;quot; and info.auto ~= &amp;quot;hybridbox&amp;quot;&lt;br /&gt;
		       and info.auto ~= &amp;quot;speciesbox&amp;quot; and info.auto ~= &amp;quot;subspeciesbox&amp;quot; and info.auto ~= &amp;quot;infraspeciesbox&amp;quot; then&lt;br /&gt;
			categoryString = categoryString .. &amp;quot;[[Category:Paraphyletic group infoboxes with manual taxonomy]]&amp;quot; &lt;br /&gt;
		end&lt;br /&gt;
		--categoryString = categoryString .. &amp;quot;[[Category:Paraphyletic group infoboxes]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- add to category list&lt;br /&gt;
	info.parameterCategory = info.parameterCategory .. categoryString&lt;br /&gt;
	&lt;br /&gt;
	--return  categoryString&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>&gt;MusikBot II</name></author>
	</entry>
</feed>