モジュール:Mapshapes

モジュールの解説[表示] [編集] [履歴] [キャッシュを破棄]

{{mapshapes}}を実現するLuaモジュール。ヘルプ:マップも参照。

-- 英語版の3879900版からインポートしました --Tmv

-- 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