Difference between revisions of "Module:Sandbox/Jts1882/Biota infobox/auto"

From blackwiki
Jump to navigation Jump to search
blackwiki>Jts1882
(fix some logic)
blackwiki>Jts1882
(a few fixes)
Line 60: Line 60:
 
local authorities = { g.templateArgs['authority'] or "",  
 
local authorities = { g.templateArgs['authority'] or "",  
 
  g.templateArgs['parent_authority'] or "",
 
  g.templateArgs['parent_authority'] or "",
  g.templateArgs['gparent_authority'] or "",  
+
  g.templateArgs['grandparent_authority'] or "",  
  g.templateArgs['ggparent_authority'] or "",
+
  g.templateArgs['greatgrandparent_authority'] or "",
  g.templateArgs['gggparent_authority'] or "",
+
  g.templateArgs['greatgreatgrandparent_authority'] or "",
 
  g.templateArgs['greatgreatgreatgrandparent_authority'] or "",
 
  g.templateArgs['greatgreatgreatgrandparent_authority'] or "",
 
  g.templateArgs['greatgreatgreatgreatgrandparent_authority'] or "",
 
  g.templateArgs['greatgreatgreatgreatgrandparent_authority'] or "",
Line 194: Line 194:
 
=============================================================================]]
 
=============================================================================]]
 
function p.taxoboxList(frame)
 
function p.taxoboxList(frame)
local currTaxon = frame.args[1] or ''
+
--local currTaxon = frame.args[1] or ''
 
local displayN = (tonumber(g.templateArgs['display_taxa']) or 1) + 1
 
local displayN = (tonumber(g.templateArgs['display_taxa']) or 1) + 1
 
--local displayN = (tonumber(frame.args['display_taxa']) or 1) + 1
 
--local displayN = (tonumber(frame.args['display_taxa']) or 1) + 1
Line 216: Line 216:
 
taxonTable[5]['authority'] = frame.args['gggparent_authority'] or 'gggp auth' ]]
 
taxonTable[5]['authority'] = frame.args['gggparent_authority'] or 'gggp auth' ]]
 
  local test = g.templateArgs['authority'] or 'authority'
 
  local test = g.templateArgs['authority'] or 'authority'
-- TODO check that taxonTable[i] exists
+
--[[ TODO check that taxonTable[i] exists
 
taxonTable[1]['authority'] = g.templateArgs['authority'] or ''
 
taxonTable[1]['authority'] = g.templateArgs['authority'] or ''
 
taxonTable[2]['authority'] = g.templateArgs['parent_authority'] or ''
 
taxonTable[2]['authority'] = g.templateArgs['parent_authority'] or ''
 
taxonTable[3]['authority'] = g.templateArgs['grandparent_authority'] or ''  
 
taxonTable[3]['authority'] = g.templateArgs['grandparent_authority'] or ''  
 
taxonTable[4]['authority'] = g.templateArgs['greatgrandparent_authority'] or ''  
 
taxonTable[4]['authority'] = g.templateArgs['greatgrandparent_authority'] or ''  
taxonTable[5]['authority'] = g.templateArgs['greatgreatgrandparent_authority'] or ''  
+
taxonTable[5]['authority'] = g.templateArgs['greatgreatgrandparent_authority'] or '' ]]
 
    
 
    
 
   -- determine when to force: when i<displayN and when infrataxons in i=2 and i=3 (why?)
 
   -- determine when to force: when i<displayN and when infrataxons in i=2 and i=3 (why?)
Line 318: Line 318:
 
 
 
if g.taxonTable[i]['always_display'] == "yes"            -- the flag for whether to force display a taxon
 
if g.taxonTable[i]['always_display'] == "yes"            -- the flag for whether to force display a taxon
    or g.taxonTable[i]['always_display'] == "true" then
+
    or g.taxonTable[i]['always_display'] == "true"  
    --or g.isPrincipalRank(g.taxonTable[i]['rank']) then  -- or major ranks
+
    or g.isPrincipalRank(g.taxonTable[i]['rank']) then  -- or major ranks
 
    -- continue
 
    -- continue
elseif g.isInfraTaxon(g.taxonTable[i]['rank']) then -- or a major rank (=not a minor rank)
+
else --if g.isInfraTaxon(g.taxonTable[i]['rank']) then -- or a major rank (=not a minor rank)
 
return ""  
 
return ""  
 
end
 
end

Revision as of 16:18, 21 December 2018

Documentation for this module may be created at Module:Sandbox/Jts1882/Biota infobox/auto/doc

local p = {}
local g = {}
g.info = {}

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 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

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)
	
	--local parents = mw.getCurrentFrame():getParent()
	local ok, taxonInfo
	local taxonTable= {}
	--taxonTable.row= {}
	local i = 1
	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 "",
	}
	local taxon = g.templateArgs['taxon'] or g.templateArgs['parent'] or "Felis"
		--taxon= 'Felis' 
		--taxon= 'Worthenella'       
		--taxon= 'Fereuungulata'
	local authority = 'authority'
    if g.templateArgs['species_name'] then 

	    if g.templateArgs['variety_name'] then 
		    taxonTable[i]= { taxon = g.templateArgs['variety_name'],
						     --parent = g.templateArgs['parent'],
						     rank = 'variety',
						     authority = authorities[i] --g.templateArgs[authority],
						    }
		    authority = 'parent_authority'
		    i=i+1
	    end
	    if g.templateArgs['subspecies_name'] then 
		    taxonTable[i]= { taxon = g.templateArgs['subspecies_name'],
						     --parent = g.templateArgs['parent'],
						     rank = 'subspecies',
						     authority = authorities[i] -- g.templateArgs[authority],
						    }
		    authority = 'parent_authority'
		    i=i+1
		end

	    taxonTable[i]= { taxon = g.templateArgs['species_name'],
					     --parent = g.templateArgs['parent'],
					     rank = 'species',
					     authority =  authorities[i] -- g.templateArgs[authority],
					    }
	    i=i+1
	    taxon = g.templateArgs['parent']
	end
		
	while i<100 do
		--if i > 1 then taxon = taxonTable[i-1]['parent'] end
		
		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
					--taxonTable[i]['parent'] = sameAsTable['parent'] -- force the parent
				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 "")
			-- do we still have a parent taxon
			if taxonTable[i]['parent'] == "" then 
				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

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 =================================

            -- 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<displayN and when infrataxons in i=2 and i=3 (why?)
    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)
--[[		res = res .. frame:expandTemplate{ title = 'Template:Taxobox/showtaxon', 
                                            args = { taxonTable[i]['taxon'], authority=taxonTable[i]['authority'], 
                                            	     fc = taxonTable[i]['always_display'], 
                                            	     format = boldFirst, virus = virus } }
]]
	end
	if (1==1) then return res end
	
	------------------------------------------------------------------------------
	-- the remainder is unused (keeping code while verifying it behaves the same)
    -- display all taxa above possible greatgreatgrandparent
	for i = taxonTable.n, 6, -1 do
		res = res .. frame:expandTemplate{ title = 'Template:Taxobox/showtaxon', args = { taxonTable[i], fc = tostring(displayN >= i), virus = virus } }
	end
	-- display greatgreatgrandparent, if it exists	
	-- display greatgreatgrandparent, if it exists
	if taxonTable.n >= 5 then
		res = res .. frame:expandTemplate{ title = 'Template:Taxobox/showtaxon', args = { taxonTable[5], authority = gggParentAuth, fc = tostring(displayN >= 5), virus = virus } }
	end
	-- display greatgrandparent, if it exists; force the display if an infrataxon is below
	if taxonTable.n >= 4 then
		local force = tostring(displayN >= 4) or
		              frame.expandTemplate{ title = 'Template:Infrataxon()', args = { taxonTable[3] } } == 'true' or
		              frame.expandTemplate{ title = 'Template:Infrataxon()', args = { taxonTable[2] } } == 'true'
		res = res .. frame:expandTemplate{ title = 'Template:Taxobox/showtaxon', args = { taxonTable[4], authority = ggParentAuth, fc = tostring(force), virus = virus } }
	end
	-- display grandparent, if it exists; force the display if an infrataxon is below
	if taxonTable.n >= 3 then
		local force = tostring(displayN >= 3) or
                      frame.expandTemplate{ title = 'Template:Infrataxon()', args = { taxonTable[2] } } == 'true'
        res = res .. frame:expandTemplate{ title = 'Template:Taxobox/showtaxon', args = { taxonTable[3], authority = gParentAuth, fc = tostring(force), virus = virus } }
	end
	-- display parent, if it exists
	if taxonTable.n >= 2 then
		res = res .. frame:expandTemplate{ title = 'Template:Taxobox/showtaxon', args = { taxonTable[2], authority = parentAuth, fc = tostring(displayN >= 2), virus = virus } }
	end
	-- display target taxon
	res = res .. frame:expandTemplate{ title = 'Template:Taxobox/showtaxon', args = { taxonTable[1], authority = auth, fc = 'true', format = boldFirst, virus = virus  } }
	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
--[[ show a row of the taxonomy table
       - uses Template:Taxobox/showtaxon
       - will emulate the template
]]
function g.showTaxonRow (frame, i,  boldFirst,  virus)
	
	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
	
--[[	
    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 } }
]]
    --{{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
    if g.taxonTable[i]['rank'] == "species" or g.taxonTable[i]['rank'] == "subspecies" or g.taxonTable[i]['rank'] == "variety" then
    	--taxonName =  g.taxonTable[i]['species_name']
    	-- no processing of name necessary (already set to species_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 = '<br /><small>'.. g.taxonTable[i]['authority'] ..'</small>'
	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
	]]
	
	--local row = '\n|'..taxonRank .. '||' .. taxonName .. authorityString 
	--return row .. '\n|-'  -- return  with new row started
    local row =g.htmlTable:tag('tr')
    local cell = row:tag('td'):wikitext(taxonRank .. ":"..i)
    cell = row:tag('td'):wikitext(taxonName .. authorityString)
    
    
    local rowWiki = '\n|-\n|'..taxonRank .. '||' .. taxonName .. authorityString 
                      -- 
	return rowWiki              -- so don't start the new row
end

return p