require('strict') -- All Lua modules on Wikipedia must begin by defining a variable that will hold their -- externally accessible functions. They can have any name and may also hold data. local p = {}  -- exposed variables local g = {}  -- these are variables with global scope in this module  local info = {}          -- contains general purpose information (e.g. header background colour) info.debug  = false -- ONLY SET THIS WHILE TESTING  --local paramData = require( 'Module:Sandbox/Jts1882/Biota Infobox/data' ) -- contains the taxon ranks in order --local autotaxa = require("Module:Sandbox/Jts1882/Biota Infobox/Autotaxobox") --local autotaxa = require("Module:Autotaxobox") local parameters = require( 'Module:Biota infobox/param' )  local core = require( 'Module:Biota infobox/core' )   -- ######################### PARAMETER HANDLING ############################  local templateArgs = {}  -- contains preprocessed arguments from calling template                           --TODO use info.args instead of templateArgs?  -- ########################### MAIN AND OTHER ENTRY FUNCTIONS ##################################  --[[ main function callable in Wikipedia via the #invoke command.         creates a taxobox-style infobox         handles preliminary parameter handling enulating taxobox and automatic taxobox templates            -- the parameters are also checked for content, alias, valid names and valid combinations            -- the parameter handling is in subpage Module:Sandbox/Jts1882/Biota Infobox/param         these are passed the core function            -- the core function emulates the template {{Taxobox/core})            -- the function is found in subpage Module:Sandbox/Jts1882/Biota Infobox/core            -- the core them creates the taxobox                  creates main table and header section (with header, subheader and fossil ranges) 	             adds addition rows for template arguments with following subsidiary functions: 			        p.addImageSection() - images and range maps  			        p.addStatusSection() - conservation status 			        p.addTaxonomySection() - listing of taxonomic heirarchy (manuel or using automatic taxonomy system) 			        p.addTaxonSection() - adds section with taxonomic information (binomial or trinomials; type genus or species; diversity) 			        p.addListSection()     - section containing list if subdivisions, synonyms, included or excluded groups --]] p.main = function(frame)  	 	--p.getArgs(frame) 	parameters.getArgs(frame, templateArgs, info)  -- gets arguments, checks for value, aliases, and against valid parameter list  	if info.auto then 		p.AutomaticTaxoboxOptions(frame) -- this emulates the automatic taxobox templates that feed the core 	else 		--[[TODO manual taxobox options: 		            name or use Template:Taxonomy name |genus|species|binomial name 		            colour = p.getTaxoboxColor(frame) 		]] 	end  	--return p._core(frame) 	return core.core(frame, templateArgs, info) end  -- this functions emulates Template:automatic taxobox and uses Template:Taxobox/core p.auto = function(frame)  	--info.auto = frame.args.auto or "automatictaxobox" 	 	p.getArgs(frame)  -- gets arguments, checks for value, aliases, and against valid parameter list  	if info.auto then 		p.AutomaticTaxoboxOptions(frame) -- this emulates the automatic taxobox templates that feed the core 	end 	 	-- additional parameters needed by Template:Taxobox/core 	templateArgs['edit link']="edit taxonomy" 	templateArgs['colour'] = p.getTaxoboxColor(frame)     templateArgs['upright'] = templateArgs['image_upright'] or 1        templateArgs['upright2'] = templateArgs['image2_upright'] or 1          -- use Template:Taxobox/core  	return tostring(frame:expandTemplate{ title = 'taxobox/core',  args = templateArgs   } )   	 end  --[[ ##################### CORE FUNCTIONS ###################################         this core function emulates Template:Taxobox/core         it is followed by functions handling the different type of entry        MOVED to subpage Module:Sandbox/Jts1882/Biota_Infobox/core ]]  -- ################## AUTOMATIC TAXOBOX SYSTEM HANDLING ################################  -- handle specific requirements of different options: auto, speciesbox etc function p.AutomaticTaxoboxOptions(frame)        --TODO replace genus with first word (genus) to strip parenthetic term     -- done in speciesbox?               templateArgs['display_taxa']  = templateArgs['display_parents'] or 1  -- note change of parameter name       local extinct = ""  	if  templateArgs['extinct'] or templateArgs['status'] == "EX" then  		--extinct = "†" 		extinct = frame:expandTemplate{ title = 'extinct' }  -- use template to get tooltip 		-- speciesbox also checks the genus taxonomy template for extinct parameter     end      ---------------------variables for SPECIESBOX, SUBSPECIESBOX and INFRASPECIESBOX---------------------    	if info.auto == "hybridbox" then    		    		--templateArgs['parent'] = templateArgs['parent'] or templateArgs['genus'] or templateArgs['genus1']    		    		local species1 = templateArgs['species'] or templateArgs['species1'] or templateArgs['father'] or templateArgs['father_species'] or ""    		local species2 = templateArgs['species2'] or templateArgs['mother'] or templateArgs['mother_species'] or templateArgs['species'] or ""    		local genus1   = templateArgs['genus'] or templateArgs['genus1']  or templateArgs['father_genus']    -- TODO use page    		local genus2   = templateArgs['genus2'] or templateArgs['mother_genus']   or templateArgs['genus']         local species3 = templateArgs['species3'] or ""         local genus3   = templateArgs['genus3'] or templateArgs['genus'] or ""          local subspecies1, subspecies2, subspecies3 = "", "", ""         --if (templateArgs['subspecies1'] and templateArgs['subspecies2'])         if templateArgs['subspecies1'] or templateArgs['subspecies2']             or (templateArgs['father_subspecies'] and templateArgs['mother_subspecies']) then         	subspecies1 = " " .. ((templateArgs['subspecies1'] or templateArgs['father_subspecies']) or "")         	subspecies2 = " " .. ((templateArgs['subspecies2'] or templateArgs['mother_subspecies']) or "")         	if templateArgs['subspecies3'] then         		subspecies3 = " " .. templateArgs['subspecies3']         		species3 = species1         	end         end             		local link1    = templateArgs['link1'] or templateArgs['father_link'] or (genus1 .. " " .. species1 .. subspecies1)    		local link2    = templateArgs['link2'] or templateArgs['mother_link'] or (genus2 .. " " .. species2 .. subspecies2)         local link3    = templateArgs['link3'] or (genus3 .. " " .. species3 .. subspecies3)      		if not templateArgs['parent'] then templateArgs['parent'] =  genus1 end    		                  --TODO disambiguate genus pages -- not needed unless using page name    		--genus1 = frame:expandTemplate{ title = 'Speciesbox/getGenus' , args = {"", genus1 } }    	    --	genus2 = frame:expandTemplate{ title = 'Speciesbox/getGenus' , args = {"", genus2 } }    		    		if not templateArgs['genus2'] and not templateArgs['father_genus'] then     			genus1 = string.sub(genus1,1,1) .. "."   -- shorten generic names for intrageneric hybrids    			genus2 = string.sub(genus2,1,1) .. "."    			genus3 = string.sub(genus3,1,1) .. "."    		end    		    		-- shorten species name if subspecies of same species    		if subspecies1 ~= "" and not templateArgs['species2']  then    			species1 = string.sub(species1,1,1) .. "."   -- shorten specific epithet for intraspecific hybrids    			species2 = string.sub(species2,1,1) .. "."    			if subspecies3 ~= "" then species3 = string.sub(species3,1,1) .. "." end    		end     		local maleSymbol, femaleSymbol = "", ""    		if templateArgs['father'] or templateArgs['father_genus'] or templateArgs['father_species'] or templateArgs['father_subspecies'] then maleSymbol = "♂" end    		if templateArgs['mother'] or templateArgs['mother_genus'] or templateArgs['mother_species'] or templateArgs['mother_subspecies'] then femaleSymbol = "♀" end    		    		templateArgs['hybrid'] = "" .. genus1 .. " " .. species1 .. subspecies1 .."" .. maleSymbol     		                       .. " × "    		                       .. "" .. genus2 .. " " .. species2 .. subspecies2 .. "" .. femaleSymbol     		if species3 ~= "" then    			templateArgs['hybrid'] = templateArgs['hybrid']   .. " × "    		                       .. "" .. genus3 .. " " .. species3  .. subspecies3 .. ""     		end               	--templateArgs['hybrid species'] = templateArgs['hybrid']      	if subspecies1 ~= "" and not templateArgs['species2'] then      	     templateArgs['species'] = "[[" .. templateArgs['genus'] .. " " .. templateArgs['species'] .. "|"      	                                .. genus1 .. " " .. templateArgs['species'] .. "]]"       	else templateArgs['species'] = nil      	end      	templateArgs['offset'] = 1 	         -- ======================= setup for SPECIESBOX ============================= 	 	elseif info.auto == "speciesbox" then                  -- code to emulate SPECIESBOX                  --[[  gets genus and species from taxon, genus+species or page name                 1. uses 'taxon' paramter ( given as binomial) if available                 2. otherwise uses 'genus' and 'species' parameters                 3. uses page name              the genus is used for the 'parent' taxon              	unless the parent is supplied (e.g. for subgenus)            This logic is handled using ,   and                  code doing similar is in an older version of this page         --]]                local genus, species = "", ""        genus = frame:expandTemplate   { title = 'Speciesbox/getGenus' ,                          -- get genus from taxon or genus parameter        	                                args = { templateArgs['taxon'], templateArgs['genus'] }        	                              }          genus = frame:expandTemplate   { title = 'Speciesbox/trim' ,                              -- remove disambiguation        	                                args = { genus }        	                              }                 species = frame:expandTemplate { title = 'Speciesbox/getSpecies' ,                        -- get species from taxon or species parameter        	                                args = { templateArgs['taxon'], templateArgs['species'] }        	                              }               if not templateArgs['parent'] or templateArgs['parent'] == "" then         	templateArgs['parent'] = templateArgs['genus']  or genus               -- set parent to genus (with disambiguation if given)         end  	    templateArgs['genus'] = genus                                               -- set to genus without diambiguation 	    templateArgs['species'] = species   	    templateArgs['taxon'] = genus .. ' ' .. species            templateArgs['name']  = frame:expandTemplate { title = 'Speciesbox/name' ,   -- set the page name         	                                           args = { templateArgs['name'],          	                                           	        templateArgs['taxon'], templateArgs['genus'], templateArgs['species'],         	                                                    --mw.title.getCurrentTitle().baseText,           -- =BASEPAGENAME (magic word for parent page)         	                                                    frame:expandTemplate { title = 'PAGENAMEBASE' }, -- page name without parenthetic term         	                                                    templateArgs['italic_title' or 'yes']           	          	                           	          }          	                                          }         	                                           		templateArgs['binomial'] = "" .. templateArgs['taxon'] .. "" 		templateArgs['binomial_authority'] = templateArgs['authority'] or nil 				     	-- set species_name e.g. Panthera leo -> P. leo     	templateArgs['species_name'] = extinct .. "" .. string.sub(templateArgs['genus'],1,1) .. '. ' .. templateArgs['species'] .. ""         templateArgs['species']      = templateArgs['species_name']                  templateArgs['display_taxa']   = templateArgs['display_taxa'] -1         templateArgs['offset'] = 1 	    if templateArgs['subgenus'] and templateArgs['subgenus'] ~= ""  then 	    	templateArgs['offset'] =  templateArgs['offset'] + 1 			templateArgs['subgenus_authority']              = templateArgs['parent_authority'] or ""     	end          templateArgs['taxon'] = nil -- For auto module                -- =====================  set-up for SUBSPECIESBOX or INTRASPECIESBOX ================= 	 	elseif info.auto == "subspeciesbox" or info.auto == "infraspeciesbox" then 	 	   --[[ From template description: 	          "The genus name, species name and subspecies name"  	             [or "genus name, specific epithet and infraspecific epithet"]                   "                  must be supplied separately: the combined taxon parameter cannot be used.""               "The genus name is then the entry into the taxonomic hierarchy.""                		    The trinomial name is set from these parameters and the parameter ignored. 		   --NOTE no infraspeciebox is currently using trinomial parameter         --]]                  -- Parameter checking. This could be here or moved to parameter checking function         if templateArgs['genus'] and templateArgs['species'] and templateArgs['subspecies'] then         	-- valid parameters for subspecies (may have variety as well)         elseif templateArgs['genus'] and templateArgs['species'] and templateArgs['variety'] then         	-- valid parameters for infraspecies (variety without subspecies)         else         	-- insufficient parameters         	-- TODO add error message and return         end         local offset = 2  -- authority offset when subspecies OR variety                   --TODO strip genus of disambiguator (need to check this works)         	local genus =mw.text.split( templateArgs['genus'], " ", true ) 	    	if genus[1] ~= "" then  	    		templateArgs['genus'] = genus[1]  	    	end         templateArgs['parent'] = templateArgs['genus'] -- genus must be supplied                  -- handle parent species name         local fullName = templateArgs['genus'] .. ' ' .. templateArgs['species']         local shortName = string.sub(templateArgs['genus'],1,1) .. '. ' .. templateArgs['species']  		if  templateArgs['species_link'] then  			templateArgs['species_name'] = "[[" ..templateArgs['species_link']  .. '|'.. shortName .. "]]"  		else  			templateArgs['species_name'] = "'.. shortName .. ""  		end         if  templateArgs['species_extinct'] then          	extinct = frame:expandTemplate{ title = 'extinct' }                    -- if parent species extinct, all children will be         	templateArgs['species_name'] = extinct .. templateArgs['species_name']          end         		         -- handle subspecies name (if set; varieties may not have a subspecies)         local separator = " "                               -- subspecies separator (default zoological) 	    local abbr_subspecies_name 	     	    if templateArgs['subspecies'] then     -- might not be subspecies if variety          	if info.auto == "infraspeciesbox"   then          		separator = " subsp. "   -- separator for plants etc         	end   			-- set abbreviated name, full name, and trinomial  			abbr_subspecies_name = string.sub(templateArgs['genus'],1,1) .. '. '  			                          .. string.sub(templateArgs['species'],1,1) .. '.'  			                          .. separator .. templateArgs['subspecies']   			fullName = templateArgs['genus'] .. ' ' .. templateArgs['species'] .. separator .. templateArgs['subspecies']   			templateArgs['trinomial'] = extinct ..  "" .. fullName .. ""             --templateArgs['subspecies_authority'] = templateArgs['authority']  -- replicates authoity in trinomial (unwanted?) 			 			templateArgs['subspecies_name']= extinct .. ""  .. abbr_subspecies_name  .. ""          end                  -- handle population (of a species or subspecies)         if templateArgs['population'] then         	if templateArgs['subspecies'] then                  -- link subspecies name when using population 				if  templateArgs['subspecies_link'] then  					templateArgs['subspecies_name'] = "[[" .. templateArgs['subspecies_link'] .. "|" .. abbr_subspecies_name  .. "]]"  				else 					templateArgs['subspecies_name'] = "" .. abbr_subspecies_name  .. ""  				end 			end 			if not templateArgs['name'] then  				templateArgs['name'] = templateArgs['population']   -- set taxobox name to population 			end  			if templateArgs['population_rank_name'] and templateArgs['population_rank_abbrev']  then 				templateArgs['trinomial'] = templateArgs['trinomial'] .. ' ' .. templateArgs['population_rank_abbrev']  				                                                      .. ' ' .. templateArgs['population'] 			else 				templateArgs['trinomial'] = nil -- don't show trinomial with population unless it has morpha or other suffix     		end 			--templateArgs['binomial'] = nil -- don't show binomial with population (when population of species); nver set 			if templateArgs['population_extinct'] == "yes" or templateArgs['population_extinct'] == "true" then 				extinct = frame:expandTemplate{ title = 'extinct' }  -- use template to get tooltip 			end 			templateArgs['population'] = extinct .. "" .. templateArgs['population'] .. "" 		end                           -- handle variety          if templateArgs['variety'] or templateArgs['varietas'] then  -- should now be aliased             local vSeparator = " var. "              --alias done? templateArgs['variety']= templateArgs['variety'] or templateArgs['varietas'] -- will use variety as parameter TODO alias this 			templateArgs['variety_name'] = extinct .. "" .. string.sub(templateArgs['genus'],1,1) .. '. ' .. string.sub(templateArgs['species'],1,1) .. '.' .. vSeparator .. templateArgs['variety'] .. ""   			templateArgs['trinomial'] = "" .. templateArgs['genus'] .. ' ' .. templateArgs['species'] .. vSeparator .. templateArgs['variety'] .. ""             --templateArgs['variety_authority'] = templateArgs['authority'] -- replicates authority in trinomial     	         	    if templateArgs['subspecies'] then 	-- subspecies needs to linked  [TODO: add subspecies_link] 	  			local redirectName = templateArgs['genus'] .. ' ' .. templateArgs['species'] .. " subsp. " .. templateArgs['subspecies']  				local shortName = "" .. string.sub(templateArgs['genus'],1,1) .. '. ' .. string.sub(templateArgs['species'],1,1) .. '.' .. separator .. templateArgs['subspecies'] .. ""  				templateArgs['subspecies_name'] =  "' .. shortName .. "" 				offset = offset + 1 -- offset when susbpecies AND variety                 templateArgs['subspecies_authority'] = templateArgs['parent_authority']         	end         end                  -- handle customisable infraspecies ranks                  -- alias (TODO move to parameter section when parameter name conversion complete; see talk page )         if  templateArgs['infraspecies1_name'] or  templateArgs['infraspecies_rank1'] then         	 templateArgs['infraspecies1_name1'] = templateArgs['infraspecies1_name'] or  templateArgs['infraspecies_rank1']         end         if  templateArgs['infraspecies2_name'] or  templateArgs['infraspecies_rank2'] then         	 templateArgs['infraspecies2_name'] = templateArgs['infraspecies2_name'] or  templateArgs['infraspecies_rank2']         end                  if templateArgs['infraspecies_rank1'] then             if templateArgs['subspecies'] then -- link subspecies         	   --templateArgs['subspecies_name'] = "[[" .. fullName:gsub("%'*%<%/?small%>%'*","") .. "|" .. abbr_subspecies_name  .. "]]"          		templateArgs['subspecies_name'] = "" .. abbr_subspecies_name  .. ""              end                          local binomial = "" .. templateArgs['genus'] .. ' ' .. templateArgs['species'] .. ""             local abbrSpeciesName = string.sub(templateArgs['genus'],1,1) .. '. ' .. string.sub(templateArgs['species'],1,1) .. '. '              abbrSpeciesName = "" .. abbrSpeciesName .. ""  -- italicise             if templateArgs['infraspecies_rank2'] then 	           local isrSeparator = " " 	           if templateArgs['infraspecies_rank2_abbrev'] then 	             isrSeparator = " " ..  templateArgs['infraspecies_rank2_abbrev'] .. " " 	           end 	           templateArgs['trinomial'] = binomial  .. isrSeparator .. templateArgs['infraspecies_rank2']  	           templateArgs['infraspecies_rank2']  = abbrSpeciesName .. isrSeparator ..  templateArgs['infraspecies_rank2']  	           templateArgs['infraspecies_rank2'] = "" .. templateArgs['infraspecies_rank2']  .. "" -- bold infraspecific name 	        else 	           local isrSeparator = " " 	           if templateArgs['infraspecies_rank1_abbrev'] then 	             isrSeparator = " " ..  templateArgs['infraspecies_rank1_abbrev'] .. " " 	           end 	           templateArgs['trinomial'] =  binomial .. isrSeparator .. templateArgs['infraspecies_rank1']  	           templateArgs['infraspecies_rank1']  = abbrSpeciesName .. isrSeparator ..  templateArgs['infraspecies_rank1']  	           templateArgs['infraspecies_rank1'] = "" .. templateArgs['infraspecies_rank1']  .. "" -- bold first infraspecific name 	        end         end                 --TODO what else do subspeciesbox and infraspeciesbox cover?)         --[[ code from templates             both:            |trinomial_authority =                infraspeciesbox: |species_authority =              subspeciesbox: | species_authority =                note: subspeciesbox doesn't recognise patent_authority with underscore           monthly reports on subspeciesbox and infraspeciesbox               no uses of parent_authority, binomial_authority or trinomial authority               no uses of grandparent, greatgrandparent etc authorites         ]]  		templateArgs['trinomial_authority'] = templateArgs['authority'] or nil          if not templateArgs['name'] or templateArgs['name'] == "" then -- if page name not set         	templateArgs['name'] = templateArgs['trinomial']         end                  -- these are used by manual taxobox to complete the taxonomy table         templateArgs['species'] = templateArgs['species_name']         templateArgs['subspecies'] = templateArgs['subspecies_name'] 		templateArgs['variety'] =templateArgs['variety_name']                  --QUESTION what happens to parent taxa when subspecies and variety?          -- set species and subgenus authorities 	    if templateArgs['subgenus'] then  	    	offset = offset + 1 		    if offset == 4  then    -- when subgenus, species, subspecies and variety 		    	templateArgs['subgenus_authority']  = templateArgs['subgenus_authority'] or templateArgs['greatgrandparent_authority'] or "" 		    	templateArgs['species_authority']   = templateArgs['grandparent_authority'] or "" 	        elseif offset == 3  then -- when subgenus, species, (subspecies OR variety) 		    	templateArgs['subgenus_authority']  = 	templateArgs['subgenus_authority'] or templateArgs['grandparent_authority'] or "" 		    	templateArgs['species_authority']   = templateArgs['parent_authority'] or "" 		    end 		else -- only need to set species authority or subspecues (if also variety) 		    if offset == 3 then    -- species, subspecies and variety 		    	templateArgs['species_authority']   = templateArgs['grandparent_authority'] or "" 		    	templateArgs['subspecies_authority']   = templateArgs['parent_authority'] or "" 		    elseif offset == 2 then  -- species, (subspecies or variety) 		        templateArgs['species_authority']   = templateArgs['parent_authority'] or "" 		    end	     		end                 templateArgs['display_taxa']   = (templateArgs['display_taxa'] or 1) -2         templateArgs['offset'] = offset  	  	    -- need to set subgenus_authority, species_authority, subspecies_authority and variety_authority          	    --[[shift authorities for subspeciesbox (two steps or three if subgenus set) 	    if templateArgs['subgenus'] and templateArgs['subgenus'] ~= ""  then 			templateArgs['subgenus_authority']              = templateArgs['grandparent_authority'] or "" 			templateArgs['authority']                       = templateArgs['greatgrandparent_authority'] or "" 			templateArgs['parent_authority']                = templateArgs['greatgreatgrandparent_authority'] or "" 			templateArgs['grandparent_authority']           = templateArgs['greatgreatgreatgrandparent_authority'] or "" 			templateArgs['greatgrandparent_authority']      = templateArgs['greatgreatgreatgreatgrandparent_authority'] or "" 			templateArgs['greatgreatgrandparent_authority'] = templateArgs['greatgreatgreatgreatgreatgrandparent_authority'] or "" 		else 			templateArgs['authority']                       = templateArgs['grandparent_authority'] or "" 			templateArgs['parent_authority']                = templateArgs['greatgrandparent_authority'] or "" 			templateArgs['grandparent_authority']           = templateArgs['greatgreatgrandparent_authority'] or "" 			templateArgs['greatgrandparent_authority']      = templateArgs['greatgreatgreatgrandparent_authority'] or "" 			templateArgs['greatgreatgrandparent_authority'] = templateArgs['greatgreatgreatgreatgrandparent_authority']	 or "" 		end 		]] 	 	-- ========================= setup for AUTOMATIC TAXOBOX ================================ 	        -- CHECK authomatic taxobox pagename overrides taxon (e.g. Tortrix? destructus) for header         --         it does but no italics in header for Tortrix? destructus      --elseif info.auto == "automatictaxobox" then 	 	elseif info.auto == "virus" or info.auto == "virusbox" then 			templateArgs['virus'] = "yes" 			templateArgs['color_as'] = "Virus" 			if not templateArgs['parent'] then 				if templateArgs['taxon'] then 			        templateArgs['parent'] = templateArgs['taxon']   			    elseif templateArgs['species'] then  			    	templateArgs['parent'] = templateArgs['species']  			    	templateArgs['species'] = nil 			    else 			    	templateArgs['parent'] = tostring( mw.title.getCurrentTitle()) or "" 			    end 			else 				templateArgs['link_parent'] = "yes"            -- if parent given, we want to link it 			end 		     	else       	-- "the automated taxobox first looks for the taxonomy template that matches the supplied |taxon= parameter "     	--       "(or, if none is supplied, the article's title, ignoring any parenthetical expressions). "     	if not templateArgs['taxon'] or  templateArgs['taxon'] == "" then     		--templateArgs['taxon'] = templateArgs['name'] or tostring( mw.title.getCurrentTitle())     		templateArgs['taxon'] = tostring( mw.title.getCurrentTitle()) or ""     		--TODO strip name of parenthetical terms off page title     		if templateArgs['taxon'] ~= "" then     			--TODO error message and exit     		end     	end		     	if templateArgs['parent'] then     		templateArgs['link_parent'] = "yes"              -- if parent given, we want to link it     	else   		   templateArgs['parent'] = templateArgs['taxon']   -- otherwise set parent   		   templateArgs['link_parent'] = "yes"              -- we still want to link it? VERIFY   		end   		--TODO set name if parameter no supplies   		   		--[[ TODO if no taxonomy template, then call setup taxonomy template    		   {{#ifexist:Template:Taxonomy/{  end  function p.templateStyle( frame, src )    return frame:extensionTag( 'templatestyles', '', { src = src } );     end	  function p.testTables(frame) 	if 1==1 then return end  -- disable 	local root = mw.html.create('table'):addClass('wikitable')  	local row = root:tag('tr')                -- add row using lua library 	local cell = row:tag('td') 	cell:wikitext('row A:') 	cell = row:tag('td'):wikitext('content A')    	row = root:tag('tr')                      -- add row using lua library  	cell = row:tag('td'):wikitext('row B:') 	cell = row:tag('td') 	          :wikitext('\n{|\n|-\n|P\n|Q\n|}') --but include a wikitxt table in one cell 	         -- :done()     -- row:done()     --root=mw.html:allDone()     root:wikitext('ab') -- add row to root using html      root:wikitext('\n|-\n|X\n|Y\n')              -- add row to root using wikitext (FAILS)           root:wikitext('\r|-\r|I\r|J\r')              -- FAIL output |- |X |Y  	 	root:wikitext(frame:preprocess('\n|-\n|U\n|V\n')) -- FAIL output |- |U |V  	 	root:wikitext('\n|M\n|N\n')     	  	row=root:tag('tr'):node('cd')    -- adds row successfully 	row=root:tag('tr'):node('\n|Xc\n|Xd\n')    -- fails to adds row 	 	 	row = root:tag('tr')                       -- add another row using lua library 	cell = row:tag('td'):wikitext('row C:') 	cell = row:tag('td'):wikitext('content C')  	root:node('\n{|\n|-\n|Xx\n|Yx\n|}\n')    -- adds new table after  	--frame:preprocess 	return 	 tostring(root)  --[[ CONCLUSION: cannot mix wikitext freely in the node structure            A complete wikitext table can be included in a cell (e.g. used for automatic taxonomy now)            An alternative is to use wikitext for the whole taxobox table ]] end  -- --------------------------- TEST AUTO TAXONOMY FUNCTIONS ----------------------------- function p.test(frame) 	     local a = require("Module:Sandbox/Jts1882/Biota Infobox/auto")  	--local taxonTable = a.loadTaxonomyTable(frame) now done in showTaxonomyTable 	     return a.showTaxonomyTable(frame) end  -- All modules end by returning the variable containing its functions to Wikipedia. return p