Module:senseid

local export = {}

-- Extract a Wikidata id from a sense id local function Wikidata_id(id) return mw.ustring.match(id, "^Q%d+$") end

local function Wikidata_entity_is_any_of(id, ids) if not mw.wikibase then return false end -- P31: instance of	for _, val in ipairs(mw.wikibase.getBestStatements(id, "P31")) do		for _, sid in ipairs(ids) do			if val["mainsnak"]["datavalue"] and val["mainsnak"]["datavalue"]["type"] == "wikibase-entityid" and val["mainsnak"]["datavalue"]["value"]["id"] == sid then return true end end end return false end

local function Wikidata_entity_continents(id) if not mw.wikibase then return nil end local ret = {} local continent_names = { ["Q15"] = "Africa", ["Q18"] = "South America", ["Q46"] = "Europe", ["Q48"] = "Asia", ["Q49"] = "North America", ["Q538"] = "Oceania", ["Q27611"] = "North America", }	-- P30: continent for _, val in ipairs(mw.wikibase.getBestStatements(id, "P30")) do		if val["mainsnak"]["datavalue"]["type"] == "wikibase-entityid" then for cid, name in pairs(continent_names) do				if val["mainsnak"]["datavalue"]["value"]["id"] == cid then table.insert(ret, name) end end end end if #ret > 0 then return ret else return nil end end

function export.anchor(lang, id) if not (type(id) == "string" or type(id) == "number") then error("The second argument to senseid should be a string or a number.") end return mw.uri.anchorEncode(lang:getFullName .. ":_" .. id) end

local function senseid_wikidata_track(lang, id) if Wikidata_id(id) then --[=[		Special:WhatLinksHere/Wiktionary:Tracking/senseid/Wikidata ]=]		require("Module:debug").track("senseid/Wikidata") local tracking = {} -- Q30014: outer planet of the Solar System -- Q3504248: inner planet of the Solar System -- Q17362350: planet of the Solar System if Wikidata_entity_is_any_of(id, {"Q30014", "Q3504248", "Q17362350"}) then table.insert(tracking, "senseid/Wikidata/planet") end -- Q2199: dwarf planet if Wikidata_entity_is_any_of(id, {"Q2199"}) then table.insert(tracking, "senseid/Wikidata/dwarf planet") end -- Q5107: continent -- Q55833: supercontinent if Wikidata_entity_is_any_of(id, {"Q5107", "Q55833"}) then table.insert(tracking, "senseid/Wikidata/continent") end -- Q6256: country -- Q3024240: former country if Wikidata_entity_is_any_of(id, {"Q6256", "Q3024240"}) then table.insert(tracking, "senseid/Wikidata/country") local continents = Wikidata_entity_continents(id) if continents then for _, name in ipairs(continents) do table.insert(tracking, "senseid/Wikidata/country/" .. name) end end end -- Q82794: geographic region if Wikidata_entity_is_any_of(id, {"Q82794"}) then table.insert(tracking, "senseid/Wikidata/region") end -- Q23442: island if Wikidata_entity_is_any_of(id, {"Q23442"}) then table.insert(tracking, "senseid/Wikidata/island") end -- Q4022: river if Wikidata_entity_is_any_of(id, {"Q4022"}) then table.insert(tracking, "senseid/Wikidata/river") end -- Q515: city if Wikidata_entity_is_any_of(id, {"Q515"}) then table.insert(tracking, "senseid/Wikidata/city") end -- Q34770: language -- Q33742: natural language -- Q33215: constructed language if Wikidata_entity_is_any_of(id, {"Q34770", "Q33742", "Q33215"}) then table.insert(tracking, "senseid/Wikidata/language") end -- Q9779: alphabet -- Q335806: abugida if Wikidata_entity_is_any_of(id, {"Q9779", "Q335806"}) then table.insert(tracking, "senseid/Wikidata/writing system") end -- Q11344: chemical element if Wikidata_entity_is_any_of(id, {"Q11344"}) then table.insert(tracking, "senseid/Wikidata/chemical element") end -- Q16521: taxon if Wikidata_entity_is_any_of(id, {"Q16521"}) then table.insert(tracking, "senseid/Wikidata/taxon") end -- Q9415: emotion if Wikidata_entity_is_any_of(id, {"Q9415"}) then table.insert(tracking, "senseid/Wikidata/emotion") end -- Q11688446: Roman deity if Wikidata_entity_is_any_of(id, {"Q11688446"}) then table.insert(tracking, "senseid/Wikidata/Roman deity") end if #tracking > 0 then require("Module:debug").track(tracking) else require("Module:debug").track("senseid/Wikidata/nothing") end end end

function single_senseid(lang, id, tag_name) -- Track which entries use Wikidata ids senseid_wikidata_track(lang, id) -- The following tag is opened but never closed, where is it supposed to be closed? --        with  it doesn't matter, as it is closed automatically. --        with it is a problem -- Any spaces in the ID attribute are replaced with underscores -- by the wikitext parser. local ret = mw.html.create(tag_name) :addClass("senseid") :attr("id", lang:getFullName .. ":_" .. id) :attr("data-senseid", id) return (tostring(ret)		:gsub("", "")) end

function export.senseid(lang, ids, tag_name) if type(ids) ~= "table" then return single_senseid(lang, ids, tag_name) elseif #ids == 0 then return "" elseif #ids == 1 then return single_senseid(lang, ids[1], tag_name) else local rets = {} for i, id in ipairs(ids) do			table.insert(rets, single_senseid(lang, id, i == 1 and tag_name or "p")) end return table.concat(rets) end end

function export.etymid(lang, id) -- Track which entries use Wikidata ids senseid_wikidata_track(lang, id) return mw.html.create("span") :addClass("etymid") :attr("id", lang:getFullName .. ":_" .. id) end

return export