Modul:Taxobox
Utseende
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