# Module:Autovirusbox

require('strict')  
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  
local args  
if .args['direct'] == 'yes' then args = .args  
else args = :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(, taxon, parent, species, strain, serotype, virus)  
-- set default taxobox name/title  
local italicsRequired = :expandTemplate{ title = 'Is italic taxon', args = {targetTaxonRank, virus='yes'} } == 'yes' and args["italic_title"] ~= "no"  
if name == '' then  
if autoTaxonType == 'ERROR' then  
name = '<span>ERROR: parameter(s) specifying taxon are incorrect; see documentation</span>'  
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 = :expandTemplate{ title = 'Children rank', args = {targetTaxonRank} }  
end  
-- ------------------------------------------------  
-- now call Taxobox/core with all of its parameters  
-- ------------------------------------------------  
local res = :expandTemplate{ title = 'Taxobox/core', args =  
{ ['edit link'] = 'e',  
virus = 'yes',  
colour = :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 .. :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(, 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 = :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  
-- This is not this module's limitation: go blame Template:Taxobox/core!  
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