Module:DCRKI
From DemocracyCraft Wiki
More actions
Documentation for this module may be created at Module:DCRKI/doc
local p = {}
-- Get a DCRKI entity.
local function getEntity(qid)
return mw.wikibase.getEntity(qid)
end
-- Get the label of an entity.
function p.label(frame)
local qid = frame.args[1]
if not qid or qid == "" then
return ""
end
local entity = getEntity(qid)
if not entity then
return ""
end
return mw.wikibase.getLabel(qid) or ""
end
-- Get the first value of a property.
function p.value(frame)
local qid = frame.args[1]
local property = frame.args[2]
if not qid or not property then
return ""
end
local entity = getEntity(qid)
if not entity or not entity.claims or not entity.claims[property] then
return ""
end
local claims = entity.claims[property]
for _, claim in ipairs(claims) do
if claim.mainsnak
and claim.mainsnak.datavalue
and claim.mainsnak.datavalue.value then
local value = claim.mainsnak.datavalue.value
if type(value) == "table" and value.id then
return mw.wikibase.getLabel(value.id) or value.id
elseif type(value) == "string" then
return value
end
end
end
return ""
end
-- Get all values of a property, separated by small bullets.
function p.values(frame)
local qid = frame.args[1]
local property = frame.args[2]
if not qid or not property then
return ""
end
local entity = getEntity(qid)
if not entity or not entity.claims or not entity.claims[property] then
return ""
end
local values = {}
for _, claim in ipairs(entity.claims[property]) do
if claim.mainsnak
and claim.mainsnak.datavalue
and claim.mainsnak.datavalue.value then
local value = claim.mainsnak.datavalue.value
if type(value) == "table" and value.id then
local label = mw.wikibase.getLabel(value.id) or value.id
table.insert(values, label)
elseif type(value) == "string" then
table.insert(values, value)
end
end
end
return table.concat(values, ' <small>•</small> ')
end
-- P96 → preferred P75 → P18 qualifier
function p.secretary(frame)
local qid = frame.args[1]
local entity = getEntity(qid)
if not entity or not entity.claims or not entity.claims.P96 then
return ""
end
-- Find the preferred P96 statement.
local preferred
for _, claim in ipairs(entity.claims.P96) do
if claim.rank == "preferred"
and claim.mainsnak
and claim.mainsnak.datavalue then
preferred = claim
break
end
end
-- Fall back to normal rank if no preferred statement exists.
if not preferred then
for _, claim in ipairs(entity.claims.P96) do
if claim.rank ~= "deprecated"
and claim.mainsnak
and claim.mainsnak.datavalue then
preferred = claim
break
end
end
end
if not preferred then
return ""
end
local value = preferred.mainsnak.datavalue.value
if type(value) ~= "table" or not value.id then
return ""
end
return mw.wikibase.getLabel(value.id) or value.id
end
-- P96 → preferred P75 → qualifier P18
function p.since(frame)
local qid = frame.args[1]
local entity = getEntity(qid)
if not entity or not entity.claims or not entity.claims.P96 then
return ""
end
local secretaryStatement
-- Find preferred P96.
for _, claim in ipairs(entity.claims.P96) do
if claim.rank == "preferred"
and claim.mainsnak
and claim.mainsnak.datavalue then
secretaryStatement = claim
break
end
end
-- Fall back if necessary.
if not secretaryStatement then
for _, claim in ipairs(entity.claims.P96) do
if claim.rank ~= "deprecated"
and claim.mainsnak
and claim.mainsnak.datavalue then
secretaryStatement = claim
break
end
end
end
if not secretaryStatement then
return ""
end
-- Get the secretary's Q-ID.
local secretaryValue = secretaryStatement.mainsnak.datavalue.value
if type(secretaryValue) ~= "table" or not secretaryValue.id then
return ""
end
local secretaryQid = secretaryValue.id
local secretary = getEntity(secretaryQid)
if not secretary
or not secretary.claims
or not secretary.claims.P75 then
return ""
end
-- Find preferred P75.
local positionStatement
for _, claim in ipairs(secretary.claims.P75) do
if claim.rank == "preferred"
and claim.mainsnak
and claim.mainsnak.datavalue then
positionStatement = claim
break
end
end
-- Fall back to normal rank.
if not positionStatement then
for _, claim in ipairs(secretary.claims.P75) do
if claim.rank ~= "deprecated"
and claim.mainsnak
and claim.mainsnak.datavalue then
positionStatement = claim
break
end
end
end
if not positionStatement then
return ""
end
-- Look for P18 qualifier on the P75 statement.
if not positionStatement.qualifiers
or not positionStatement.qualifiers.P18 then
return ""
end
for _, qualifier in ipairs(positionStatement.qualifiers.P18) do
if qualifier.datavalue and qualifier.datavalue.value then
local value = qualifier.datavalue.value
if type(value) == "string" then
return value
elseif type(value) == "table" and value.text then
return value.text
end
end
end
return ""
end
return p