This is the
module sandbox page for
Module:Automated taxobox (
diff). See also the companion subpage for test cases. |
This module depends on the following other modules: |
Module:Automated taxobox ( talk · · hist · links · doc · subpages · sandbox · testcases)
This module provides the functionality of various automated taxoboxes.
Currently, it implements {{
Automatic taxobox}}, {{
Ichnobox}} and {{
Oobox}} – see {{
Automatic taxobox}} for more details and parameters. For this purpose, it can be called via the relevant template, e.g. {{Automatic taxobox |...}}
, or directly, in which case |direct=yes
must be supplied, e.g. {{#invoke:Automated taxobox|automaticTaxobox |direct=yes |...}}
.
Support for other automated taxoboxes (e.g. {{ Speciesbox}}) is intended to be added in future. (Currently, only providing a name for a taxobox generated by {{ Speciesbox}} is handled by this module.)
require('strict')
local TaxonItalics = require('Module:TaxonItalics/sandbox')
local Autotaxobox = require('Module:Autotaxobox/sandbox')
local ItalicTitle = require('Module:Italic title')
local p = {} -- functions made public
local l = {} -- nonpublic internal functions and variables global to the module
l.system = '' -- '' for normal scientific classification (default)
-- 'ichnos' for trace fossil classification
-- 'veterovata' for egg fossil classification
-- =============================================================================
-- ichnobox implements Template:Ichnobox; see the documentation of that
-- template for details.
-- The only difference from Template:Automatic taxobox is in the taxobox colour
-- and classification link and the parameters for type species and genera.
-- =============================================================================
function p.ichnobox(frame)
l.system = 'ichnos'
return p.automaticTaxobox(frame)
end
-- =============================================================================
-- oobox implements Template:Oobox; see the documentation of that
-- template for details.
-- The only difference from Template:Automatic taxobox is in the taxobox colour
-- and classification link and the parameters for type species and genera.
-- =============================================================================
function p.oobox(frame)
l.system = 'veterovata'
return p.automaticTaxobox(frame)
end
-- =============================================================================
-- automaticTaxobox implements Template:Automatic taxobox; see the documentation
-- of that template for details.
-- It also implements Template:Ichnobox and Template:Oobox. The small
-- differences are signalled by the module-wide variable l.system.
-- The following parameters present in the old template code version of
-- Template:Automatic taxobox were not used and have not been implemented:
-- image_caption_align
-- image2_caption_align
-- binomial2
-- binomial2_authority
-- binomial3
-- binomial3_authority
-- binomial4
-- binomial4_authority
-- =============================================================================
function p.automaticTaxobox(frame)
local args
if frame.args'direct' == 'yes' then args = frame.args
else args = frame:getParent().args end
local res = ''
-- ---------------------------------------------------------------------
-- pick up taxobox parameters from the caller that need to be processed;
-- most will be passed on unchanged
-- ---------------------------------------------------------------------
local pagename = args'pagename' or '' -- for testing and debugging only
local italicTitle = args'italic_title' or args'italic title' or ''
local ichnos = ''
if l.system == 'ichnos' then ichnos = 'true' end
local veterovata = ''
if l.system == 'veterovata' then veterovata = 'true' end
local fossilRange = args'fossil_range' or args'fossil range' or args'temporal_range' or args'temporal range' or ''
local oldestFossil = args'oldest_fossil' or args'oldest fossil' or ''
local youngestFossil = args'youngest_fossil' or args'youngest fossil' or ''
local name = args'name' or ''
local colourAs = args'color_as' or args'color as' or args'colour_as' or args'colour as' or ''
local taxon = args'taxon' or ''
local authority = args'authority' or ''
local parentAuthority = args'parent_authority' or args'parent authority' or ''
local subdivision = args'subdivision' or ''
local subdivisionRef = args'subdivision_ref' or args'subdivision ref' or ''
local subdivisionRanks = args'subdivision_ranks' or args'subdivision ranks' or ''
local manualFlag = 'text' -- marks manually specified ranks
local binomial = args'binomial' or args'binomial_'..manualFlag or args'binomial '..manualFlag or ''
local binomialAuthority = args'binomial_authority' or args'binomial authority' or ''
local genusManual = args'genus_'..manualFlag or args'genus '..manualFlag or''
local speciesManual = args'species_'..manualFlag or args'species '..manualFlag or''
-- ------------------------------------------------------
-- set the taxobox parameters determined by this function
-- ------------------------------------------------------
fossilRange = l.setfossilRange(frame, fossilRange, oldestFossil, youngestFossil)
-- use the base page name as the taxon if the taxon parameter is missing
local currentPagename = mw.title.getCurrentTitle()
if pagename == '' then pagename = currentPagename.text end -- pagename para only used in testing and
local basePagename = pagename
if italicTitle ~= 'taxon' then basePagename = mw.ustring.gsub(basePagename, '%s+%b()$', '', 1) end
local taxonParaMissingError = false
if taxon == '' then
taxonParaMissingError = true
taxon = basePagename
end
-- decide if the page name and taxobox name need to be italicized;
-- if italic_title is not set, then if the names are the taxon, use its rank to decide
local ok, taxonRank = Autotaxobox.getTaxonInfoItem(frame, taxon, 'rank') -- taxonRank needed later if not here
if italicTitle == '' then
if not (ok and taxonRank ~= '' and
frame:expandTemplate{ title = 'Is italic taxon', args = {taxonRank} } == 'yes') then
italicTitle = 'no'
end
end
-- remove any " (DISAMBIG)" or "/MODIFIER" from the taxon's name;
-- if the base page name is the same as the base taxon name, then italicization can be applied
local baseTaxon = taxon
if italicTitle ~= 'taxon' then baseTaxon = mw.ustring.gsub(baseTaxon, '%s+%b()$', '', 1) end
baseTaxon = mw.ustring.gsub(baseTaxon, '/.*$', '', 1)
if italicTitle == '' and basePagename == baseTaxon then
italicTitle = 'yes'
end
-- italicize the page name (page title) if required
if currentPagename.namespace == 0 and (italicTitle == 'yes' or italicTitle == 'taxon') then
if italicTitle == 'taxon' or TaxonItalics.hasConnectingTerm(baseTaxon) then
res = res .. frame:expandTemplate{ title = 'Italic taxon title', args = {} }
italicTitle = 'yes'
else ItalicTitle._main({})
end
end
-- set the taxobox name if not supplied, italicizing it if appropriate.
if name == '' then
name = basePagename
if italicTitle == 'yes' then
name = TaxonItalics.italicizeTaxonName(name, false, false)
end
-- name = name .. '/' .. baseTaxon .. '/' .. nameRank
end
-- determine taxobox colour
local colour = ''
if colourAs ~= '' then
colour = frame:expandTemplate{ title = 'Taxobox colour', args = {colourAs} }
elseif l.system == 'ichnos' then
colour = frame:expandTemplate{ title = 'Taxobox colour', args = {'Ichnos'} }
elseif l.system == 'veterovata' then
colour = frame:expandTemplate{ title = 'Taxobox colour', args = {'Veterovata'} }
else
colour = Autotaxobox.getTaxoboxColour(frame, taxon)
end
-- fill in a missing subdivision_ranks parameter
if subdivision ~= '' and subdivisionRanks == '' and ok and taxonRank ~= '' then
subdivisionRanks = frame:expandTemplate{ title = 'Children rank', args = {taxonRank} }
end
-- set binomial parameters if the target taxon is (unusually) a species
local genusAuthority = ''
if binomial == '' then
if ok and taxonRank == 'species' then
binomial = TaxonItalics.italicizeTaxonName(taxon, false, false)
binomialAuthority = authority
end
end
-- handle any manually set ranks
local boldFirst = ''
local offset = 0
if speciesManual ~= '' then
offset = offset + 1
binomialAuthority = authority
if binomial == '' then binomial = '<span class="error">Error: binomial parameter value is missing</span>' end
end
if genusManual ~= '' then
boldFirst = 'link'
offset = offset + 1
if offset == 1 then
genusAuthority = authority
else
genusAuthority = parentAuthority
end
end
-- process type genus and type species if present; italicize if they seem not to have an authority attached
local typeGenus = ''
local typeGenusAuthority = ''
local typeSpecies = ''
local typeSpeciesAuthority = ''
local typeIchnogenus = ''
local typeIchnogenusAuthority = ''
local typeIchnospecies = ''
local typeIchnospeciesAuthority = ''
local typeOogenus = ''
local typeOogenusAuthority = ''
local typeOospecies = ''
local typeOospeciesAuthority = ''
if l.system == '' then
typeGenus = l.italicizeTypeName(args'type_genus' or args'type genus' or '')
typeGenusAuthority = args'type_genus_authority' or args'type genus authority' or ''
typeSpecies = l.italicizeTypeName(args'type_species' or args'type species' or '')
typeSpeciesAuthority = args'type_species_authority' or args'type species authority' or ''
elseif l.system == 'ichnos' then
typeIchnogenus = l.italicizeTypeName(args'type_ichnogenus' or args'type ichnogenus' or '')
typeIchnogenusAuthority = args'type_ichnogenus_authority' or args'type ichnogenus authority' or ''
typeIchnospecies = l.italicizeTypeName(args'type_ichnospecies' or args'type ichnospecies' or '')
typeIchnospeciesAuthority = args'type_ichnospecies_authority' or args'type ichnospecies authority' or ''
elseif l.system == 'veterovata' then
typeOogenus = l.italicizeTypeName(args'type_oogenus' or args'type oogenus' or '')
typeOogenusAuthority = args'type_oogenus_authority' or args'type oogenus authority' or ''
typeOospecies = l.italicizeTypeName(args'type_oospecies' or args'type oospecies' or '')
typeOospeciesAuthority = args'type_oospecies_authority' or args'type oospecies authority' or ''
end
-- ------------------------------------------------
-- now call Taxobox/core with all of its parameters
-- ------------------------------------------------
res = res .. frame:expandTemplate{ title = 'Taxobox/core', args =
{ ichnos = ichnos,
veterovata = veterovata,
'edit link' = 'e',
temporal_range = fossilRange,
display_taxa = args'display_parents' or args'display parents' or '1',
parent = taxon,
authority = authority,
parent_authority = parentAuthority,
grandparent_authority = args'grandparent_authority' or args'grandparent authority' or '',
greatgrandparent_authority = args'greatgrandparent_authority' or args'greatgrandparent authority' or '',
greatgreatgrandparent_authority = args'greatgreatgrandparent_authority' or args'greatgreatgrandparent authority' or '',
name = name,
colour = colour,
status = args'status' or '',
status_system = args'status_system' or args'status system' or '',
status_ref = args'status_ref' or args'status ref' or '',
status2 = args'status2' or '',
status2_system = args'status2_system' or args'status2 system' or '',
status2_ref = args'status2_ref' or args'status2 ref' or '',
trend = args'trend' or '',
extinct = args'extinct' or '',
image = args'image' or '',
upright = args'image_upright' or args'image upright' or '',
image_alt = args'image_alt' or args'image alt' or '',
image_caption = args'image_caption' or args'image caption' or '',
image2 = args'image2' or '',
upright2 = args'image2_upright' or args'image2 upright' or '',
image2_alt = args'image2_alt' or args'image2 alt' or '',
image2_caption = args'image2_caption' or args'image2 caption' or '',
classification_status = args'classification_status' or args'classification status' or '',
diversity = args'diversity' or '',
diversity_ref = args'diversity_ref' or args'diversity ref' or '',
diversity_link = args'diversity_link' or args'diversity link' or '',
bold_first = boldFirst,
offset = offset,
genus = genusManual,
genus_authority = genusAuthority,
species = speciesManual,
binomial = binomial,
binomial_authority = binomialAuthority,
trinomial = args'trinomial' or '',
trinomial_authority = args'trinomial_authority' or args'trinomial authority' or '',
type_genus = typeGenus,
type_genus_authority = typeGenusAuthority,
type_species = typeSpecies,
type_species_authority = typeSpeciesAuthority,
type_ichnogenus = typeIchnogenus,
type_ichnogenus_authority = typeIchnogenusAuthority,
type_ichnospecies = typeIchnospecies,
type_ichnospecies_authority = typeIchnospeciesAuthority,
type_oogenus = typeOogenus,
type_oogenus_authority = typeOogenusAuthority,
type_oospecies = typeOospecies,
type_oospecies_authority = typeOospeciesAuthority,
subdivision = subdivision,
subdivision_ref = subdivisionRef,
subdivision_ranks = subdivisionRanks,
type_strain = args'type_strain' or args'type strain' or '',
range_map = args'range_map' or args'range map' or '',
range_map_upright = args'range_map_upright' or args'range map upright' or '',
range_map_alt = args'range_map_alt' or args'range map alt' or '',
range_map_caption = args'range_map_caption' or args'range map caption' or '',
range_map2 = args'range_map2' or args'range map2' or '',
range_map2_upright = args'range_map2_upright' or args'range map2 upright' or '',
range_map2_alt = args'range_map2_alt' or args'range map2 alt' or '',
range_map2_caption = args'range_map2_caption' or args'range map2 caption' or '',
range_map3 = args'range_map3' or args'range map3' or '',
range_map3_upright = args'range_map3_upright' or args'range map3 upright' or '',
range_map3_alt = args'range_map3_alt' or args'range map3 alt' or '',
range_map3_caption = args'range_map3_caption' or args'range map3 caption' or '',
range_map4 = args'range_map4' or args'range map4' or '',
range_map4_upright = args'range_map4_upright' or args'range map4 upright' or '',
range_map4_alt = args'range_map4_alt' or args'range map4 alt' or '',
range_map4_caption = args'range_map4_caption' or args'range map4 caption' or '',
synonyms_ref = args'synonyms_ref' or args'synonyms ref' or '',
synonyms = args'synonyms' or ''
} }
-- put page in error-tracking categories if required
local errCat1 = ''
if genusManual ~= '' or speciesManual ~= '' or binomial ~= '' then errCat1 = '[[Category:Automatic taxoboxes using manual parameters]]' end
local errCat2 = ''
if taxonParaMissingError then errCat2 = '[[Category:Automatic taxoboxes relying on page title]]' end
res = res .. frame:expandTemplate{ title = 'Main other', args = {errCat1..errCat2} }
return res
end
-- =============================================================================
-- l.setfossilRange(frame, fossilRange, oldestFossil, youngestFossil) checks
-- the parameters that determine the fossil range, returning an appropriate
-- range.
-- =============================================================================
-- temporary public function for debugging
function p.chkFossilRange(frame)
local args = frame.args
local fossilRange = args'temporal_range' or args'temporal range' or args'fossil_range' or args'fossil range' or ''
local oldestFossil = args'oldest_fossil' or args'oldest fossil' or ''
local youngestFossil = args'youngest_fossil' or args'youngest fossil' or ''
local fossilRange = l.setfossilRange(frame, fossilRange, oldestFossil, youngestFossil)
return fossilRange
end
function l.setfossilRange(frame, fossilRange, oldestFossil, youngestFossil)
local res = ''
if fossilRange ~= '' then
if mw.ustring.find(frame:expandTemplate{ title = 'Period start', args = { fossilRange } }, '[Ee]rror') then
res = fossilRange
else
res = frame:expandTemplate{ title = 'Geological range', args = { fossilRange } }
end
elseif oldestFossil ~= '' then
if youngestFossil == '' then youngestFossil = 'Recent' end
if mw.ustring.find(frame:expandTemplate{ title = 'Period start', args = { oldestFossil } }, '[Ee]rror') or
mw.ustring.find(frame:expandTemplate{ title = 'Period start', args = { youngestFossil } }, '[Ee]rror') then
res = oldestFossil..'–'..youngestFossil
else
res = frame:expandTemplate{ title = 'Geological range', args = { oldestFossil, youngestFossil } }
end
end
return res
end
-- =============================================================================
-- l.italicizeTypeName(typeName) checks whether the name of a type genus or
-- species should be italicized, because it appears to be a bare name.
-- =============================================================================
function l.italicizeTypeName(typeName)
if typeName and not (string.find(typeName, "<", 1, true) or string.find(typeName, ">", 1, true)) then
typeName = TaxonItalics.italicizeTaxonName(typeName, false, false)
end
return typeName
end
-- **************************** Speciesbox support *****************************
-- =============================================================================
-- l.genusOf(str) extracts the genus from a string. Normally this will be the
-- first word of the string (e.g. given 'Bellis perennis' it returns 'Bellis').
-- It also handles a string containing a nothogenus with a spaced × (e.g. given
-- '× Heucherella tiarelloides' it returns '× Heucherella').
-- =============================================================================
function l.genusOf(str)
local res = mw.ustring.match(str, '^[^%s]*', 1)
if res == mw.ustring.char(215) then
res = res .. ' ' .. mw.ustring.match(str, '^[^%s]*', 3)
end
return res
end
-- =============================================================================
-- l.doSpeciesboxName(name, taxon, genus, species, basePageTitle, italicTitle)
-- returns a name for a taxobox created by Template:Speciesbox. The name will be
-- italicized if appropriate. It also generates code to italicize the page title
-- if appropropriate. In both cases the test for italicization is that the base
-- taxon name (stripped of any disambiguation or qualifier) is the same as the
-- base page title.
-- =============================================================================
function p.speciesboxName(frame)
local name = frame.args1 or ''
local taxon = frame.args2 or ''
local genus = frame.args3 or ''
local species = frame.args4 or ''
local basePageTitle = frame.args5 or ''
local italicTitle = frame.args6 or ''
return l.doSpeciesboxName(name, taxon, genus, species, basePageTitle, italicTitle)
end
function l.doSpeciesboxName(name, taxon, genus, species, basePageTitle, italicTitle)
if taxon ~= '' then
genus = mw.ustring.gsub(l.genusOf(taxon), '/.*$', '', 1) -- strip any qualifier
else
genus = mw.ustring.gsub(mw.ustring.gsub(genus, '%s+%b()$', '', 1), '/.*$', '', 1) -- strip any disambig and qualifier
if species == '' then taxon = genus
else taxon = genus .. ' ' .. species
end
end
local italicizeP = italicTitle ~= 'no' and (basePageTitle == taxon or basePageTitle == genus) -- use basePageTitle to match taxon/genus
-- deal with taxobox name (i.e. its caption)
if name == '' then
name = basePageTitle
if italicizeP then name = TaxonItalics.italicizeTaxonName(name, false, false) end
end
-- deal with page title
if italicizeP then
local pageTitle = mw.title.getCurrentTitle().text -- formatting the page title with DISPLAYTITLE needs the full page title
if italicTitle ~= 'test' then
pageTitle = TaxonItalics.italicizeTaxonName(pageTitle, false, false, true) -- format pageTitle, not italicizing any parenthesized term
local nsText = mw.title.getCurrentTitle().nsText -- for drafts and other pages not in mainspace
if nsText ~= '' then
pageTitle = nsText .. ':' .. pageTitle
end
mw.getCurrentFrame():callParserFunction('DISPLAYTITLE', pageTitle)
else
name = name .. ' \\Italic title\\ ' .. pageTitle -- for testing and debugging
end
end
return name
end
-- =============================================================================
-- =============================================================================
function p.infraspeciesboxName(frame)
local name = frame.args1 or ''
local genus = frame.args2 or ''
local species = frame.args3 or ''
local ct = frame.args4 or ''
local infraspecies = frame.args5 or ''
local basePageTitle = frame.args6 or ''
local italicTitle = frame.args7 or ''
return l.doinfraspeciesboxName(name, genus, species, ct, infraspecies, basePageTitle, italicTitle)
end
function l.doinfraspeciesboxName(name, genus, species, ct, infraspecies, basePageTitle, italicTitle)
genus = mw.ustring.gsub(mw.ustring.gsub(genus, '%s+%b()$', '', 1), '/.*$', '', 1) -- strip any disambig and qualifier
local taxon = genus .. ' ' .. species
if ct == '' then taxon = taxon .. ' ' .. infraspecies
else taxon = taxon .. ' ' .. ct .. ' ' .. infraspecies
end
local italicizeP = italicTitle ~= 'no' and (basePageTitle == taxon) -- use basePageTitle to match taxon
-- deal with taxobox name (i.e. its caption)
if name == '' then
name = basePageTitle
if italicizeP then name = TaxonItalics.italicizeTaxonName(name, false, false) end
end
-- deal with page title
if italicizeP then
local pageTitle = mw.title.getCurrentTitle().text -- formatting the page title with DISPLAYTITLE needs the full page title
pageTitle = TaxonItalics.italicizeTaxonName(pageTitle, false, false, true) -- format pageTitle, not italicizing any parenthesized term
if italicTitle ~= 'test' then
mw.getCurrentFrame():callParserFunction('DISPLAYTITLE', pageTitle)
else
name = name .. ' \\Italic title\\ ' .. pageTitle -- for testing and debugging
end
end
return name
end
return p
This is the
module sandbox page for
Module:Automated taxobox (
diff). See also the companion subpage for test cases. |
This module depends on the following other modules: |
Module:Automated taxobox ( talk · · hist · links · doc · subpages · sandbox · testcases)
This module provides the functionality of various automated taxoboxes.
Currently, it implements {{
Automatic taxobox}}, {{
Ichnobox}} and {{
Oobox}} – see {{
Automatic taxobox}} for more details and parameters. For this purpose, it can be called via the relevant template, e.g. {{Automatic taxobox |...}}
, or directly, in which case |direct=yes
must be supplied, e.g. {{#invoke:Automated taxobox|automaticTaxobox |direct=yes |...}}
.
Support for other automated taxoboxes (e.g. {{ Speciesbox}}) is intended to be added in future. (Currently, only providing a name for a taxobox generated by {{ Speciesbox}} is handled by this module.)
require('strict')
local TaxonItalics = require('Module:TaxonItalics/sandbox')
local Autotaxobox = require('Module:Autotaxobox/sandbox')
local ItalicTitle = require('Module:Italic title')
local p = {} -- functions made public
local l = {} -- nonpublic internal functions and variables global to the module
l.system = '' -- '' for normal scientific classification (default)
-- 'ichnos' for trace fossil classification
-- 'veterovata' for egg fossil classification
-- =============================================================================
-- ichnobox implements Template:Ichnobox; see the documentation of that
-- template for details.
-- The only difference from Template:Automatic taxobox is in the taxobox colour
-- and classification link and the parameters for type species and genera.
-- =============================================================================
function p.ichnobox(frame)
l.system = 'ichnos'
return p.automaticTaxobox(frame)
end
-- =============================================================================
-- oobox implements Template:Oobox; see the documentation of that
-- template for details.
-- The only difference from Template:Automatic taxobox is in the taxobox colour
-- and classification link and the parameters for type species and genera.
-- =============================================================================
function p.oobox(frame)
l.system = 'veterovata'
return p.automaticTaxobox(frame)
end
-- =============================================================================
-- automaticTaxobox implements Template:Automatic taxobox; see the documentation
-- of that template for details.
-- It also implements Template:Ichnobox and Template:Oobox. The small
-- differences are signalled by the module-wide variable l.system.
-- The following parameters present in the old template code version of
-- Template:Automatic taxobox were not used and have not been implemented:
-- image_caption_align
-- image2_caption_align
-- binomial2
-- binomial2_authority
-- binomial3
-- binomial3_authority
-- binomial4
-- binomial4_authority
-- =============================================================================
function p.automaticTaxobox(frame)
local args
if frame.args'direct' == 'yes' then args = frame.args
else args = frame:getParent().args end
local res = ''
-- ---------------------------------------------------------------------
-- pick up taxobox parameters from the caller that need to be processed;
-- most will be passed on unchanged
-- ---------------------------------------------------------------------
local pagename = args'pagename' or '' -- for testing and debugging only
local italicTitle = args'italic_title' or args'italic title' or ''
local ichnos = ''
if l.system == 'ichnos' then ichnos = 'true' end
local veterovata = ''
if l.system == 'veterovata' then veterovata = 'true' end
local fossilRange = args'fossil_range' or args'fossil range' or args'temporal_range' or args'temporal range' or ''
local oldestFossil = args'oldest_fossil' or args'oldest fossil' or ''
local youngestFossil = args'youngest_fossil' or args'youngest fossil' or ''
local name = args'name' or ''
local colourAs = args'color_as' or args'color as' or args'colour_as' or args'colour as' or ''
local taxon = args'taxon' or ''
local authority = args'authority' or ''
local parentAuthority = args'parent_authority' or args'parent authority' or ''
local subdivision = args'subdivision' or ''
local subdivisionRef = args'subdivision_ref' or args'subdivision ref' or ''
local subdivisionRanks = args'subdivision_ranks' or args'subdivision ranks' or ''
local manualFlag = 'text' -- marks manually specified ranks
local binomial = args'binomial' or args'binomial_'..manualFlag or args'binomial '..manualFlag or ''
local binomialAuthority = args'binomial_authority' or args'binomial authority' or ''
local genusManual = args'genus_'..manualFlag or args'genus '..manualFlag or''
local speciesManual = args'species_'..manualFlag or args'species '..manualFlag or''
-- ------------------------------------------------------
-- set the taxobox parameters determined by this function
-- ------------------------------------------------------
fossilRange = l.setfossilRange(frame, fossilRange, oldestFossil, youngestFossil)
-- use the base page name as the taxon if the taxon parameter is missing
local currentPagename = mw.title.getCurrentTitle()
if pagename == '' then pagename = currentPagename.text end -- pagename para only used in testing and
local basePagename = pagename
if italicTitle ~= 'taxon' then basePagename = mw.ustring.gsub(basePagename, '%s+%b()$', '', 1) end
local taxonParaMissingError = false
if taxon == '' then
taxonParaMissingError = true
taxon = basePagename
end
-- decide if the page name and taxobox name need to be italicized;
-- if italic_title is not set, then if the names are the taxon, use its rank to decide
local ok, taxonRank = Autotaxobox.getTaxonInfoItem(frame, taxon, 'rank') -- taxonRank needed later if not here
if italicTitle == '' then
if not (ok and taxonRank ~= '' and
frame:expandTemplate{ title = 'Is italic taxon', args = {taxonRank} } == 'yes') then
italicTitle = 'no'
end
end
-- remove any " (DISAMBIG)" or "/MODIFIER" from the taxon's name;
-- if the base page name is the same as the base taxon name, then italicization can be applied
local baseTaxon = taxon
if italicTitle ~= 'taxon' then baseTaxon = mw.ustring.gsub(baseTaxon, '%s+%b()$', '', 1) end
baseTaxon = mw.ustring.gsub(baseTaxon, '/.*$', '', 1)
if italicTitle == '' and basePagename == baseTaxon then
italicTitle = 'yes'
end
-- italicize the page name (page title) if required
if currentPagename.namespace == 0 and (italicTitle == 'yes' or italicTitle == 'taxon') then
if italicTitle == 'taxon' or TaxonItalics.hasConnectingTerm(baseTaxon) then
res = res .. frame:expandTemplate{ title = 'Italic taxon title', args = {} }
italicTitle = 'yes'
else ItalicTitle._main({})
end
end
-- set the taxobox name if not supplied, italicizing it if appropriate.
if name == '' then
name = basePagename
if italicTitle == 'yes' then
name = TaxonItalics.italicizeTaxonName(name, false, false)
end
-- name = name .. '/' .. baseTaxon .. '/' .. nameRank
end
-- determine taxobox colour
local colour = ''
if colourAs ~= '' then
colour = frame:expandTemplate{ title = 'Taxobox colour', args = {colourAs} }
elseif l.system == 'ichnos' then
colour = frame:expandTemplate{ title = 'Taxobox colour', args = {'Ichnos'} }
elseif l.system == 'veterovata' then
colour = frame:expandTemplate{ title = 'Taxobox colour', args = {'Veterovata'} }
else
colour = Autotaxobox.getTaxoboxColour(frame, taxon)
end
-- fill in a missing subdivision_ranks parameter
if subdivision ~= '' and subdivisionRanks == '' and ok and taxonRank ~= '' then
subdivisionRanks = frame:expandTemplate{ title = 'Children rank', args = {taxonRank} }
end
-- set binomial parameters if the target taxon is (unusually) a species
local genusAuthority = ''
if binomial == '' then
if ok and taxonRank == 'species' then
binomial = TaxonItalics.italicizeTaxonName(taxon, false, false)
binomialAuthority = authority
end
end
-- handle any manually set ranks
local boldFirst = ''
local offset = 0
if speciesManual ~= '' then
offset = offset + 1
binomialAuthority = authority
if binomial == '' then binomial = '<span class="error">Error: binomial parameter value is missing</span>' end
end
if genusManual ~= '' then
boldFirst = 'link'
offset = offset + 1
if offset == 1 then
genusAuthority = authority
else
genusAuthority = parentAuthority
end
end
-- process type genus and type species if present; italicize if they seem not to have an authority attached
local typeGenus = ''
local typeGenusAuthority = ''
local typeSpecies = ''
local typeSpeciesAuthority = ''
local typeIchnogenus = ''
local typeIchnogenusAuthority = ''
local typeIchnospecies = ''
local typeIchnospeciesAuthority = ''
local typeOogenus = ''
local typeOogenusAuthority = ''
local typeOospecies = ''
local typeOospeciesAuthority = ''
if l.system == '' then
typeGenus = l.italicizeTypeName(args'type_genus' or args'type genus' or '')
typeGenusAuthority = args'type_genus_authority' or args'type genus authority' or ''
typeSpecies = l.italicizeTypeName(args'type_species' or args'type species' or '')
typeSpeciesAuthority = args'type_species_authority' or args'type species authority' or ''
elseif l.system == 'ichnos' then
typeIchnogenus = l.italicizeTypeName(args'type_ichnogenus' or args'type ichnogenus' or '')
typeIchnogenusAuthority = args'type_ichnogenus_authority' or args'type ichnogenus authority' or ''
typeIchnospecies = l.italicizeTypeName(args'type_ichnospecies' or args'type ichnospecies' or '')
typeIchnospeciesAuthority = args'type_ichnospecies_authority' or args'type ichnospecies authority' or ''
elseif l.system == 'veterovata' then
typeOogenus = l.italicizeTypeName(args'type_oogenus' or args'type oogenus' or '')
typeOogenusAuthority = args'type_oogenus_authority' or args'type oogenus authority' or ''
typeOospecies = l.italicizeTypeName(args'type_oospecies' or args'type oospecies' or '')
typeOospeciesAuthority = args'type_oospecies_authority' or args'type oospecies authority' or ''
end
-- ------------------------------------------------
-- now call Taxobox/core with all of its parameters
-- ------------------------------------------------
res = res .. frame:expandTemplate{ title = 'Taxobox/core', args =
{ ichnos = ichnos,
veterovata = veterovata,
'edit link' = 'e',
temporal_range = fossilRange,
display_taxa = args'display_parents' or args'display parents' or '1',
parent = taxon,
authority = authority,
parent_authority = parentAuthority,
grandparent_authority = args'grandparent_authority' or args'grandparent authority' or '',
greatgrandparent_authority = args'greatgrandparent_authority' or args'greatgrandparent authority' or '',
greatgreatgrandparent_authority = args'greatgreatgrandparent_authority' or args'greatgreatgrandparent authority' or '',
name = name,
colour = colour,
status = args'status' or '',
status_system = args'status_system' or args'status system' or '',
status_ref = args'status_ref' or args'status ref' or '',
status2 = args'status2' or '',
status2_system = args'status2_system' or args'status2 system' or '',
status2_ref = args'status2_ref' or args'status2 ref' or '',
trend = args'trend' or '',
extinct = args'extinct' or '',
image = args'image' or '',
upright = args'image_upright' or args'image upright' or '',
image_alt = args'image_alt' or args'image alt' or '',
image_caption = args'image_caption' or args'image caption' or '',
image2 = args'image2' or '',
upright2 = args'image2_upright' or args'image2 upright' or '',
image2_alt = args'image2_alt' or args'image2 alt' or '',
image2_caption = args'image2_caption' or args'image2 caption' or '',
classification_status = args'classification_status' or args'classification status' or '',
diversity = args'diversity' or '',
diversity_ref = args'diversity_ref' or args'diversity ref' or '',
diversity_link = args'diversity_link' or args'diversity link' or '',
bold_first = boldFirst,
offset = offset,
genus = genusManual,
genus_authority = genusAuthority,
species = speciesManual,
binomial = binomial,
binomial_authority = binomialAuthority,
trinomial = args'trinomial' or '',
trinomial_authority = args'trinomial_authority' or args'trinomial authority' or '',
type_genus = typeGenus,
type_genus_authority = typeGenusAuthority,
type_species = typeSpecies,
type_species_authority = typeSpeciesAuthority,
type_ichnogenus = typeIchnogenus,
type_ichnogenus_authority = typeIchnogenusAuthority,
type_ichnospecies = typeIchnospecies,
type_ichnospecies_authority = typeIchnospeciesAuthority,
type_oogenus = typeOogenus,
type_oogenus_authority = typeOogenusAuthority,
type_oospecies = typeOospecies,
type_oospecies_authority = typeOospeciesAuthority,
subdivision = subdivision,
subdivision_ref = subdivisionRef,
subdivision_ranks = subdivisionRanks,
type_strain = args'type_strain' or args'type strain' or '',
range_map = args'range_map' or args'range map' or '',
range_map_upright = args'range_map_upright' or args'range map upright' or '',
range_map_alt = args'range_map_alt' or args'range map alt' or '',
range_map_caption = args'range_map_caption' or args'range map caption' or '',
range_map2 = args'range_map2' or args'range map2' or '',
range_map2_upright = args'range_map2_upright' or args'range map2 upright' or '',
range_map2_alt = args'range_map2_alt' or args'range map2 alt' or '',
range_map2_caption = args'range_map2_caption' or args'range map2 caption' or '',
range_map3 = args'range_map3' or args'range map3' or '',
range_map3_upright = args'range_map3_upright' or args'range map3 upright' or '',
range_map3_alt = args'range_map3_alt' or args'range map3 alt' or '',
range_map3_caption = args'range_map3_caption' or args'range map3 caption' or '',
range_map4 = args'range_map4' or args'range map4' or '',
range_map4_upright = args'range_map4_upright' or args'range map4 upright' or '',
range_map4_alt = args'range_map4_alt' or args'range map4 alt' or '',
range_map4_caption = args'range_map4_caption' or args'range map4 caption' or '',
synonyms_ref = args'synonyms_ref' or args'synonyms ref' or '',
synonyms = args'synonyms' or ''
} }
-- put page in error-tracking categories if required
local errCat1 = ''
if genusManual ~= '' or speciesManual ~= '' or binomial ~= '' then errCat1 = '[[Category:Automatic taxoboxes using manual parameters]]' end
local errCat2 = ''
if taxonParaMissingError then errCat2 = '[[Category:Automatic taxoboxes relying on page title]]' end
res = res .. frame:expandTemplate{ title = 'Main other', args = {errCat1..errCat2} }
return res
end
-- =============================================================================
-- l.setfossilRange(frame, fossilRange, oldestFossil, youngestFossil) checks
-- the parameters that determine the fossil range, returning an appropriate
-- range.
-- =============================================================================
-- temporary public function for debugging
function p.chkFossilRange(frame)
local args = frame.args
local fossilRange = args'temporal_range' or args'temporal range' or args'fossil_range' or args'fossil range' or ''
local oldestFossil = args'oldest_fossil' or args'oldest fossil' or ''
local youngestFossil = args'youngest_fossil' or args'youngest fossil' or ''
local fossilRange = l.setfossilRange(frame, fossilRange, oldestFossil, youngestFossil)
return fossilRange
end
function l.setfossilRange(frame, fossilRange, oldestFossil, youngestFossil)
local res = ''
if fossilRange ~= '' then
if mw.ustring.find(frame:expandTemplate{ title = 'Period start', args = { fossilRange } }, '[Ee]rror') then
res = fossilRange
else
res = frame:expandTemplate{ title = 'Geological range', args = { fossilRange } }
end
elseif oldestFossil ~= '' then
if youngestFossil == '' then youngestFossil = 'Recent' end
if mw.ustring.find(frame:expandTemplate{ title = 'Period start', args = { oldestFossil } }, '[Ee]rror') or
mw.ustring.find(frame:expandTemplate{ title = 'Period start', args = { youngestFossil } }, '[Ee]rror') then
res = oldestFossil..'–'..youngestFossil
else
res = frame:expandTemplate{ title = 'Geological range', args = { oldestFossil, youngestFossil } }
end
end
return res
end
-- =============================================================================
-- l.italicizeTypeName(typeName) checks whether the name of a type genus or
-- species should be italicized, because it appears to be a bare name.
-- =============================================================================
function l.italicizeTypeName(typeName)
if typeName and not (string.find(typeName, "<", 1, true) or string.find(typeName, ">", 1, true)) then
typeName = TaxonItalics.italicizeTaxonName(typeName, false, false)
end
return typeName
end
-- **************************** Speciesbox support *****************************
-- =============================================================================
-- l.genusOf(str) extracts the genus from a string. Normally this will be the
-- first word of the string (e.g. given 'Bellis perennis' it returns 'Bellis').
-- It also handles a string containing a nothogenus with a spaced × (e.g. given
-- '× Heucherella tiarelloides' it returns '× Heucherella').
-- =============================================================================
function l.genusOf(str)
local res = mw.ustring.match(str, '^[^%s]*', 1)
if res == mw.ustring.char(215) then
res = res .. ' ' .. mw.ustring.match(str, '^[^%s]*', 3)
end
return res
end
-- =============================================================================
-- l.doSpeciesboxName(name, taxon, genus, species, basePageTitle, italicTitle)
-- returns a name for a taxobox created by Template:Speciesbox. The name will be
-- italicized if appropriate. It also generates code to italicize the page title
-- if appropropriate. In both cases the test for italicization is that the base
-- taxon name (stripped of any disambiguation or qualifier) is the same as the
-- base page title.
-- =============================================================================
function p.speciesboxName(frame)
local name = frame.args1 or ''
local taxon = frame.args2 or ''
local genus = frame.args3 or ''
local species = frame.args4 or ''
local basePageTitle = frame.args5 or ''
local italicTitle = frame.args6 or ''
return l.doSpeciesboxName(name, taxon, genus, species, basePageTitle, italicTitle)
end
function l.doSpeciesboxName(name, taxon, genus, species, basePageTitle, italicTitle)
if taxon ~= '' then
genus = mw.ustring.gsub(l.genusOf(taxon), '/.*$', '', 1) -- strip any qualifier
else
genus = mw.ustring.gsub(mw.ustring.gsub(genus, '%s+%b()$', '', 1), '/.*$', '', 1) -- strip any disambig and qualifier
if species == '' then taxon = genus
else taxon = genus .. ' ' .. species
end
end
local italicizeP = italicTitle ~= 'no' and (basePageTitle == taxon or basePageTitle == genus) -- use basePageTitle to match taxon/genus
-- deal with taxobox name (i.e. its caption)
if name == '' then
name = basePageTitle
if italicizeP then name = TaxonItalics.italicizeTaxonName(name, false, false) end
end
-- deal with page title
if italicizeP then
local pageTitle = mw.title.getCurrentTitle().text -- formatting the page title with DISPLAYTITLE needs the full page title
if italicTitle ~= 'test' then
pageTitle = TaxonItalics.italicizeTaxonName(pageTitle, false, false, true) -- format pageTitle, not italicizing any parenthesized term
local nsText = mw.title.getCurrentTitle().nsText -- for drafts and other pages not in mainspace
if nsText ~= '' then
pageTitle = nsText .. ':' .. pageTitle
end
mw.getCurrentFrame():callParserFunction('DISPLAYTITLE', pageTitle)
else
name = name .. ' \\Italic title\\ ' .. pageTitle -- for testing and debugging
end
end
return name
end
-- =============================================================================
-- =============================================================================
function p.infraspeciesboxName(frame)
local name = frame.args1 or ''
local genus = frame.args2 or ''
local species = frame.args3 or ''
local ct = frame.args4 or ''
local infraspecies = frame.args5 or ''
local basePageTitle = frame.args6 or ''
local italicTitle = frame.args7 or ''
return l.doinfraspeciesboxName(name, genus, species, ct, infraspecies, basePageTitle, italicTitle)
end
function l.doinfraspeciesboxName(name, genus, species, ct, infraspecies, basePageTitle, italicTitle)
genus = mw.ustring.gsub(mw.ustring.gsub(genus, '%s+%b()$', '', 1), '/.*$', '', 1) -- strip any disambig and qualifier
local taxon = genus .. ' ' .. species
if ct == '' then taxon = taxon .. ' ' .. infraspecies
else taxon = taxon .. ' ' .. ct .. ' ' .. infraspecies
end
local italicizeP = italicTitle ~= 'no' and (basePageTitle == taxon) -- use basePageTitle to match taxon
-- deal with taxobox name (i.e. its caption)
if name == '' then
name = basePageTitle
if italicizeP then name = TaxonItalics.italicizeTaxonName(name, false, false) end
end
-- deal with page title
if italicizeP then
local pageTitle = mw.title.getCurrentTitle().text -- formatting the page title with DISPLAYTITLE needs the full page title
pageTitle = TaxonItalics.italicizeTaxonName(pageTitle, false, false, true) -- format pageTitle, not italicizing any parenthesized term
if italicTitle ~= 'test' then
mw.getCurrentFrame():callParserFunction('DISPLAYTITLE', pageTitle)
else
name = name .. ' \\Italic title\\ ' .. pageTitle -- for testing and debugging
end
end
return name
end
return p