Modul:Wikidata-embeder

Fra Wikipedia, den frie encyklopædi
Documentation icon Moduldokumentation[opret]
require('Modul:No globals')
local p = {}
local wikibase = mw.wikibase
local lang = mw.language.getContentLanguage()

local function vis_qid(qid)
	local label = lang:ucfirst(mw.wikibase.getLabel(qid))
	local sitelink = mw.wikibase.getSitelink(qid)
	if sitelink then
		label = '[[' .. sitelink .. '|' .. label .. ']]'
	end
	return label
end

local function vis_tid(tid, prec)
	if prec == 9 then -- years
		return string.sub(tid, 2, 5)
	elseif prec == 10 then -- months
		return lang:formatDate('F" "Y', tid)
	elseif prec == 11 then -- days
		return lang:formatDate('j." "F" "Y', tid)
	end
	return tid .. '(præcision: ' .. prec .. ')'
end

local function getQualifierId(qualifier)
	if qualifier then
		local first = qualifier[1]
		if first.snaktype == 'value' then
			return vis_qid(first.datavalue.value.id), first.datavalue.value.id
		elseif first.snaktype == 'novalue' then
			return 'Ingen'
		end
	end
end

local function getQualifierTid(qualifier)
	if qualifier then
		local first = qualifier[1]
		if first.snaktype == 'value' then
			return first.datavalue.value.time, first.datavalue.value.precision
		end
	end
end

local function getQualifierTekst(qualifier)
	if qualifier then
		local first = qualifier[1]
		if first.snaktype == 'value' then
			return first.datavalue.value
		end
	end
end

local function udskriv(embedeID, embede)
	local tekst = 'Embede: ' .. vis_qid(embedeID)
	if embede.for_ then
		tekst = tekst .. ' for ' .. embede.for_
	end
	tekst = tekst .. '\n'

	if embede.nr then tekst = tekst .. '* Nr.: ' .. embede.nr .. '\n' end
	if embede.erstatter then tekst = tekst .. '* Forgænger: ' .. embede.erstatter .. '\n' end
	if embede.erstattet_af then tekst = tekst .. '* Efterfølger: ' .. embede.erstattet_af .. '\n' end
	if embede.kabinet then tekst = tekst .. '* Kabinet: ' .. embede.kabinet .. '\n' end
	if embede.statsoverhoved then tekst = tekst .. '* Statsoverhoved: ' .. embede.statsoverhoved .. '\n' end
	if embede.valgkreds then tekst = tekst .. '* Valgkreds: ' .. embede.valgkreds .. '\n' end
	if embede.arbejdsgiver then tekst = tekst .. '* Arbejdsgiver: ' .. embede.arbejdsgiver .. '\n' end
	if embede.arbejdsfelt then tekst = tekst .. '* Arbejdsfelt: ' .. embede.arbejdsfelt .. '\n' end
	if embede.parlamentsgruppe then tekst = tekst .. '* Parlamentsgruppe: ' .. embede.parlamentsgruppe .. '\n' end
	if embede.parlamentsperiode then tekst = tekst .. '* Parlamentsperiode: ' .. embede.parlamentsperiode .. '\n' end
	if embede.repraesenterer then tekst = tekst .. '* Repræsenterer: ' .. embede.repraesenterer .. '\n' end
	if embede.valg then tekst = tekst .. '* Valg: ' .. embede.valg .. '\n' end
	if embede.start then
		if embede.slut then
			tekst = tekst .. '* Tid: ' .. vis_tid(embede.start, embede.startPraecision) ..
				' – ' .. vis_tid(embede.slut, embede.slutPraecision) .. '\n'
		else
			tekst = tekst .. '* Start: ' .. vis_tid(embede.start, embede.startPraecision) .. '\n'
		end
	elseif embede.tidspunkt then
		tekst = tekst .. '* Tidspunkt: ' .. vis_tid(embede.tidspunkt, embede.tidspunktPraecision) .. '\n'
	end
	return tekst
end

local function lav_infoboks_label_og_datafelt(infoboks_args, data, label, row)
	if not data then return row end
	row = row + 1
	infoboks_args['label' .. row] = label
	infoboks_args['data' .. row] = data
	return row
end
	
local function lav_infoboks_args(row, embede, infoboks_args)
	if embede.for_ then
		row = row + 1
		infoboks_args['header' .. row] = ' for ' .. embede.for_
	end
	if embede.start then
		row = row + 1
		if embede.slut then
			infoboks_args['data' .. row] = vis_tid(embede.start, embede.startPraecision) ..
				' – ' .. vis_tid(embede.slut, embede.slutPraecision)
		else
			infoboks_args['data' .. row] = vis_tid(embede.start, embede.startPraecision) .. ' – '
		end
	elseif embede.tidspunkt then
		row = row + 1
		infoboks_args['data' .. row] = vis_tid(embede.tidspunkt, embede.tidspunktPraecision)
	end
	row = lav_infoboks_label_og_datafelt(infoboks_args, embede.nr, 'Nummer', row)
	row = lav_infoboks_label_og_datafelt(infoboks_args, embede.erstatter, 'Erstatter', row)
	row = lav_infoboks_label_og_datafelt(infoboks_args, embede.erstattet_af, 'Efterfølger', row)
	row = lav_infoboks_label_og_datafelt(infoboks_args, embede.kabinet, 'Kabinet', row)
	row = lav_infoboks_label_og_datafelt(infoboks_args, embede.statsoverhoved, 'Statsoverhoved', row)
	row = lav_infoboks_label_og_datafelt(infoboks_args, embede.valgkreds, 'Valgkreds', row)
	row = lav_infoboks_label_og_datafelt(infoboks_args, embede.arbejdsgiver, 'Arbejdsgiver', row)
	row = lav_infoboks_label_og_datafelt(infoboks_args, embede.arbejdsfelt, 'Arbejdsfelt', row)
	row = lav_infoboks_label_og_datafelt(infoboks_args, embede.parlamentsgruppe, 'Parlaments­gruppe', row)
	-- row = lav_infoboks_label_og_datafelt(infoboks_args, embede.parlamentsperiode, 'Parlaments­periode', row)
	row = lav_infoboks_label_og_datafelt(infoboks_args, embede.repraesenterer, 'Repræsenterer', row)
	row = lav_infoboks_label_og_datafelt(infoboks_args, embede.valg, 'Valg', row)
	return row
end

-- Læs data om et embede fra Wikidata
-- Ind: embede: Wikidata statement for embede (P39)
-- Ud: 1) QID for embedet, 2) tabel med data for embedet
local function getEmbedeData(embede)
	local embedeID = (embede.mainsnak.snaktype == "value") and embede.mainsnak.datavalue.value.id or nil
	local qualifiers = embede.qualifiers
	if not embedeID or not qualifiers then
		-- Værdien er novalue, somevalue eller uden kvalifikatorer. I alle tilfælde uden relevante data
		return nil, nil
	end

	local embedeData = {}
	embedeData.erstatter = getQualifierId(qualifiers.P1365)
	embedeData.erstattet_af = getQualifierId(qualifiers.P1366)
	embedeData.kabinet = getQualifierId(qualifiers.P5054)
	embedeData.organisation = getQualifierId(qualifiers.P2389)
	embedeData.for_ = getQualifierId(qualifiers.P642)
	embedeData.valgkreds = getQualifierId(qualifiers.P768)
	embedeData.arbejdsgiver = getQualifierId(qualifiers.P108)
	embedeData.arbejdsfelt = getQualifierId(qualifiers.P101)
	embedeData.parlamentsgruppe = getQualifierId(qualifiers.P4100)
	embedeData.parlamentsperiode, embedeData.parlamentsperiodeId = getQualifierId(qualifiers.P2937)
	embedeData.valg = getQualifierId(qualifiers.P2715)
	embedeData.repraesenterer = getQualifierId(qualifiers.P1268)
	embedeData.statsoverhoved = getQualifierId(qualifiers.P35)
	embedeData.start, embedeData.startPraecision = getQualifierTid(qualifiers.P580)
	embedeData.slut, embedeData.slutPraecision = getQualifierTid(qualifiers.P582)
	embedeData.tidspunkt, embedeData.tidspunktPraecision = getQualifierTid(qualifiers.P585)
	embedeData.nr = getQualifierTekst(qualifiers.P1545)

	-- Hvis start (P580) og slut (P582) mangler, kan de måske findes ved via værdierne for parlamentsperiode (P2937)
	if embedeData.parlamentsperiode then
		if not embedeData.start then
			local s = wikibase.getBestStatements(embedeData.parlamentsperiodeId, 'P571') -- Oprettet
			local first = s[1]
			if first and first.mainsnak.snaktype == "value" then
				embedeData.start = first.mainsnak.datavalue.value.time 
				embedeData.startPraecision = first.mainsnak.datavalue.value.precision
			end
		end
		if not embedeData.slut then
			local s = wikibase.getBestStatements(embedeData.parlamentsperiodeId, 'P576') -- Nedlagt
			local first = s[1]
			if first and first.mainsnak.snaktype == "value" then
				embedeData.slut = first.mainsnak.datavalue.value.time 
				embedeData.slutPraecision = first.mainsnak.datavalue.value.precision
			end
		end
	end
	
	-- Sorter efter starttid eller tidspunkt
	embedeData.sortkey = embedeData.start or embedeData.tidspunkt or ''

	return embedeID, embedeData
end

function p.embeder(frame)
	local args = (frame == mw.getCurrentFrame()) and frame:getParent().args or frame.args
	local qid = args.q or mw.wikibase.getEntityIdForCurrentPage()
	if not qid then
		return ''
	end
	local liste = {}
	
	-- Læs alle Wikidata statements for embede (P39) med bedste rangering
	local p39 = wikibase.getBestStatements(qid, 'P39')
	for _, embede in pairs(p39) do
		local embedeQID, embedeData = getEmbedeData(embede)
		if embedeQID then
			if not liste[embedeQID] then
				liste[embedeQID] = {}
			end
			liste[embedeQID][#liste[embedeQID] + 1] = embedeData
		end
	end
	local embede_sort = {}
	for embedeQID, embede_liste in pairs(liste) do
		-- Sorter tilfælde af samme embede efter starttid eller tidspunkt.
		table.sort(embede_liste, function(a,b) return a.sortkey < b.sortkey end)
		embede_sort[#embede_sort + 1] = { 
			['id'] = embedeQID, 
			['sortkey'] = embede_liste[1].sortkey,
			['liste'] = embede_liste
		}
		
		-- Saml tilfælde af samme embede hvis sluttid for et embede og starttid for det næste er sammenfaldende:
		-- To do 
		
	end
	
	-- Sorter tilfælde af forskellige embeder efter starttid eller tidspunkt for første forekomst
	table.sort(embede_sort, function(a,b) return a.sortkey < b.sortkey end)

	if args.infoboks == 'ja' then
		local infoboks_args = {
			child = 'yes',
			headerstyle = 'background:lavender'
		}
		local row = 0
		for _, sort in pairs(embede_sort) do
			row = row + 1
			infoboks_args['header' .. row] = vis_qid(sort.id)
			for _, embede in pairs(sort.liste) do
				row = lav_infoboks_args(row, embede, infoboks_args)
			end
		end
		mw.logObject(infoboks_args)
		return (require('Modul:Infoboks').infobox)(infoboks_args)
		

	else
		local tekst = {}
		for _, sort in pairs(embede_sort) do
			for _, embede in pairs(sort.liste) do
				tekst[#tekst + 1] = udskriv(sort.id, embede)
			end
		end
		return table.concat(tekst, '\n')
	end
end

return p