Modul:Wikidata-embeder
Udseende
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