Մոդուլ:Taxobox/Taxonomy from Wikidata
Արտաքին տեսք
Documentation for this module may be created at Մոդուլ:Taxobox/Taxonomy from Wikidata/doc
-- Gjeremål:
-- Når eit takson har fleire foreledertakson (t.d. Cetartiodactyla (Q27850))
-- går ikkje alle stigane innom alle rangane
local utdata = {}
local IDEALTAL = 8 -- kor mange rangar som skal synast til vanleg
local TAKSONID = 'Q16521'; cladeID = 'Q713623'
local IGNORER = {Q2382443 = true, Q146481 = true, Q22666877 = true, Q19858692 = true}
local RANGTYPEIDAR = {subspecies = 'Q68947', species= 'Q7432', section_super_species = 'Q3181348', subgenus = 'Q3238261', genus = 'Q34740', subtribus = 'Q3965313',
tribus = 'Q227936', supertribus = 'Q14817220', subfamilia = 'Q164280',
familia = 'Q35409', superfamilia = 'Q2136103', infraordo = 'Q2889003', subordo = 'Q5867959', ordo = 'Q36602',
superordo = 'Q5868144', infraclassis = 'Q2007442', subclassis = 'Q5867051', classis = 'Q37517',
superclassis = 'Q3504061', infraphylum = 'Q2361851', subphylum = 'Q1153785', phylum = 'Q38348', superphylum = 'Q3978005',
infraregnum = 'Q3150876', subregnum = 'Q2752679', regnum = 'Q36732', superregnum = 'Q19858692', domain = 'Q146481'}
RANGTYPEIDAR['clade'] ='Q713623' -- ikkje eigentleg ein rangtype
RANGTYPEIDAR['unranked'] = 'unranked'
local RANGNAME = {}
for i, j in pairs(RANGTYPEIDAR) do
RANGNAME[j] = i
end
local DIVISJONIDAR = {superdivisio = 'Q23760204', divisio = 'Q334460', subdivisio = 'Q3491997'}
local DIVISJONUTBYTE = {superdivisio = 'superphylum', divisio = 'phylum', subdivisio = 'subphylum'}
local DIVISJONNAME = {}
for i, j in pairs(DIVISJONIDAR) do
DIVISJONNAME[j] = i
end
function utdata.hovud(ID)
local ranghierarki = {}
local byrjeID = ID or mw.wikibase.getEntityIdForCurrentPage()
laegsteRangen = nil
rangnummer = 1
regnum = nil
data = utdata.rekursjon(byrjeID, ranghierarki, true)[1] -- hent ranghierarkiet rekursivt
if #data == 0 then -- fann ikkje noko taksonomisk hierarki
return {}
end
-- rangane som i utgangspunktet skal vera med
standardinnhald = {}
standardinnhald[RANGTYPEIDAR['subspecies']] = true
standardinnhald[RANGTYPEIDAR['species']] = true
standardinnhald[RANGTYPEIDAR['section_super_species']] = true
standardinnhald[RANGTYPEIDAR['genus']] = true
standardinnhald[RANGTYPEIDAR['subgenus']] = true
standardinnhald[RANGTYPEIDAR['familia']] = true
standardinnhald[RANGTYPEIDAR['ordo']] = true
standardinnhald[RANGTYPEIDAR['classis']] = true
standardinnhald[RANGTYPEIDAR['subphylum']] = true
standardinnhald[RANGTYPEIDAR['phylum']] = true
standardinnhald[RANGTYPEIDAR['regnum']] = true
laegsteRangname = RANGNAME[laegsteRangen] or DIVISJONUTBYTE[DIVISJONNAME[laegsteRangen]]
standardinnhald[laegsteRangname] = true
if regnum == 'Archaea' or regnum == 'Bacteria' or mw.ustring.find(laegsteRangname, 'regnum') then
standardinnhald[RANGTYPEIDAR['superregnum']] = true -- unnatak
end
if mw.ustring.find(laegsteRangname, 'regnum') then
standardinnhald[RANGTYPEIDAR['superregnum']] = true
end
local tekMed = {tal = 0}
local unytta = {}
for i = 1, #data do -- sjå kva standardrangar me har
tekMed[i] = false
rangtypeID = data[i][1]
nykel = RANGNAME[rangtypeID] or DIVISJONUTBYTE[DIVISJONNAME[rangtypeID]]
if standardinnhald[rangtypeID] and not tekMed[nykel] then
tekMed[i] = true
tekMed[nykel] = true
tekMed.tal = tekMed.tal + 1
elseif not IGNORER[rangtypeID] then
table.insert(unytta, {i, rangtypeID, nykel})
end
end
i = 1
while (tekMed.tal < IDEALTAL and i <= #unytta) do -- freist å få det ideelle talet på rangar
local rangnr = unytta[i][1]
local rangtypeID = unytta[i][2]
local nykel = unytta[i][3]
if (RANGNAME[rangtypeID] or DIVISJONNAME[rangtypeID]) and not tekMed[nykel]
and not (RANGNAME[rangtypeID] == 'clade' and laegsteRangname ~= 'clade') -- berre ha med clade om artikkelemne
then
tekMed[rangnr] = true
tekMed.tal = tekMed.tal + 1
tekMed[nykel] = true
end
i = i + 1
end
local taksonomitabell = {}
local ubrotenMonotypi = true
for i = 1, #data do
rangtypeID = data[i][1]
nykel = RANGNAME[rangtypeID] or DIVISJONUTBYTE[DIVISJONNAME[rangtypeID]]
local vitName = data[i][2]; armenianName = data[i][3]; side = data[i][4]
local monotypisk = data[i][6]; utdoeydd = data[i][7]
if i == 1 then
ubrotenMonotypi = false
elseif (i == 2 and monotypisk) or (ubrotenMonotypi and monotypisk) then
ubrotenMonotypi = true
else
ubrotenMonotypi = false
end
local innhaldsdata = {vitName, armenianName, side, ubrotenMonotypi, utdoeydd}
if tekMed[i] then
if not taksonomitabell[nykel] and tekMed[i] then
taksonomitabell[nykel] = innhaldsdata
end
end
end
taksonomitabell['lægste rangen'] = laegsteRangname
return taksonomitabell
end
function utdata.rekursjon(rangID, ranghierarki, tving)
local taksonomielement = mw.wikibase.getEntity(rangID)
local monotypisk = false
local utdoeydd = false
local rangtypeID = nil
local ikkjerang -- for bruk ved unrankede taksonomiske einingar
if not taksonomielement.claims then return {ranghierarki, false} end -- fann feil element eller noko er gale med elementet
if not taksonomielement.claims.P105 then return {ranghierarki, false} end -- taksonomisk rang ikkje oppgjeve (ikkje det same som ingen verdi)
if taksonomielement:getBestStatements('P105')[1]['mainsnak']['datavalue'] then
rangtypeID = taksonomielement:getBestStatements('P105')[1]['mainsnak']['datavalue']['value']['id'] -- kva type rang
rang = mw.wikibase.label(rangtypeID)
if not laegsteRangen then laegsteRangen = rangtypeID end
else
foerekomstAvID = taksonomielement:getBestStatements('P31')[1]['mainsnak']['datavalue']['value']['id']
if foerekomstAvID == cladeID then
ikkjerang = 'clade'
elseif foerekomstAvID == TAKSONID then
ikkjerang = 'unranked'
else
ikkjerang = 'unranked'
end
if not laegsteRangen then -- artikkelen handlar om ei unranked taksonomisk eining
laegsteRangen = RANGTYPEIDAR[ikkjerang]
rang = ikkjerang
else
rang = ''
end
if not tving then -- fann ei unranked taksonomisk eining, vil helst ikkje gå vidare
return {ranghierarki, false}
end
end
if not rangtypeID then -- unrankede taksonomiske einingar har ingen oppgjeven rangtype
rangtypeID = RANGTYPEIDAR[ikkjerang]
end
local vitskaplegRangname = ''
if taksonomielement.claims.P225 then
vitskaplegRangname = taksonomielement.claims.P225[1]['mainsnak']['datavalue']['value']
end
if taksonomielement.claims.P31 then -- «førekomst av»
if taksonomielement.claims.P31[1]['mainsnak']['datavalue']['value']['id'] == 'Q310890' then
monotypisk = true
end
if taksonomielement.claims.P31[1]['mainsnak']['datavalue']['value']['id'] == 'Q23038290' then -- fossilt takson
utdoeydd = true
end
end
if taksonomielement.claims.P141 and taksonomielement.claims.P141[1]['mainsnak']['datavalue']['value']['id'] == 'Q237350' then -- utdøydd
utdoeydd = true
end
local armenianRangname
if taksonomielement.labels['hy'] and taksonomielement.labels['hy']['language'] == 'hy' then -- vil ikkje ha merkelapp frå eit anna språk enn nyarmenian
armenianRangname = taksonomielement:getLabel('hy')
else
armenianRangname = nil
end
if armenianRangname == vitskaplegRangname then -- vitskapleg name er sett som merkelapp
armenianRangname = nil
end
wikipediasidetittel = taksonomielement:getSitelink('hywiki') -- tittelen til lokal artikkel, om han finst
if rang ~= '' then
ranghierarki[rangnummer] = {rangtypeID, vitskaplegRangname, armenianRangname, wikipediasidetittel, rangID, monotypisk, utdoeydd} -- sank inn informasjonen som skal nyttast
rangnummer = rangnummer + 1
end
if rangtypeID == RANGTYPEIDAR['regnum'] then
regnum = vitskaplegRangname
end
if taksonomielement.claims.P171 and taksonomielement.claims.P171[1]['mainsnak']['snaktype'] ~= 'novalue' then
foreldrerangar = taksonomielement:getBestStatements('P171') -- hent berre dei beste forelderrangane
rettVeg = false -- om gjeldande foreldertakson er ein clade
i = 1
while (rettVeg == false and i <= #foreldrerangar) do
nesteRangID = foreldrerangar[1]['mainsnak']['datavalue']['value']['id']
if i == #foreldrerangar then -- har ikkje noko val anna enn å gå gjennom claden
tving = true
else
tving = false
end
neste = utdata.rekursjon(nesteRangID, ranghierarki, tving)
rettVeg = neste[2]
i = i + 1
end
return neste
else -- toppen nådd
return {ranghierarki, rettVeg = true}
end
end
return utdata