Spring til indhold

Modul:Wikidata-embeder

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

local function vis_qid(qid)
	local label = 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.startP) ..
				' – ' .. vis_tid(embede.slut, embede.slutP) .. '\n'
		else
			tekst = tekst .. '* Start: ' .. vis_tid(embede.start, embede.startP) .. '\n'
		end
	elseif embede.tidspunkt then
		tekst = tekst .. '* Tidspunkt: ' .. vis_tid(embede.tidspunkt, embede.tidspunktP) .. '\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.startP) .. ' – ' .. vis_tid(embede.slut, embede.slutP)
		else
			infoboks_args['data' .. row] = vis_tid(embede.start, embede.startP) .. ' – '
		end
	elseif embede.tidspunkt then
		row = row + 1
		infoboks_args['data' .. row] = vis_tid(embede.tidspunkt, embede.tidspunktP)
	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, 'Parlamentsgruppe', row)
	row = lav_infoboks_label_og_datafelt(infoboks_args, embede.parlamentsperiode, 'Parlamentsperiode', 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

function p.embeder(frame)
	local args = (frame == mw.getCurrentFrame()) and frame:getParent().args or frame.args
	local qid = args.q or mw.wikibase.getEntilotyIdForCurrentPage()
	if not qid then
		return ''
	end
	local liste = {}
	local p39 = wikibase.getBestStatements(qid, 'P39')
	for _, embede in pairs(p39) do
		local embedeID = (embede.mainsnak.snaktype == "value") and embede.mainsnak.datavalue.value.id or nil
		local erstatter
		local erstattet_af
		local kabinet
		local organisation
		local for_
		local start, startP
		local slut, slutP
		local tidspunkt, tidspunktP
		local valgkreds
		local arbejdsgiver
		local arbejdsfelt
		local parlamentsgruppe
		local parlamentsperiode, parlamentsperiodeId
		local repraesenterer
		local statsoverhoved
		local valg
		local nr
		if embedeID then
			local dette = {}
			local qualifiers = embede.qualifiers
			if qualifiers then
				dette.erstatter = getQualifierId(qualifiers.P1365)
				dette.erstattet_af = getQualifierId(qualifiers.P1366)
				dette.kabinet = getQualifierId(qualifiers.P5054)
				dette.organisation = getQualifierId(qualifiers.P2389)
				dette.for_ = getQualifierId(qualifiers.P642)
				dette.valgkreds = getQualifierId(qualifiers.P768)
				dette.arbejdsgiver = getQualifierId(qualifiers.P108)
				dette.arbejdsfelt = getQualifierId(qualifiers.P101)
				dette.parlamentsgruppe = getQualifierId(qualifiers.P4100)
				dette.parlamentsperiode, dette.parlamentsperiodeId = getQualifierId(qualifiers.P2937)
				dette.valg = getQualifierId(qualifiers.P2715)
				dette.repraesenterer = getQualifierId(qualifiers.P1268)
				dette.statsoverhoved = getQualifierId(qualifiers.P35)
				dette.start, dette.startP = getQualifierTid(qualifiers.P580)
				dette.slut, dette.slutP = getQualifierTid(qualifiers.P582)
				dette.tidspunkt, dette.tidspunktP = getQualifierTid(qualifiers.P585)
				dette.nr = getQualifierTekst(qualifiers.P1545)

				if dette.parlamentsperiode then
					if not dette.start then
						local s = wikibase.getBestStatements(dette.parlamentsperiodeId, 'P571')
						local first = s[1]
						if first and first.mainsnak.snaktype == "value" then
							dette.start = first.mainsnak.datavalue.value.time 
							dette.startP = first.mainsnak.datavalue.value.precision
						end
					end
					if not dette.slut then
						local s = wikibase.getBestStatements(dette.parlamentsperiodeId, 'P576')
						local first = s[1]
						if first and first.mainsnak.snaktype == "value" then
							dette.slut = first.mainsnak.datavalue.value.time 
							dette.slutP = first.mainsnak.datavalue.value.precision
						end
					end
				end
			end
			dette.sortkey = dette.start or dette.tidspunkt or ''
			if not liste[embedeID] then
				liste[embedeID] = {}
			end
			liste[embedeID][#liste[embedeID] + 1] = dette
		end
	end
	local embede_sort = {}
	for embedeID, embede_liste in pairs(liste) do
		table.sort(embede_liste, function(a,b) return a.sortkey < b.sortkey end)
		embede_sort[#embede_sort + 1] = { 
			['id'] = embedeID, 
			['sortkey'] = embede_liste[1].sortkey,
			['liste'] = embede_liste
		}
	end
	
	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