Module:WDfetch
Appearance
Documentation for this module may be created at Module:WDfetch/doc
local p = {}
-- Function to fetch and display the value of a specified Wikidata property
-- from an entity, formatting the output similarly to the infobox display.
-- Requires both a property ID (e.g. P12081) and a Q‑ID (e.g. Q2934).
function p.getvalue(frame)
-- Collect arguments from the calling frame.
local args = {}
for k, v in pairs(frame:getParent().args) do
if v ~= "" then args[k] = v end
end
for k, v in pairs(frame.args) do
if v ~= "" then args[k] = v end
end
-- Get the property ID.
local propertyId = args[1] or args.pid
if not propertyId then
mw.log("p.getvalue: No property ID provided.")
return "Error: No property ID provided."
end
-- Get the Q-ID.
local qid = args.qid
if not qid then
mw.log("p.getvalue: No Qid provided.")
return "Error: No Qid provided."
end
mw.log("p.getvalue: Fetching entity for qid " .. qid)
-- Retrieve the full entity object using the Lua interface.
local entity = mw.ext.UnlinkedWikibase.getEntity(qid)
if not entity then
mw.log("p.getvalue: Entity not found for qid " .. qid)
return "Error: Entity not found for Qid " .. qid
end
-- Extract claims from the entity.
local claims = entity.claims or {}
local propertyClaims = claims[propertyId]
if not propertyClaims or #propertyClaims == 0 then
mw.log("p.getvalue: No claims found for property " .. propertyId)
return nil
end
-- Extract the first claim's value.
local claim = propertyClaims[1]
if not (claim and claim.mainsnak and claim.mainsnak.datavalue) then
mw.log("p.getvalue: Claim structure invalid for property " .. propertyId)
return nil
end
local datatype = claim.mainsnak.datatype
mw.log("p.getvalue: Processing claim for property " .. propertyId .. " with datatype " .. datatype)
local value
if datatype == "wikibase-item" then
value = '{{wdl|' .. claim.mainsnak.datavalue.value.id .. '}}'
elseif datatype == "monolingualtext" then
value = claim.mainsnak.datavalue.value.text
elseif datatype == "commonsMedia" then
value = '[[File:' .. claim.mainsnak.datavalue.value .. '|300px]]'
elseif datatype == "time" then
-- Format the time value using the English date format.
local timeValue = claim.mainsnak.datavalue.value.time
local lang = mw.language.getContentLanguage()
value = lang:formatDate('j F Y', timeValue)
else
value = '<small><em>Type ' .. datatype .. ' not handled by Module:Infobox yet.</em></small>'
end
-- Capitalize the first letter if the result is a string.
if type(value) == "string" then
value = value:gsub("^%l", string.upper)
end
mw.log("p.getvalue: Returning value: " .. tostring(value))
return value
end
return p