มอดูล: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 = 'ERROR: parameter(s) specifying taxon are incorrect; see documentation'
		else
			name = targetTaxon
			if italicsRequired then
				name = "" .. targetTaxon .. ""
			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 = ""..species..""
		else
			species = ""..species..""
		end
	end
	-- embolden lowest rank
	if infraTaxon ~=  then
		infraTaxon = ""..infraTaxon..""
	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 = {} }
	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 > 1 then autoTaxonType = 'ERROR' end
	return autoTaxon, autoTaxonType, infraTaxon, infraTaxonRank, targetTaxon, targetTaxonRank
end
return p