require('strict')  local p = {} local templateArgs = {} local info = {}  local paramData = require( 'Module:Biota infobox/data' ) -- contains the taxon ranks in order local autotaxa = require("Module:Autotaxobox") local parameters = require( 'Module:Biota infobox/param' )   --[[ ##################### CORE FUNCTIONS ###################################        this core function emulates Template:Taxobox/core         it is followed by functions handling the different type of entry ]] p.main = function(frame) 	-- this function emulates Template:Taxobox/core when called from taxobox feeder templates 	--  i.e. Taxobox, Automatic taxobox, Speciesbox, etc 	parameters.getArgs(frame)  	templateArgs['image_upright'] = templateArgs['upright'] or 1        templateArgs['image2_upright'] = templateArgs['upright2']  or 1     info.headerColor = templateArgs['colour'] 	return p._core     --TODO check it works end -- this is the core function, called either from main() or auto() p.core = function(frame, args, localinfo)  	templateArgs = args 	info = localinfo 	return p._core(frame)  end  p._core = function(frame)   	                                    -- TODO use mw.title.getCurrentTitle().basePageTitle 	info.name = templateArgs['name'] or tostring( mw.title.getCurrentTitle() ) --.rootPageTitle )      if not info.headerColor then     	info.headerColor = p.getTaxoboxColor(frame) -- so only transverse taxobox heirarchy once     end      	--[[ create table (two versions) 	     1. use mwhtml library to build table in taxoboxTable 	     2. use wikitest to build table in wikitextTable     ]] 	local taxoboxTable = mw.html.create('table'):addClass('infobox'):addClass('biota') 								                :addClass('biota-infobox') 	local wikitextTable = '\n{| class="infobox biota biota-infobox" '							                 								                     info.subheader =     if templateArgs['subheader'] and templateArgs['subheader'] ~=  then 		info.subheader=''..templateArgs['subheader']..''     end          --TODO do we need additional handling to check  templete      --        or handle oldest_fossil and youngest_fossil (these don't seem to be used now)     -- Note: taxobox/core uses temporal_range     local temporalRange =     if templateArgs['temporal_range']  then     	temporalRange = 'Temporal range: ' .. templateArgs['temporal_range'] .. '' -- use <div> rather than      end          local rowHeader = taxoboxTable:tag('tr'):tag('th'):attr('colspan', '2'):addClass('section-header') 	                :cssText('background:' ..  info.headerColor .. ';') 					:wikitext(info.name .. info.subheader .. temporalRange)          wikitextTable = wikitextTable .. '\n|-\n! colspan="2" class="section-header" style="background:' ..  info.headerColor .. ';" '                       .. '|' .. info.name .. info.subheader .. temporalRange          -- add images     wikitextTable = wikitextTable ..  p.addImageSection(frame, taxoboxTable, 'image')                                   .. p.addImageSection(frame, taxoboxTable, 'image2')          --add conservation status  	wikitextTable = wikitextTable .. p.addStatusSection(frame, taxoboxTable, 'status') 	                              .. p.addStatusSection(frame, taxoboxTable, 'status2') 	 	-- add taxonomy table (uses entered parameters or automatic taxonomy system) 	wikitextTable = wikitextTable .. p.addTaxonomySection(frame, taxoboxTable)      	-- add sections with binomial, trinomial, type species/genus (with authorities) 	wikitextTable = wikitextTable  				..	p.addTaxonSection(frame, taxoboxTable, 'binomial', 'Binomial name') 				..	p.addTaxonSection(frame, taxoboxTable, 'trinomial', 'Trionomial name') 				..	p.addTaxonSection(frame, taxoboxTable, 'type_genus', 'Type genus') 					--TODO type_ichnogenus, type_oogenus 				..	p.addTaxonSection(frame, taxoboxTable, 'type_species', 'Type species') 					--TODO type_ichnospecies, type_oospecies 				..  p.addTaxonSection(frame, taxoboxTable, 'type_strain', 'Type strain')  	-- add sections showing subdivisions (i.e. child taxa) 	wikitextTable = wikitextTable                   .. p.addListSection(frame, taxoboxTable, 'subdivision', templateArgs['subdivision_ranks'] or 'Subdivisions')                  ..	p.addListSection(frame, taxoboxTable, 'possible_subdivision', templateArgs['possible_subdivision_ranks'] or 'Possible subdivisions')          -- diversity section (TODO consider how best to handle)     wikitextTable = wikitextTable .. p.addTaxonSection(frame, taxoboxTable, 'diversity', 'Diversity')   	-- show included groups (accepts 'included' or 'includes') [used for paraphyletic taxa] 	wikitextTable = wikitextTable .. p.addListSection(frame, taxoboxTable, 'includes', 'Groups included') 	--p.addListSection(frame, taxoboxTable, 'included', 'Groups included') -- use alias      --add range map (should this be below binomial/trinomial?)     wikitextTable = wikitextTable .. p.addImageSection(frame, taxoboxTable, 'range_map')  	-- show excluded groups (accepts 'excluded' or 'excludes') [used for paraphyletic taxa] 	local excludedHeaderText = 'Cladistically included but traditionally excluded taxa' 	wikitextTable = wikitextTable .. p.addListSection(frame, taxoboxTable, 'excludes', excludedHeaderText)      -- add addition binomials, trinomial and range maps 	wikitextTable = wikitextTable  	         .. p.addTaxonSection(frame, taxoboxTable, 'binomial2', 'Binomial name (2)') 	         --p.addTaxonSection(frame, taxoboxTable, 'trinomial2', 'Trionomial name (2)')              .. p.addImageSection(frame, taxoboxTable, 'range_map2')              .. p.addTaxonSection(frame, taxoboxTable, 'binomial3', 'Binomial name (3)')              --p.addTaxonSection(frame, taxoboxTable, 'trinomial3', 'Trionomial name (3)')              .. p.addImageSection(frame, taxoboxTable, 'range_map3')              .. p.addTaxonSection(frame, taxoboxTable, 'binomial4', 'Binomial name (4)')              --p.addTaxonSection(frame, taxoboxTable, 'trinomial4', 'Trionomial name (4)')              .. p.addImageSection(frame, taxoboxTable, 'range_map4')  	-- add synonyms section 	wikitextTable = wikitextTable .. p.addListSection(frame, taxoboxTable, 'synonyms', 'Synonyms')  	-- add debug/tracking  info section 	if info.debug then 	    wikitextTable = wikitextTable ..p.addListSection(frame, taxoboxTable, 'debug', 'Debug/tracking info') 	end 	 	------------------add templateSyles and return taxobox table--------------------------- 	 	local src = "Template:Biota infobox/styles.css" -- TemplateStyles file     	    	wikitextTable = 	wikitextTable .. '\n|}'      local output =	wikitextTable            -- output the wikitext table     --local output = tostring(taxoboxTable)    -- output the mw.html table 	 	return output .. p.templateStyle( frame, src ) .. info.parameterCategory  	--return '' .. output .. p.templateStyle( frame, src ) .. info.parameterCategory .. '' 	 end  -- End the main function.	  --[[ ====================================================================================      function to add conservation sections          uses template  }}  --]] function p.addStatusSection(frame, taxoboxTable, status)      -- must use table container to handle template output     -- don't use header or content cells; the 'taxobox/species' template handles it     -- just need to add background colour on the row     local wikiText = ""     if templateArgs[status] and templateArgs[status] ~= "" then   		local statusText = frame:expandTemplate{ title = 'taxobox/species',  									          args = {templateArgs[status..'_system'] or , 									    		      templateArgs[status] or , 									    		      templateArgs[status..'_ref'] or , 									    		      ['extinction_date'] = templateArgs['extinct'] or    									    		      }     	          	                        } 		local row = taxoboxTable:tag('tr') 		                                  --:cssText('background:' ..  p.getTaxoboxColor(frame) .. ';') 		local cell = row:tag('td'):attr('colspan', '2') 		           :wikitext('\n{|\n|- style="background:' ..  info.headerColor .. ';"') 		           :wikitext('\n'..tostring(statusText))     	           :wikitext('\n|}')                 -- mw.addWarning ('taxobox/species returns:' .. '' .. statusText .. '')         if status == "status2" then         	wikiText = '\n|-' ..tostring(statusText) -- Horrible fudge to prevent header on second conservation status          	                                         --  mimicks taxobox in not having newline after \- so header doesn't show         else         	wikiText = '\n|-  colspan="2" style="background:' ..  info.headerColor .. ';" '                        .. '\n' ..tostring(statusText)         end     end     return wikiText  end  --[[ ==============================================================================      function to add sections for taxonomic information with authorities ('_authority' suffix)         e.g. binomial, trinomial, type_species, type_genus;          diversity also handled here --]] function p.addTaxonSection(frame, taxoboxTable, target, headerText) 	 	local wikiText = ""     -- return if we don't have value 	if not templateArgs[target]  or templateArgs[target] ==  then return "" end 	 	local bold = "" -- variable for bolding binomial and trinomial (type genus/species etc are not bolded) 	local showHeader = true 	 	local listHeader = (templateArgs[target..'_text'] or headerText)   	-- custom processing section 	--if target == 'binomial' or target == 'binomial2' or target == 'binomial3' or target == 'binomial4' then 	if target == 'binomial' then 		headerText = '' .. listHeader .. '' 		bold ="" 	--elseif target == 'trinomial' or target == 'trinomial2' or target == 'trinomial3' or target == 'trinomial4' then 	elseif target == 'trinomial'  then 		local trinomenLink = "Trinomen" -- for zoological or default 		if info.auto ==  "infraspeciesbox" then trinomenLink = "Infraspecific name (botany)" end -- regnum contains plant/fung/Archaeplastida" 		headerText = '' .. headerText .. '' 		bold ="" 	elseif target == 'binomial2' or target == 'binomial3' or target == 'binomial4' 		   or target == 'trinomial2' or target == 'trinomial3' or target == 'trinomial4' then 		showHeader = false 		bold ="'" 	elseif target == 'diversity'  then 	   headerText = '' .. headerText .. '' 	else 	   --TODO is any handling needed for other option 	   headerText = '' .. headerText .. '' 	end      	if templateArgs[target..'_ref'] then 			headerText = headerText .. templateArgs[target..'_ref'] .. '\n' 	 end 	 	local contentString =    -- content for the content cell 	if target == 'diversity' and templateArgs['diversity'] ~= "" then 		if templateArgs[target..'_link'] and templateArgs[target..'_link'] ~= "" then  		    contentString =  '\n[[' .. templateArgs[target..'_link'] .. '|' .. templateArgs[target] .. ']]\n'  		else 			contentString =  '\n' .. templateArgs[target] .. '\n' 		end 	 else 	 	-- taxon name and authority (binomial, type species, etc) 		local authorityString = 		if templateArgs[target..'_authority'] then 			authorityString = '' .. templateArgs[target..'_authority'] .. '' -- \n'  		end  		contentString =  bold .. templateArgs[target] .. bold .. authorityString .. '\n'  		--contentString =  '\n' ..  bold .. templateArgs[target] .. bold .. authorityString .. '\n'  -- extra <p> inserted     end 	  	 	-- add table rows 	if templateArgs[target] and templateArgs[target] ~=  then 		if showHeader then 			local rowHeader = taxoboxTable:tag('tr') 			rowHeader  :tag('th') 			           :attr('colspan', '2') 			           :addClass('section-header') 			           :cssText('background:' ..  info.headerColor .. ';') 			           :wikitext( headerText )                            	wikiText = wikiText .. '\n|- \n! colspan="2" class="section-header" style="background:' ..  info.headerColor .. ';" '             		   .. '|' .. headerText          end 		 		local rowList = taxoboxTable:tag('tr') 		rowList    :tag('td') 		           :attr('colspan', '2') 		           --:addClass('section-content') 		           :addClass('taxon-section') 		           --:cssText('text-align:center;') --font-weight:bold;') 		           :wikitext( contentString )          wikiText = wikiText .. '\n|- \n| colspan="2" class="taxon-section" |' .. contentString                               	end	     return wikiText end  --[[ ====================================================================================      function to produce sections for included taxa (subdivisions), synonyms, etc       - each consists of two rows containing a header and the content       - for paraphyletic groups it has include(d|s) and exclude(d|s) groups        - for general taxobox it has subdivision and possible subdivision (disabled here)       - any can be modified for other purposes (e.g. sisters) by changing the header taxt with a -text parameter   ]] function p.addListSection(frame, taxoboxTable, target, headerText)         if not templateArgs[target] or templateArgs[target] == "" then return "" end -- redundant for now          local wikiText = ""     local refString = 	if templateArgs[target..'_ref'] then 		   --add '_ref' option for 'synonym_ref' (the rest get it as a bonus) TODO check example 			refString = templateArgs[target..'_ref'] --.. '\n' 	 	 end 	local listHeader = (templateArgs[target..'_text'] or headerText) .. refString 	-- add table rows 	if templateArgs[target] and templateArgs[target] ~= then 		local rowHeader = taxoboxTable:tag('tr') 		rowHeader  :tag('th') 		           :attr('colspan', '2') 		           :addClass('section-header') 		           :cssText('background:' .. info.headerColor .. ';') 		           :wikitext(listHeader)         wikiText = wikiText .. '\n|- \n! colspan="2" class="section-header" style="background:' ..  info.headerColor .. ';" '                .. '|' .. listHeader           		local rowList = taxoboxTable:tag('tr') 		rowList    :tag('td') 		           :attr('colspan', '2') 		           :addClass('section-content') 		           :wikitext('\n' .. templateArgs[target] .. '\n' )	         wikiText = wikiText .. '\n|- \n| colspan="2" class="section-content" '                .. '|' .. '\n' .. templateArgs[target] .. '\n'  	 end	 	 return wikiText end  --[[ ============================================================================      function to add image sections      - used for illustrative images at top and for range maps --]] function p.addImageSection(frame, taxoboxTable, target) 	  	 local wikiText = "" 	 if templateArgs[target] and templateArgs[target] ~=  then 	 	         local imageWidth =          local imageCaptionString =         if templateArgs[target..'_caption'] then          	--imageCaptionString = '' .. templateArgs[target .. '_caption'] .. ''          	--imageCaptionString = '' .. templateArgs[target .. '_caption'] .. ''          	imageCaptionString = templateArgs[target .. '_caption']         end         local imageAltString =          if templateArgs[target..'_alt'] then         	imageAltString = templateArgs[target..'_alt']         elseif templateArgs[target..'_caption'] then         	imageAltString = templateArgs[target..'_caption'] -- use caption for alt text if none provided         end          local upright = templateArgs['image_upright'] or 1                  local InfoboxImage = require( 'Module:InfoboxImage' ) --, parent.args[target]  )         local params = { args = { 	image = templateArgs[target], 							        size = templateArgs[target..'_width'], 							        sizedefault = 'frameless', 							        alt = imageAltString, 							        upright = templateArgs[target..'_upright'] or upright  							        } 					    } 					             local image = InfoboxImage.InfoboxImage(  params )          	    --local rowImage = taxoboxTable:tag('tr')  	    local rowImage = mw.html.create('tr') 		rowImage:tag('td') 					 :attr('colspan', '2') 		             :addClass("image-section") 		             :wikitext(image) 		             --:wikitext(imageCaptionString) 		taxoboxTable:node(rowImage)         wikiText= wikiText .. '\n|- \n|colspan="2" class="image-section" |' .. image  	     	    if imageCaptionString ~= "" then                  -- only insert row if caption string 		    local rowImageCaption = mw.html.create('tr') 			rowImageCaption:tag('td') 						 :attr('colspan', '2') 			             :addClass("image-section") 			             --:wikitext(image) 			             :wikitext(imageCaptionString) 	        taxoboxTable:node(rowImageCaption) 	        wikiText = wikiText ..  '\n|- \n|colspan="2" class="image-section" |' .. imageCaptionString         end      end          -- TODO handle upright 	return wikiText end   --[[ ============================ TAXONOMY SECTION =======================================      adds a table showing the taxonomy       - uses either manual parameters or the automatic taxonomy system       - currently adds a table inside a cell (like paraphyletic group) rather than just adding rows (core taxobox system) --]]       function p.addTaxonomySection(frame, taxoboxTable)          local wikiText = "" 	local taxonomyHeader = "Scientific classification" 	if templateArgs['virus_group']  then  		taxonomyHeader = "Virus classification" 	elseif templateArgs['ichnos']  then  		taxonomyHeader = "Trace fossil classification" 	elseif templateArgs['veterovata']  then  		taxonomyHeader = "Eggshell classification" 	else 		-- TODO add other options (DONE but not verified ichnos or veterovata) 		-- ! colspan=2 style="min-width:15em; text-align: center" |  		--          	--	     		-- handle |classification_status=disputed (add ref) 	end 	 	-- add symbol and link to taxonomy editor 	local editLink = 	if info.auto then 		local tooltip = templateArgs['edit link'] or "Edit this classification" 		local style = 'font-size:smaller; float:right; padding-right:0.4em; margin-left:-3em;' 		local link = 'Template:Taxonomy/' .. templateArgs['parent'] 		if info.db == "wikidata" then 			local message = 'Select%20preview%20to%20see%20Wikidata%20hierarchy' 			local url='https://en.wikipedia.org/w/index.php?action=edit&section=new&preloadtitle=' .. message  			      .. '&title=Template:Biota_infobox/Wikidata/preview&preload=User:Jts1882/Taxonomy/preload2&preloadparams%5b%5d=' 			link =  url .. string.gsub( templateArgs['parent'], " ", "_") 		end 		editLink  = '' 			.. '15px|link=' .. link .. '|' .. tooltip  .. '' 			--.. 'link=' .. link .. '|' .. tooltip  .. '</span>' 			 	end 	local status = "" 	if templateArgs['classification_status'] then  		status = '(' .. templateArgs['classification_status'] .. ')' 	    if templateArgs['classification_ref'] then status = status .. templateArgs['classification_ref'] end 		status = status .. '' 	end 	 	local rowTaxonomyHeader = taxoboxTable:tag('tr') 	rowTaxonomyHeader:tag('th') 	           :attr('colspan', '2') 	           :addClass('section-header') 	           :cssText('background:' ..  info.headerColor .. ';') 	           :wikitext(taxonomyHeader) 	           :wikitext(editLink) 	           :wikitext(status)          wikiText = wikiText .. '\n|- \n! colspan="2" class="section-header" style="min-width:15em;text-align:center;background:' ..  info.headerColor .. ';" '                .. '|' .. taxonomyHeader .. editLink .. status          --[[ get taxonomy list, either using automatic taxobox system or manual system               manual: get ranks and taxa from template parameter          auto (default): get ranks and taxa from taxonomy template parameters          module: get ranks and taxa from dataa submodules          wikidata: get ranks and taxa from wikidata     ]]     -- shows ranks of genus or above for all auto modes 	if info.db == "module" then  	    local wdModule = require( 'Module:Biota infobox/Wikidata' )  	    wikiText = wikiText .. wdModule.addModuleTaxonomy(frame, taxoboxTable,  templateArgs)   -- use module copy of template data 	elseif info.db == "wikidata" then  	    --wikiText = wikiText ..'\n|-|\n|' .. p.addWikidataTaxonomy(frame, taxoboxTable)   -- use wikidata         local wdModule = require( 'Module:Biota infobox/Wikidata' )           wikiText = wikiText .. wdModule.addWikidataTaxonomy(frame, taxoboxTable,  templateArgs)   -- use wikidata 		 		-- TODO need to handle colour          -- the default is class="section-header" colspan="2" style="background:rgb(250,240,230);"         -- wikiText = wikiText:gsub('style="background:rgb%(250,240,230%);"', 'style="background:red;"')         -- gsub must be applied to wikitextTable         -- use more generally to avoid traversing the hierarchy twice) 	elseif info.auto then  		--[[ get automatic taxonomy hierarchy (three different variants) 		      1) direct call to taxoboxList() - preferred if issues with setting frame arguments can be resolved (used in live version) 		      2) experimental version of taxoboxList() 		      3) [ET] using Template:Taxobox/taxonomy 		]] 	    wikiText = wikiText ..'\n|-|\n|' .. p.addAutomaticTaxonomy(frame, taxoboxTable)   -- use #invoke of module 	end 	if info.auto then 		-- use manual taxobox for subgeneric ranks:  subgenus,species, subspecies, variety (also for informal group)     -- ranks below genys using manual taxobox code  	    local taxonRanks = { 'subgenus', 'species', 'hybrid',  'subspecies', 'population', 'variety' , 'infraspecies_rank1' , 'infraspecies_rank2', 'informal'}  		 		wikiText = wikiText .. p.addManualTaxonomy(frame, taxoboxTable, taxonRanks) 	else 		wikiText = wikiText .. p.addManualTaxonomy(frame, taxoboxTable, paramData.taxonRanks) -- just add rows manually     end     return wikiText end AUTOMATIC TAXONOMY (using invoke of module function) ----------- function p.addAutomaticTaxonomy(frame, taxoboxTable) -- use invoke of module function 	--emulate template:  	--which uses {{#invoke:Autotaxobox|taxoboxList 	--local autotaxa = require("Module:Autotaxobox") -- also needed for colours so global now      local bold_first = 'bold'     if templateArgs['species'] or templateArgs['hybrid'] then 	bold_first = 'link'    end     if templateArgs['link_parent'] then 	bold_first = 'link'    end      local args = {	templateArgs['parent'],  -- or tostring( mw.title.getCurrentTitle() ),  					display_taxa	    = templateArgs['display_taxa'] or 1, 					offset              = templateArgs['offset'] or 0, 					authority           = templateArgs['authority'], 			        parent_authority    = templateArgs['parent_authority'], 			        gparent_authority   = templateArgs['grandparent_authority'], 			        ggparent_authority  = templateArgs['greatgrandparent_authority'], 			        gggparent_authority = templateArgs['greatgreatgrandparent_authority'], 			        virus=templateArgs['virus'], 			        bold_first          = bold_first 	          } 	               frame.args = args    -- templateArgs['debug'] =  mw.dumpObject(frame)   	local autoTaxonomy = autotaxa.taxoboxList(frame) 	     if (1==1) then return autoTaxonomy end          local row = taxoboxTable:tag('tr')  --  incompatible with the templates called                         :wikitext('\n|rank ||taxon name ')                           :wikitext('\n'.. autoTaxonomy )  -- autoTaxonomy ends with a new row (|-)at end                         :wikitext('\n|x ||y ')                 -- so add blank cells to complete extra row                                                                --   this and affects spacing in taxonomy rows                         --:wikitext('\n')                      -- spacing fine, newline for table wikitext                                                   --[[ note:  the output of  [used by invoke:Autotaxobox|taxoboxList] ends with a newline token                 this and affects spacing in taxonomy rows                 leaving the empty row results in spurious paragraphs above the table       ]] 	return  end  MANUAL TAXONOMY--------------------------------  function p.addManualTaxonomy(frame,taxoboxTable, taxonRanks) 	 	--local parent = mw.getCurrentFrame():getParent() 	--local taxonRanks = data.taxonRanks 	 	-- following {{Paraphyletic group, a table is add to the cell in the classification row 	--local taxonomyTable = mw.html.create('table'):addClass('taxonomy') 	 	-- an alternative is to dispense with the extra table and just add the rows (like taxobox/core),  	--    which would need colspan=2 on other rows (DONE) 	local taxonomyTable = 	taxoboxTable   	local wikiText = "" 	 	for k,v in pairs(taxonRanks) do 		 		if templateArgs[v] then 		    local taxonName = templateArgs[v] 		     		    local taxonRank = frame:expandTemplate{ title = "anglicise rank", args = {taxonRanks[k]} } 		    if v == 'infraspecies_rank1' and templateArgs['infraspecies_rank1_name'] then 		        taxonRank = templateArgs['infraspecies_rank1_name'] 		    elseif  v == 'infraspecies_rank2' and templateArgs['infraspecies_rank2_name']then 		        taxonRank = templateArgs['infraspecies_rank2_name'] 		    elseif  v == 'population' and templateArgs['population_rank_name']then 		        taxonRank = templateArgs['population_rank_name'] 		    end 		     		    if taxonRanks[k] == "virus_group" then 		    	taxonName = frame:expandTemplate{ title = "Virus group", args = {templateArgs[v]} } 		    --	taxonRank = "Group" -- handled by anglicise rank template 		    end 		    local authorityString =  		    if templateArgs[taxonRanks[k]..'_authority'] then 		    	authorityString = ''..templateArgs[taxonRanks[k]..'_authority']..'' 		    end 		    local taxonString = ''..taxonName..''..authorityString  		    local row = taxonomyTable:tag('tr') 	     	row:tag('td'):wikitext(taxonRank..':') 		    row:tag('td'):wikitext(taxonString) 		    --:wikitext(''..parent.args[taxonRanks[k]..'_authority']..'')                          wikiText = wikiText  .. '\n|- \n|' .. taxonRank..': \n|' .. taxonString 		end  	end -- end for loop 	 	--return tostring(taxonomyTable) 	return wikiText 	 end  --[[ ########################### UTILITY FUNCTIONS ###############################################  TAXOBOX COLOUR--------------------------------------    -- gets colour for headers using manual or automatic taxobox schemes ]]	 function p.getTaxoboxColor(frame) 	 	local colorAs = templateArgs['color_as'] or nil 	 	if  info.auto and not templateArgs['virus_group'] then  	   --colour_as|color as|colour as set, use template  	   	   (2) else use the auto taxonnomy tree to find colour:  	    {{#invoke:Autotaxobox|taxoboxColour|{{{parent|{{{genus|{{first word|{ 	-- 		--[[if (templateArgs['color_as'] and templateArgs['color_as'] ~= "") or 		   (templateArgs['colour_as'] and templateArgs['colour_as'] ~= "") or 		   (templateArgs['color as'] and templateArgs['color as'] ~= "") or 		   (templateArgs['colour as'] and templateArgs['colour as'] ~= "") then 		     		   local colorAs = "" 		   if templateArgs['color_as'] then colorAs = templateArgs['color_as']  end 		   if templateArgs['colour_as']  then colorAs =  templateArgs['colour_as'] end 		   if templateArgs['color as'] then colorAs =  templateArgs['color as'] end 		   if templateArgs['colour as']  then colorAs =  templateArgs['colour as']  end]] 		if colorAs then -- templateArgs['color_as'] and templateArgs['color_as'] ~= ""   then 			 		    return frame:expandTemplate{ title = 'Taxobox colour', args = {colorAs} } 		     		else 			-- us #invoke:Autotaxobox|taxoboxColour| [parent should be set] 			 			frame.args[1] = templateArgs['parent'] 			 	        return autotaxa.taxoboxColour(frame) 			--return	"palegreen" 		end 	else -- use manual taxobox colours 		-- 		if not colorAs then  --templateArgs['color_as']    then       			local group =			if templateArgs['regnum'] then 				group = templateArgs['regnum'] 			elseif templateArgs['virus_group'] then 				group = templateArgs['virus_group'] 			elseif templateArgs['unranked_phylum'] then 				group = templateArgs['unranked_phylum'] 			elseif templateArgs['phylum'] then 				group = templateArgs['phylum'] 			else 				group = "Incertae sedis"          -- TODO check if this is what was desired 			end             colorAs = group         end 	    return frame:expandTemplate{ title = 'Taxobox colour', args = {colorAs} } 	end end  function p.templateStyle( frame, src )    return frame:extensionTag( 'templatestyles', , { src = src } );     end	 function p.firstToUpper(str)     return (str:gsub("^%l", string.upper)) end  function p.test(frame) 	return info.auto	 end  return p