From Wikipedia, the free encyclopedia

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' = "'''''[[" .. link1 .. "|" .. genus1 .. " " .. species1 .. subspecies1 .."]]'''''" .. maleSymbol 

   		                       .. " × "

   		                       .. "'''''[[" .. link2 .. "|" .. genus2 .. " " .. species2 .. subspecies2 .. "]]'''''" .. femaleSymbol



   		if species3 ~= "" then

   			templateArgs'hybrid' = templateArgs'hybrid'   .. " × "

   		                       .. "'''''[[" .. link3 .. "|" .. 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

        

        --[[ {{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 {{Speciesbox/getGenus}},  {{Speciesbox/getSpecies}} and {{Speciesbox/trim}}

                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 genus1 ~= "" then 

	    		templateArgs'genus' = genus1 

	    	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' = "''[[" .. fullName  .. '|'.. 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

				templateArgs'subspecies_name' = "''[[" .. fullName .. "|" .. abbr_subspecies_name  .. "]]''" 

			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 

	  			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' =  "[[" .. redirectName .. '|' .. 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' = "''[[" .. fullName .. "|" .. abbr_subspecies_name  .. "]]''" 

            end

            

            local binomial = "''" .. templateArgs'genus' .. ' ' .. templateArgs'species' .. "''"

            local abbrSpeciesName = string.sub(templateArgs'genus'],1,1) .. '.&nbsp;' .. string.sub(templateArgs'species'],1,1) .. '.&nbsp;' 

            abbrSpeciesName = "''" .. abbrSpeciesName .. "''"  -- italicise

            if templateArgs'infraspecies_rank2' then

	           local isrSeparator = "&nbsp;"

	           if templateArgs'infraspecies_rank2_abbrev' then

	             isrSeparator = "&nbsp;" ..  templateArgs'infraspecies_rank2_abbrev' .. "&nbsp;"

	           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 = "&nbsp;"

	           if templateArgs'infraspecies_rank1_abbrev' then

	             isrSeparator = "&nbsp;" ..  templateArgs'infraspecies_rank1_abbrev' .. "&nbsp;"

	           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 = {{{authority|{{{trinomial authority|{{{trinomial_authority|}}} }}} }}}

            infraspeciesbox: |species_authority = {{{parent_authority|{{{parent authority|{{{binomial authority|{{{binomial_authority|}}}}}}}}}}}}

            subspeciesbox: | species_authority = {{{parent authority|{{{binomial authority|{{{binomial_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/{{{taxon|<includeonly>{{PAGENAME}}

  		   {{Automatic taxobox/floating intro|taxon={{{taxon|{{PAGENAME}}}}} }}

  		]]

	

	end	-- end special handling for speciesbox, subspeciesbox, and automatic taxobox

	

	-- check taxonomy templates for automatic taxobox systtem

	--{{#ifexist:Template:Taxonomy/{{{taxon|<includeonly>{{PAGENAME}}</includeonly><noinclude>Acacia</noinclude>}}}

	--       |<noinclude><!--do nothing if it exists--></noinclude>

	--       |{{Automatic taxobox/floating intro|taxon={{{taxon|{{PAGENAME}}}}} }}

-->}}



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('<tr><td>a</td><td>b</td></tr>') -- 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('<tr>\n|M\n|N\n</tr>')    

	



	row=root:tag('tr'):node('<td>c</td><td>d</td>')    -- 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
From Wikipedia, the free encyclopedia

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' = "'''''[[" .. link1 .. "|" .. genus1 .. " " .. species1 .. subspecies1 .."]]'''''" .. maleSymbol 

   		                       .. " × "

   		                       .. "'''''[[" .. link2 .. "|" .. genus2 .. " " .. species2 .. subspecies2 .. "]]'''''" .. femaleSymbol



   		if species3 ~= "" then

   			templateArgs'hybrid' = templateArgs'hybrid'   .. " × "

   		                       .. "'''''[[" .. link3 .. "|" .. 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

        

        --[[ {{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 {{Speciesbox/getGenus}},  {{Speciesbox/getSpecies}} and {{Speciesbox/trim}}

                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 genus1 ~= "" then 

	    		templateArgs'genus' = genus1 

	    	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' = "''[[" .. fullName  .. '|'.. 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) .. '.&nbsp;' 

			                          .. 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

				templateArgs'subspecies_name' = "''[[" .. fullName .. "|" .. abbr_subspecies_name  .. "]]''" 

			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) .. '.&nbsp;' .. 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 

	  			local redirectName = templateArgs'genus' .. ' ' .. templateArgs'species' .. " subsp. " .. templateArgs'subspecies' 

				local shortName = "''" .. string.sub(templateArgs'genus'],1,1) .. '.&nbsp;' .. string.sub(templateArgs'species'],1,1) .. '.' .. separator .. templateArgs'subspecies' .. "''" 

				templateArgs'subspecies_name' =  "[[" .. redirectName .. '|' .. 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' = "''[[" .. fullName .. "|" .. abbr_subspecies_name  .. "]]''" 

            end

            

            local binomial = "''" .. templateArgs'genus' .. ' ' .. templateArgs'species' .. "''"

            local abbrSpeciesName = string.sub(templateArgs'genus'],1,1) .. '.&nbsp;' .. string.sub(templateArgs'species'],1,1) .. '.&nbsp;' 

            abbrSpeciesName = "''" .. abbrSpeciesName .. "''"  -- italicise

            if templateArgs'infraspecies_rank2' then

	           local isrSeparator = "&nbsp;"

	           if templateArgs'infraspecies_rank2_abbrev' then

	             isrSeparator = "&nbsp;" ..  templateArgs'infraspecies_rank2_abbrev' .. "&nbsp;"

	           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 = "&nbsp;"

	           if templateArgs'infraspecies_rank1_abbrev' then

	             isrSeparator = "&nbsp;" ..  templateArgs'infraspecies_rank1_abbrev' .. "&nbsp;"

	           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 = {{{authority|{{{trinomial authority|{{{trinomial_authority|}}} }}} }}}

            infraspeciesbox: |species_authority = {{{parent_authority|{{{parent authority|{{{binomial authority|{{{binomial_authority|}}}}}}}}}}}}

            subspeciesbox: | species_authority = {{{parent authority|{{{binomial authority|{{{binomial_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/{{{taxon|<includeonly>{{PAGENAME}}

  		   {{Automatic taxobox/floating intro|taxon={{{taxon|{{PAGENAME}}}}} }}

  		]]

	

	end	-- end special handling for speciesbox, subspeciesbox, and automatic taxobox

	

	-- check taxonomy templates for automatic taxobox systtem

	--{{#ifexist:Template:Taxonomy/{{{taxon|<includeonly>{{PAGENAME}}</includeonly><noinclude>Acacia</noinclude>}}}

	--       |<noinclude><!--do nothing if it exists--></noinclude>

	--       |{{Automatic taxobox/floating intro|taxon={{{taxon|{{PAGENAME}}}}} }}

-->}}



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('<tr><td>a</td><td>b</td></tr>') -- 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('<tr>\n|M\n|N\n</tr>')    

	



	row=root:tag('tr'):node('<td>c</td><td>d</td>')    -- 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

Videos

Youtube | Vimeo | Bing

Websites

Google | Yahoo | Bing

Encyclopedia

Google | Yahoo | Bing

Facebook