Denne modulen implementerer {{taksoboksLua}}. Sjå Modul:Taksoboks/norske namn for automatisk omsetjing av latinske namn.

Alle undermodular:




local eksport = {}
local omsetjingsdata = require('Modul:Taksoboks/norske namn')
local taksonomiWD = require('Modul:Taksoboks/Taksonomidata frå Wikidata')

function eksport.hentNorskNamn(rang, vitskaplegNamn)
	if omsetjingsdata[rang] then
		return omsetjingsdata[rang][vitskaplegNamn]
	else
		return nil
	end
end

function eksport.formaterNamn(vitskaplegNamn, norskNamn, sidetittel, rang, art, erListeelement, lenk, uthev, utdoeydd, erVirus)
	local tekst = ''
	local skalKursiverast = erVirus or rang:match('slekt') or rang:match('art')
	local mellomrom = ' '
	local vitskaplegNamnFormatert = vitskaplegNamn:gsub(' ', ' ')
	if erListeelement then
		mellomrom = ' '
	end

	if norskNamn == vitskaplegNamn then -- samanfallande norsk og vitskapleg namn tyder gjerne på uynskt duplikasjon
		norskNamn = nil
	end

	if norskNamn then
		norskNamn =  mw.language.getContentLanguage():ucfirst(norskNamn) -- stor fyrstebokstav
		if art and mw.title.getCurrentTitle().text == norskNamn and not sidetittel then
			tekst = '[[' .. norskNamn .. ' (' .. rang .. ')|' .. norskNamn .. ']]' -- unngå utheving av høgre rang ved samanfallande namn
		else
			if uthev then
				tekst = "'''" .. norskNamn .. "'''"
			elseif sidetittel then
				tekst = '[[' .. sidetittel ..'|' .. norskNamn .. ']]'
			elseif lenk ~= false then
				tekst = '[[' .. norskNamn .. ']]'
			else
				tekst = norskNamn
			end
		end
		
		if skalKursiverast then -- legg til vitskapleg namn
			tekst = tekst .. mellomrom .. "''" .. '<small>' .. vitskaplegNamnFormatert .. '</small>' .. "''"
		else
			tekst = tekst .. mellomrom .. '<small>' .. vitskaplegNamnFormatert .. '</small>'
		end
	else
		if uthev then 
			tekst = "'''" .. vitskaplegNamnFormatert .. "'''"
		elseif sidetittel then
			tekst = '[[' .. sidetittel .. '|' .. vitskaplegNamnFormatert .. ']]'
		elseif lenk ~= false then
			tekst = '[[' .. vitskaplegNamn .. '|' .. vitskaplegNamnFormatert .. ']]'
		else
			tekst = vitskaplegNamnFormatert
		end
		if skalKursiverast then
			tekst = "''" .. tekst .. "''"
		end
	end
	if utdoeydd then
		tekst = '†' .. tekst
	end
	return tekst
end

function eksport.klassifisertAvWD(Wikidataelement, rike)
	if Wikidataelement.claims and Wikidataelement.claims.P225 then
		local kategoriar = ''
		local resultat = ''
		local klassifisertAv, klassifisertAar, parentesar
		
		if Wikidataelement.claims.P225[1]['qualifiers'] and Wikidataelement.claims.P225[1]['qualifiers']['P405'] then
			n = #Wikidataelement.claims.P225[1]['qualifiers']['P405'] -- talet på forfattarar for dette taksonet
			for i = 1, n do
				personID = 'Q' .. Wikidataelement.claims.P225[1]['qualifiers']['P405'][i]['datavalue']['value']['numeric-id'] -- person
				personelement = mw.wikibase.getEntity(personID) -- hent elementet til personen
				klassifisertAvNamn = personelement:getLabel()
				personsidetittel = personelement:getSitelink('nnwiki') -- finn evt. lokal wikiside
				splittaNamn = mw.text.split(klassifisertAvNamn, ' ')
				if rike == 'Animalia' and personelement.claims.P835 then -- zoologisk sitering
					personskildring = personelement.claims.P835[1]['mainsnak']['datavalue']['value']
					for i = 1, #personelement.claims.P835 do
						if mw.ustring.find(klassifisertAvNamn, personelement.claims.P835[i]['mainsnak']['datavalue']['value']) then -- føretrekk sitering som speglar namn på norsk
							personskildring = personelement.claims.P835[i]['mainsnak']['datavalue']['value']
							break
						end
					end
				elseif rike == 'Plantae' or rike == 'Fungi' and personelement.claims.P428 then -- botanikkavstytting
					personskildring = personelement.claims.P428[1]['mainsnak']['datavalue']['value']
				elseif personelement.claims.P734 and personelement.claims.P734[1]['mainsnak']['datavalue'] then -- nytt etternamnet
					etternamnID = personelement.claims.P734[1]['mainsnak']['datavalue']['value']['id']
					personskildring = mw.wikibase.getEntity(etternamnID):getLabel()
				else
					personskildring = splittaNamn[#splittaNamn]  -- nytt berre sisteleddet av namnet
				end
				tittel = personsidetittel or klassifisertAvNamn
				if i == 1 then
					klassifisertAv = '[[' .. tittel .. '|' .. personskildring .. ']]'
				elseif i ~= n then
					klassifisertAv = klassifisertAv .. ', ' .. '[[' .. tittel .. '|' .. personskildring .. ']]'
				else
					klassifisertAv = klassifisertAv .. ' & ' .. '[[' .. tittel .. '|' .. personskildring .. ']]'
				end
				if mw.title.getCurrentTitle().namespace == 0 and mw.title.new('Kategori:Takson namngjevne av ' .. klassifisertAvNamn):getContent() ~= nil then
					kategoriar = kategoriar .. '[[Kategori:Takson namngjevne av ' .. klassifisertAvNamn .. ']]'
				else
					klassifisertAvModul = require('Modul:Klassifisert av')
					kategoriar = kategoriar .. klassifisertAvModul.hovud(personskildring, 'berre kategori', 'om finst')
				end
			end
		end
		if Wikidataelement.claims.P225[1]['qualifiers'] and Wikidataelement.claims.P225[1]['qualifiers']['P574'] then 
			klassifisertDato = Wikidataelement.claims.P225[1]['qualifiers']['P574'][1]['datavalue']['value']['time'] -- dato
			klassifisertAar = '[[' .. mw.text.split(mw.ustring.sub(klassifisertDato, 2), '-')[1] .. ']]'
		end
		
		if Wikidataelement.claims.P225[1]['qualifiers'] and Wikidataelement.claims.P225[1]['qualifiers']['P31'] then 
			if Wikidataelement.claims.P225[1]['qualifiers']['P31'][1]['datavalue']['value']['numeric-id'] == 14594740 then -- skal ha parentesar
				parentesar = true
			end
		end
		
		if klassifisertAv and klassifisertAar then
			resultat = klassifisertAv .. ', ' .. klassifisertAar
		else
			resultat = klassifisertAv or klassifisertAar or resultat
		end
		if parentesar then
			resultat = '(' .. resultat .. ')'
		end
		resultat = resultat .. kategoriar
		
		return resultat
	else
		return nil
	end
end


function eksport.nyRadseksjon(innhald)
	local tekst = string.format('\n|- valign="top"\n|-\n| style="text-align:center;background: #EEDDAA;" colspan="2"|%s', innhald)
	return tekst
end

function eksport.nyRad(skildring, innhald)
	if skildring ~= '' then
		skildring = skildring .. '\n| '
	end
	local tekst = string.format('\n|- valign="top"\n| %s%s', skildring, innhald)
	return tekst
end

function eksport.lagListe(listedata, rang, erVirus)
	local listeelement = mw.text.split(listedata, ',')
	local liste = ''
	for i = 1, #listeelement do
		local listeelementet = listeelement[i]:gsub('^%s*', '') -- fjern leiande mellomrom
		local norskNamn = eksport.hentNorskNamn(rang, listeelementet)
		listeelementet = eksport.formaterNamn(listeelementet, norskNamn, nil, rang, false, true, true, false, false, erVirus)
		liste = liste .. listeelementet .. '<br />'
	end
	return liste
end

function eksport.statustekst(status, omraade)
	local tekst = ''
	local kategoriar = ''
	local WD = {Q211005 = 'lc', Q719675 = 'nt', Q278113 = 'vu', Q11394 = 'en',
		Q219127 = 'cr', Q239509 = 'ew', Q237350 = 'ex', Q3245245 = 'dd'}
	
	if mw.ustring.sub(status, 1, 1) == 'q' then -- stoda vart henta frå Wikidata
		status = WD[mw.ustring.upper(mw.ustring.sub(status, 1, 1)) .. mw.ustring.sub(status, 2)]
	end
	
	if omraade == 'verda' then
		tekst = '<small>\'\'\'[[Global raudliste|Status i verda:]]\'\'\' '
	end
	if omraade == 'Noreg' then
		tekst = tekst .. '<small>\'\'\'[[Norsk raudliste for artar|Status i Noreg:]]\'\'\' '
	end
	if status == 'secure'  or status == 'ikkje truga'then
		tekst = tekst ..  'Ikkje truga'
	elseif status == 'dom' or status == 'domesticated'  or status == 'husdyr' then
		tekst = tekst ..  'Husdyr'
	elseif status == 'dd' or status == 'datamangel'  or status == 'data' then
		tekst = tekst ..  'Datamangel'
	elseif status == 'lc' or status == 'livskraftig'  then
		tekst = tekst ..  '[[Fil:Status iucn LC icon.svg|15px|LC]] [[Livskraftig]]'
		if omraade == 'verda' then
			kategoriar = kategoriar .. '[[Kategori:Livskraftige artar]]'
		elseif omraade == 'Noreg' then
			kategoriar = kategoriar .. '[[Kategori:Livskraftige artar i Noreg]]'
		end
	elseif status == 'nt' or status == 'nær truga' then
		tekst = tekst ..  '[[Fil:Status iucn NT icon.svg|15px|NT]] [[Nær truga]]'
		if omraade == 'verda' then
			kategoriar = kategoriar .. '[[Kategori:Nær truga artar]]'
		elseif omraade == 'Noreg' then
			kategoriar = kategoriar .. '[[Kategori:Nær truga artar i Noreg]]'
		end
	elseif status == 'vu' or status == 'sårbar' then
		tekst = tekst ..  '[[Fil:Status iucn VU icon.svg|15px|VU]] [[Sårbare artar|Sårbar]]'
		if omraade == 'verda' then
			kategoriar = kategoriar .. '[[Kategori:Sårbare artar]]'
		elseif omraade == 'Noreg' then
			kategoriar = kategoriar .. '[[Kategori:Truga artar i Noreg]]'
		end
	elseif status == 'en' or status == 'sterkt truga'  then
		tekst = tekst ..  '[[Fil:Status iucn EN icon.svg|15px|EN]] [[Sterkt truga]]'
		if omraade == 'verda' then
			kategoriar = kategoriar .. '[[Kategori:Sterkt truga artar]]'
		elseif omraade == 'Noreg' then
			kategoriar = kategoriar .. '[[Kategori:Truga artar i Noreg]]'
		end
	elseif status == 'cr' or status == 'kritisk truga'  then
		tekst = tekst ..  '[[Fil:Status iucn CR icon.svg|15px|CR]] [[Kritisk truga]]'
		if omraade == 'verda' then
			kategoriar = kategoriar .. '[[Kategori:Kritisk truga artar]]'
		elseif omraade == 'Noreg' then
			kategoriar = kategoriar .. '[[Kategori:Truga artar i Noreg]]'
		end
	elseif status == 'ew' then
			tekst = tekst ..  '[[Fil:Status iucn EW icon.svg|15px|EW]] [[Utrydda art|Utrydda]] i vill tilstand'
					if omraade == 'verda' then
			kategoriar = kategoriar .. '[[Kategori:Artar utrydda i vill tilstand]]'
		end
	elseif status == 're' or status == 'ex' or status == 'ew' or  status == 'utrydda' then
		if omraade == 'verda' then
			tekst = tekst ..  '[[Fil:Status iucn EX icon.svg|15px|EX]] [[Utrydda art|Utdøydd]]'
			kategoriar = kategoriar .. '[[Kategori:Utdøydde artar]]'
		elseif omraade == 'Noreg' then
			tekst = tekst ..  '[[Fil:Status iucn RE icon.svg|15px|RE]] [[Utrydda art|Regionalt utdøydd]]'
			kategoriar = kategoriar .. '[[Kategori:Utdøydde artar i Noreg]]'
		end
	elseif status == 'se' or status == 'svært høg risiko' then
		tekst = tekst ..  ' [[Framandartslista|Framandart]] med svært høg risiko'
		if omraade == 'Noreg' then
			kategoriar = kategoriar .. '[[Kategori:Artar på Framandartslista]]'
		end
	elseif status == 'hi' or status == 'høg risiko' then
		tekst = tekst ..  ' [[Framandartslista|Framandart]] med høg risiko'
		if omraade == 'Noreg' then
			kategoriar = kategoriar .. '[[Kategori:Artar på Framandartslista]]'
		end
	elseif status == 'ph' or status == 'potensielt høg risiko' then
		tekst = tekst ..  ' [[Framandartslista|Framandart]] med potensielt høg risiko'
		if omraade == 'Noreg' then
			kategoriar = kategoriar .. '[[Kategori:Artar på Framandartslista]]'
		end
	elseif status == 'lo' or status == 'låg risiko' then
		tekst = tekst ..  ' [[Framandartslista|Framandart]] med låg risiko'
		if omraade == 'Noreg' then
			kategoriar = kategoriar .. '[[Kategori:Artar på Framandartslista]]'
		end
	elseif status == 'nk' or status == 'ingen kjend risiko' then
		tekst = tekst ..  ' [[Framandartslista|Framandart]] med ingen kjend risiko'
		if omraade == 'Noreg' then
			kategoriar = kategoriar .. '[[Kategori:Artar på Framandartslista]]'
		end
	elseif status == 'nr' or status == 'ikkje risikovurdert' then
		tekst = tekst ..  ' [[Framandartslista|Framandart]] som ikkje er risikovurdert'
	end
	tekst = tekst .. '</small>'
	
	if mw.title.getCurrentTitle().namespace == 0 then -- legg berre til kategoriar i hovudnamnerommet
		tekst = tekst .. kategoriar
	end
	
	return tekst
end

function eksport.bilete(bilete, bilettekst, biletstorleik)
	local bilettekst1 = ''; local bilettekst2 = ''
	local biletstorleik = biletstorleik or ''
	if bilettekst then
		bilettekst1 = '|' .. bilettekst
		bilettekst2 = string.format('<br />%s', bilettekst)
	end
	if biletstorleik ~= '' then
		biletstorleik = '|' .. biletstorleik
	end
	
	return string.format('[[Fil:%s%s|frameless%s]]', bilete, biletstorleik, bilettekst1) .. bilettekst2
end


function eksport.hovud(frame)
	local tabell = {}
	local taksoboks = ''
	local args = frame:getParent().args
	local namn = {}
	local erVirus = args['er_virus']
	local status = args['status']
	if status == '' then status = nil end
	local statusNoreg = args['status_noreg']
	if statusNoreg == '' then statusNoreg = nil end
	local bilete = args['bilete'] or args['bilde']
	if bilete == '' then bilete = nil end
	local bilettekst1 = args['bilettekst'] or args['bildetekst']
	if bilettekst1 == '' then bilettekst1 = nil end
	local bilettekst2 = args['bilettekst2'] or args['bildetekst2']
	if bilettekst2 == '' then bilettekst2 = nil end
	local bilete2 = args['bilete2'] or args['bilde2']
	if bilete2 == '' then bilete2 = nil end
	local kart = args['kart']
	if kart == '' then kart = nil end
	local karttekst = args['karttekst']
	if karttekst == '' then karttekst = nil end
	local ID = args['id'] or args['ID']
	if ID == '' then ID = nil end
	local Wikidataelement 
	if not args['ingen_Wikidata'] or args['ingen_Wikidata'] ~= 'ja' then
		elementID = ID or mw.wikibase.getEntityIdForCurrentPage() 
		Wikidataelement = mw.wikibase.getEntity(elementID) -- Wikidata-elementet til sida (eller oppgjeven førehandsvisings-ID)
	end
	local taksonomiFraaWDArg = args['taksonomidata_frå_Wikidata'] or args['taksonomi_WD']
	local taksonomiFraaWD = false
	if not taksonomiFraaWDArg or taksonomiFraaWDArg == '' or taksonomiFraaWDArg == 'nei' then
		taksonomiFraaWD = false
	elseif Wikidataelement then
		taksonomiFraaWD = true
	end
	
	SIDETITTEL = mw.title.getCurrentTitle().text
	
	--
	tabell['status og utbreiing'] = {}
	tabell.bilete = {[1] = {}, [2] = {}}
	tabell.taksonomi = {hierarki = {}, rangar = {}}
	tabell.klassifiseringsboks = {innhald = {}}
	--
	
	-- handsam bilete
	local kjoenn = {Q44148 = 'hann', Q43445 = 'hoe'}
	if not bilete and not bilete2 then -- sjå om det finst bilete på Wikidata
		if Wikidataelement and Wikidataelement.claims and Wikidataelement.claims.P18 then
			local besteBileta = Wikidataelement:getBestStatements('P18')
			if besteBileta[1]['mainsnak']['datavalue'] then
				if besteBileta[1]['qualifiers'] and besteBileta[1]['qualifiers']['P21'] then
					tabell.bilete[1]['kjønn'] = kjoenn[besteBileta[1]['qualifiers']['P21'][1]['datavalue']['value']['id']]
					bilete = besteBileta[1]['mainsnak']['datavalue']['value']
				end
			end
			if besteBileta[2] and besteBileta[2]['mainsnak']['datavalue'] then
				if besteBileta[2]['qualifiers'] and besteBileta[2]['qualifiers']['P21'] then
					bilete2 = besteBileta[2]['mainsnak']['datavalue']['value']
					tabell.bilete[2]['kjønn'] = kjoenn[besteBileta[2]['qualifiers']['P21'][1]['datavalue']['value']['id']]
				end
			end
			if not bilete then
				local besteBiletet = nil
				for k, v in pairs(besteBileta) do -- plukk ut bilete med nynorsk eller engelsk tekst
					if not besteBiletet then
						besteBiletet = {bilete = v, rang = 9000}
					end
					if v['qualifiers'] and v['qualifiers']['P2439'] and v['qualifiers']['P2439'][1]['datavalue']['value']['id'] then
						if v['qualifiers']['P2439'][1]['datavalue']['value']['id'] =='Q25164' and besteBiletet.rang > 1 then
							besteBiletet = {bilete = v, rang = 1}
						elseif v['qualifiers']['P2439'][1]['datavalue']['value']['id'] =='Q1860' and besteBiletet.rang > 2 then
							besteBiletet = {bilete = v, rang = 2}
						end
					end	
				end
				bilete = besteBiletet.bilete['mainsnak']['datavalue']['value']
			end
		end
	end
	
	if bilete then
		tabell.bilete[1] = {fil = bilete, skildring = bilettekst1, storleik = args['biletstorleik'] or args['bildestorleik'], ['kjønn'] = tabell.bilete[1]['kjønn']}
	end
	if bilete2 then
		tabell.bilete[2] = {fil = bilete2, skildring = bilettekst2, storleik = args['biletstorleik2'] or args['bildestorleik2'], ['kjønn'] = tabell.bilete[2]['kjønn']}
	end
	
	if not status and Wikidataelement then
		if Wikidataelement.claims and Wikidataelement.claims.P141 then -- hent IUCN-stode frå Wikidata
			status = Wikidataelement.claims.P141[1]['mainsnak']['datavalue']['value']['id']
		end
	end

	local karttekstmerke = false
	if not kart and Wikidataelement then
		if Wikidataelement.claims and Wikidataelement.claims.P181 then -- hent kart frå Wikidata
			kart = Wikidataelement.claims.P181[1]['mainsnak']['datavalue']['value']
		end
	end

	-- handsam status
	if status or statusNoreg or kart then
		local seksjonstittel
		if kart then
			seksjonstittel = 'Utbreiing'
			if status or statusNoreg then
				seksjonstittel = seksjonstittel .. ' og status'
			end
		elseif status or statusNoreg then
			seksjonstittel = 'Status'
		end
		tabell['status og utbreiing'].overskrift = eksport.nyRadseksjon(string.format("'''%s'''", seksjonstittel))
		tabell['status og utbreiing'].status = {}
	end
	if status and status ~= '' then
		status = status:lower()
		tabell['status og utbreiing'].status.verda = eksport.statustekst(status, 'verda')
		if args['status_kjelde'] then
			tabell['status og utbreiing'].status.verda = tabell['status og utbreiing'].status.verda .. args['status_kjelde']
		end
	end
	if statusNoreg and statusNoreg ~= '' then
		statusNoreg = statusNoreg:lower()
		tabell['status og utbreiing'].status.Noreg = ''
		if status then
			tabell['status og utbreiing'].status.Noreg = '<br />'
		end
		tabell['status og utbreiing'].status.Noreg = tabell['status og utbreiing'].status.Noreg .. eksport.statustekst(statusNoreg, 'Noreg')
		if args['status_noreg_kjelde'] then
			tabell['status og utbreiing'].status.Noreg = tabell['status og utbreiing'].status.Noreg .. args['status_noreg_kjelde']
		end
	end
	
	-- handsam kart
	if kart then
		tabell['status og utbreiing'].kart = {}
		tabell['status og utbreiing'].kart.fil = kart
		if karttekst then
			tabell['status og utbreiing'].kart.skildring = karttekst
		end
		if args['kartstorleik'] then
			tabell['status og utbreiing'].kart.storleik = args['kartstorleik']
		end
	end
	
	-- byrjing på klassifisering
	if taksonomiFraaWD then -- skal henta inn taksonomidata frå Wikidata
		taksonomidataWD = taksonomiWD.hovud(ID)
	end
	
	tabell.taksonomi.overskrift = eksport.nyRadseksjon("'''[[Biologisk systematikk|Systematikk]]'''")
	
	-- særhandsaming for dette argumentet
	local rike = args['rike']
	if not rike and taksonomiFraaWD and taksonomidataWD['rike'] then
		rike = taksonomidataWD['rike'][1]
	end

	local klassifisertAv = args['klassifisert_av']
	
	-- format: {<liste over gyldige argumentnamn>}, <skildring av raden>}
	
	local gyldigeArgument = {{{'domene'}, "'''[[Biologisk domene|Domene:]]'''"}, {{'overrike'}, "'''[[Biologisk rike|Overrike:]]'''"}, 
		{{'rike'}, "'''[[Biologisk rike|Rike:]]'''"}, {{'underrike'}, "'''[[Biologisk rike|Underrike:]]'''"}, 
		{{'infrarike'}, "'''[[Biologisk rike|Infrarike:]]'''"},	{{'overrekkje', 'overrekke'}, "'''[[Biologisk rekkje|Overrekkje:]]'''"},
		{{'rekkje', 'rekke'}, "'''[[Biologisk rekkje|Rekkje:]]'''"}, {{'underrekkje', 'underrekke'}, "'''[[Biologisk rekkje|Underrekkje:]]'''"},
		{{'infrarekkje', 'infrarekke'}, "'''[[Biologisk rekkje|Infrarekkje:]]'''"}, {{'megaklasse'}, "'''[[Biologisk klasse|Megaklasse:]]'''"},
		{{'overklasse'}, "'''[[Biologisk klasse|Overklasse:]]'''"}, {{'klasse'}, "'''[[Biologisk klasse|Klasse:]]'''"},
		{{'underklasse'}, "'''[[Biologisk klasse|Underklasse:]]'''"},  {{'infraklasse'}, "'''[[Biologisk klasse|Infraklasse:]]'''"},
		{{'overorden'}, "'''[[Biologisk orden|Overorden:]]'''"}, {{'orden'}, "'''[[Biologisk orden|Orden:]]'''"},
		{{'underorden'}, "'''[[Biologisk orden|Underorden:]]'''"}, {{'infraorden'}, "'''[[Biologisk orden|Infraorden:]]'''"},
		 {{'parvorden'}, "'''[[Biologisk orden|Parvorden:]]'''"},
		{{'overfamilie'}, "'''[[Biologisk familie|Overfamilie:]]'''"}, {{'familie'}, "'''[[Biologisk familie|Familie:]]'''"},
		{{'underfamilie'}, "'''[[Biologisk familie|Underfamilie:]]'''"}, {{'overstamme', 'overtribus'}, "'''[[Biologisk tribus|Overstamme:]]'''"},
		{{'stamme', 'tribus'}, "'''[[Biologisk tribus|Stamme:]]'''"}, {{'understamme', 'undertribus'}, "'''[[Biologisk tribus|Understamme:]]'''"},
		{{'slekt'}, "'''[[Biologisk slekt|Slekt:]]'''"}, {{'underslekt'}, "'''[[Biologisk slekt|Underslekt:]]'''"}, {{'seksjon_over_art'}, "'''Seksjon:'''"},
		{{'art'}, "'''[[Biologisk art|Art:]]'''"}, {{'underart'}, "'''[[Underart|Underart:]]'''"}, {{'varietet'}, "'''[[Varietet|Varietet:]]'''"}, {{'form'}, "'''[[Form i botanikk|Form:]]'''"},
		{{'kultivar'}, "'''[[Kultivar|Kultivar:]]'''"}, {{'rosekultivar'}, "'''[[Kultivar|Kultivar:]]'''"}, {{'potetkultivar'}, "'''[[Kultivar|Kultivar:]]'''"},
		{{'klade'}, "'''''[[Klade|Klade:]]'''''"}, {{'urangert'}, "'''''[[Biologisk klassifisering|(Urangert)]]''''':"}}
	
	local rangskildring = {}
	for i = 1, #gyldigeArgument do 
		rangskildring[gyldigeArgument[i][1][1]] = gyldigeArgument[i][2] -- bygg tabell som kan indekserast med rangnamn
	end

	local rangnummer = 0
	for i = 1, #gyldigeArgument do -- bygg infoboksen, rang for rang
		local erWDData = false -- om taksonomidataet er henta frå Wikidata
		local argumenthovudnamn = gyldigeArgument[i][1][1] -- t.d. 'rekkje'; for å vera eintydig
		for j = 1, #gyldigeArgument[i][1] do -- iterer over alle mogelege argumentsynonym
			argumentnamn = gyldigeArgument[i][1][j]
			argumentinndata = args[argumentnamn .. '_rå'] or args[argumentnamn]
			
			if not argumentinndata and taksonomiFraaWD then
				if taksonomidataWD[argumentnamn] then
					argumentinndata = taksonomidataWD[argumentnamn]
					erWDData = true
				end
			end
			
			if argumentinndata then
				break
			end
		end
		
		local vitskaplegNamn
		local lenk = true -- om det skal opprettast ei wikilenkje
		local uthev = false -- om namnet skal uthevast (t.d. for monotypi)
		local utdoeydd = false -- om taksoner er utdøydd
		if argumentinndata then
			rangnummer = rangnummer + 1
			tabell.taksonomi.hierarki[rangnummer] = {innhald = {}}
			tabell.taksonomi.hierarki[rangnummer].rangnamn = argumenthovudnamn
			if args[argumentnamn .. '_rå'] then
				tabell.taksonomi.hierarki[rangnummer].innhald['rå'] = argumentinndata
			elseif args[argumentnamn .. '_norsk'] then
				tabell.taksonomi.hierarki[rangnummer].innhald['norsk namn'] = args[argumentnamn .. '_norsk']
				tabell.taksonomi.hierarki[rangnummer].innhald['vitskapleg namn'] = argumentinndata
			else 
				local sidetittel = nil
				if erWDData then
					vitskaplegNamn = argumentinndata[1]
					sidetittel = argumentinndata[3]
					monotypisk = argumentinndata[4]
					utdoeydd = argumentinndata[5]

					tabell.taksonomi.hierarki[rangnummer].innhald.monotypisk = monotypisk
					
					if argumentinndata[2] then -- fann det norske namnet på Wikidata
						norskNamn = argumentinndata[2] 
					else
						norskNamn = eksport.hentNorskNamn(argumenthovudnamn, vitskaplegNamn)
					end
						
					if argumenthovudnamn == 'seksjon_over_art' then
						if vitskaplegNamn:find('sect.') then
							vitskaplegNamn = mw.text.split(vitskaplegNamn, 'sect. ')[2]
						end
						if not sidetittel then -- unngår potensielt uheldig lenking
							lenk = false
						end
					end
					if vitskaplegNamn:find('subg.') then
							vitskaplegNamn = mw.text.split(vitskaplegNamn, 'subg. ')[2]
					end
					if vitskaplegNamn:find('subsp.') then
							vitskaplegNamn = mw.ustring.gsub(vitskaplegNamn, ' subsp. ', ' ')
					end
				else
					if argumenthovudnamn == 'art' then
						vitskaplegNamn = tabell.taksonomi.rangar['slekt'].innhald['vitskapleg namn'] .. ' ' .. argumentinndata
					elseif argumenthovudnamn == 'underart' then
						vitskaplegNamn = tabell.taksonomi.rangar['slekt'].innhald['vitskapleg namn'] .. ' ' .. tabell.taksonomi.rangar['art'].innhald['vitskapleg namn'] .. ' ' .. argumentinndata
					else
						vitskaplegNamn = argumentinndata
					end
					norskNamn = eksport.hentNorskNamn(argumenthovudnamn, vitskaplegNamn)
				end
				tabell.taksonomi.hierarki[rangnummer].innhald['vitskapleg namn'] = vitskaplegNamn
				if norskNamn ~= vitskaplegNamn then
					tabell.taksonomi.hierarki[rangnummer].innhald['norsk namn'] = norskNamn
				end
				tabell.taksonomi.hierarki[rangnummer].innhald.sidetittel = sidetittel
				tabell.taksonomi.hierarki[rangnummer].innhald.lenk = lenk
				tabell.taksonomi.hierarki[rangnummer].innhald['utdøydd'] = utdoeydd

				tabell.taksonomi.rangar[argumenthovudnamn] = tabell.taksonomi.hierarki[rangnummer]
			end
		end
	end
	
	if tabell.taksonomi.hierarki[1] then
		ARTIKKELRANGNAMN = tabell.taksonomi.hierarki[#tabell.taksonomi.hierarki].rangnamn
		namn['vitskapleg'] = tabell.taksonomi.hierarki[#tabell.taksonomi.hierarki].innhald['vitskapleg namn']
		if tabell.taksonomi.hierarki[1].innhald['vitskapleg namn']:match('Virus') then
			erVirus = true
		end
	end


	if args['namn'] then
		namn['formatert'] = args['namn']:gsub(' ', '&nbsp;')
		namn['uformatert'] = args['namn']:gsub("'''", ''):gsub("''", ''):gsub('&nbsp;', ' ')
		namn['norsk'] = namn['uformatert']
		local fyrst = mw.ustring.find(namn['formatert'], '%a')
		local storFyrste = mw.ustring.upper(namn['formatert']:sub(fyrst, fyrst))
		namn['formatert, stor fyrstebokstav'] = namn['formatert']:sub(1, fyrst-1) .. storFyrste .. namn['formatert']:sub(fyrst + 1)
	elseif tabell.taksonomi.hierarki[1] then
		if tabell.taksonomi.hierarki[#tabell.taksonomi.hierarki].norsk then
			namn['norsk'] = tabell.taksonomi.hierarki[#tabell.taksonomi.hierarki].norsk
			namn['formatert'] = namn['norsk']:gsub(" ", '&nbsp;')
			namn['uformatert'] = namn['norsk']
			namn['formatert, stor fyrstebokstav'] = mw.ustring.upper(mw.ustring.sub(namn['norsk'], 1, 1)) .. mw.ustring.sub(namn['norsk'], 2)
		elseif taksonomiFraaWD and Wikidataelement and Wikidataelement.labels['nn'] and Wikidataelement.labels['nn']['language'] == 'nn' and Wikidataelement:getLabel('nn') ~= namn['vitskapleg'] then -- nytt merkelappen på Wikidata som namn
			local merkelapp = Wikidataelement:getLabel('nn')
			namn['uformatert'] = merkelapp
			namn['formatert'] = merkelapp
			namn['norsk'] = merkelapp
			namn['formatert, stor fyrstebokstav'] = mw.ustring.upper(mw.ustring.sub(merkelapp, 1, 1)) .. mw.ustring.sub(merkelapp, 2)
		elseif not namn['uformatert'] then
			namn['uformatert'] = namn['vitskapleg']
			if mw.ustring.match(ARTIKKELRANGNAMN, 'slekt') or mw.ustring.match(ARTIKKELRANGNAMN, 'art') or erVirus then
				namn['formatert'] = "''" .. namn['vitskapleg'] .. "''"
			else
				namn['formatert'] = namn['vitskapleg']
			end
			namn['formatert, stor fyrstebokstav'] = namn['formatert']
		end
	end

	if tabell.taksonomi.hierarki[1] and namn['uformatert'] == namn['vitskapleg'] and not mw.ustring.find(SIDETITTEL, namn['vitskapleg']:gsub('&nbsp;', ' ')) then -- det ser ut som at sidetittelen er eit norsk namn på taksonet
		namn['uformatert'] = mw.language.getContentLanguage():lcfirst(SIDETITTEL)
		namn['norsk'] = namn['uformatert']
		namn['formatert'] = namn['uformatert']
		namn['formatert, stor fyrstebokstav'] = SIDETITTEL
	end
	
	if tabell.taksonomi.hierarki[1] then
		namn['uformatert, stor fyrstebokstav'] = mw.ustring.upper(mw.ustring.sub(namn['uformatert'], 1, 1)) .. mw.ustring.sub(namn['uformatert'], 2)
	end

	if klassifisertAv then -- hent inn namn om det finst
		klassifisertAvModul = require('Modul:Klassifisert av')
		tabell.klassifiseringsboks.innhald['av, rå'] = klassifisertAvModul.hovud(klassifisertAv, 'wikilenkje, argument', 'om finst')
	elseif Wikidataelement then
		tabell.klassifiseringsboks.innhald['av, rå'] = eksport.klassifisertAvWD(Wikidataelement, rike)
	end
	
	tabell.lister = {}
	local gyldigeLister = {{{'rekkjer', 'rekker'}, 'rekkje'}, {{'underrekkjer', 'underrekker'}, 'underrekkje'}, {{'klassar', 'klasser'}, 'klasse'}, 
		{{'ordenar'}, 'orden'}, {{'underordenar'}, 'underorden'},
		{{'familiar'}, 'familie'}, {{'underfamiliar'}, 'underfamilie'}, {{'slekter'}, 'slekt'}, {{'artar'}, 'art'}, {{'underartar'}, 'underart'}}
	for i = 1, #gyldigeLister do -- finn ut om det er gjeve eit listeargument
		local listedata = nil
		local listerang = gyldigeLister[i][2]
		for j = 1, #gyldigeLister[i][1] do -- iterer over alle mogelege listeargumentsynonym
			listenamn = gyldigeLister[i][1][j]
			listedata = args[listenamn .. '_rå'] or args[listenamn]
			if listedata then
				break
			end
		end
		if listedata then
			radinnhald = ' colspan="2" |'
			if args[listenamn .. '_rå'] then
				radinnhald = radinnhald .. '\n' .. listedata -- sleng på eit lineskift fyrst for å få lista til å verka
			else 
				radinnhald = radinnhald .. eksport.lagListe(listedata, listerang, erVirus)
			end
			listetittel = "'''" .. mw.ustring.upper(mw.ustring.sub(listenamn, 1, 1)) .. mw.ustring.sub(listenamn, 2) .. "'''"
			liste = eksport.nyRadseksjon(listetittel) .. eksport.nyRad('', radinnhald)
			table.insert(tabell.lister, liste)
		end
	end

	----- Samansetjing av taksoboksen -----
	---
	--

	-- byrjinga på taksboksen
	taksoboks = string.format([[{| class="toccolours" style="float:right; clear:right; width:250px; margin-left: 1em; font-size=small;"
| colspan="2"  style="text-align:center;background: #EEDDAA;"|'''%s''' ]], namn['formatert, stor fyrstebokstav'] or SIDETITTEL )
	taksoboks = taksoboks .. '\n|-\n| colspan="2" align="center" style="text-align: center; | '
	
	
	-- bilete
	if tabell['bilete'][1].fil or tabell['bilete'][2].fil then
		if tabell['bilete'][1]['kjønn'] or tabell['bilete'][2]['kjønn'] then
			if mw.ustring.find(namn['formatert'], ' ') or mw.ustring.find(namn['formatert'], '&nbsp;') then
				sep = '-'
			else
				sep = ''
			end
		end
	
		local bilettekst1
		if not tabell.bilete[1].skildring and ARTIKKELRANGNAMN == 'art' or ARTIKKELRANGNAMN == 'underart' then -- vil berre ha taksonnamnet som bilettekst for artar og underartar
			if tabell.bilete[1]['kjønn'] then
				bilettekst1 = namn['formatert, stor fyrstebokstav'] .. sep .. tabell.bilete[1]['kjønn']
			else
				bilettekst1 = namn['formatert, stor fyrstebokstav']
			end
		else
			bilettekst1 = tabell.bilete[1].skildring
		end
		
		taksoboks = taksoboks .. eksport.bilete(tabell.bilete[1].fil, bilettekst1, tabell.bilete[1].storleik)
		
		if tabell.bilete[2].fil then
			if tabell.bilete[1] then
				taksoboks = taksoboks .. '\n|-\n| colspan="2" align="center" style="text-align: center; | '
			end
			local bilettekst2
			if not tabell.bilete[2].skildring then
				if tabell.bilete[2]['kjønn'] then
					bilettekst2 = namn['formatert, stor fyrstebokstav'] .. sep .. tabell.bilete[2]['kjønn']
				else
					bilettekst2 = namn['formatert, stor fyrstebokstav']
				end
			else
				bilettekst2 = tabell.bilete[2].skildring
			end
			taksoboks = taksoboks .. eksport.bilete(tabell.bilete[2].fil, bilettekst2, tabell.bilete[2].storleik)
		end
	end
	
	-- status og utbreiing
	if tabell['status og utbreiing'].overskrift then
		taksoboks = taksoboks .. tabell['status og utbreiing'].overskrift .. '\n|-\n|colspan="2" align="center" style="text-align: center;|'
		if tabell['status og utbreiing'].status.verda then
			taksoboks = taksoboks .. tabell['status og utbreiing'].status.verda
		end
		if tabell['status og utbreiing'].status.Noreg then
			taksoboks = taksoboks .. tabell['status og utbreiing'].status.Noreg
		end
		if tabell['status og utbreiing'].kart then
			local skildring = tabell['status og utbreiing'].kart.skildring or 'Utbreiinga av ' .. namn['formatert']
			karttekst1 = '|' .. skildring
			karttekst2 = string.format('<br /> %s', skildring)
			taksoboks = taksoboks .. string.format('[[Fil:%s%s|frameless%s]]', tabell['status og utbreiing'].kart.fil, tabell['status og utbreiing'].kart.storleik or '', karttekst1) .. karttekst2
		end
	end
	
	-- taksonomi
	if tabell.taksonomi.hierarki[1] then
		taksoboks = taksoboks .. tabell.taksonomi.overskrift
		for i = 1, #tabell.taksonomi.hierarki do
			vitskaplegNamn = tabell.taksonomi.hierarki[i].innhald['vitskapleg namn']
			norskNamn = tabell.taksonomi.hierarki[i].innhald['norsk namn']
			sidetittel = tabell.taksonomi.hierarki[i].innhald.sidetittel
			lenk = tabell.taksonomi.hierarki[i].innhald.lenk
			monotypisk = tabell.taksonomi.hierarki[i].innhald.monotypisk
			utdoeydd = tabell.taksonomi.hierarki[i].innhald['utdøydd']
			rangnamn = tabell.taksonomi.hierarki[i].rangnamn
			
			local uthev
			if monotypisk then
				uthev = true
			elseif ARTIKKELRANGNAMN == rangnamn then
				uthev = true
			end
			
			if rangnamn == ARTIKKELRANGNAMN and not norskNamn and namn['norsk'] then -- norsk namn henta frå artikkeltittelen
				norskNamn = namn['norsk']
			end
			
			if not erVirus then
				if rangnamn == 'art' then -- avstytta namn
					local namnelement = mw.text.split(vitskaplegNamn, ' ')
					vitskaplegNamn = mw.ustring.sub(namnelement[1], 1, 1) .. '.&nbsp;' ..namnelement[2]
				elseif rangnamn == 'underart' then
					local namnelement = mw.text.split(vitskaplegNamn, ' ')
					vitskaplegNamn = mw.ustring.sub(namnelement[1], 1, 1) .. '.&nbsp;' .. mw.ustring.sub(namnelement[2], 1, 1) .. '.&nbsp;' .. namnelement[3]
				end
			end
			if tabell.taksonomi.hierarki[i].innhald['rå'] then
				radinnhald = tabell.taksonomi.hierarki[i].innhald['rå']
			else
				radinnhald = eksport.formaterNamn(vitskaplegNamn, norskNamn, sidetittel, rangnamn, art, false, lenk, uthev, utdoeydd, erVirus)
			end
			taksoboks = taksoboks .. eksport.nyRad(rangskildring[rangnamn], radinnhald)
		end

		if mw.ustring.match(ARTIKKELRANGNAMN, 'art') then
			taksoboks = taksoboks .. eksport.nyRadseksjon("'''[[Vitskapleg namn]]'''") .. '\n|- valign="top"\n| style="text-align: center;" colspan="2" |'
			taksoboks = taksoboks .. "'''''" .. tabell.taksonomi.rangar[ARTIKKELRANGNAMN].innhald['vitskapleg namn'] .. "'''''"
			if tabell.klassifiseringsboks.innhald['av, rå'] then
				taksoboks = taksoboks .. '<div style="text-align: center; font-size: smaller; ">' .. tabell.klassifiseringsboks.innhald['av, rå'] .. '</div>'
			end
		elseif tabell.klassifiseringsboks.innhald['av, rå'] then
			taksoboks = taksoboks .. '<br /><small>' .. tabell.klassifiseringsboks.innhald['av, rå'] .. '</small>'
		end
	end

	-- lister
	if tabell['lister'] then
		for i = 1, #tabell.lister do
			taksoboks = taksoboks .. tabell.lister[i]
		end
	end

	-- enden på taksoboksen
	taksoboks = taksoboks .. '\n|}'
	
	--
	----
	----- Taksoboks ferdig sett saman -----
	if SIDETITTEL == namn['uformatert'] and SIDETITTEL ~= mw.ustring.gsub(namn['formatert'], '&nbsp;', ' ') then
		frame:callParserFunction('VISTITTEL', namn['formatert'])
	end
	
	if ID and mw.title.getCurrentTitle().namespace == 0 then -- åtvaring ved førehandsvising i hovudnamnerommet
		if ID == mw.wikibase.getEntityIdForCurrentPage() then 
			mw.addWarning('Argumentet <code>| id = ' .. ID .. '</code> er identisk med elmentet artikkelen er kopla til ' ..
				'og skal difor ikkje ha nokon verknad. <code>id</code>-argumentet bør berre nyttast når Wikidata-elementet som har taksonomidataa er ' ..
				'eit anna element enn det artikkelen er kopla til, og bør fjernast her.</span></strong>')
		else
			mw.addWarning('Merk: argumentet <code>| id = ' .. ID .. '</code> kan tyda på at artikkelen er kopla til feil ' ..
				'Wikidata-element sidan taksonomidataa ligg på eit anna Wikidata-element enn det artikkelen er kopla til.</span></strong>')
		end
	end

	return taksoboks
end

return eksport