Jump to content

Module:unsubst

ពីWiktionary

Documentation for this module may be created at Module:unsubst/doc

-- Cannot unsubst if not currently being substed.

if not mw.isSubsting() then
	local frame_title = mw.getCurrentFrame():getTitle()

	-- If another module is calling this one, throw an error.
	if frame_title ~= "Module:unsubst" then
		error(("[[%s]] should not require [[Module:unsubst]] unless mw.isSubsting() returns true"):format(frame_title))
	end

	-- Otherwise, enable {{#invoke:unsubst|me|...}}.
	local export = {}

	local process_params = require("Module:parameters").process

	function export.me(frame)
		return process_params(frame.args, {
			[""] = true
		})[""]
	end

	return export
end

local m_pages = require("Module:pages")
local m_template_parser = require("Module:template parser")

local build_template = m_template_parser.buildTemplate
local concat = table.concat
local is_internal_title = m_pages.is_internal_title
local new_title = mw.title.new

local function get_title(frame)
	local title = new_title(frame:getTitle())
	return is_internal_title(title) and title or
		-- This shouldn't happen.
		error("frame returned an invalid title")
end

local function serialize(title, args)
	return "{{" .. concat(build_template(title, args), "|") .. "}}"
end

local mt = {}

if m_pages.is_transcluded() then
	local get_template_invocation_name = m_template_parser.getTemplateInvocationName

	function mt:__index(entry_point)
		return function(frame)
			frame = frame:getParent()
			return serialize(get_template_invocation_name(get_title(frame)), frame.args)
		end
	end
else
	function mt:__index(entry_point)
		return function(frame)
			local title = get_title(frame)
			return title.namespace == 828 and
				(serialize(("safesubst:<noinclude/>#invoke:%s|%s"):format(title.text, entry_point), frame.args)) or
				-- This shouldn't happen.
				error(("[[Module:unsubst]] cannot work if the current frame is not in the %s namespace, because the #invoke magic word requires it"):format(mw.site.namespaces[828].canonicalName))
		end
	end
end

return setmetatable({}, mt)