Module:Mapshapes

-- This fetches referenced wikidata entries (P527 - has part, or -- P2670 - has parts of the class ) and adds mapshapes, with colors acc. to -- P465 (sRGB color hex triplet) or P462 (color)

-- TODO: Ideally, this could be merged into Module:map (incl. the Template:Mapshapes)

-- test code: -- frame={["args"]={["default-color"] = "#ff0000"}, ["expandTemplate"] =function(a,b) mw.logObject(b); end} -- p.showOne(frame, "Q2400801", {})

local p = {}

local function matches_filter(args, id) if (args[2] == "") then return true end

local idx = 2 while (args[idx] ~= "") do		if id == args[idx] then return true end idx = idx + 1 end return false end

p.showOne = function(frame, subentityID, out) local subentity = mw.wikibase.getEntity(subentityID) if subentity.claims == nil then mw.log("empty mapshape " .. subentityID .. "!") return out end local label = subentity:getLabel if label == nil then label = '' end

local rgb if subentity.claims.P465 ~= nil then for k, v in pairs(subentity.claims.P465) do			if v.rank ~= "deprecated" then rgb = subentity.claims.P465[k].mainsnak.datavalue.value break end end end if rgb == nil or rgb == "" then mw.log("no rgb") if subentity.claims["P462"] == nil then mw.log("no color") rgb = frame.args["default-color"] else if subentity.claims.P462[1].qualifiers ~= nil and subentity.claims.P462[1].qualifiers.P465 ~= nil then rgb = subentity.claims.P462[1].qualifiers.P465[1].datavalue.value mw.logObject(rgb) else colorID = subentity.claims.P462[1].mainsnak.datavalue.value.id				color = mw.wikibase.getEntity(colorID) rgb = color.claims.P465[1].mainsnak.datavalue.value mw.logObject(rgb) end end end

arguments = { wikidata=subentityID, type="geoline", stroke="#"..rgb, }	arguments["stroke-width"] = frame.args["stroke-width"] arguments["stroke-opacity"] = frame.args["stroke-opacity"] arguments["group"] = frame.args["group"] arguments["title"] = string.gsub(string.gsub(label, '"', '\\"'), "'", "\'")

out[#out + 1] = frame:expandTemplate{title='Mapshape', args=arguments} return out end

p.show = function(frame) local itemID = mw.text.trim(frame.args[1] or "") local entity = mw.wikibase.getEntity(itemID) local claims = entity.claims.P527 if claims == nil then claims = entity.claims.P2670 end if claims then if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then local out = {} for k, v in pairs(claims) do				local subentityID = v.mainsnak.datavalue.value.id				if matches_filter(frame.args, subentityID) then out = p.showOne(frame, subentityID, out) end end return table.concat(out, "") end else return "" end end

return p