local p = {}  -- This is used to get a normal wiki-linked value, or a comma separated list of them if multiple values exist p.getValue = function(frame)     local propertyID = mw.text.trim(frame.args[1] or "")     local input_parm = mw.text.trim(frame.args[2] or "")     if input_parm == "FETCH_WIKIDATA" then         local entity = mw.wikibase.getEntityObject()         if entity == nil then return "" end         if entity.claims == nil then return "" end         if entity.claims[propertyID] ~= nil then             local out = {}             for k, v in pairs(entity.claims[propertyID]) do                 if (mw.wikibase.sitelink("Q" .. v.mainsnak.datavalue.value["numeric-id"])) then                     out[#out + 1] = "[[" .. mw.wikibase.sitelink("Q" .. v.mainsnak.datavalue.value["numeric-id"]) .. "]]"                 else                 	if (mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])) then                         out[#out + 1] = "[[:d:" .. "Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"]) .. "]]<small><abbr title='该条目不存在'>[?]</abbr></small>"                     else                         out[#out + 1] = "[[:d:" .. "Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "]]<small><abbr title='该条目不存在'>[?]</abbr></small>"                     end                 end             end             return table.concat(out, "、")         else             return ""         end     else         return input_parm     end end  -- This is used to get a value like 'male' (for property p21) which won't be linked p.getRawValue = function(frame)     local propertyID = mw.text.trim(frame.args[1] or "")     local input_parm = mw.text.trim(frame.args[2] or "")     if input_parm == "FETCH_WIKIDATA" then         local entity = mw.wikibase.getEntityObject()         if entity == nil then return "" end         if entity.claims == nil then return "" end         if entity.claims[propertyID] ~= nil then             local out = {}             for k, v in pairs(entity.claims[propertyID]) do                 out[#out + 1] = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])             end             return table.concat(out, "、")         else             return ""         end     else         return input_parm     end end  -- This is used to get a date value for date_of_birth (p569), etc. which won't be linked -- consolidate by testing if entity.claims[propertyID].mainsnak.datavalue.type is "time" p.getDateValue = function(frame)     local propertyID = mw.text.trim(frame.args[1] or "")     local input_parm = mw.text.trim(frame.args[2] or "")     local date_format = mw.text.trim(frame.args[3] or "dmy")     if input_parm == "FETCH_WIKIDATA" then         local entity = mw.wikibase.getEntityObject()         if entity == nil then return "" end         if entity.claims == nil then return "" end         if entity.claims[propertyID] ~= nil then             local out = {}             local dt = {}             for k, v in pairs(entity.claims[propertyID]) do                 local d = v.mainsnak.datavalue.value.time                 dt.year = string.sub(d, 9, 12)                 dt.month = string.sub(d, 14, 15)                 dt.day = string.sub(d, 17, 18)                 if date_format == "dmy" then                     out[#out + 1] = os.date("%e %B %Y", os.time(dt))                 else                     out[#out + 1] = os.date("%B %e, %Y", os.time(dt))                 end             end             return table.concat(out, "、")         else             return ""         end     else         return input_parm     end end  return p