<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="vi">
	<id>https://bktt.vn/index.php?action=history&amp;feed=atom&amp;title=M%C3%B4_%C4%91un%3ABiota_infobox</id>
	<title>Mô đun:Biota infobox - Lịch sử thay đổi</title>
	<link rel="self" type="application/atom+xml" href="https://bktt.vn/index.php?action=history&amp;feed=atom&amp;title=M%C3%B4_%C4%91un%3ABiota_infobox"/>
	<link rel="alternate" type="text/html" href="https://bktt.vn/index.php?title=M%C3%B4_%C4%91un:Biota_infobox&amp;action=history"/>
	<updated>2026-06-03T02:25:39Z</updated>
	<subtitle>Lịch sử thay đổi của trang này ở wiki</subtitle>
	<generator>MediaWiki 1.35.0</generator>
	<entry>
		<id>https://bktt.vn/index.php?title=M%C3%B4_%C4%91un:Biota_infobox&amp;diff=9166&amp;oldid=prev</id>
		<title>Tttrung: Tạo trang mới với nội dung “require('Module:No globals') local p = {}  -- exposed variables local g = {}  -- these are variables with global scope in this module  local info = {}…”</title>
		<link rel="alternate" type="text/html" href="https://bktt.vn/index.php?title=M%C3%B4_%C4%91un:Biota_infobox&amp;diff=9166&amp;oldid=prev"/>
		<updated>2020-11-23T02:07:04Z</updated>

		<summary type="html">&lt;p&gt;Tạo trang mới với nội dung “require(&amp;#039;Module:No globals&amp;#039;) local p = {}  -- exposed variables local g = {}  -- these are variables with global scope in this module  local info = {}…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Trang mới&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require('Module:No globals')&lt;br /&gt;
local p = {}  -- exposed variables&lt;br /&gt;
local g = {}  -- these are variables with global scope in this module&lt;br /&gt;
&lt;br /&gt;
local info = {}          -- contains general purpose information (e.g. header background colour)&lt;br /&gt;
info.debug  = false -- ONLY SET THIS WHILE TESTING&lt;br /&gt;
&lt;br /&gt;
local parameters = require( 'Module:Biota infobox/param' ) &lt;br /&gt;
local core = require( 'Module:Biota infobox/core' ) &lt;br /&gt;
&lt;br /&gt;
-- ######################### PARAMETER HANDLING ############################&lt;br /&gt;
&lt;br /&gt;
local templateArgs = {}  -- contains preprocessed arguments from calling template&lt;br /&gt;
                          --TODO use info.args instead of templateArgs?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ########################### MAIN AND OTHER ENTRY FUNCTIONS ##################################&lt;br /&gt;
&lt;br /&gt;
--[[ main function callable in Wikipedia via the #invoke command.&lt;br /&gt;
        creates a taxobox-style infobox&lt;br /&gt;
        handles preliminary parameter handling enulating taxobox and automatic taxobox templates&lt;br /&gt;
           -- the parameters are also checked for content, alias, valid names and valid combinations&lt;br /&gt;
           -- the parameter handling is in subpage Module:Sandbox/Jts1882/Biota Infobox/param&lt;br /&gt;
        these are passed the core function&lt;br /&gt;
           -- the core function emulates the template {{Taxobox/core})&lt;br /&gt;
           -- the function is found in subpage Module:Sandbox/Jts1882/Biota Infobox/core&lt;br /&gt;
           -- the core them creates the taxobox&lt;br /&gt;
                 creates main table and header section (with header, subheader and fossil ranges)&lt;br /&gt;
	             adds addition rows for template arguments with following subsidiary functions:&lt;br /&gt;
			        p.addImageSection() - images and range maps &lt;br /&gt;
			        p.addStatusSection() - conservation status&lt;br /&gt;
			        p.addTaxonomySection() - listing of taxonomic heirarchy (manuel or using automatic taxonomy system)&lt;br /&gt;
			        p.addTaxonSection() - adds section with taxonomic information (binomial or trinomials; type genus or species; diversity)&lt;br /&gt;
			        p.addListSection()     - section containing list if subdivisions, synonyms, included or excluded groups&lt;br /&gt;
--]]&lt;br /&gt;
p.main = function(frame) &lt;br /&gt;
	&lt;br /&gt;
	--p.getArgs(frame)&lt;br /&gt;
	parameters.getArgs(frame, templateArgs, info)  -- gets arguments, checks for value, aliases, and against valid parameter list&lt;br /&gt;
&lt;br /&gt;
	if info.auto then&lt;br /&gt;
		p.AutomaticTaxoboxOptions(frame) -- this emulates the automatic taxobox templates that feed the core&lt;br /&gt;
	else&lt;br /&gt;
		--[[TODO manual taxobox options:&lt;br /&gt;
		            name or use Template:Taxonomy name |genus|species|binomial name&lt;br /&gt;
		            colour = p.getTaxoboxColor(frame)&lt;br /&gt;
		]]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--return p._core(frame)&lt;br /&gt;
	return core.core(frame, templateArgs, info)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- this functions emulates Template:automatic taxobox and uses Template:Taxobox/core&lt;br /&gt;
p.auto = function(frame) &lt;br /&gt;
	--info.auto = frame.args.auto or &amp;quot;automatictaxobox&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	p.getArgs(frame)  -- gets arguments, checks for value, aliases, and against valid parameter list&lt;br /&gt;
&lt;br /&gt;
	if info.auto then&lt;br /&gt;
		p.AutomaticTaxoboxOptions(frame) -- this emulates the automatic taxobox templates that feed the core&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- additional parameters needed by Template:Taxobox/core&lt;br /&gt;
	templateArgs['edit link']=&amp;quot;edit taxonomy&amp;quot;&lt;br /&gt;
	templateArgs['colour'] = p.getTaxoboxColor(frame)&lt;br /&gt;
    templateArgs['upright'] = templateArgs['image_upright'] or 1   &lt;br /&gt;
    templateArgs['upright2'] = templateArgs['image2_upright'] or 1&lt;br /&gt;
    &lt;br /&gt;
    -- use Template:Taxobox/core&lt;br /&gt;
 	return tostring(frame:expandTemplate{ title = 'taxobox/core',  args = templateArgs   } ) &lt;br /&gt;
 	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ ##################### CORE FUNCTIONS ###################################&lt;br /&gt;
&lt;br /&gt;
       this core function emulates Template:Taxobox/core &lt;br /&gt;
       it is followed by functions handling the different type of entry&lt;br /&gt;
       MOVED to subpage Module:Sandbox/Jts1882/Biota_Infobox/core&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ################## AUTOMATIC TAXOBOX SYSTEM HANDLING ################################&lt;br /&gt;
------------------------------------------------------------------------------------------------&lt;br /&gt;
-- handle specific requirements of different options: auto, speciesbox etc&lt;br /&gt;
function p.AutomaticTaxoboxOptions(frame)&lt;br /&gt;
  &lt;br /&gt;
    --TODO replace genus with first word (genus) to strip parenthetic term&lt;br /&gt;
    -- done in speciesbox?&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    templateArgs['display_taxa']  = templateArgs['display_parents'] or 1  -- note change of parameter name &lt;br /&gt;
   &lt;br /&gt;
    local extinct = &amp;quot;&amp;quot;&lt;br /&gt;
 	if  templateArgs['extinct']  then &lt;br /&gt;
		--extinct = &amp;quot;†&amp;quot;&lt;br /&gt;
		extinct = frame:expandTemplate{ title = 'extinct' }  -- use template to get tooltip&lt;br /&gt;
		-- speciesbox also checks the genus taxonomy template for extinct parameter&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ---------------------variables for SPECIESBOX, SUBSPECIESBOX and INFRASPECIESBOX---------------------&lt;br /&gt;
   	if info.auto == &amp;quot;hybridbox&amp;quot; then&lt;br /&gt;
   		&lt;br /&gt;
   		--templateArgs['parent'] = templateArgs['parent'] or templateArgs['genus'] or templateArgs['genus1']&lt;br /&gt;
   		&lt;br /&gt;
   		local species1 = templateArgs['species'] or templateArgs['species1'] or templateArgs['father'] or templateArgs['father_species'] or &amp;quot;&amp;quot;&lt;br /&gt;
   		local species2 = templateArgs['species2'] or templateArgs['mother'] or templateArgs['mother_species'] or templateArgs['species'] or &amp;quot;&amp;quot;&lt;br /&gt;
   		local genus1   = templateArgs['genus'] or templateArgs['genus1']  or templateArgs['father_genus']    -- TODO use page&lt;br /&gt;
   		local genus2   = templateArgs['genus2'] or templateArgs['mother_genus']   or templateArgs['genus']&lt;br /&gt;
        local species3 = templateArgs['species3'] or &amp;quot;&amp;quot;&lt;br /&gt;
        local genus3   = templateArgs['genus3'] or templateArgs['genus'] or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        local subspecies1, subspecies2, subspecies3 = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
        --if (templateArgs['subspecies1'] and templateArgs['subspecies2'])&lt;br /&gt;
        if templateArgs['subspecies1'] or templateArgs['subspecies2'] &lt;br /&gt;
           or (templateArgs['father_subspecies'] and templateArgs['mother_subspecies']) then&lt;br /&gt;
        	subspecies1 = &amp;quot; &amp;quot; .. ((templateArgs['subspecies1'] or templateArgs['father_subspecies']) or &amp;quot;&amp;quot;)&lt;br /&gt;
        	subspecies2 = &amp;quot; &amp;quot; .. ((templateArgs['subspecies2'] or templateArgs['mother_subspecies']) or &amp;quot;&amp;quot;)&lt;br /&gt;
        	if templateArgs['subspecies3'] then&lt;br /&gt;
        		subspecies3 = &amp;quot; &amp;quot; .. templateArgs['subspecies3']&lt;br /&gt;
        		species3 = species1&lt;br /&gt;
        	end&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
   		local link1    = templateArgs['link1'] or templateArgs['father_link'] or (genus1 .. &amp;quot; &amp;quot; .. species1 .. subspecies1)&lt;br /&gt;
   		local link2    = templateArgs['link2'] or templateArgs['mother_link'] or (genus2 .. &amp;quot; &amp;quot; .. species2 .. subspecies2)&lt;br /&gt;
        local link3    = templateArgs['link3'] or (genus3 .. &amp;quot; &amp;quot; .. species3 .. subspecies3) &lt;br /&gt;
&lt;br /&gt;
   		if not templateArgs['parent'] then templateArgs['parent'] =  genus1 end&lt;br /&gt;
   		&lt;br /&gt;
        &lt;br /&gt;
        --TODO disambiguate genus pages -- not needed unless using page name&lt;br /&gt;
   		--genus1 = frame:expandTemplate{ title = 'Speciesbox/getGenus' , args = {&amp;quot;&amp;quot;, genus1 } }&lt;br /&gt;
   	    --	genus2 = frame:expandTemplate{ title = 'Speciesbox/getGenus' , args = {&amp;quot;&amp;quot;, genus2 } }&lt;br /&gt;
   		&lt;br /&gt;
   		if not templateArgs['genus2'] and not templateArgs['father_genus'] then &lt;br /&gt;
   			genus1 = string.sub(genus1,1,1) .. &amp;quot;.&amp;quot;   -- shorten generic names for intrageneric hybrids&lt;br /&gt;
   			genus2 = string.sub(genus2,1,1) .. &amp;quot;.&amp;quot;&lt;br /&gt;
   			genus3 = string.sub(genus3,1,1) .. &amp;quot;.&amp;quot;&lt;br /&gt;
   		end&lt;br /&gt;
   		&lt;br /&gt;
   		-- shorten species name if subspecies of same species&lt;br /&gt;
   		if subspecies1 ~= &amp;quot;&amp;quot; and not templateArgs['species2']  then&lt;br /&gt;
   			species1 = string.sub(species1,1,1) .. &amp;quot;.&amp;quot;   -- shorten specific epithet for intraspecific hybrids&lt;br /&gt;
   			species2 = string.sub(species2,1,1) .. &amp;quot;.&amp;quot;&lt;br /&gt;
   			if subspecies3 ~= &amp;quot;&amp;quot; then species3 = string.sub(species3,1,1) .. &amp;quot;.&amp;quot; end&lt;br /&gt;
   		end&lt;br /&gt;
&lt;br /&gt;
   		local maleSymbol, femaleSymbol = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
   		if templateArgs['father'] or templateArgs['father_genus'] or templateArgs['father_species'] or templateArgs['father_subspecies'] then maleSymbol = &amp;quot;♂&amp;quot; end&lt;br /&gt;
   		if templateArgs['mother'] or templateArgs['mother_genus'] or templateArgs['mother_species'] or templateArgs['mother_subspecies'] then femaleSymbol = &amp;quot;♀&amp;quot; end&lt;br /&gt;
   		&lt;br /&gt;
   		templateArgs['hybrid'] = &amp;quot;'''''[[&amp;quot; .. link1 .. &amp;quot;|&amp;quot; .. genus1 .. &amp;quot; &amp;quot; .. species1 .. subspecies1 ..&amp;quot;]]'''''&amp;quot; .. maleSymbol &lt;br /&gt;
   		                       .. &amp;quot; × &amp;quot;&lt;br /&gt;
   		                       .. &amp;quot;'''''[[&amp;quot; .. link2 .. &amp;quot;|&amp;quot; .. genus2 .. &amp;quot; &amp;quot; .. species2 .. subspecies2 .. &amp;quot;]]'''''&amp;quot; .. femaleSymbol&lt;br /&gt;
&lt;br /&gt;
   		if species3 ~= &amp;quot;&amp;quot; then&lt;br /&gt;
   			templateArgs['hybrid'] = templateArgs['hybrid']   .. &amp;quot; × &amp;quot;&lt;br /&gt;
   		                       .. &amp;quot;'''''[[&amp;quot; .. link3 .. &amp;quot;|&amp;quot; .. genus3 .. &amp;quot; &amp;quot; .. species3  .. subspecies3 .. &amp;quot;]]'''''&amp;quot; &lt;br /&gt;
   		end&lt;br /&gt;
        &lt;br /&gt;
     	--templateArgs['hybrid species'] = templateArgs['hybrid']&lt;br /&gt;
     	if subspecies1 ~= &amp;quot;&amp;quot; and not templateArgs['species2'] then&lt;br /&gt;
     	     templateArgs['species'] = &amp;quot;''[[&amp;quot; .. templateArgs['genus'] .. &amp;quot; &amp;quot; .. templateArgs['species'] .. &amp;quot;|&amp;quot;&lt;br /&gt;
     	                                .. genus1 .. &amp;quot; &amp;quot; .. templateArgs['species'] .. &amp;quot;]]''&amp;quot; &lt;br /&gt;
     	else templateArgs['species'] = nil&lt;br /&gt;
     	end&lt;br /&gt;
     	templateArgs['offset'] = 1&lt;br /&gt;
	    &lt;br /&gt;
    -- ======================= setup for SPECIESBOX =============================&lt;br /&gt;
	&lt;br /&gt;
	elseif info.auto == &amp;quot;speciesbox&amp;quot; then&lt;br /&gt;
        &lt;br /&gt;
        --[[ {{speciesbox}} gets genus and species from taxon, genus+species or page name&lt;br /&gt;
                1. uses 'taxon' paramter ( given as binomial) if available&lt;br /&gt;
                2. otherwise uses 'genus' and 'species' parameters&lt;br /&gt;
                3. uses page name&lt;br /&gt;
             the genus is used for the 'parent' taxon &lt;br /&gt;
            	unless the parent is supplied (e.g. for subgenus)&lt;br /&gt;
            	else use genus (from taxon or genus parameter or page name)&lt;br /&gt;
            	&lt;br /&gt;
           {{Speciesbox}} now using {{Speciesbox/getGenus}} and  {Speciesbox/getSpecies}}&lt;br /&gt;
                code doing similar is commented out below&lt;br /&gt;
           &lt;br /&gt;
           TODO use {{{{Speciesbox/name}}&lt;br /&gt;
        --]]&lt;br /&gt;
       local genus, species = &amp;quot;&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;
       &lt;br /&gt;
       genus = frame:expandTemplate{ title = 'Speciesbox/getGenus' , args = {templateArgs['taxon'], templateArgs['genus']} }&lt;br /&gt;
       species = frame:expandTemplate{ title = 'Speciesbox/getSpecies' , args = {templateArgs['taxon'], templateArgs['genus']} }&lt;br /&gt;
       &lt;br /&gt;
		if templateArgs['taxon'] then&lt;br /&gt;
           &lt;br /&gt;
           -- following line disableas using getGenus/getSpecies templates	       &lt;br /&gt;
           -- genus, species = string.match(templateArgs['taxon'], &amp;quot;(%S+)%s(%S+)&amp;quot;) -- %S: All characters not in %s&lt;br /&gt;
	       &lt;br /&gt;
	       templateArgs['genus'] = genus                 &lt;br /&gt;
	       templateArgs['species'] = species            &lt;br /&gt;
	   &lt;br /&gt;
	    elseif templateArgs['genus'] and templateArgs['species'] then&lt;br /&gt;
	    	&lt;br /&gt;
	    	--[[strip off (disambiguator) to handle multi-kingdom genus e.g.| genus = Acanthocarpus (plant)&lt;br /&gt;
	    	local genusParts =mw.text.split( templateArgs['genus'], &amp;quot; &amp;quot;, true )     -- string.match( s, '^%a*'', 1 )&lt;br /&gt;
	    	                                    &lt;br /&gt;
	    	if genusParts[1] ~= &amp;quot;&amp;quot; then &lt;br /&gt;
	    		--templateArgs['parent']=templateArgs['genus']  -- set parent (NO, parent should override)&lt;br /&gt;
	    		genus = genusParts[1] &lt;br /&gt;
	    	end&lt;br /&gt;
	    	now handled by getGenus/getSpecies templates --]]&lt;br /&gt;
	    	&lt;br /&gt;
	    	templateArgs['taxon'] = genus .. ' ' .. templateArgs['species']&lt;br /&gt;
	&lt;br /&gt;
	    else&lt;br /&gt;
	    	-- TODO no valid taxon yet; use page name&lt;br /&gt;
	    	-- use first word of pagename - handled by {{Speciesbox/getGenus}}&lt;br /&gt;
	    end&lt;br /&gt;
    &lt;br /&gt;
        if not templateArgs['parent'] or templateArgs['parent'] == &amp;quot;&amp;quot; then&lt;br /&gt;
        	templateArgs['parent'] = templateArgs['genus']       -- set parent to genus if not supplied&lt;br /&gt;
        end&lt;br /&gt;
        --[[if not templateArgs['name'] or templateArgs['name'] == &amp;quot;&amp;quot; then -- if page name not set&lt;br /&gt;
        	templateArgs['name'] = &amp;quot;''&amp;quot; .. templateArgs['taxon'] .. &amp;quot;''&amp;quot;&lt;br /&gt;
        end    ]]    	&lt;br /&gt;
        --TODO use {{Speciesbox/name}}&lt;br /&gt;
        templateArgs['name']  = frame:expandTemplate{ title = 'Speciesbox/name' , &lt;br /&gt;
        	                           args = { templateArgs['name'], templateArgs['taxon'], &lt;br /&gt;
        	                                    templateArgs['genus'], templateArgs['species'],&lt;br /&gt;
        	                                    mw.title.getCurrentTitle().baseText,&lt;br /&gt;
        	                                    templateArgs['italic_title' or 'yes']  &lt;br /&gt;
        	          	&lt;br /&gt;
        	          } }&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
		-- set binomial : the speciesbox template seems to use genus and species before taxon name&lt;br /&gt;
		-- &amp;quot;| binomial = ''{{Str letter/trim|{{{genus|{{{taxon|&amp;lt;includeonly&amp;gt;{{PAGENAME}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;Acacia&amp;lt;/noinclude&amp;gt;}}}}}}}} {{{species|{{remove first word|{{{taxon|&amp;lt;includeonly&amp;gt;{{PAGENAMEBASE}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;Acacia aemula&amp;lt;/noinclude&amp;gt;}}}}}}}}''&amp;quot;&lt;br /&gt;
		-- documentation suggest taxon, which is followed here&lt;br /&gt;
		templateArgs['binomial'] = &amp;quot;''&amp;quot; .. templateArgs['taxon'] .. &amp;quot;''&amp;quot;&lt;br /&gt;
		templateArgs['binomial_authority'] = templateArgs['authority'] or nil&lt;br /&gt;
				&lt;br /&gt;
&lt;br /&gt;
    	-- set species_name e.g. Panthera leo -&amp;gt; P. leo&lt;br /&gt;
    	templateArgs['species_name'] = extinct .. &amp;quot;'''''&amp;quot; .. string.sub(templateArgs['genus'],1,1) .. '. ' .. templateArgs['species'] .. &amp;quot;'''''&amp;quot;&lt;br /&gt;
        templateArgs['species']=templateArgs['species_name']&lt;br /&gt;
        &lt;br /&gt;
        templateArgs['display_taxa']   = templateArgs['display_taxa'] -1&lt;br /&gt;
        templateArgs['offset'] = 1&lt;br /&gt;
	    if templateArgs['subgenus'] and templateArgs['subgenus'] ~= &amp;quot;&amp;quot;  then&lt;br /&gt;
	    	templateArgs['offset'] =  templateArgs['offset'] + 1&lt;br /&gt;
			templateArgs['subgenus_authority']              = templateArgs['parent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
    	end&lt;br /&gt;
	    --templateArgs['species_authority']   = templateArgs['authority'] or &amp;quot;&amp;quot; -- don't show species_authority as duplicates binomial authority&lt;br /&gt;
	    &lt;br /&gt;
	    &lt;br /&gt;
	    --[[shift authorities for speciesbox (two steps if subgenus set)&lt;br /&gt;
	    if templateArgs['subgenus'] and templateArgs['subgenus'] ~= &amp;quot;&amp;quot;  then&lt;br /&gt;
			templateArgs['subgenus_authority']              = templateArgs['parent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['authority']                       = templateArgs['grandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['parent_authority']                = templateArgs['greatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['grandparent_authority']           = templateArgs['greatgreatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['greatgrandparent_authority']      = templateArgs['greatgreatgreatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['greatgreatgrandparent_authority'] = templateArgs['greatgreatgreatgreatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
		else                                                                &lt;br /&gt;
			-- note: must set to &amp;quot;&amp;quot; if 'parent_authority's don't exist, otherwise the value of 'authority' is unchanged&lt;br /&gt;
			templateArgs['authority']                       = templateArgs['parent_authority'] or &amp;quot;&amp;quot;  &lt;br /&gt;
			templateArgs['parent_authority']                = templateArgs['grandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['grandparent_authority']           = templateArgs['greatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['greatgrandparent_authority']      = templateArgs['greatgreatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['greatgreatgrandparent_authority'] = templateArgs['greatgreatgreatgrandparent_authority'] or &amp;quot;&amp;quot;	&lt;br /&gt;
		end&lt;br /&gt;
        ]]&lt;br /&gt;
        templateArgs['taxon'] = nil -- For auto module&lt;br /&gt;
 &lt;br /&gt;
        &lt;br /&gt;
    -- =====================  set-up for SUBSPECIESBOX or INTRASPECIESBOX =================&lt;br /&gt;
	&lt;br /&gt;
	elseif info.auto == &amp;quot;subspeciesbox&amp;quot; or info.auto == &amp;quot;infraspeciesbox&amp;quot; then&lt;br /&gt;
	&lt;br /&gt;
	   --[[ From template description:&lt;br /&gt;
	          &amp;quot;The genus name, species name and subspecies name&amp;quot; &lt;br /&gt;
	             [or &amp;quot;genus name, specific epithet and infraspecific epithet&amp;quot;] &lt;br /&gt;
                 &amp;quot;&lt;br /&gt;
                 must be supplied separately: the combined taxon parameter cannot be used.&amp;quot;&amp;quot;&lt;br /&gt;
              &amp;quot;The genus name is then the entry into the taxonomic hierarchy.&amp;quot;&amp;quot;&lt;br /&gt;
              &lt;br /&gt;
		    The trinomial name is set from these parameters and the parameter ignored.&lt;br /&gt;
		   --NOTE no infraspeciebox is currently using trinomial parameter&lt;br /&gt;
        --]]&lt;br /&gt;
        &lt;br /&gt;
        -- Parameter checking. This could be here or moved to parameter checking function&lt;br /&gt;
        if templateArgs['genus'] and templateArgs['species'] and templateArgs['subspecies'] then&lt;br /&gt;
        	-- valid parameters for subspecies (may have variety as well)&lt;br /&gt;
        elseif templateArgs['genus'] and templateArgs['species'] and templateArgs['variety'] then&lt;br /&gt;
        	-- valid parameters for infraspecies (variety without subspecies)&lt;br /&gt;
        else&lt;br /&gt;
        	-- insufficient parameters&lt;br /&gt;
        	-- TODO add error message and return&lt;br /&gt;
        end&lt;br /&gt;
        local offset = 2  -- authority offset when subpecies OR variety &lt;br /&gt;
        &lt;br /&gt;
        --TODO strip genus of disambiguator (need to check this works)&lt;br /&gt;
        	local genus =mw.text.split( templateArgs['genus'], &amp;quot; &amp;quot;, true )&lt;br /&gt;
	    	if genus[1] ~= &amp;quot;&amp;quot; then &lt;br /&gt;
	    		templateArgs['genus'] = genus[1] &lt;br /&gt;
	    	end&lt;br /&gt;
        templateArgs['parent'] = templateArgs['genus'] -- genus must be supplied&lt;br /&gt;
        &lt;br /&gt;
        local fullName = templateArgs['genus'] .. ' ' .. templateArgs['species']&lt;br /&gt;
 		templateArgs['species_name'] = &amp;quot;''[[&amp;quot; .. fullName  .. '|'.. string.sub(templateArgs['genus'],1,1) .. '. ' .. templateArgs['species'] .. &amp;quot;]]''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        -- if subspecies is set (could be with or without variety)&lt;br /&gt;
        local separator = &amp;quot; &amp;quot;                               -- subspecies separator (default zoological)&lt;br /&gt;
	    if templateArgs['subspecies'] then                  -- might not be if variety&lt;br /&gt;
        	if info.auto == &amp;quot;infraspeciesbox&amp;quot;   then separator = &amp;quot; ''&amp;lt;small&amp;gt;subsp.&amp;lt;/small&amp;gt;'' &amp;quot;   end&lt;br /&gt;
			templateArgs['subspecies_name']= extinct .. &amp;quot;'''''&amp;quot; .. string.sub(templateArgs['genus'],1,1) .. '.&amp;amp;nbsp;' .. string.sub(templateArgs['species'],1,1) .. '.' .. separator .. templateArgs['subspecies'] .. &amp;quot;'''''&amp;quot;&lt;br /&gt;
  			fullName = templateArgs['genus'] .. ' ' .. templateArgs['species'] .. separator .. templateArgs['subspecies'] &lt;br /&gt;
			templateArgs['trinomial'] = &amp;quot;''&amp;quot; .. fullName .. &amp;quot;''&amp;quot;&lt;br /&gt;
            --templateArgs['subspecies_authority'] = templateArgs['authority']  -- replicates authoity in trinomial (unwanted?)&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        if templateArgs['variety'] or templateArgs['varietas'] then  -- should now be aliased&lt;br /&gt;
            local vSeparator = &amp;quot; ''&amp;lt;small&amp;gt;var.&amp;lt;/small&amp;gt;'' &amp;quot; &lt;br /&gt;
            --alias done? templateArgs['variety']= templateArgs['variety'] or templateArgs['varietas'] -- will use variety as parameter TODO alias this&lt;br /&gt;
			templateArgs['variety_name'] = extinct .. &amp;quot;'''''&amp;quot; .. string.sub(templateArgs['genus'],1,1) .. '.&amp;amp;nbsp;' .. string.sub(templateArgs['species'],1,1) .. '.' .. vSeparator .. templateArgs['variety'] .. &amp;quot;'''''&amp;quot;&lt;br /&gt;
  			templateArgs['trinomial'] = &amp;quot;''&amp;quot; .. templateArgs['genus'] .. ' ' .. templateArgs['species'] .. vSeparator .. templateArgs['variety'] .. &amp;quot;''&amp;quot;&lt;br /&gt;
            --templateArgs['variety_authority'] = templateArgs['authority'] -- replicates authority in trinomial&lt;br /&gt;
    	    &lt;br /&gt;
    	    if templateArgs['subspecies'] then 	-- subspecies needs to linked instead of bold &lt;br /&gt;
	  			local redirectName = templateArgs['genus'] .. ' ' .. templateArgs['species'] .. &amp;quot; subsp. &amp;quot; .. templateArgs['subspecies'] &lt;br /&gt;
				local shortName = &amp;quot;''&amp;quot; .. string.sub(templateArgs['genus'],1,1) .. '.&amp;amp;nbsp;' .. string.sub(templateArgs['species'],1,1) .. '.' .. separator .. templateArgs['subspecies'] .. &amp;quot;''&amp;quot; &lt;br /&gt;
				templateArgs['subspecies_name'] =  &amp;quot;[[&amp;quot; .. redirectName .. '|' .. shortName .. &amp;quot;]]&amp;quot;&lt;br /&gt;
				offset = offset + 1 -- offset when susbpecies AND variety&lt;br /&gt;
                templateArgs['subspecies_authority'] = templateArgs['parent_authority']&lt;br /&gt;
        	end&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        --TODO what else do subspeciesbix and infraspeciesbox cover?)&lt;br /&gt;
&lt;br /&gt;
       --[[ code from templates&lt;br /&gt;
            both:            |trinomial_authority = {{{authority|{{{trinomial authority|{{{trinomial_authority|}}} }}} }}}&lt;br /&gt;
            infraspeciesbox: |species_authority = {{{parent_authority|{{{parent authority|{{{binomial authority|{{{binomial_authority|}}}}}}}}}}}}&lt;br /&gt;
            subspeciesbox: | species_authority = {{{parent authority|{{{binomial authority|{{{binomial_authority|}}}}}}}}}&lt;br /&gt;
              note: subspeciesbox doesn't recognise patent_authority with underscore&lt;br /&gt;
          monthly reports on subspeciesbox and infraspeciesbox&lt;br /&gt;
              no uses of parent_authority, binomial_authority or trinomial authority&lt;br /&gt;
              no uses of grandparent, greatgrandparent etc authorites&lt;br /&gt;
        ]]&lt;br /&gt;
 		templateArgs['trinomial_authority'] = templateArgs['authority'] or nil&lt;br /&gt;
&lt;br /&gt;
        if not templateArgs['name'] or templateArgs['name'] == &amp;quot;&amp;quot; then -- if page name not set&lt;br /&gt;
        	templateArgs['name'] = templateArgs['trinomial']&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        -- these are used by manual taxobox to complete the taxonomy table&lt;br /&gt;
        templateArgs['species'] = templateArgs['species_name']&lt;br /&gt;
        templateArgs['subspecies'] = templateArgs['subspecies_name']&lt;br /&gt;
		templateArgs['variety'] =templateArgs['variety_name']&lt;br /&gt;
        &lt;br /&gt;
        --QUESTION what happens to parent taxa when subspecies and variety? &lt;br /&gt;
        -- set species and subgenus authorities&lt;br /&gt;
	    if templateArgs['subgenus'] then &lt;br /&gt;
	    	offset = offset + 1&lt;br /&gt;
		    if offset == 4  then    -- when subgenus, species, subspecies and variety&lt;br /&gt;
		    	templateArgs['subgenus_authority']  = templateArgs['subgenus_authority'] or templateArgs['greatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
		    	templateArgs['species_authority']   = templateArgs['grandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
	        elseif offset == 3  then -- when subgenus, species, (subspecies OR variety)&lt;br /&gt;
		    	templateArgs['subgenus_authority']  = 	templateArgs['subgenus_authority'] or templateArgs['grandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
		    	templateArgs['species_authority']   = templateArgs['parent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
		    end&lt;br /&gt;
		else -- only need to set species authority or subspecues (if also variety)&lt;br /&gt;
		    if offset == 3 then    -- species, subspecies and variety&lt;br /&gt;
		    	templateArgs['species_authority']   = templateArgs['grandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
		    	templateArgs['subspecies_authority']   = templateArgs['parent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
		    elseif offset == 2 then  -- species, (subspecies or variety)&lt;br /&gt;
		        templateArgs['species_authority']   = templateArgs['parent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
		    end	    &lt;br /&gt;
		end&lt;br /&gt;
       &lt;br /&gt;
        templateArgs['display_taxa']   = (templateArgs['display_taxa'] or 1) -2&lt;br /&gt;
        templateArgs['offset'] = offset&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	    -- need to set subgenus_authority, species_authority, subspecies_authority and variety_authority&lt;br /&gt;
        &lt;br /&gt;
	    --[[shift authorities for subspeciesbox (two steps or three if subgenus set)&lt;br /&gt;
	    if templateArgs['subgenus'] and templateArgs['subgenus'] ~= &amp;quot;&amp;quot;  then&lt;br /&gt;
			templateArgs['subgenus_authority']              = templateArgs['grandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['authority']                       = templateArgs['greatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['parent_authority']                = templateArgs['greatgreatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['grandparent_authority']           = templateArgs['greatgreatgreatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['greatgrandparent_authority']      = templateArgs['greatgreatgreatgreatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['greatgreatgrandparent_authority'] = templateArgs['greatgreatgreatgreatgreatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			templateArgs['authority']                       = templateArgs['grandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['parent_authority']                = templateArgs['greatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['grandparent_authority']           = templateArgs['greatgreatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['greatgrandparent_authority']      = templateArgs['greatgreatgreatgrandparent_authority'] or &amp;quot;&amp;quot;&lt;br /&gt;
			templateArgs['greatgreatgrandparent_authority'] = templateArgs['greatgreatgreatgreatgrandparent_authority']	 or &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		]]&lt;br /&gt;
	&lt;br /&gt;
	-- ========================= setup for AUTOMATIC TAXOBOX ================================&lt;br /&gt;
	        -- CHECK authomatic taxobox pagename overrides taxon (e.g. Tortrix? destructus) for header&lt;br /&gt;
        --         it does but no italics in header for Tortrix? destructus&lt;br /&gt;
&lt;br /&gt;
    --elseif info.auto == &amp;quot;automatictaxobox&amp;quot; then&lt;br /&gt;
	&lt;br /&gt;
	elseif info.auto == &amp;quot;virus&amp;quot; or info.auto == &amp;quot;virusbox&amp;quot; then&lt;br /&gt;
			templateArgs['virus'] = &amp;quot;yes&amp;quot;&lt;br /&gt;
			templateArgs['color_as'] = &amp;quot;Virus&amp;quot;&lt;br /&gt;
			if not templateArgs['parent'] then&lt;br /&gt;
				if templateArgs['taxon'] then&lt;br /&gt;
			        templateArgs['parent'] = templateArgs['taxon']  &lt;br /&gt;
			    elseif templateArgs['species'] then &lt;br /&gt;
			    	templateArgs['parent'] = templateArgs['species'] &lt;br /&gt;
			    	templateArgs['species'] = nil&lt;br /&gt;
			    else&lt;br /&gt;
			    	templateArgs['parent'] = tostring( mw.title.getCurrentTitle()) or &amp;quot;&amp;quot;&lt;br /&gt;
			    end&lt;br /&gt;
			else&lt;br /&gt;
				templateArgs['link_parent'] = &amp;quot;yes&amp;quot;            -- if parent given, we want to link it&lt;br /&gt;
			end&lt;br /&gt;
		    &lt;br /&gt;
	else &lt;br /&gt;
&lt;br /&gt;
    	-- &amp;quot;the automated taxobox first looks for the taxonomy template that matches the supplied |taxon= parameter &amp;quot;&lt;br /&gt;
    	--       &amp;quot;(or, if none is supplied, the article's title, ignoring any parenthetical expressions). &amp;quot;&lt;br /&gt;
    	if not templateArgs['taxon'] or  templateArgs['taxon'] == &amp;quot;&amp;quot; then&lt;br /&gt;
    		--templateArgs['taxon'] = templateArgs['name'] or tostring( mw.title.getCurrentTitle())&lt;br /&gt;
    		templateArgs['taxon'] = tostring( mw.title.getCurrentTitle()) or &amp;quot;&amp;quot;&lt;br /&gt;
    		--TODO strip name of parenthetical terms off page title&lt;br /&gt;
    		if templateArgs['taxon'] ~= &amp;quot;&amp;quot; then&lt;br /&gt;
    			--TODO error message and exit&lt;br /&gt;
    		end&lt;br /&gt;
    	end		&lt;br /&gt;
    	if templateArgs['parent'] then&lt;br /&gt;
    		templateArgs['link_parent'] = &amp;quot;yes&amp;quot;              -- if parent given, we want to link it&lt;br /&gt;
    	else&lt;br /&gt;
  		   templateArgs['parent'] = templateArgs['taxon']   -- otherwise set parent&lt;br /&gt;
  		end&lt;br /&gt;
  		--TODO set name if parameter no supplies&lt;br /&gt;
  		&lt;br /&gt;
  		--[[ TODO if no taxonomy template, then call setup taxonomy template &lt;br /&gt;
  		   {{#ifexist:Template:Taxonomy/{{{taxon|&amp;lt;includeonly&amp;gt;{{PAGENAME}}&lt;br /&gt;
  		   {{Automatic taxobox/floating intro|taxon={{{taxon|{{PAGENAME}}}}} }}&lt;br /&gt;
  		]]&lt;br /&gt;
	&lt;br /&gt;
	end	-- end special handling for speciesbox, subspeciesbox, and automatic taxobox&lt;br /&gt;
	&lt;br /&gt;
	-- check taxonomy templates for automatic taxobox systtem&lt;br /&gt;
	--{{#ifexist:Template:Taxonomy/{{{taxon|&amp;lt;includeonly&amp;gt;{{PAGENAME}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;Acacia&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
	--       |&amp;lt;noinclude&amp;gt;&amp;lt;!--do nothing if it exists--&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
	--       |{{Automatic taxobox/floating intro|taxon={{{taxon|{{PAGENAME}}}}} }}&lt;br /&gt;
--&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------&lt;br /&gt;
function p.templateStyle( frame, src )&lt;br /&gt;
   return frame:extensionTag( 'templatestyles', '', { src = src } );&lt;br /&gt;
   &lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------&lt;br /&gt;
function p.testTables(frame)&lt;br /&gt;
	if 1==1 then return end  -- disable&lt;br /&gt;
	local root = mw.html.create('table'):addClass('wikitable')&lt;br /&gt;
&lt;br /&gt;
	local row = root:tag('tr')                -- add row using lua library&lt;br /&gt;
	local cell = row:tag('td')&lt;br /&gt;
	cell:wikitext('row A:')&lt;br /&gt;
	cell = row:tag('td'):wikitext('content A')  &lt;br /&gt;
&lt;br /&gt;
	row = root:tag('tr')                      -- add row using lua library &lt;br /&gt;
	cell = row:tag('td'):wikitext('row B:')&lt;br /&gt;
	cell = row:tag('td')&lt;br /&gt;
	          :wikitext('\n{|\n|-\n|P\n|Q\n|}') --but include a wikitxt table in one cell&lt;br /&gt;
	         -- :done()&lt;br /&gt;
&lt;br /&gt;
   -- row:done()&lt;br /&gt;
    --root=mw.html:allDone()&lt;br /&gt;
    root:wikitext('&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;a&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;b&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;') -- add row to root using html &lt;br /&gt;
    root:wikitext('\n|-\n|X\n|Y\n')              -- add row to root using wikitext (FAILS) &lt;br /&gt;
    &lt;br /&gt;
    root:wikitext('\r|-\r|I\r|J\r')              -- FAIL output |- |X |Y &lt;br /&gt;
	&lt;br /&gt;
	root:wikitext(frame:preprocess('\n|-\n|U\n|V\n')) -- FAIL output |- |U |V &lt;br /&gt;
	&lt;br /&gt;
	root:wikitext('&amp;lt;tr&amp;gt;\n|M\n|N\n&amp;lt;/tr&amp;gt;')    &lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	row=root:tag('tr'):node('&amp;lt;td&amp;gt;c&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;d&amp;lt;/td&amp;gt;')    -- adds row successfully&lt;br /&gt;
	row=root:tag('tr'):node('\n|Xc\n|Xd\n')    -- fails to adds row&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	row = root:tag('tr')                       -- add another row using lua library&lt;br /&gt;
	cell = row:tag('td'):wikitext('row C:')&lt;br /&gt;
	cell = row:tag('td'):wikitext('content C')&lt;br /&gt;
&lt;br /&gt;
	root:node('\n{|\n|-\n|Xx\n|Yx\n|}\n')    -- adds new table after&lt;br /&gt;
&lt;br /&gt;
	--frame:preprocess&lt;br /&gt;
	return 	 tostring(root)&lt;br /&gt;
&lt;br /&gt;
--[[ CONCLUSION: cannot mix wikitext freely in the node structure&lt;br /&gt;
           A complete wikitext table can be included in a cell (e.g. used for automatic taxonomy now)&lt;br /&gt;
           An alternative is to use wikitext for the whole taxobox table&lt;br /&gt;
]]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- --------------------------- TEST AUTO TAXONOMY FUNCTIONS -----------------------------&lt;br /&gt;
function p.test(frame)&lt;br /&gt;
	&lt;br /&gt;
    local a = require(&amp;quot;Module:Sandbox/Jts1882/Biota Infobox/auto&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	--local taxonTable = a.loadTaxonomyTable(frame) now done in showTaxonomyTable&lt;br /&gt;
	&lt;br /&gt;
    return a.showTaxonomyTable(frame)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- All modules end by returning the variable containing its functions to Wikipedia.&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Tttrung</name></author>
	</entry>
</feed>