Modul:Taxobox
Aspect
Documentația acestui modul poate fi creată la Modul:Taxobox/doc
local getArgs = require('Modul:Arguments').getArgs
local infobox = require('Modul:Infobox')
local infoboxImage = require('Modul:InfoboxImage').InfoboxImage
local wikidata = require('Modul:Wikidata')
local StringUtils = require('Modul:StringUtils')
local join = require('Modul:Separated entries')._main
local p = {}
local taxonorder = {
'Q22666877', -- superdomeniu
'Q146481', --domeniu
'Q3491996', --subdomeniu
'Q19858692', --supraregn
'Q36732', --regn
'Q2752679', --subregn
'Q3150876', --infraregn
'Q3978005', --supraîncrengătură
'Q38348', --încrengătură
'Q1153785', --subîncrengătură
'Q2361851', --infraîncrengătură
'Q1153785', --microîncrengătură
'Q3504061', --supraclasă
'Q37517', --clasă
'Q5867051', --subclasă
'Q2007442', --infraclasă
'Q5868144', --supraordin
'Q36602', --ordin
'Q6054237', --magnordin
'Q5867959', --subordin
'Q2889003', --infraordin
'Q6311258', -- parvordin
'Q3181348', -- secțiune zoologică
'Q10861375', -- subsecțiune zoologică
'Q2136103', --suprafamilie
'Q10296147', --epifamilie
'Q35409', --familie
'Q2455704', --subfamilie
'Q5481039', --infrafamilie
'Q14817220', --supratrib
'Q227936', --trib
'Q3965313', --subtrib
'Q3798630', --infratrib
'Q1783100', --supragen
'Q34740', --gen
'Q3238261', --subgen
'Q3181348', -- secțiune botanică
'Q5998839', --subsecțiune botanică
'Q3025161', --serie
'Q13198444', -- subserie
'Q1783100', --supraspecie
'Q7432', --specie
'Q68947', --subspecie
'Q21446603', --infraspecie
'Q767728', --varietate
}
local argMap = {
superdomain = 'Q22666877', supradomeniu = 'Q22666877',
domain = 'Q146481', domeniu = 'Q146481',
subdomain = 'Q3491996', subdomeniu = 'Q3491996',
superregnum = 'Q19858692', supraregn = 'Q19858692',
regnum = 'Q36732', regn = 'Q36732', kingdom = 'Q36732',
subregnum = 'Q2752679', subregn = 'Q2752679',
infraregnum = 'Q3150876', infraregn = 'Q3150876',
superdivisio = 'Q3978005', superdiviziune = 'Q3978005', superphylum = 'Q3978005', --supraîncrengătură
divisio = 'Q38348', phylum = 'Q38348', --încrengătură
subphylum = 'Q1153785', subdivisio = 'Q1153785', --subîncrengătură
infraphylum = 'Q2361851', --infraîncrengătură
microphylum = 'Q1153785',
superclassis = 'Q3504061', --supraclasă
classis = 'Q37517', --clasă
subclassis = 'Q5867051', --subclasă
infraclassis = 'Q2007442', --infraclasă
magnordo = 'Q6054237',
superordo = 'Q5868144', --supraordin
ordo = 'Q36602', --ordin
subordo = 'Q5867959', --subordin
infraordo = 'Q2889003', --infraordin
parvordo = 'Q6311258',
zoosectio = 'Q3181348', -- secțiune zoologică
zoosubsectio = 'Q10861375',
superfamilia = 'Q2136103', --suprafamilie
epifamilia = 'Q10296147', --epifamilie
familia = 'Q35409', --familie
subfamilia = 'Q2455704', --subfamilie
infrafamilia = 'Q5481039', --infrafamilie
supertribus = 'Q14817220', --supratrib
tribus = 'Q227936', --trib
subtribus = 'Q3965313', --subtrib
infratribus = 'Q3798630', --infratrib
supergenus = 'Q1783100', --supragen
genus = 'Q34740', --gen
subgenus = 'Q3238261', --subgen
sectio = 'Q3181348', -- secțiune botanică
subsectio = 'Q5998839',
series = 'Q3025161', --serie
subseries = 'Q13198444', -- subserie
superspecies = 'Q1783100', --supraspecie
species = 'Q7432', --specie
subspecies = 'Q68947', --subspecie
infraspecies = 'Q21446603', --infraspecie
variety = 'Q767728', varietate = 'Q767728', -- varietate
}
local function extractStatusFromWikidata()
local statusIds = wikidata.getBestEntityIdsList(nil, 'P141') -- iucn conservation status
local statusDescriptions = {}
if statusIds then
for statusIdx,statusId in ipairs(statusIds) do
local statusImg = wikidata.findOneValueNoRef('P18', mw.wikibase.getEntityObject('Q' .. statusId))
if statusImg then statusImg = mw.ustring.gsub(statusImg, '.svg', ' ro.svg') end
local statusTxt = wikidata.findLabel('Q' .. statusId)
local statusCats = wikidata.getBestEntityIdsList(nil, 'P910')
statusDescriptions[statusIdx] = ''
if statusImg then statusDescriptions[statusIdx] = statusDescriptions[statusIdx] .. '[[Fișier:' .. statusImg .. '|frameless]]' end
if statusTxt then statusDescriptions[statusIdx] = statusDescriptions[statusIdx] .. tostring(mw.html.create('br')) .. statusTxt end
if statusCats then
for catIdx,catId in ipairs(statusCats) do
local localCatTitle = mw.wikibase.sitelink('Q' .. catId)
if localCatTitle and mw.ustring.len(mw.text.trim(localCatTitle)) > 0 then
statusDescriptions[statusIdx] = statusDescriptions[statusIdx] .. '[[' .. localCatTitle .. ']]'
end
end
end
end
end
return statusDescriptions
end
local function extractStatusFromArgs(args)
local statusData = {}
statusData['iucn2.3'] = {}
statusData['iucn2.3']['ex'] = {image='Status iucn2.3 EX ro.svg', text='Dispărut', cat='Specii dispărute'}
statusData['iucn2.3']['ew'] = {image='Status iucn2.3 EW ro.svg', text='Stare de dispariție', cat='Specii dispărute în stare sălbatică'}
statusData['iucn2.3']['cr'] = {image='Status iucn2.3 CR ro.svg', text='Critic', cat='Specii în pericol critic de dispariție'}
statusData['iucn2.3']['en'] = {image='Status iucn2.3 EN ro.svg', text='În pericol', cat='Specii amenințate'}
statusData['iucn2.3']['vu'] = {image='Status iucn2.3 VU ro.svg', text='Vulnerabil', cat='Specii în stare vulnerabilă'}
statusData['iucn2.3']['lr'] = {image='Status iucn2.3 blank.svg', text='Risc minim', cat='Invalid conservation status'}
statusData['iucn2.3']['cd'] = {image='Status iucn2.3 CD ro.svg', text='[[Conservation Dependent]]', cat='IUCN Red List conservation dependent species'}
statusData['iucn2.3']['lr/cd'] = statusData['iucn2.3']['cd']
statusData['iucn2.3']['nt'] = {image='Status iucn2.3 NT ro.svg', text='Risc scăzut (NT)', cat='Specii amenințate moderat'}
statusData['iucn2.3']['lr/nt'] = statusData['iucn2.3']['nt']
statusData['iucn2.3']['lc'] = {image='Status iucn2.3 LC ro.svg', text='Risc scăzut (LC)', cat='Specii cu risc scăzut'}
statusData['iucn2.3']['lr/lc'] = statusData['iucn2.3']['lc']
statusData['iucn2.3']['dd'] = {image='Status iucn2.3 blank.svg', text='Date insuficiente'}
statusData['iucn2.3']['ne'] = {text='Neevaluată'}
statusData['iucn2.3']['nr'] = {text='Nerecunoscută'}
statusData['iucn2.3']['pe'] = {image='Status iucn2.3 CR ro.svg', text='Critic, posibilă dispariție', cat='Specii în pericol critic de dispariție'}
statusData['iucn2.3']['pew'] = {image='Status iucn2.3 CR ro.svg', text='Critic, posibilă dispariție în sălbăticie', cat='Specii în pericol critic de dispariție'}
statusData['iucn3.1'] = {}
statusData['iucn3.1']['ex'] = {image='Status iucn3.1 EX ro.svg', text='Dispărut', cat='Specii dispărute'}
statusData['iucn3.1']['ew'] = {image='Status iucn3.1 EW ro.svg', text='Stare de dispariție', cat='Specii dispărute în stare sălbatică'}
statusData['iucn3.1']['cr'] = {image='Status iucn3.1 CR ro.svg', text='Critic', cat='Specii în pericol critic de dispariție'}
statusData['iucn3.1']['en'] = {image='Status iucn3.1 EN ro.svg', text='În pericol', cat='Specii amenințate'}
statusData['iucn3.1']['vu'] = {image='Status iucn3.1 VU ro.svg', text='Vulnerabil', cat='Specii în stare vulnerabilă'}
statusData['iucn3.1']['nt'] = {image='Status iucn3.1 NT ro.svg', text='Risc scăzut (NT)', cat='Specii amenințate moderat'}
statusData['iucn3.1']['lc'] = {image='Status iucn3.1 LC ro.svg', text='Risc scăzut (LC)', cat='Specii cu risc scăzut'}
statusData['iucn3.1']['dd'] = {image='Status iucn3.1 blank.svg', text='Date insuficiente'}
statusData['iucn3.1']['ne'] = {text='Neevaluată'}
statusData['iucn3.1']['nr'] = {text='Nerecunoscută'}
statusData['iucn3.1']['pw'] = {image='Status iucn3.1 LC ro.svg', text='Critic, posibilă dispariție', cat='Specii în pericol critic de dispariție'}
statusData['iucn3.1']['pew'] = {image='Status iucn3.1 LC ro.svg', text='Critic, posibilă dispariție în sălbăticie', cat='Specii în pericol critic de dispariție'}
statusData['iucn'] = statusData['iucn3.1']
local ret = {}
for i=1,2 do
local statusArgName = 'status'
if i ~= 1 then statusArgName = statusArgName .. tostring(i) end
local statusObj = statusData[mw.ustring.lower(args[statusArgName .. '_system'])][mw.ustring.lower(args[statusArgName])]
if statusObj == nil then return '' end
local retTxt = ''
if statusObj.image then retTxt = retTxt .. '[[Fișier:' .. statusObj.image .. '|frameless]]' end
if statusObj.text then retTxt = retTxt .. tostring(mw.html.create('br')) .. statusObj.text end
if statusObj.cat then retTxt = retTxt .. '[[Categorie:' .. statusObj.cat .. ']]' end
table.insert(ret, retTxt)
end
return ret
end
local function extractTaxonomyFromArgs(args)
local taxonomy = nil
for argN,argV in pairs(args) do
if argMap[argN] then
if taxonomy == nil then taxonomy = {} end
taxonomy[argMap[argN]] = argV
end
end
if args['binomial'] then
if taxonomy == nil then taxonomy = {} end
taxonomy.name = binomial
end
local argAuthority = args['binomial_authority'] or args['binomial authority'] or args['autoritate_binomial'] or args['binomial_autoritate']
if argAuthority then
if taxonomy == nil then taxonomy = {} end
taxonomy.author = argAuthority
end
return nil
end
local function extractTaxonomyFromWikidata()
local taxonomy = nil
local taxonNameClaims = wikidata.findClaimsForProperty(nil, 'P225') -- taxon name
local taxonRank = wikidata.findOneValueNoRef('P105') -- taxon rank
local rankValue = { deprecated = 0, normal = 1, preferred = 2 }
if taxonNameClaims and taxonRank and #taxonNameClaims > 0 then
table.sort(taxonNameClaims, function(c1, c2) return rankValue[c1.rank] > rankValue[c2.rank] end)
taxonomy = {}
taxonomy.rank = taxonRank
taxonomy.name = wikidata.printSnak(taxonNameClaims[1].mainsnak) .. wikidata.outputReferences(taxonNameClaims[1])
if taxonNameClaims[1].qualifiers and taxonNameClaims[1].qualifiers['P405'] then -- taxon author
local taxonAuthorNamesList = {}
for taxonAuthorIdx,taxonAuthorQualifier in ipairs(taxonNameClaims[1].qualifiers['P405']) do
mw.logObject(taxonAuthorQualifier, 'taxon author qualifier')
local taxonAuthorCitation = nil
if taxonAuthorQualifier.datatype == 'wikibase-item' and taxonAuthorQualifier.datavalue.type == 'wikibase-entityid' then
local taxonAuthorQID = StringUtils.prependIfMissing({tostring(taxonAuthorQualifier.datavalue.value['numeric-id']), 'Q'})
taxonAuthorCitation = wikidata.findOneValue('P835', taxonAuthorQID) --author citation (zoology)
if taxonAuthorCitation == nil then
taxonAuthorCitation = wikidata.findOneValue('P428', taxonAuthorQID) -- botanist author abbreviation
end
local taxonAuthorLink = nil
if taxonAuthorCitation == nil then
taxonAuthorLink = wikidata.printSnak(taxonAuthorQualifier)
else
taxonAuthorLink = '[[' .. (mw.wikibase.sitelink(taxonAuthorQID) or (':d:' .. taxonAuthorQID)) .. '|' .. taxonAuthorCitation .. ']]'
end
taxonAuthorLink = taxonAuthorLink .. wikidata.outputReferences(taxonAuthorQualifier)
table.insert(taxonAuthorNamesList, taxonAuthorLink)
end
end
taxonAuthorNamesList.separator = ', '
taxonomy.author = join(taxonAuthorNamesList)
end
if taxonNameClaims[1].qualifiers and taxonNameClaims[1].qualifiers['P574'] and taxonNameClaims[1].qualifiers['P574'][1] then
local d = wikidata.extractDateFromClaim(taxonNameClaims[1].qualifiers['P574'][1])
if d and d.year then taxonomy.publicationDate = tostring(d.year) end
end
end
local taxonParentIdList = wikidata.getBestEntityIdsList(nil, 'P171') -- parent taxon
while taxonParentIdList and #taxonParentIdList > 0 do
if taxonomy == nil then taxonomy = {} end
local taxonParentId = taxonParentIdList[1]
local qTaxonParentId = StringUtils.prependIfMissing({taxonParentId, 'Q'})
local taxonParentName = wikidata.findOneValueNoRef('P225', qTaxonParentId) -- taxon name
local taxonSitelink = mw.wikibase.sitelink(qTaxonParentId) or (':d:' .. qTaxonParentId)
local taxonRankId = wikidata.getBestEntityIdsList(qTaxonParentId, 'P105') -- taxon rank
if taxonRankId and taxonRankId[1] then
local qTaxonRankId = StringUtils.prependIfMissing({taxonRankId[1], 'Q'})
taxonomy[qTaxonRankId] = '[[' .. taxonSitelink .. '|' .. taxonParentName .. ']]'
end
taxonParentIdList = wikidata.getBestEntityIdsList(qTaxonParentId, 'P171') -- parent taxon
end
mw.logObject(taxonomy, 'taxonomy from wikidata')
return taxonomy
end
p._displayInfobox = function(args)
local ibArgs = { antet = 'biota' }
if args['colour'] then ibArgs['culoare cadru'] = args['colour'] end
local title = args['nume'] or args['name'] or wikidata.findLabel()
if title == nil or mw.ustring.len(mw.text.trim(title)) == 0 then
title = mw.title.getCurrentTitle().text
end
if args['temporal_range'] then
title = title .. tostring(mw.html.create('br')) .. tostring(mw.html.create('small'):wikitext('Fosilă: ' .. args['temporal_range']))
end
ibArgs['title'] = title
local img = {}
img[1] = args['image'] or wikidata.findOneValueNoRef('P18')
if img[1] then ibArgs['image'] = infoboxImage{image=img[1], sizedefault='280px', upright='1', alt=args['image_alt']} end
img[2] = args['image2']
if img[2] then ibArgs['image2'] = infoboxImage{image=img[2], sizedefault='280px', upright='1', alt=args['image2_alt']} end
ibArgs['caption1'] = args['image_caption']
ibArgs['caption2'] = args['image2_caption']
local entryIndex = 1
local statusDescriptions = nil
if args['status'] and args['status_system'] then
statusDescriptions = extractStatusFromArgs(args)
else
statusDescriptions = extractStatusFromWikidata()
end
if statusDescriptions then
ibArgs['header' .. tostring(entryIndex)] = '[[Stare de conservare]]'
entryIndex = entryIndex + 1
for statDescIdx=1,#statusDescriptions,1 do
ibArgs['data' .. tostring(entryIndex)] = statusDescriptions[statDescIdx]
entryIndex = entryIndex + 1
end
end
local taxonomy = extractTaxonomyFromArgs(args)
if taxonomy == nil or #taxonomy == 0 then
taxonomy = extractTaxonomyFromWikidata()
end
if taxonomy then
ibArgs['header' .. tostring(entryIndex)] = '[[Clasificare științifică]]'
entryIndex = entryIndex + 1
for _k,eachTaxonOrder in pairs(taxonorder) do
if taxonomy[eachTaxonOrder] then
ibArgs['label' .. tostring(entryIndex)] = wikidata.findLinkToItem(eachTaxonOrder, true, false, false)
ibArgs['data' .. tostring(entryIndex)] = taxonomy[eachTaxonOrder]
entryIndex = entryIndex + 1
end
end
if taxonomy.name then
ibArgs['header' .. tostring(entryIndex)] = '[[Nume binomial]]'
entryIndex = entryIndex + 1
ibArgs['data' .. tostring(entryIndex)] = "'''" .. tostring(mw.html.create('span'):addClass('binomial'):wikitext(taxonomy.name)) .. "'''"
entryIndex = entryIndex + 1
if taxonomy.author then
ibArgs['data' .. tostring(entryIndex)] = tostring(mw.html.create('br')) .. tostring(mw.html.create('small'):wikitext(join({taxonomy.author, taxonomy.publicationDate, separator = ', '})))
entryIndex = entryIndex + 1
end
end
end
local rangeMap = args['range_map'] or wikidata.findOneValueNoRef('P181') --taxon range map image
if rangeMap then
ibArgs['data' .. tostring(entryIndex)] = infoboxImage{image=rangeMap, sizedefault='280px', upright='1', alt=args['image_alt']}
entryIndex = entryIndex + 1
end
ibArgs.doc = 'Taxobox'
ibArgs.wikidata = 'y'
return infobox._infobox(ibArgs)
end
p.infobox = function(frame)
local args = getArgs(frame)
return p._displayInfobox(args)
end
return p