Modul:Taxobox

Från Wikipedia

Dokumentationen för denna modul kan skapas på Modul:Taxobox/dok

p = {}
local wikidata = require('Modul:Wikidata2').formatStatementsFromLua
local wikidata2 = require('Modul:Wikidata2').formatEntityId
local lokalstatus = require('Modul:Taxobox/LokalStatus').LokalStatusFromLua

function filhantering(manbild, databild, manbildtext, databildtext, manbredd)
	local s = ''
	if manbild then
		s = s .. '[[File:' .. manbild
	 	if not manbildtext then
			s = s .. '|' .. manbredd .. 'px]]'
		else
			s = s .. '|' .. manbildtext .. '|' .. manbredd .. 'px]]'
			s = s .. mw.text.tag('div', {}, manbildtext ) 
		end
	else
		s = s .. '[[File:' .. databild
		if not databildtext then
			s = s .. '|250px]]'
		else
			s = s .. '|' .. databildtext .. '|' .. '250px]]'
			s = s .. mw.text.tag('div', {}, databildtext ) 
		end
	end
	return s
end
local pref = {	['Q146481'] = '', -- domän
				['Q36732']  = '', -- rike föredragen systematik 
				['Q38348']  = '', -- stam
				['Q334460'] = '', -- division
				['Q37517']  = '', -- klass
				['Q1153785'] = '', -- underklass
				['Q36602'] = '', -- ordning
				['Q34740'] = '', --släkte
				['Q35409'] = ''} -- familj

local kursiv = {	['Q34740'] = '',
					['Q7432'] = '',
					['Q767728'] = '', 
					['Q68947'] = ''}

local kort =  { ['var'] = '',
				['var.'] = '',
				['ssp'] = '',
				['ssp.'] = '',
				['grupp'] = '',
				['grupp.'] = ''}

local colors = {	['Q756'] = 'lightgreen',
					['Q729'] = 'pink',
					['Q764'] = 'lightblue',
					['Q10892'] = 'khaki',
					['Q137323'] = 'khaki',
					['Q10876'] = 'lightgrey',
					['Q10872'] = 'darkgrey'}
local statusen = {  ['dom'] = "[[Rödlistning|Status i världen:]] Husdjur",
	['domesticated'] 		= "[[Rödlistning|Status i världen:]] Husdjur",
  	['dd']					= "[[Rödlistning|Status i världen:]] [[Kunskapsbrist]]",
  	['q3245245']			= "[[Rödlistning|Status i världen:]] [[Kunskapsbrist]]",
  	['data']				= "[[Rödlistning|Status i världen:]] [[Kunskapsbrist]]",
  	['lr']					= "[[Rödlistning|Status i världen:]] [[Låg risk]]",
  	['lc']					= "[[Rödlistning|Status i världen:]] [[Livskraftig]] (lc)",
  	['q211005']				= "[[Rödlistning|Status i världen:]] [[Livskraftig]] (lc)",
  	['lr/lc']				= "[[Rödlistning|Status i världen:]] [[Livskraftig]] (lc)",
  	['lrlc']				= "[[Rödlistning|Status i världen:]] [[Livskraftig]] (lc)",
  	['se']					= "[[Rödlistning|Status i världen:]] [[Livskraftig]] (lc)",
  	['secure']				= "[[Rödlistning|Status i världen:]] [[Livskraftig]] (lc)",
  	['lr/nt']				= "[[Rödlistning|Status i världen:]] [[Nära hotad]]",
  	['q719675']				= "[[Rödlistning|Status i världen:]] [[Nära hotad]]",
  	['lrnt']				= "[[Rödlistning|Status i världen:]] [[Nära hotad]]",
  	['nt']					= "[[Rödlistning|Status i världen:]] [[Nära hotad]]",
  	['lr/cd']				= "[[Rödlistning|Status i världen:]] [[Behov av åtgärder]]",
  	['q158862']				= "[[Rödlistning|Status i världen:]] [[Behov av åtgärder]]",
  	['lrcd']				= "[[Rödlistning|Status i världen:]] [[Behov av åtgärder]]",
  	['vu']					= "[[Rödlistning|Status i världen:]] [[Sårbar]]",
  	['q278113']				= "[[Rödlistning|Status i världen:]] [[Sårbar]]",
  	['en']					= "[[Rödlistning|Status i världen:]] [[Starkt hotad]]",
  	['q11394']				= "[[Rödlistning|Status i världen:]] [[Starkt hotad]]",
  	['cr']					= "[[Rödlistning|Status i världen:]] [[Akut hotad]]",
  	['q219127']				= "[[Rödlistning|Status i världen:]] [[Akut hotad]]",
  	['ew']					= "[[Rödlistning|Status i världen:]] [[Utdöd]] i vilt tillstånd",
  	['q239509']				= "[[Rödlistning|Status i världen:]] [[Utdöd]] i vilt tillstånd",
  	['ex']					= "[[Rödlistning|Status i världen:]] [[Utdöd]]",
  	['q237350']				= "[[Rödlistning|Status i världen:]] [[Utdöd]]",
  	['extinct']				= "[[Rödlistning|Status i världen:]] [[Utdöd]]",
  	['fossil']				= "[[Rödlistning|Status i världen:]] [[Fossil]]",
  	['pre']					= "[[Rödlistning|Status i världen:]] [[Förhistorisk]]",
  	['text']				= "[[Rödlistning|Status i världen:]] Se text"	
  	}
local statuscat = {  ['dom'] = "[[Kategori:Husdjur]]",
	['domesticated'] 		= "[[Kategori:Husdjur]]",
  	['dd']					= "[[Kategori:Arter med kunskapsbrist som bevarandestatus]]",
  	['q3245245']			= "[[Kategori:Arter med kunskapsbrist som bevarandestatus]]",
  	['data']				= "[[Kategori:Arter med kunskapsbrist som bevarandestatus]]",
  	['lr']					= "",
  	['lc']					= "[[Kategori:Livskraftiga arter]]",
  	['q211005']				= "[[Kategori:Livskraftiga arter]]",
  	['lr/lc']				= "[[Kategori:Livskraftiga arter]]",
  	['lrlc']				= "[[Kategori:Livskraftiga arter]]",
  	['se']					= "[[Kategori:Livskraftiga arter]]",
  	['secure']				= "[[Kategori:Livskraftiga arter]]",
  	['lr/nt']				= "[[Kategori:Nära hotade arter]]",
  	['q719675']				= "[[Kategori:Nära hotade arter]]",
  	['lrnt']				= "[[Kategori:Nära hotade arter]]",
  	['nt']					= "[[Kategori:Nära hotade arter]]",
  	['lr/cd']				= "[[Kategori:Arter med behov av åtgärder]]",
  	['q158862']				= "[[Kategori:Arter med behov av åtgärder]]",
  	['lrcd']				= "[[Kategori:Arter med behov av åtgärder]]",
  	['vu']					= "[[Kategori:Sårbara arter]]",
  	['q278113']				= "[[Kategori:Sårbara arter]]",
  	['en']					= "[[Kategori:Starkt hotade arter]]",
  	['q11394']				= "[[Kategori:Starkt hotade arter]]",
  	['cr']					= "[[Kategori:Akut hotade arter]]",
  	['q219127']				= "[[Kategori:Akut hotade arter]]",
  	['ew']					= "[[Kategori:Utdöda arter i vilt tillstånd]]",
  	['q239509']				= "[[Kategori:Utdöda arter i vilt tillstånd]]",
  	['ex']					= "[[Kategori:Utdöda arter]]",
  	['q237350']				= "[[Kategori:Utdöda arter]]",
  	['extinct']				= "[[Kategori:Utdöda arter]]",
  	['fossil']				= "[[Kategori:Fossila arter]]",
  	['pre']					= "[[Kategori:Förhistoriska arter]]",
  	['text']				= ""	
  }
function kursiduller(arg)
	local a = mw.text.split( arg, '%s' )
	if #a == 1 then
		return mw.text.tag('i', {}, arg)
	end
	local s = {}
	local y = false
	for i, j in pairs(a) do
		if not kort[j] then
			table.insert(s, mw.text.tag('i', {}, j))
		else
			table.insert(s, j)
			y = true
		end
	end
	if y then
		return table.concat(s, ' ')
	else
		return mw.text.tag('i', {}, arg)
	end
end

function letarike(arg)
	if arg == nil then 
	    return nil	
	elseif #arg == 1 then
		return arg[1].item
	else
		for i, j in pairs(arg) do
			local rank = ruff(wikidata({property='P105', raw = 'ja', enbarten = 'ja', entityId = j.item, novalue = '(orankad)', noref = 'ja'})).item
			if pref[rank] then
				return j.item
			end
		end
	end
	return arg[1].item
end
			
function ruff(arg, qid2)
	if not arg then
		return {value = '', label = '', ref = '', item = ''}
	end	
	if not qid2 then return arg[1] end
	for i, j in pairs(arg) do
		if j.item == qid2 then
			return j
		end
	end
	return arg[1]
end

function monotypisk(qid) -- funktion som tar fram om det är en monotypisk taxa eller inte
	local p31 = wikidata({property='P31', noref = 'true', raw = 'true', entityId = qid})
	for i, j in pairs(p31) do
		if j.item == 'q310890' then
			return true
		end
	end
	return false
end
		
function p.Taxen(frame)
	local args = frame:getParent().args
	local qid = args[1]
	local entity = {}
	if not qid then
		entity = mw.wikibase.getEntityObject()
		if not entity then
			qid = 'Q46212'
		else
			qid = entity.id
		end
	else 
		entity = mw.wikibase.getEntityObject( qid )
		if not entity then
			return ''
		end
	end
	if not entity then return '' end
	local species = nil
	if entity.sitelinks and entity.sitelinks.specieswiki then
		species = entity.sitelinks.specieswiki.title
	end
	local namn = mw.language.getContentLanguage():ucfirst( (args.namn or mw.wikibase.label( qid ) or mw.title.getCurrentTitle().text))
	local globalstatus = args['status'] or ruff(wikidata({property = "P141", raw = 'ja', entityId = qid, enbarten = 'ja', sortbytime = 'chronological', noref = 'ja'})).item
	globalstatus = statusen[mw.ustring.lower( globalstatus or '' )]
	local globalstatusref = ''
	if args['status'] then
		globalstatusref = args['status_ref'] or args['status ref']
	else
		globalstatusref = ruff(wikidata({property = "P141", raw = 'ja', entityId = qid, enbarten = 'ja', sortbytime = 'chronological'})).ref
	end
	
	local qids = {}
	local mono = {} -- variabel som ska berätta om källor ska läggas till eller inte
	local try = true
	local faglar = false
	local color = 'white'
	local katter = ''
	local wdbild = wikidata({property='P18', raw = 'ja', entityId = qid, novalue = '', noref = 'ja'})
	local wdbild1, wdbild2, wdbildtext1, wdbildtext2 = nil
	if wdbild and wdbild[2] then
		wdbildtext2 = wdbild[2].bildtext
		wdbild2 = wdbild[2].value
	end
	if wdbild and wdbild[1] then
		wdbildtext1 = wdbild[1].bildtext
		wdbild1 = wdbild[1].value
	end

	local utbredningsbilden = wikidata({property='P181', raw = 'ja', entityId = qid, novalue = '', noref = 'ja'})
	local utbredningsbild, utbredningsbildtext = nil
	if utbredningsbilden and utbredningsbilden[1] then
		utbredningsbildtext = utbredningsbilden[1].bildtext
		utbredningsbild     = utbredningsbilden[1].value
	end

	while qid do
		qids[#qids+1] = qid -- bygger en variabel med alla qid
		qid = letarike(wikidata({property='P171', raw = 'ja', entityId = qid, noref = 'true'}))
		if qid == 'Q5113' then
			faglar = true
		end
		if colors[qid] then
			color = colors[qid]
		end
		if qid == 'Q2382443' or qid == 'Q19081' then -- högre än domän behöver vi inte gå och prokaryota är förårldrat
			qid = nil
		end
		mono[#mono+1] = true
	end
	if args.color and args.color ~= '' then 
		color = args.color
	end
	for i, qid in pairs(qids) do
		if i > 1 then
			if not mono[i-1] or not monotypisk(qid) then
				mono[i] = false
			end
		end
	end	
	if globalstatus then
		namn = namn .. '<br/>' .. mw.text.tag('span', {style="font-size:.8em"}, globalstatus .. (globalstatusref or '')) 
	end
	namn = namn .. lokalstatus(args)
	if (args['fossil_range'] and args['fossil_range'] ~= '') or (args['fossil range'] and args['fossil range'] ~= '')  then
		namn = namn .. mw.text.tag('br', {}) .. mw.text.tag('span', {style="font-size:.8em"}, '[[Stratigrafisk utbredning]]: ' .. (args['fossil_range'] or args['fossil range']))
	end
	local ingress = mw.text.tag('tr', {}, mw.text.tag('td', {colspan="2", class="", style="text-align:center; font-size: 125%; font-weight: bold; background:" .. color}, namn))
	if (args.image and args.image ~= '') or (wdbild1 and args.image ~= '') then
		local s = filhantering(args.image, wdbild1, args['image_caption'] or args['image caption'], wdbildtext1, args['image_width'] or args['image width'] or '250') 
		ingress = ingress .. mw.text.tag('tr', {}, mw.text.tag('td', {colspan="2", class="", style="text-align:center;"}, s))
	end	
	ingress = ingress .. mw.text.tag('tr', {}, mw.text.tag('td', {colspan="2", style="text-align:center;background:" .. color}, mw.text.tag('b', {},'[[Systematik (biologi)|Systematik]]')))
	local n = #qids
	local struktur = ''
	local rankforra = ''
	local vet = ''
	local vetenskapligt = ''
	while n > 0 do
		local rank = ruff(wikidata({property='P105', raw = 'ja', enbarten = 'ja', entityId = qids[n], noref = 'true', novalue = '(orankad)', versalisering = 'ucfirst'}))
		local higher = ''
				local skamed = true
		if #qids > 10 and (rank.value == '(orankad)' or not pref[rank.item]) and n > 3 and not args['felsök'] then
			skamed = false
		end
		if rankforra == rank.value and rank.value ~= '(orankad)' and not args['felsök'] then
			skamed = false
		end
		rankforra = rank.value
		if mono[n] then
			rank = ruff(wikidata({property='P105', raw = 'ja', enbarten = 'ja', entityId = qids[n], novalue = '(orankad)', versalisering = 'ucfirst'}))
			higher = ruff(wikidata({property='P171', raw = 'ja', entityId = qids[n-1], versalisering = 'ucfirst'}), qids[n])
			vetenskapligt = ruff(wikidata({property='P225', raw = 'ja', enbarten = 'ja', entityId = qids[n], versalisering = 'ucfirst'}))
		else
			if mono[n-1] then
				higher = ruff(wikidata({property='P171', raw = 'ja', entityId = qids[n-1], versalisering = 'ucfirst'}), qids[n])
			else
				higher = ruff(wikidata({property='P171', raw = 'ja', entityId = qids[n-1], noref = 'true', versalisering = 'ucfirst', relevantred= 'yes'}), qids[n])
			end
			vetenskapligt = ruff(wikidata({property='P225', raw = 'ja', enbarten = 'ja', entityId = qids[n], noref = 'true', versalisering = 'ucfirst'}))
		end
		if n == 1 or skamed then
			vet = vetenskapligt.value
			if n == 1 then
				higher = wikidata2(qids[1], {versalisering = 'ucfirst'})
			end
			local lika = (higher and mw.ustring.lower( higher.label ) == mw.ustring.lower( vetenskapligt.label ))
			if kursiv[rank.item] then
				vet = kursiduller( vet )
				if lika then
					local s = higher.ref
					higher = wikidata2(qids[1], {versalisering = 'ucfirst', label = vet})
					higher.ref = s
				end
			end
			if lika then
				local s1 = mw.text.tag('td', {}, rank.value .. (rank.ref or ''))
				local sx = 	(vetenskapligt.ref or '')
				if n == 1 then sx = '' end
				local s2 = mw.text.tag('td', {}, higher.value .. (higher.ref or '') .. sx )
				struktur = struktur .. mw.text.tag('tr', {}, s1 .. s2)
			else
				local s1 = mw.text.tag('td', {rowspan = "2"}, rank.value .. (rank.ref or ''))
				local s2 = mw.text.tag('td', {}, higher.value .. (higher.ref or ''))
				struktur = struktur .. mw.text.tag('tr', {}, s1 .. s2)
				local sx = 	(vetenskapligt.ref or '')
				if n == 1 then sx = '' end
				local s3 = mw.text.tag('td', {}, vet .. sx)
				struktur = struktur .. mw.text.tag('tr', {}, s3)	
			end
			if mono[n] and n > 1 and (vetenskapligt.auktor or vetenskapligt.dateoftaxpub) then
				local s3 = {}
				table.insert(s3, vetenskapligt.auktor)
				table.insert(s3, vetenskapligt.dateoftaxpub)
				local s1 = mw.text.tag('td', {}, '')
				local s2 = mw.text.tag('td', {}, mw.text.tag('small', {}, table.concat(s3, ', ')))
				struktur = struktur .. s1 .. s2
			end
		end
		n = n - 1
	end
	local suffix = {}
	if vet then
		table.insert(suffix, mw.text.tag('tr', {}, mw.text.tag('th', {colspan="2", style="text-align:center;background:" .. color}, '[[Vetenskapligt namn]]')))
		local s = mw.text.tag('span', {style="float:right; font-size:70%;"}, '[[species:' .. (species or vetenskapligt.value) .. '|§]]')
		s = s .. vet .. vetenskapligt.ref
		table.insert(suffix, mw.text.tag('tr', {}, mw.text.tag('th', {colspan="2",class="",style="text-align:center;"}, s)))
		if vetenskapligt.auktor then
			local s1 = mw.text.tag('th', {}, '[[Auktorsnamn|Auktor]]')
			s1 = s1 .. mw.text.tag('td', {}, vetenskapligt.auktor  .. ' ' .. (vetenskapligt.dateoftaxpub or ''))
			table.insert(suffix, mw.text.tag('tr', {}, s1))
		end
	end	
	if (args['range_map'] and args['range_map'] ~= '') or (args['range map'] and args['range map'] ~= '') or (utbredningsbild and args['range_map'] ~= '' and args['range map'] ~= '') then
		local s = filhantering(	args['range_map'] or args['range_map'], utbredningsbild, args['range_map_caption'] or args['range map caption'], utbredningsbildtext, args['range_map_width'] or args['range map width'] or '250')
		table.insert(suffix, mw.text.tag('tr', {}, mw.text.tag('th', {colspan="2", style="text-align:center;background:" .. color}, 'Utbredning')))		
		table.insert(suffix, mw.text.tag('tr', {}, mw.text.tag('td', {colspan="2", class="",style="text-align:center;"}, s)))
	end	
	if args.subdivision and args.subdivision ~= '' then
		table.insert(suffix, mw.text.tag('tr', {}, mw.text.tag('th', {colspan="2", style="text-align:center;background:" .. color}, args['subdivision_ranks'] or args['subdivision ranks'] or '[[Art]]er')))
		table.insert(suffix, mw.text.tag('tr', {}, mw.text.tag('td', {colspan="2", style="text-align:center;"}, '\n' .. args.subdivision )))
	end	
	local synon = wikidata({property='P1420', raw = 'ja', entityId = qid, novalue = ''})
	if (args.synonyms and args.synonyms ~= '') or (synon and synonyms ~= '') then
		if args.synonyms then
			table.insert(suffix, mw.text.tag('tr', {}, mw.text.tag('th', {colspan="2", style="text-align:center;background:" .. color}, '[[Synonym (biologi)|Synonymer]]')))
			table.insert(suffix, mw.text.tag('tr', {}, mw.text.tag('td', {colspan="2", style="text-align:center;"}, '\n' .. args.synonyms )))
		else
			local s = ''
			for i, syn in pairs(synon) do
				local qid2 = syn.item
				local s2 = ''
				local vetenskap = ruff(wikidata({property='P225', raw = 'ja', enbarten = 'ja', entityId = qid2, versalisering = 'ucfirst'}))
				if vetenskap then
					s2 = vetenskap.value .. syn.ref
					if vetenskap.auktor  then
						s2 = s2 .. ', ' .. mw.text.tag('small', {}, vetenskap.auktor  .. ' ' .. (vetenskap.dateoftaxpub or ''))
					end
					s2 = s2 .. vetenskap.ref
				else
					s2 = s2 .. syn.value .. syn.ref
				end
				s = s .. mw.text.tag('li', {}, s2)
			end
			if s ~= '' then
				table.insert(suffix, mw.text.tag('tr', {}, mw.text.tag('th', {colspan="2", style="text-align:center;background:" .. color}, '[[Synonym (biologi)|Synonymer]]')))
				s = mw.text.tag('ul', {}, s)	
				table.insert(suffix, mw.text.tag('tr', {}, mw.text.tag('td', {colspan="2", style="text-align:center;"}, '\n' .. s )))
			end
		end
	end
	if (args.image2 and args.image2 ~= '') or (wdbild2 and args.image2 ~= '') then
		local s = filhantering(args.image2, wdbild2, args['image2_caption'] or args['image2 caption'], wdbildtext2, args['image2_width'] or args['image2 width'] or '250') 
		table.insert(suffix, mw.text.tag('tr', {}, mw.text.tag('td', {colspan="2", class="",style="text-align:center;"}, s)))
	end	
	if faglar or color == 'pink' or color == 'lightgreen' then
		local text = ''
		if -- faglar then 
			--text = mw.text.tag('small', {}, 'Hitta fler artiklar om fåglar med') .. mw.text.tag('div', {}, mw.text.tag('b', {}, '[[Portal:Fåglar|Fågelportalen]]'))
		--elseif color == 'lightgreen' then
			--text = mw.text.tag('small', {}, 'Hitta fler artiklar om växter med') .. mw.text.tag('div', {}, mw.text.tag('b', {}, '[[Portal:Växter|Växtportalen]]'))
		--elseif 
		color == 'pink' then
			text = mw.text.tag('small', {}, 'Hitta fler artiklar om djur med') .. mw.text.tag('div', {}, mw.text.tag('b', {}, '[[Portal:Djur|Djurportalen]]'))			
		end
		text = mw.text.tag('tr', {}, mw.text.tag('td', {colspan="2", style="text-align:center; background:"..color, class=""}, text))
		table.insert(suffix, text)
	end
		
	if mw.title.getCurrentTitle().namespace == 0 then
		local globalstatuscat = args['status'] or ruff(wikidata({property = "P141", raw = 'ja', entityId = qid, enbarten = 'ja', sortbytime = 'chronological', noref = 'ja'})).item
		katter = katter .. (statuscat[mw.ustring.lower( globalstatuscat or '' )] or '')
	end
	
	return mw.text.tag('table', {class="infobox", cellspacing="3", style="width: 22em; text-align: left; font-size: 88%; line-height: 1.75em; font-size:95%;width:20.3788em;padding:.18em;"} , ingress .. struktur .. table.concat(suffix)) .. katter 
end

return p