မဝ်ဂျူ:unsubst
This module protects templates and modules from being wrongly substituted.
Usage
ပလေဝ်ဒါန်First, put the following at the beginning of the entry_point
function in the module:
if mw.isSubsting() then
return require('Module:unsubst').unsubst_template("entry_point")
end
Where "entry_point"
should be replaced with the function name. Next, edit the template:
{{safesubst:<noinclude/>#invoke:...|entry_point|...}}
The <noinclude/>
is optional. The template will substitute into its transcluded form.
To protect the module itself instead of the template, add this at the start of the function instead:
if mw.isSubsting() then
return require('Module:unsubst').unsubst_module("entry_point")
end
Directly in templates
ပလေဝ်ဒါန်You can wrap the template code in
{{safesubst:#invoke:unsubst|me|= ... }}
It will work just like unsubst_template
above, apart from also generating a transclusion to Module:unsubst. Additionally, it protects templates from being copied and pasted to non-template pages.
local m_template_parser = require("Module:template parser")
local build_template = m_template_parser.buildTemplate
local concat = table.concat
local get_template_invocation_name = m_template_parser.getTemplateInvocationName
local is_internal_title = require("Module:pages").is_internal_title
local new_title = mw.title.new
local is_substing = mw.isSubsting()
local function unsubst_me(frame)
return frame.args[""]
end
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 = {}
function mt:__index(entry_point)
-- Cannot unsubst if not currently being substed.
if not is_substing then
local frame_title = mw.getCurrentFrame():getTitle()
if frame_title ~= "Module:unsubst" then
error(("[[%s]] should not call [[Module:unsubst]] unless mw.isSubsting() returns true"):format(frame_title))
end
-- Allow {{#invoke:unsubst|me|=...}}, but otherwise return nothing.
return entry_point == "me" and unsubst_me or nil
end
return function(frame)
local parent = frame:getParent()
if parent:getTitle() ~= mw.title.getCurrentTitle().fullText then
return serialize(get_template_invocation_name(get_title(parent)), parent.args)
end
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
return setmetatable({}, mt)