Module:OfficeData

-- -- module local variables and functions copied from Module:Wikidata

local function printError(code) return ' ' .. (i18n.errors[code] or code) .. ' ' end

local function printDatavalueEntity(data, parameter) -- data fields: entity-type [string], numeric-id [int, Wikidata id] local id if data["entity-type"] == "item" then id = "Q" .. data["numeric-id"] elseif data["entity-type"] == "property" then id = "P" .. data["numeric-id"] else return printError("unknown-entity-type") end if parameter then if parameter == "link" then local linkTarget = mw.wikibase.sitelink(id) local linkName = mw.wikibase.label(id) if linkTarget then -- if there is a local Wikipedia article link to it using the label or the article title return "" .. (linkName or linkTarget) .. "" else -- if there is no local Wikipedia article output the label or link to the Wikidata object to let the user input a proper label if linkName then return linkName else return "" .. id .. "" end end else return data[parameter] end else return mw.wikibase.label(id) or id	end end

local function getSnakValue(snak, parameter) if snak.snaktype == "value" then -- call the respective snak parser if snak.datavalue.type == "string" then return snak.datavalue.value elseif snak.datavalue.type == "wikibase-entityid" then return printDatavalueEntity(snak.datavalue.value, parameter) end end return mw.wikibase.renderSnak(snak) end local function getQualifierSnak(claim, qualifierId) -- a "snak" is Wikidata terminology for a typed key/value pair -- a claim consists of a main snak holding the main information of this claim, -- as well as a list of attribute snaks and a list of references snaks if qualifierId then -- search the attribute snak with the given qualifier as key if claim.qualifiers then local qualifier = claim.qualifiers[qualifierId] if qualifier then return qualifier[1] end end return nil, printError("qualifier-not-found") else -- otherwise return the main snak return claim.mainsnak end end local function getValueOfClaim(claim, qualifierId, parameter) local error local snak snak, error = getQualifierSnak(claim, qualifierId) if snak then return getSnakValue(snak, parameter) else return nil, error end end

-- -- module local variables and functions derived from Module:Wikidata but customized

local function getValue(claims, sortindices, frame) local qualifierId = frame.args["qualifier"] local parameter = frame.args["parameter"] local list = frame.args["list"] local references = frame.args["references"] local showerrors = frame.args["showerrors"] local showerrors = true local result local error if list then local value -- iterate over all elements and return their value (if existing) result = {} for idx in pairs(claims) do			local claim = claims[sortindices[idx]] value, error = getValueOfClaim(claim, qualifierId, parameter) if not value and showerrors then value = error end if value and references then value = value .. getReferences(frame, claim) end result[#result + 1] = value end result = table.concat(result, list) else -- return first element local claim = claims[sortindices[1]] result, error = getValueOfClaim(claim, qualifierId, parameter) if result and references then result = result .. getReferences(frame, claim) end end return result end

-- -- module export functions

local p = {}

function p.getPreferredOfficeholder(frame) local id = frame.args["id"]	-- "id" should be nil local showerrors = frame.args["showerrors"] local default = frame.args["default"] if default then showerrors = nil end local showerrors = true local entity = mw.wikibase.getEntity(id) local claims = entity['claims']['P1308'] -- get initial sort indices local sortindices = {} for idx in pairs(claims) do		sortindices[#sortindices + 1] = idx end -- sort by claim rank local comparator = function(a, b)		local rankmap = { deprecated = 2, normal = 1, preferred = 0 } local ranka = rankmap[claims[a].rank or "normal"] local rankb = rankmap[claims[b].rank or "normal"] return ranka < rankb end table.sort(sortindices, comparator) result = getValue(claims, sortindices, frame) if result then return result else if showerrors then return error else return default end end end

function p.getPreferredOfficeholderLink(frame) frame.args["parameter"] = "link" return p.getPreferredOfficeholder(frame) end

function p.getPreferredOfficeholderStarttime(frame) frame.args["qualifier"] = "P580" return p.getPreferredOfficeholder(frame) end

function p.getPreferredOfficeholderCountry(frame) frame.args["qualifier"] = "P17" return p.getPreferredOfficeholder(frame) end

function p.getPreferredOfficeholderCountryLink(frame) frame.args["parameter"] = "link" return p.getPreferredOfficeholderCountry(frame) end

return p