Module:Wd: Difference between revisions
Jump to navigation
Jump to search
>Thayts (←Created page with 'local p = {} local function formatAmount(amount) -- strip + signs from front amount = mw.ustring.gsub(amount, "\+(.+)", "%1") return amount end local func...') |
>Thayts No edit summary |
||
Line 99: | Line 99: | ||
local out = {} | local out = {} | ||
for k, v in pairs(claims) do | for k, v in pairs(claims) do | ||
if not propertyValue or v.mainsnak.snaktype == 'value' and snakEqualsValue(v.mainsnak, propertyValue) then | if (not propertyValue or (v.mainsnak.snaktype == 'value' and snakEqualsValue(v.mainsnak, propertyValue))) and v.qualifiers[qualifierID] then | ||
for k2, v2 in pairs(v.qualifiers[qualifierID]) do | for k2, v2 in pairs(v.qualifiers[qualifierID]) do | ||
if v2.snaktype == 'value' then | if v2.snaktype == 'value' then |
Revision as of 17:20, 20 August 2016
Documentation for this module may be created at Module:Wd/doc
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))) and v.qualifiers[qualifierID] 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