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

	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 = '<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
	]]
    -- 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
"https://si.wikipedia.org/w/index.php?title=Module:Sandbox/Jts1882/Biota_infobox/auto&oldid=511589" වෙතින් සම්ප්‍රවේශනය කෙරිණි