Jump to content

Մոդուլ: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