Module:Wd

local p = {}

local function formatAmount(amount) -- strip + signs from front amount = mw.ustring.gsub(amount, "\+(.+)", "%1") return amount end

local function getRawValue(snak) if snak.snaktype ~= 'value' then return "" end if snak.datavalue.type == "wikibase-entityid" then return "Q" .. snak.datavalue.value["numeric-id"] elseif snak.datavalue.type == "quantity" then return formatAmount(snak.datavalue.value["amount"]) else return snak.datavalue.value end end

local function getValue(snak) if snak.snaktype ~= 'value' then return "" end if snak.datavalue.type == "wikibase-entityid" then return mw.wikibase.label("Q" .. snak.datavalue.value["numeric-id"]) elseif snak.datavalue.type == "quantity" then return formatAmount(snak.datavalue.value["amount"]) else return snak.datavalue.value end end

local function snakEqualsValue(snak, value) local snakValue = getRawValue(snak) if snak.datavalue.type == "wikibase-entityid" then value = value:upper end return snakValue == value end

p.property = function(frame) local entity, propertyID, claims local firstArg = mw.text.trim(frame.args[1] or "") if firstArg:sub(1,1):upper == "Q" then entity = mw.wikibase.getEntity(firstArg) propertyID = mw.text.trim(frame.args[2] or "") else entity = mw.wikibase.getEntity propertyID = firstArg end if entity and entity.claims then claims = entity.claims[propertyID] end if claims then local result = entity:formatPropertyValues(propertyID, mw.wikibase.entity.claimRanks).value -- if number type: remove thousand separators, bounds and units if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "quantity") then result = mw.ustring.gsub(result, "(%d),(%d)", "%1%2") result = mw.ustring.gsub(result, "(%d)±.*", "%1") end return result else return "" end end

p.qualifier = function(frame) local entity, propertyID, propertyValue, qualifierID, claims local firstArg = mw.text.trim(frame.args[1] or "") local nextIndex = 2 if firstArg:sub(1,1):upper == "Q" then entity = mw.wikibase.getEntity(firstArg) propertyID = mw.text.trim(frame.args[nextIndex] or "") nextIndex = nextIndex + 1 else entity = mw.wikibase.getEntity propertyID = firstArg end local nextArg = mw.text.trim(frame.args[nextIndex] or "") nextIndex = nextIndex + 1 if nextArg:sub(1,1):upper == "P" then propertyValue = nil qualifierID = nextArg else -- Escaping: if the first character is '\' followed by 'P' or '\' (i.e. "\P" or "\\") then remove the '\' if nextArg:sub(1,2):upper == "\\P" or nextArg:sub(1,2) == "\\\\" then nextArg = nextArg:sub(2) end propertyValue = nextArg qualifierID = mw.text.trim(frame.args[nextIndex] or "") nextIndex = nextIndex + 1 end if entity and entity.claims then claims = entity.claims[propertyID] end if claims then local out = {} for k, v in pairs(claims) do			if not propertyValue or v.mainsnak.snaktype == 'value' and snakEqualsValue(v.mainsnak, propertyValue) then for k2, v2 in pairs(v.qualifiers[qualifierID]) do					if v2.snaktype == 'value' then out[#out + 1] = getValue(v2) end end end end return table.concat(out, ", ") else return "" end end

p.label = function(frame) if frame.args[1] then return mw.wikibase.label(mw.text.trim(frame.args[1])) else return mw.wikibase.label end end

return p