Module:Transclude: Difference between revisions
From Neodyland Wiki
More actions
Create Module:Transclude for use on `/i18n` subpages that delegate to a `/layout` subpage |
Add `#ignoredParams` parameter |
||
| Line 24: | Line 24: | ||
-- @param {table} outArgs | -- @param {table} outArgs | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
local function mergeArgs(inArgs, outArgs) | local function mergeArgs(inArgs, outArgs, ignoredParams) | ||
checkType("mergeArgs", 1, inArgs, "table"); | checkType("mergeArgs", 1, inArgs, "table"); | ||
checkType("mergeArgs", 2, outArgs, "table"); | checkType("mergeArgs", 2, outArgs, "table"); | ||
for name, value in pairs(inArgs) do | for name, value in pairs(inArgs) do | ||
outArgs[name] = value; | if not (ignoredParams and ignoredParams[name]) then | ||
outArgs[name] = value; | |||
end | |||
end | end | ||
| Line 53: | Line 55: | ||
return function (frame) | return function (frame) | ||
checkType('transclude["' .. name .. '"]', 1, frame, "table"); | checkType('transclude["' .. name .. '"]', 1, frame, "table"); | ||
local ignoredParams; | |||
if (frame.args["#ignoredParams"]) then | |||
ignoredParams = {} | |||
for m in mw.text.gsplit(frame.args["#ignoredParams"], '|', true) do | |||
ignoredParams[mw.text.trim(m)] = true | |||
end | |||
end | |||
local args = {}; | local args = {}; | ||
mergeArgs(frame:getParent().args, args); | mergeArgs(frame:getParent().args, args, ignoredParams); | ||
mergeArgs(frame.args, args); | mergeArgs(frame.args, args, ignoredParams); | ||
if (not title.exists) then | if (not title.exists) then | ||
Revision as of 02:14, 4 August 2021
This documentation is transcluded from Module:Transclude/doc.
-- <nowiki>
--------------------------------------------------------------------------------
-- Module that allows transcluding a template with all parent arguments.
-- Useful in `/i18n` template subpages that delegate to a `/layout` subpage.
--
-- @module transclude
-- @author [[User:ExE Boss]]
-- @require [[Module:No globals]]
--------------------------------------------------------------------------------
require('Module:No globals')
local checkType = require('libraryUtil').checkType;
local INVALID_TITLES = {
["."] = true,
[".."] = true,
};
--------------------------------------------------------------------------------
-- Helper function that merges argument tables.
--
-- @function mergeArgs
-- @param {table} inArgs
-- @param {table} outArgs
--------------------------------------------------------------------------------
local function mergeArgs(inArgs, outArgs, ignoredParams)
checkType("mergeArgs", 1, inArgs, "table");
checkType("mergeArgs", 2, outArgs, "table");
for name, value in pairs(inArgs) do
if not (ignoredParams and ignoredParams[name]) then
outArgs[name] = value;
end
end
return outArgs;
end
local mt = {};
function mt.__index(_, name)
if (
type(name) ~= "string"
or INVALID_TITLES[name]
or mw.ustring.find(name, "#", nil, true)
) then
return nil;
end
local title = mw.title.new(name, "Template")
if (not title) then
return nil;
end
return function (frame)
checkType('transclude["' .. name .. '"]', 1, frame, "table");
local ignoredParams;
if (frame.args["#ignoredParams"]) then
ignoredParams = {}
for m in mw.text.gsplit(frame.args["#ignoredParams"], '|', true) do
ignoredParams[mw.text.trim(m)] = true
end
end
local args = {};
mergeArgs(frame:getParent().args, args, ignoredParams);
mergeArgs(frame.args, args, ignoredParams);
if (not title.exists) then
return "[[:" .. title.fullText .. "]]";
end
return frame:expandTemplate{
title = title,
args = args,
};
end
end
return setmetatable({}, mt);