Module:Autovirusbox
require('Module:No globals')
 local ItalicTitle = require('Module:Italic title')
 local p = {} -- functions made public
 local l = {} -- internal functions, kept separate
 
 -- =============================================================================
 -- main implements Template:Virusbox; see the documentation of that template
 -- for details.
 -- =============================================================================
 
 function p.main(frame)
 	local args
 	if frame.args['direct'] == 'yes' then args = frame.args
 	else args = frame:getParent().args end
 	-- ---------------------------------------------------------------------
 	-- pick up taxobox parameters from the caller that need to be processed;
 	-- most are passed on unchanged
 	-- ---------------------------------------------------------------------
 	local name = args['name'] or ''
 	local taxon = args['taxon'] or ''
 	local parent = args['parent'] or ''
 	local species = args['species'] or ''
 	local strain = args['strain'] or ''
 	local serotype = args['serotype'] or ''
 	local virus = args['virus'] or ''
 	local displayParents = args['display_parents'] or '1'
 --[[
 	local authority = args['authority'] or ''
 	local parentAuthority = args['parent_authority'] or ''
 	local gParentAuthority = args['grandparent_authority'] or ''
 	local ggParentAuthority = args['greatgrandparent_authority'] or ''
 	local gggParentAuthority = args['greatgreatgrandparent_authority'] or ''
 	local typeGenusAuthority = args['type_genus_authority'] or ''
 ]]
 	local subdivision = args['subdivision'] or ''
 	local subdivisionRanks = args['subdivision_ranks'] or ''
 	local subdivisionRef = args['subdivision_ref'] or args['subdivision ref'] or ''
 
 	-- ------------------------------------------------------
 	-- set the taxobox parameters determined by this function
 	-- ------------------------------------------------------
 	local autoTaxon, autoTaxonType, infraTaxon, infraTaxonRank, targetTaxon, targetTaxonRank = l.paramChk(frame, taxon, parent, species, strain, serotype, virus)
 	-- set default taxobox name/title
 	local italicsRequired = frame:expandTemplate{ title = 'Is italic taxon', args = {targetTaxonRank, virus='yes'} } == 'yes'
 	if name == '' then
 		if autoTaxonType == 'ERROR' then
 			name = '&lt;span class=&quot;error&quot;&gt;ERROR: parameter(s) specifying taxon are incorrect; see [[Template:Virusbox/doc#Usage|documentation]]&lt;/span&gt;'
 		else
 			name = targetTaxon
 			if italicsRequired then
 				name = &quot;''&quot; .. targetTaxon .. &quot;''&quot;
 			end
 		end
 	end
 	-- the page name (title) should be italicized if it's the same as the target taxon and that is italicized
 	local currentPage = mw.title.getCurrentTitle()
 	local pagename = currentPage.text
 	if pagename == targetTaxon then
 		if italicsRequired then ItalicTitle._main({}) end
 	end
 	-- is the auto-taxon name bold or linked (i.e. will it be the last row in the taxobox or not)?
 	local boldFirst = 'bold' 
 	if autoTaxonType == 'PARENT' then boldFirst = 'link' end
 	-- italicize and link species name, or embolden if nothing below
 	if species ~= '' then
 		if infraTaxon ~= '' then
 			species = &quot;''[[&quot;..species..&quot;]]''&quot;
 		else
 			species = &quot;'''''&quot;..species..&quot;'''''&quot;
 		end
 	end
 	-- embolden lowest rank
 	if infraTaxon ~= '' then
 		infraTaxon = &quot;'''&quot;..infraTaxon..&quot;'''&quot;
 	end
 	-- set offset and fix display_parents if there are ranks below autoTaxon
 	local offset = 0
 	if infraTaxon ~= '' then offset = offset + 1 end
 	if species ~= '' then offset = offset + 1 end
 	if offset ~= 0 then
 		displayParents = tostring(tonumber(displayParents) - offset)
 	end
 	-- fill in a missing subdivision_ranks parameter
 	if subdivision ~= '' and subdivisionRanks == '' then
 		subdivisionRanks =  frame:expandTemplate{ title = 'Children rank', args = {targetTaxonRank} }
 	end
 	-- ------------------------------------------------
 	-- now call Taxobox/core with all of its parameters
 	-- ------------------------------------------------
 	local res = frame:expandTemplate{ title = 'Taxobox/core', args =
 		{ ['edit link'] = 'e',
 		  virus = 'yes',
 		  colour = frame:expandTemplate{ title = 'Taxobox colour', args = { 'virus' } },
 		  name = name,
 		  parent = autoTaxon,
 		  bold_first = boldFirst,
 --[[
 		  authority = authority,
           parent_authority = parentAuthority,
 		  grandparent_authority = gparentAuthority,
 		  grandparent_authority = gparentAuthority,
 		  greatgrandparent_authority = ggparentAuthority,
 		  greatgreatgrandparent_authority = gggparentAuthority,
 		  offset = tostring(offset),
 ]]		  
 		  image = args['image'] or '',
 		  image_upright = args['image_upright'] or '',
 		  image_alt = args['image_alt'] or '',
 		  image_caption = args['image_caption'] or '',
 		  image2 = args['image2'] or '',
 		  image2_upright = args['image2_upright'] or '',
 		  image2_alt = args['image2_alt'] or '',
 		  image2_caption = args['image2_caption'] or '',
 		  species = species,
 		  virus_infrasp = infraTaxon,
 		  virus_infrasp_rank =  infraTaxonRank,
 		  display_taxa = displayParents,
 		  type_genus = args['type_genus'] or '',
 		  --type_genus_authority = args['type_genus_authority'] or '',
 		  type_species = args['type_species'] or '',
 		  --type_species_authority = args['type_species_authority'] or ''
 		  subdivision_ranks = subdivisionRanks,
 		  subdivision_ref = subdivisionRef,
 		  subdivision = subdivision,
 		  type_strain = args['type_strain'] or '',
 		  synonyms = args['synonyms'] or '',
 		  synonyms_ref = args['synonyms_ref'] or '',
 		  range_map = args['range_map'] or '',
 		  range_map_upright = args['range_map_upright'] or '',
 		  range_map_alt = args['range_map_alt'] or '',
 		  range_map_caption = args['range_map_caption'] or '',
 		} }
 	-- put page in error-tracking category if required
 	if autoTaxonType == 'ERROR' then
 		res = res .. frame:expandTemplate{ title = 'Main other', args = {'[[Category:Virusboxes with incorrect parameters that specify taxon]]'} }
 	end
 	return res
 end
 
 -- =============================================================================
 -- paramChk checks the taxon-specifying parameters for consistency, selecting
 -- the target taxon (the taxon that is the target of the taxobox), the
 -- infra-taxon (the taxon below species level), if any, and the 'auto-taxon',
 -- the taxon that is the entry point into the automated taxobox system.
 -- =============================================================================
 
 function l.paramChk(frame, taxon, parent, species, strain, serotype, virus)
 	-- set target taxon and infra-taxon
 	local infraTaxon = ''
 	local infraTaxonRank = ''
 	local targetTaxon
 	local targetTaxonRank
 	if strain ~= '' then
 		infraTaxon = strain
 		infraTaxonRank = 'strain'
 		targetTaxon = infraTaxon
 		targetTaxonRank = infraTaxonRank
 	elseif serotype ~= '' then
 		infraTaxon = serotype
 		infraTaxonRank = 'serotype'
 		targetTaxon = infraTaxon
 		targetTaxonRank = infraTaxonRank
 	elseif virus ~= '' then
 		infraTaxon = virus
 		infraTaxonRank = 'virus'
 		targetTaxon = infraTaxon
 		targetTaxonRank = infraTaxonRank
 	elseif species ~= '' then
 		targetTaxon = species
 		targetTaxonRank = 'species'
 	else
 		targetTaxon = taxon
 		targetTaxonRank = frame:expandTemplate{ title = 'Taxon info', args = {targetTaxon, 'rank' } }
 	end
 	-- set the autotaxon (entry into the automated taxobox system) if the
 	-- parameters are valid; the default is invalid
 	local autoTaxon = ''
 	local autoTaxonType = 'ERROR'
 	if taxon ~= '' then
 		if parent..species..infraTaxon  == '' then
 			autoTaxon = taxon
 			autoTaxonType = 'TAXON'
 		end
 	elseif parent ~= '' and  (species ~='' or infraTaxon ~= '') then
 		autoTaxon = parent
 		autoTaxonType = 'PARENT'
 	end
 	-- check for multiple infra-taxa
 	local count = 0
 	if strain ~= '' then count = count + 1 end
 	if serotype ~= '' then count = count + 1 end
 	if virus ~= '' then count = count + 1 end
 	if count &gt; 1 then autoTaxonType = 'ERROR' end
 	return autoTaxon, autoTaxonType, infraTaxon, infraTaxonRank, targetTaxon, targetTaxonRank
 end