Module:Sandbox/Jts1882/Biota infobox/auto
local p = {} --
local g = {} -- these are variables with global scope in this sub-module
g.info = {}
-- testing function to show automatic taxonomy within a table
function p.showTaxonomyTable(frame)
g.templateArgs = {}
g.info.auto= false
g.taxonTable = p.loadTaxonomyTable(frame)
local output = '\n
class="wikitable" \n |
style="vertical-align:top;" '
--output = output .. '\n! Rank !! Taxon \n |
' -- oldversion starting new row
output = output .. '\n! Rank !! Taxon' -- don't start a new row here g.htmlTable = mw.html.create('table') :addClass('infobox'):addClass('biota') :cssText("text-align: left; width: 200px; font-size: 100%") output = output .. p.taxoboxList(frame) output = output .. '\n |
return tostring(g.htmlTable) .. output
--return '\n' ..p.showTaxonomyHierarchyRaw(frame, g.taxonTable) --output
--return output
end
--[[ function to add rows for an automatic taxonomy to an taxobox-style infobox
-- called from parent to this submodule
-- uses a modification of p.taxoboxList() form Module:Autotaxobox
-- uses a function to emulate
]]
function p.getTaxonomyTableRows(frame, htmlTable, templateArgs, info)
g.htmlTable = htmlTable
g.templateArgs = templateArgs
g.info = info
g.taxonTable = p.loadTaxonomyTable(frame)
return p.taxoboxList(frame)
end
--[[ testing function to output the heirarchy table from the automatic taxonomy as a wikitable
]]
function p.showTaxonomyHierarchyRaw(frame, taxonTable)
local output = '
class="wikitable sortable" '
for k,v in pairs(taxonTable[1]) do output = output .. '\n!' .. k end for i=1, #taxonTable, 1 do output = output .. '\n |
'
for k,v in pairs(taxonTable[i]) do output = output .. '\n|' .. v end end output = output .. '\n |
--return mw.dumpObject(taxonTable)
return output
end
--[[ function p.loadTaxonomyTable(frame) - loads a 2-D table of taxon information from automatic taxonomy system
each row is the informaiton for a taxon
- this obtained useing Template:Taxonomy/TAXON with argument ['machine code'] = "all"
- additionally adds blank taxon and authority columns
row ={ parent, rank, link_target, link_text, always_display, extinct, same_as, refs, taxon, authority }
]]
function p.loadTaxonomyTable(frame)
local ok, taxonInfo
local taxonTable= {}
local i = 1
-- load authorities from template parameters
local authorities = { g.templateArgs['authority'] or "",
g.templateArgs['parent_authority'] or "",
g.templateArgs['grandparent_authority'] or "",
g.templateArgs['greatgrandparent_authority'] or "",
g.templateArgs['greatgreatgrandparent_authority'] or "",
g.templateArgs['greatgreatgreatgrandparent_authority'] or "",
g.templateArgs['greatgreatgreatgreatgrandparent_authority'] or "",
}
-- get the name of the first taxon
local taxon = g.templateArgs['taxon'] or g.templateArgs['parent'] or "Felis"
--taxon= 'Felis'
--taxon= 'Worthenella'
--taxon= 'Fereuungulata'
--local authority = 'authority'
-- the following section is an alternative method for adding rows for species, subspecies, etc
--START: insert rows for variety, subspecies, species and subgenus at base of automatic taxonomy
if g.templateArgs['species_name'] then
if g.templateArgs['variety_name'] then
taxonTable[i]= { taxon = g.templateArgs['variety_name'],
rank = 'variety',
authority = authorities[i] --g.templateArgs[authority],
}
i=i+1
end
if g.templateArgs['subspecies_name'] then
taxonTable[i]= { taxon = g.templateArgs['subspecies_name'],
rank = 'subspecies',
authority = authorities[i] -- g.templateArgs[authority],
}
i=i+1
end
-- TODO if subgenus
taxonTable[i]= { taxon = g.templateArgs['species_name'],
rank = 'species',
authority = authorities[i] -- g.templateArgs[authority],
}
i=i+1
taxon = g.templateArgs['parent']
end
--END: insert rows for variety, subspecies species and subgenus at base of automatic taxonomy
--[[ load the heirarchy of the automatic taxonomy
each row has the contents for a taxon returned by g.getTaxonInfo()
which uses Template:Taxonomy/TAXON with argument machine code ="all"
]]
while i<100 do
ok, taxonTable[i] = g.getTaxonInfo(frame, taxon)
--if ok and taxonTable[i]['parent'] ~= "" then
if ok then
if taxonTable[i]['same_as'] and taxonTable[i]['same_as'] ~= "" then
taxon = taxonTable[i]['same_as']
local ok, sameAsTable = g.getTaxonInfo(frame, taxon)
if ok then
for k,v in pairs(taxonTable[i]) do
if v == "" then
taxonTable[i][k] = sameAsTable[k] -- use same_as values if none set
end
end
else break;
end
else -- we have what data for the taxon directly
-- TODO do something
end
-- add taxon to the table row
if taxonTable[i]['link_text'] and taxonTable[i]['link_text'] ~= "" then
taxonTable[i]['taxon'] = taxonTable[i]['link_text']
else
taxonTable[i]['taxon'] = taxonTable[i]['link_target']
end
-- authority from parent authroity sequence
taxonTable[i]['authority'] = (authorities[i] or "")
if taxonTable[i]['parent'] == "" then -- have we reached the top of the heirarchy?
break
else
taxon = taxonTable[i]['parent'] -- set the taxon for the next loop
end
else break
end
i = i + 1
end
--we have a complete table
taxonTable.n = #taxonTable - 1 -- minus one as last one has parent=life and displays as Genus: Ursus
return taxonTable
end
--[[ loads a row of taxon information
uses Template:Taxonomy/TAXON with argument ['machine code'] = "all"
additionally adds blank taxon and authority columns
row ={ parent, rank, link_target, link_text, always_display, extinct, same_as, refs, taxon, authority }
]]
function g.getTaxonInfo(frame, taxon)
local ok, taxonInfo = pcall(frame.expandTemplate, frame, { title = 'Template:Taxonomy/' .. taxon,
args = {['machine code'] = "all" } })
if ok then
local split= mw.text.split(taxonInfo, "$", true)
-- all: returns "parent$rank$link_target$unnamed parameter$always_display$extinct$same_as$refs"
local taxonRow ={
parent = split[1] or "",
rank = split[2] or "",
-- if link containing pipe, e.g. |link=Fereuungulata|Ferungulata =LINK_TARGET|LINK_TEXT
link_target = split[3] or "", -- link_target = link or first part of link before pipe
link_text = split[4] or "", -- then produces unnamed parameter 'link_text'
always_display = split[5] or "",
extinct = split[6] or "",
same_as = split[7] or "",
refs = split[8] or "",
taxon = "", -- create blank now to stop table reordering
authority = "", -- create blank now to stop table reordering
}
return ok, taxonRow
end
end
--[[=========================== taxoboxList (old version) =================================
-- Copied from Module:Autotaxobox on 19 December 2018
-- modified to use full table of taxaonomy template parameters
-- reason: to reduce template calls, especially in replacement for Template:Taxobox/showtaxon
Returns the rows of taxa in an automated taxobox, based on the taxonomic
hierarchy for the supplied taxon.
Usage:
{{#invoke:Autotaxobox|taxoboxList|TAXON
|display_taxa = the number of taxa *above* TAXON to force to be displayed
|authority = taxonomic authority for TAXON
|parent_authority = taxonomic authority for TAXON's parent
|gparent_authority = taxonomic authority for TAXON's grandparent
|ggparent_authority = taxonomic authority for TAXON's greatgrandparent
|ggparent_authority = taxonomic authority for TAXON's greatgreatgrandparent
|bold_first = 'bold' to bold TAXON in its row
|virus = 'yes' to apply virus taxa italicization standards
}}
=============================================================================]]
function p.taxoboxList(frame)
--local currTaxon = frame.args[1] or ''
local displayN = (tonumber(g.templateArgs['display_taxa']) or 1) + 1
--local displayN = (tonumber(frame.args['display_taxa']) or 1) + 1
--local auth = frame.args['authority'] or ''
--local parentAuth = frame.args['parent_authority'] or ''
--local gParentAuth = frame.args['gparent_authority'] or ''
--local ggParentAuth = frame.args['ggparent_authority'] or ''
--local gggParentAuth = frame.args['gggparent_authority'] or ''
local boldFirst = frame.args['bold_first'] or 'link' -- values 'link' or 'bold'
local virus = frame.args['virus'] or 'no' -- values 'yes' or 'no'
-- local taxonTable = l.makeTable(frame, currTaxon)
local taxonTable = g.taxonTable -- modifications using full table
--taxonTable.n = #taxonTable
--displayN = 10 -- force display
--[[]
taxonTable[1]['authority'] = frame.args['authority'] or 'authority'
taxonTable[2]['authority'] = frame.args['parent_authority'] or 'parent auth'
taxonTable[3]['authority'] = frame.args['gparent_authority'] or 'gp auth'
taxonTable[4]['authority'] = frame.args['ggparent_authority'] or 'ggp auth'
taxonTable[5]['authority'] = frame.args['gggparent_authority'] or 'gggp auth' ]]
local test = g.templateArgs['authority'] or 'authority'
--[[ TODO check that taxonTable[i] exists
taxonTable[1]['authority'] = g.templateArgs['authority'] or ''
taxonTable[2]['authority'] = g.templateArgs['parent_authority'] or ''
taxonTable[3]['authority'] = g.templateArgs['grandparent_authority'] or ''
taxonTable[4]['authority'] = g.templateArgs['greatgrandparent_authority'] or ''
taxonTable[5]['authority'] = g.templateArgs['greatgreatgrandparent_authority'] or '' ]]
-- determine when to force: when i for i= 1, displayN, 1 do -- use 'always_display' to flag a force taxonTable[i]['always_display'] = "yes" end --[[check for lower infrataxons for i=4 and i=3 TODO verify this works if g.isInfraTaxon(taxonTable[3]['rank']) then -- if i=3 an infrataxon taxonTable[4]['always_display'] = "yes" -- then always display i=4 end if g.isInfraTaxon(taxonTable[2]['rank']) then -- if i=2 an infrataxon taxonTable[4]['always_display'] = "yes" -- then always display i=3 and i=4 taxonTable[3]['always_display'] = "yes" end]] local res = '' -- generic display to replace >6, 5,4,3,2,1 sections for i = taxonTable.n, 1, -1 do if i==1 then boldFirst = "bold" end res = res .. g.showTaxonRow(frame, i, boldFirst, virus) --res = res .. g.showTaxonRow(frame, i, taxonTable[i]['taxon'], taxonTable[i]['authority'], taxonTable[i]['always_display'], boldFirst, virus) end return res end --[[ function to check if an infrarank (not major rank) that should be displayed - emulates template Template:Infrataxon(), which uses Template:Principal rank ]] function g.isPrincipalRank(rank) -- Remove "ichno" and "oo" and then check for a major taxon ("oordo" becomes "rdo"): rank = string.gsub(rank, "ichno", "") rank = string.gsub(rank, "oo", "") if rank == "regnum" or rank=="phylum" or rank=="divisio" or rank=="classis" or rank=="ordo" or rank=="rdo" or rank=="familia" or rank=="genus" or rank=="species" or rank=="subspecies" or rank=="variety" then return true else return false -- rank is an infrarank end --return not g.isInfraTaxon(rank) end function g.isInfraTaxon(rank) --Remove "ichno" and "oo" and then check for a major taxon ("oordo" becomes "rdo"): rank = string.gsub(rank, "ichno", "") rank = string.gsub(rank, "oo", "") if rank == "regnum" or rank=="phylum" or rank=="divisio" or rank=="classis" or rank=="ordo" or rank=="rdo" or rank=="familia" or rank=="genus" or rank=="species" or rank=="subspecies" or rank=="variety" then return false else return true -- rank is an infrarank end end --[[ function g.showTaxonRow () - show a row of the taxonomy table - emulates Template:Taxobox/showtaxon - uses Template:Taxon link and Template:anglicise rank ]] function g.showTaxonRow (frame, i, boldFirst, virus) --[[ return frame:expandTemplate{ title = 'Template:Taxobox/showtaxon', args = { g.taxonTable[i]['taxon'], authority=g.taxonTable[i]['authority'], fc = g.taxonTable[i]['always_display'], format = boldFirst, virus = virus } } ]] -- do we want to display the taxon? if g.taxonTable[i]['always_display'] == "yes" -- the flag for whether to force display a taxon or g.taxonTable[i]['always_display'] == "true" or g.isPrincipalRank(g.taxonTable[i]['rank']) then -- or major ranks -- continue else --if g.isInfraTaxon(g.taxonTable[i]['rank']) then -- or a major rank (=not a minor rank) return "" end --{{Taxon link|{{{1|Ursa}}}|bold={{#ifeq:{{{format|link}}}|bold|yes|no}}|virus={{{virus|no}}}}} local bold = "no" if boldFirst == "bold" then bold = "yes" end --taxon name local taxonName = g.taxonTable[i]['taxon'] -- plain name local rank = g.taxonTable[i]['rank'] if rank == "species" or rank == "subspecies" or rank == "variety" then -- no processing of name necessary (already set to species_name, subspecies_name, etc) else taxonName = frame:expandTemplate{ title = "Taxon link", args = { taxonName, bold=bold, virus=virus } } end --rank local taxonRank = g.taxonTable[i]['rank'] taxonRank = frame:expandTemplate{ title = "anglicise rank", args = { g.taxonTable[i]['rank'] } } if g.taxonTable[i]['rank'] == "virus_group" then taxonName = frame:expandTemplate{ title = "Virus group", args = { g.taxonTable[i]['taxon'] } } -- taxonRank = "Group" -- handled by anglicise rank template end local authorityString = '' if g.taxonTable[i]['authority'] and g.taxonTable[i]['authority'] ~= "" then authorityString = ' end --[[ now output the html the autotaxobox templates had already started a new row and ended with new row this was the stumbling block for the nodal approach uing the Lua html library (mw.html) which required the embedded table ]] -- new method append row to the table structure using mw:html library local row =g.htmlTable:tag('tr') local cell = row:tag('td'):wikitext(taxonRank .. ":"..i) cell = row:tag('td'):wikitext(taxonName .. authorityString) -- old method: return wikitext for table row local rowWiki = '\n|-\n|'..taxonRank .. ':' .. i .. '||' .. taxonName .. authorityString --return row .. '\n|-' -- return with new row started return rowWiki -- so don't start the new row end return p
'.. g.taxonTable[i]['authority'] ..''