モジュールの解説[作成]
require('strict')
local p = {}
local wb = mw.wikibase or error("wikibase is not installed.")

--[[
  @return https://www.mediawiki.org/wiki/Extension:Wikibase_Client/Lua#mw.wikibase.entity | nil
]]

function p.getCurrentEntity()
	return wb.getEntity()
end

function p.getEntity(id)
	return wb.getEntity("Q" .. tostring(id))
end

--[[
@param {string} proj
@param {string} label
@param {string | nil} qid
@return {string | nil}
]]
local function check_wikidata(proj, label, qid)
	local entity = qid and p.getEntity(qid) or p.getCurrentEntity()
	local prefixes = {
		["jawiki"] = "",
		["jawiktionary"] = "wikt:",
		["jawikibooks"] = "b:",
		["jawikiquote"] = "q:",
		["jawikinews"] = "n:",
		["jawikisource"] = "s:",
		["jawikiversity"] = "v:",
		["jawikivoyage"] = "voy:",
		["metawiki"] = "m:",
		["commonswiki"] = "c:",
		["wikidatawiki"] = "d:",
	}
	local prefix = prefixes[proj] or error("site " .. proj .. " doesn't exist.")
	-- piped link text
	local linktext = label and "|" .. label or ""
	--[[https://www.mediawiki.org/wiki/Extension:Wikibase_Client/Lua#mw.wikibase.getSitelink]]
	local sl = entity:getSitelink(proj)
	if sl then
		return "[[" .. prefix .. sl .. linktext .. "]]"
	else
		-- non-existent
		return nil
	end
end

local function link_from_wikidata(file, pj_int, pj_abbr, qid)
	local link = check_wikidata(pj_int, pj_abbr, qid)
	link = link and link or "<del>" .. pj_abbr .. "</del>"
	return "* [[File:" .. file .. "|16px|link=]]" .. link .. "\n"
end

function p.manually(args)
	-- TODO 現在ParserFunctionsで実装されているwikidata=noの処理をここに持ってくる
end

function p.from_wikidata(frame, qid)
	qid = qid or nil
	-- convert into wikitext
	local wikitext = frame:expandTemplate { title="flatlist", args = {
		style = "border:#AAA solid 1px;padding:0.3em;line-height:1.0;",
		-- {{Flatlist}}は{{{1}}}しか受け付けない。{{{1}}}の型は箇条書き要素。
		link_from_wikidata("Wikipedia-logo-v2.svg", "jawiki", "jawp", qid) ..
		link_from_wikidata("Wiktionary-logo.svg", "jawiktionary", "jawt", qid) ..
		link_from_wikidata("Wikibooks-logo.svg", "jawikibooks", "jawb", qid) ..
		link_from_wikidata("Wikiquote-logo.svg", "jawikiquote", "jawq", qid) ..
		link_from_wikidata("Wikinews-logo.png", "jawikinews", "jawn", qid) ..
		link_from_wikidata("Wikisource-logo.svg", "jawikisource", "jaws", qid) ..
		link_from_wikidata("Wikiversity-logo.svg", "jawikiversity", "jawv", qid) ..
		link_from_wikidata("Wikivoyage-logo.svg", "jawikivoyage", "jawy", qid) ..
		link_from_wikidata("Commons-logo.svg", "commonswiki", "commons", qid) ..
		link_from_wikidata("Wikimedia Community Logo.svg", "metawiki", "meta", qid) ..
		link_from_wikidata("Wikidata-logo.svg", "wikidatawiki", "wikidata", qid)
	} }
	mw.log(wikitext)
	return wikitext
end

function p.main(frame)
	return p.from_wikidata(frame, nil)
end

return p