Permanently protected module
From Wikipedia, the free encyclopedia


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='<div style="font-weight:normal;font-size:smaller;">'..templateArgs'subheader'..'</div>'

    end

    

    --TODO do we need additional handling to check {{geological range}} 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 = '<div><small>Temporal range: ' .. templateArgs'temporal_range' .. '</small></div>' -- use <div> rather than <br/>

    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 = '[[Cladistics|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', '[[Synonym (taxonomy)|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 '<div style="float:right;">' .. output .. p.templateStyle( frame, src ) .. info.parameterCategory .. '</div>'

	

end  -- End the main function.	



--[[ ====================================================================================

     function to add conservation sections 

        uses template {{taxobox/species|{{{status_system|}}}|{{{status|}}}|{{{status_ref|}}}|extinct={{{extinct|}}} }} }}

 --]]

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

 

		local status = frame:expandTemplate{ title = 'taxobox/species', 

									          args = {templateArgsstatus..'_system' or '',

									    		      templateArgsstatus or '',

									    		      templateArgsstatus..'_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(status))

    	           :wikitext('\n|}')

        

        wikiText = '\n|-  colspan="2" style="background:' ..  info.headerColor .. ';" ' 

                      .. '\n' ..tostring(status)

    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 templateArgstarget  or templateArgstarget == '' then return "" end

	

	local bold = "" -- variable for bolding binomial and trinomial (type genus/species etc are not bolded)

	local showHeader = true

	

	local listHeader = (templateArgstarget..'_text' or headerText) 



	-- custom processing section

	--if target == 'binomial' or target == 'binomial2' or target == 'binomial3' or target == 'binomial4' then

	if target == 'binomial' then

		headerText = '[[Binomial nomenclature|' .. 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 = '[['.. trinomenLink .. '|' .. 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 = '[[Biodiversity|' .. headerText .. ']]'

	else

	   --TODO is any handling needed for other option

	   headerText = '[[' .. headerText .. ']]'

	end

    

	if templateArgstarget..'_ref' then

			headerText = headerText .. templateArgstarget..'_ref' .. '\n'

	 end

	

	local contentString = ''   -- content for the content cell

	if target == 'diversity' and templateArgs'diversity' ~= "" then

		if templateArgstarget..'_link' and templateArgstarget..'_link' ~= "" then 

		    contentString =  '\n[[' .. templateArgstarget..'_link' .. '|' .. templateArgstarget .. ']]\n' 

		else

			contentString =  '\n' .. templateArgstarget .. '\n'

		end

	 else

	 	-- taxon name and authority (binomial, type species, etc)

		local authorityString = ''

		if templateArgstarget..'_authority' then

			authorityString = '<br/><small>' .. templateArgstarget..'_authority' .. '</small>' -- \n' 

		end 

		contentString =  bold .. templateArgstarget .. bold .. authorityString .. '\n' 

		--contentString =  '\n' ..  bold .. templateArgs[target] .. bold .. authorityString .. '\n'  -- extra <p> inserted

    end 	 

	

	-- add table rows

	if templateArgstarget and templateArgstarget ~= '' 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 templateArgstarget or templateArgstarget == "" then return "" end -- redundant for now

    

    local wikiText = ""

    local refString = ''

	if templateArgstarget..'_ref' then

		   --add '_ref' option for 'synonym_ref' (the rest get it as a bonus) TODO check example

			refString = templateArgstarget..'_ref' --.. '\n' 	

	 end

	local listHeader = (templateArgstarget..'_text' or headerText) .. refString

	-- add table rows

	if templateArgstarget and templateArgstarget ~= ''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' .. templateArgstarget .. '\n' )	

        wikiText = wikiText .. '\n|- \n| colspan="2" class="section-content" '

               .. '|' .. '\n' .. templateArgstarget .. '\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 templateArgstarget and templateArgstarget ~= '' then

	 	

        local imageWidth = ''

        local imageCaptionString = ''

        if templateArgstarget..'_caption' then 

        	--imageCaptionString = '<br /><small><div style="text-align:center">' .. templateArgs[target .. '_caption'] .. '</div></small>' 

        	--imageCaptionString = '<br /><div>' .. templateArgs[target .. '_caption'] .. '</div>' 

        	imageCaptionString = templateArgstarget .. '_caption'

        end

        local imageAltString = ''

        if templateArgstarget..'_alt' then

        	imageAltString = templateArgstarget..'_alt'

        elseif templateArgstarget..'_caption' then

        	imageAltString = templateArgstarget..'_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 = templateArgstarget],

							        size = templateArgstarget..'_width'],

							        sizedefault = 'frameless',

							        alt = imageAltString,

							        upright = templateArgstarget..'_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 = "[[Taxonomy_(biology)|Scientific classification]]"

	if templateArgs'virus_group'  then 

		taxonomyHeader = "[[Virus classification]]"

	elseif templateArgs'ichnos'  then 

		taxonomyHeader = "[[Trace fossil classification]]"

	elseif templateArgs'veterovata'  then 

		taxonomyHeader = "[[Veterovata|Eggshell classification]]"

	else

		-- TODO add other options (DONE but not verified ichnos or veterovata)

		-- ! colspan=2 style="min-width:15em; text-align: center{{#if:{{{colour|}}}|{{;}} background-color{{COLON}} {{{colour}}} }}" | 

		--   {{#if:{{{virus_group|{{{virus|}}}}}}|[[Virus classification]]

		--    	|{{#if:{{{ichnos|}}}|[[Trace fossil classification]]

	    --   	|{{#if:{{{veterovata|}}}|[[Veterovata|Eggshell classification]]

	    --   |[[Taxonomy (biology)|Scientific classification]]}} }} }} 

     	--	    {{#if:{{{edit link|}}}|{{edit taxonomy|{{{parent|}}} | {{{edit link}}} }}

		--   {{#if: {{{classification_status|}}} | <br>({{{classification_status}}}) | }} }}

		-- 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/?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  = '<span class="plainlinks" style="'.. style ..'">'

			.. '[[File:OOjs UI icon edit-ltr.svg|15px|link=' .. link .. '|' .. tooltip  .. ']]</span>'

			--.. '[[File:Red Pencil Icon.png|link=' .. link .. '|' .. tooltip  .. ']]</span>'

			

	end

	local status = ""

	if templateArgs'classification_status' then 

		status = '<div style="font-weight:normal;" >(' .. templateArgs'classification_status' .. ')'

	    if templateArgs'classification_ref' then status = status .. templateArgs'classification_ref' end

		status = status .. '</div>'

	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: {{taxobox/taxonomy}}

	--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 {{taxobox/showtaxon}} [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 templateArgsv then

		    local taxonName = templateArgsv

		    

		    local taxonRank = frame:expandTemplate{ title = "anglicise rank", args = {taxonRanksk]} }

		    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 taxonRanksk == "virus_group" then

		    	taxonName = frame:expandTemplate{ title = "Virus group", args = {templateArgsv]} }

		    --	taxonRank = "Group" -- handled by anglicise rank template

		    end

		    local authorityString = ''

		    if templateArgstaxonRanksk..'_authority' then

		    	authorityString = '<br /><small>'..templateArgstaxonRanksk..'_authority'..'</small>'

		    end

		    local taxonString = '<span class="'.. taxonRanksk ..'">'..taxonName..'</span>'..authorityString



		    local row = taxonomyTable:tag('tr')

	     	row:tag('td'):wikitext(taxonRank..':')

		    row:tag('td'):wikitext(taxonString)

		    --:wikitext('<br /><small>'..parent.args[taxonRanks[k]..'_authority']..'</small>')

            

            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 

	   --[[(1) if color_as|colour_as|color as|colour as set, use template {{Taxobox colour|color_as}}

	   	   (2) else use the auto taxonnomy tree to find colour: {{#invoke:Autotaxobox|taxoboxColour| }}

	    {{#invoke:Autotaxobox|taxoboxColour|{{{parent|{{{genus|{{first word|{{{taxon|{{PAGENAME}} }}

	--]]

		--[[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}}} [parent should be set]

			

			frame.args1 = templateArgs'parent'

			

	        return autotaxa.taxoboxColour(frame)

			--return	"palegreen"

		end

	else -- use manual taxobox colours

		--{{Taxobox colour|{{{regnum|{{{virus_group|{{{unranked_phylum|{{{phylum|''[[Incertae sedis]]''}}}}}}}}}}}}}}

		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
Permanently protected module
From Wikipedia, the free encyclopedia


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='<div style="font-weight:normal;font-size:smaller;">'..templateArgs'subheader'..'</div>'

    end

    

    --TODO do we need additional handling to check {{geological range}} 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 = '<div><small>Temporal range: ' .. templateArgs'temporal_range' .. '</small></div>' -- use <div> rather than <br/>

    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 = '[[Cladistics|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', '[[Synonym (taxonomy)|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 '<div style="float:right;">' .. output .. p.templateStyle( frame, src ) .. info.parameterCategory .. '</div>'

	

end  -- End the main function.	



--[[ ====================================================================================

     function to add conservation sections 

        uses template {{taxobox/species|{{{status_system|}}}|{{{status|}}}|{{{status_ref|}}}|extinct={{{extinct|}}} }} }}

 --]]

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

 

		local status = frame:expandTemplate{ title = 'taxobox/species', 

									          args = {templateArgsstatus..'_system' or '',

									    		      templateArgsstatus or '',

									    		      templateArgsstatus..'_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(status))

    	           :wikitext('\n|}')

        

        wikiText = '\n|-  colspan="2" style="background:' ..  info.headerColor .. ';" ' 

                      .. '\n' ..tostring(status)

    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 templateArgstarget  or templateArgstarget == '' then return "" end

	

	local bold = "" -- variable for bolding binomial and trinomial (type genus/species etc are not bolded)

	local showHeader = true

	

	local listHeader = (templateArgstarget..'_text' or headerText) 



	-- custom processing section

	--if target == 'binomial' or target == 'binomial2' or target == 'binomial3' or target == 'binomial4' then

	if target == 'binomial' then

		headerText = '[[Binomial nomenclature|' .. 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 = '[['.. trinomenLink .. '|' .. 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 = '[[Biodiversity|' .. headerText .. ']]'

	else

	   --TODO is any handling needed for other option

	   headerText = '[[' .. headerText .. ']]'

	end

    

	if templateArgstarget..'_ref' then

			headerText = headerText .. templateArgstarget..'_ref' .. '\n'

	 end

	

	local contentString = ''   -- content for the content cell

	if target == 'diversity' and templateArgs'diversity' ~= "" then

		if templateArgstarget..'_link' and templateArgstarget..'_link' ~= "" then 

		    contentString =  '\n[[' .. templateArgstarget..'_link' .. '|' .. templateArgstarget .. ']]\n' 

		else

			contentString =  '\n' .. templateArgstarget .. '\n'

		end

	 else

	 	-- taxon name and authority (binomial, type species, etc)

		local authorityString = ''

		if templateArgstarget..'_authority' then

			authorityString = '<br/><small>' .. templateArgstarget..'_authority' .. '</small>' -- \n' 

		end 

		contentString =  bold .. templateArgstarget .. bold .. authorityString .. '\n' 

		--contentString =  '\n' ..  bold .. templateArgs[target] .. bold .. authorityString .. '\n'  -- extra <p> inserted

    end 	 

	

	-- add table rows

	if templateArgstarget and templateArgstarget ~= '' 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 templateArgstarget or templateArgstarget == "" then return "" end -- redundant for now

    

    local wikiText = ""

    local refString = ''

	if templateArgstarget..'_ref' then

		   --add '_ref' option for 'synonym_ref' (the rest get it as a bonus) TODO check example

			refString = templateArgstarget..'_ref' --.. '\n' 	

	 end

	local listHeader = (templateArgstarget..'_text' or headerText) .. refString

	-- add table rows

	if templateArgstarget and templateArgstarget ~= ''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' .. templateArgstarget .. '\n' )	

        wikiText = wikiText .. '\n|- \n| colspan="2" class="section-content" '

               .. '|' .. '\n' .. templateArgstarget .. '\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 templateArgstarget and templateArgstarget ~= '' then

	 	

        local imageWidth = ''

        local imageCaptionString = ''

        if templateArgstarget..'_caption' then 

        	--imageCaptionString = '<br /><small><div style="text-align:center">' .. templateArgs[target .. '_caption'] .. '</div></small>' 

        	--imageCaptionString = '<br /><div>' .. templateArgs[target .. '_caption'] .. '</div>' 

        	imageCaptionString = templateArgstarget .. '_caption'

        end

        local imageAltString = ''

        if templateArgstarget..'_alt' then

        	imageAltString = templateArgstarget..'_alt'

        elseif templateArgstarget..'_caption' then

        	imageAltString = templateArgstarget..'_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 = templateArgstarget],

							        size = templateArgstarget..'_width'],

							        sizedefault = 'frameless',

							        alt = imageAltString,

							        upright = templateArgstarget..'_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 = "[[Taxonomy_(biology)|Scientific classification]]"

	if templateArgs'virus_group'  then 

		taxonomyHeader = "[[Virus classification]]"

	elseif templateArgs'ichnos'  then 

		taxonomyHeader = "[[Trace fossil classification]]"

	elseif templateArgs'veterovata'  then 

		taxonomyHeader = "[[Veterovata|Eggshell classification]]"

	else

		-- TODO add other options (DONE but not verified ichnos or veterovata)

		-- ! colspan=2 style="min-width:15em; text-align: center{{#if:{{{colour|}}}|{{;}} background-color{{COLON}} {{{colour}}} }}" | 

		--   {{#if:{{{virus_group|{{{virus|}}}}}}|[[Virus classification]]

		--    	|{{#if:{{{ichnos|}}}|[[Trace fossil classification]]

	    --   	|{{#if:{{{veterovata|}}}|[[Veterovata|Eggshell classification]]

	    --   |[[Taxonomy (biology)|Scientific classification]]}} }} }} 

     	--	    {{#if:{{{edit link|}}}|{{edit taxonomy|{{{parent|}}} | {{{edit link}}} }}

		--   {{#if: {{{classification_status|}}} | <br>({{{classification_status}}}) | }} }}

		-- 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/?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  = '<span class="plainlinks" style="'.. style ..'">'

			.. '[[File:OOjs UI icon edit-ltr.svg|15px|link=' .. link .. '|' .. tooltip  .. ']]</span>'

			--.. '[[File:Red Pencil Icon.png|link=' .. link .. '|' .. tooltip  .. ']]</span>'

			

	end

	local status = ""

	if templateArgs'classification_status' then 

		status = '<div style="font-weight:normal;" >(' .. templateArgs'classification_status' .. ')'

	    if templateArgs'classification_ref' then status = status .. templateArgs'classification_ref' end

		status = status .. '</div>'

	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: {{taxobox/taxonomy}}

	--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 {{taxobox/showtaxon}} [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 templateArgsv then

		    local taxonName = templateArgsv

		    

		    local taxonRank = frame:expandTemplate{ title = "anglicise rank", args = {taxonRanksk]} }

		    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 taxonRanksk == "virus_group" then

		    	taxonName = frame:expandTemplate{ title = "Virus group", args = {templateArgsv]} }

		    --	taxonRank = "Group" -- handled by anglicise rank template

		    end

		    local authorityString = ''

		    if templateArgstaxonRanksk..'_authority' then

		    	authorityString = '<br /><small>'..templateArgstaxonRanksk..'_authority'..'</small>'

		    end

		    local taxonString = '<span class="'.. taxonRanksk ..'">'..taxonName..'</span>'..authorityString



		    local row = taxonomyTable:tag('tr')

	     	row:tag('td'):wikitext(taxonRank..':')

		    row:tag('td'):wikitext(taxonString)

		    --:wikitext('<br /><small>'..parent.args[taxonRanks[k]..'_authority']..'</small>')

            

            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 

	   --[[(1) if color_as|colour_as|color as|colour as set, use template {{Taxobox colour|color_as}}

	   	   (2) else use the auto taxonnomy tree to find colour: {{#invoke:Autotaxobox|taxoboxColour| }}

	    {{#invoke:Autotaxobox|taxoboxColour|{{{parent|{{{genus|{{first word|{{{taxon|{{PAGENAME}} }}

	--]]

		--[[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}}} [parent should be set]

			

			frame.args1 = templateArgs'parent'

			

	        return autotaxa.taxoboxColour(frame)

			--return	"palegreen"

		end

	else -- use manual taxobox colours

		--{{Taxobox colour|{{{regnum|{{{virus_group|{{{unranked_phylum|{{{phylum|''[[Incertae sedis]]''}}}}}}}}}}}}}}

		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

Videos

Youtube | Vimeo | Bing

Websites

Google | Yahoo | Bing

Encyclopedia

Google | Yahoo | Bing

Facebook