Module:Template wrapper: Difference between revisions

From Frontierpedia, the Microsoft Agent encyclopedia
en>JJMC89
(That breaks current uses of the module that depend on not passing positional parameters, e.g. CS1|2 wrappers)
en>Trappist the monk
(synch from sandbox;)
Line 1: Line 1:
require('Module:No globals');
require('Module:No globals');


local p={};
local error_msg = '<span style=\"font-size:100%\" class=\"error\"><code style=\"color:inherit; border:inherit; padding:inherit;\">&#124;_template=</code> missing or empty</span>';
local error_msg = '<span style=\"font-size:100%\" class=\"error\"><code style=\"color:inherit; border:inherit; padding:inherit;\">&#124;_template=</code> missing or empty</span>';


Line 28: Line 27:
local function add_parameter (k, v, args, list)
local function add_parameter (k, v, args, list)
if list then
if list then
table.insert( args, table.concat ({k, '=', v})); -- write parent frame parameter names and values to args table as string
table.insert( args, table.concat ({k, '=', v})); -- write parameter names and values to args table as string
else
else
args[k] = v; -- copy parent frame parameters to args table
args[k] = v; -- copy parameters to args table
end
end
end
end
Line 37: Line 36:
--[[--------------------------< F R A M E _ A R G S _ G E T >--------------------------------------------------
--[[--------------------------< F R A M E _ A R G S _ G E T >--------------------------------------------------


Fetch the template's 'default' and control parameters; adds default parameters to args
Fetch the wrapper template's 'default' and control parameters; adds default parameters to args


returns content of |_template= parameter; nil else
returns content of |_template= parameter (name of the working template); nil else


]]
]]
Line 50: Line 49:
if '_template' == k then
if '_template' == k then
template = v; -- save the name of template that we are wrapping
template = v; -- save the name of template that we are wrapping
elseif '_exclude' ~= k then -- _exclude already handled so ignore it here
elseif '_exclude' ~= k and '_include-positional' ~= k then -- these already handled so ignore here;
add_parameter (k, v, args, list); -- add all other parameters to args in the style dictated by list
add_parameter (k, v, args, list); -- add all other parameters to args in the style dictated by list
end
end
Line 62: Line 61:
--[[--------------------------< P F R A M E _ A R G S _ G E T >------------------------------------------------
--[[--------------------------< P F R A M E _ A R G S _ G E T >------------------------------------------------


Fetch the template's 'live' parameters; adds live parameters that aren't members of the exclude table to args table
Fetches the wrapper template's 'live' parameters; adds live parameters that aren't members of the exclude table to
args table; positional parameters may not be excluded


no return value
no return value
Line 68: Line 68:
]]
]]


local function pframe_args_get (pframe_args, args, exclude, list)
local function pframe_args_get (pframe_args, args, exclude, _include_positional, list)
for k, v in pairs (pframe_args) do
for k, v in pairs (pframe_args) do
if 'string' == type (k) and not is_in_table (exclude, k) then -- do not pass along positional or excluded parameters
if 'string' == type (k) and not is_in_table (exclude, k) then -- do not pass along excluded parameters
if v and ('' ~= v) then -- pass along only those parameters that have assigned values
if v and ('' ~= v) then -- pass along only those parameters that have assigned values
if 'unset' == v:lower() then -- special keyword to unset 'default' parameters set in the wrapper template
if 'unset' == v:lower() then -- special keyword to unset 'default' parameters set in the wrapper template
Line 77: Line 77:
add_parameter (k, v, args, list) -- add all other parameters to args in the style dictated by list
add_parameter (k, v, args, list) -- add all other parameters to args in the style dictated by list
end
end
end
end
if _include_positional then
for i, v in ipairs (pframe_args) do -- pass along positional parameters
if 'unset' == v:lower() then -- special keyword to unset 'default' parameters set in the wrapper template
v = ''; -- unset the value in the args table
end
add_parameter (i, v, args, list);
end
end
end
end
Line 86: Line 95:
Collect the various default and live parameters into args styled according to boolean list.
Collect the various default and live parameters into args styled according to boolean list.


returns name of the wrapped or listed template or nil for an error message
returns name of the working or listed template or nil for an error message


]]
]]
Line 92: Line 101:
local function _main (frame, args, list)
local function _main (frame, args, list)
local template;
local template;
local exclude = {}; -- table of parameter names for parameters that are not passed to the wrapped template
local exclude = {}; -- table of parameter names for parameters that are not passed to the working template
local _include_positional;
if frame.args._exclude and ('' ~= frame.args._exclude) then -- if there is |_exclude= and it's not empty
if frame.args._exclude and ('' ~= frame.args._exclude) then -- if there is |_exclude= and it's not empty
Line 99: Line 109:


template = frame_args_get (frame.args, args, list); -- get parameters provided in the {{#invoke:template wrapper|...|...}}
template = frame_args_get (frame.args, args, list); -- get parameters provided in the {{#invoke:template wrapper|...|...}}
if nil == template or '' == template then -- this is the one parameter required by this module
if nil == template or '' == template then -- this is the one parameter that is required by this module
return nil; -- not present, tell calling funtion to emit an error message
return nil; -- not present, tell calling function to emit an error message
end
end
local pframe = frame:getParent(); -- here we get the wrapped template's 'live' parameters from pframe.args
_include_positional = 'yes' == frame.args['_include-positional']; -- when true pass all positional parameters along with non-excluded named parameters to ...
pframe_args_get (pframe.args, args, exclude, list); -- add parameters and values to args that are not listed in the exclude table
-- ... the working template; positional parameters are not excludable
local pframe = frame:getParent(); -- here we get the wrapper template's 'live' parameters from pframe.args
pframe_args_get (pframe.args, args, exclude, _include_positional, list); -- add parameters and values to args that are not listed in the exclude table


return template; -- args now has all default and live parameters, return wrapped template name
return template; -- args now has all default and live parameters, return working template name
end
end


Line 112: Line 125:
--[[--------------------------< W R A P >----------------------------------------------------------------------
--[[--------------------------< W R A P >----------------------------------------------------------------------


Template entry point.  Call this function to 'execute' the wrapped template
Template entry point.  Call this function to 'execute' the working template


]]
]]


function p.wrap (frame)
local function wrap (frame)
local args = {}; -- table of default and live parameters and their values to be passed to the wrapped template
local args = {}; -- table of default and live parameters and their values to be passed to the wrapped template
local template; -- the name of the wrapped template
local template; -- the name of the working template


template = _main (frame, args, false); -- get default and live parameters and the name of the wrapped template
template = _main (frame, args, false); -- get default and live parameters and the name of the working template
if not template then -- template name is required
if not template then -- template name is required
return error_msg; -- emit error message and abandon if template name not present
return error_msg; -- emit error message and abandon if template name not present
end
end
return frame:expandTemplate {title=template, args=args}; -- render the template
return frame:expandTemplate {title=template, args=args}; -- render the working template
end
end


Line 131: Line 144:
--[[--------------------------< L I S T >----------------------------------------------------------------------
--[[--------------------------< L I S T >----------------------------------------------------------------------


Template entry point.  Call this function to 'display' the source for the wrapped template.  This function added
Template entry point.  Call this function to 'display' the source for the working template.  This function added
as a result of a TfD here: Wikipedia:Templates_for_discussion/Log/2018_April_28#Module:PassArguments
as a result of a TfD here: Wikipedia:Templates_for_discussion/Log/2018_April_28#Module:PassArguments


Line 141: Line 154:




function p.list (frame)
local function list (frame)
local args = {}; -- table of default and live parameters and their values to be passed to the listed template
local args = {}; -- table of default and live parameters and their values to be passed to the listed template
local template; -- the name of the listed template
local template; -- the name of the listed template
Line 153: Line 166:
end
end


return p;
 
--[[--------------------------< E X P O R T E D  F U N C T I O N S >------------------------------------------
]]
 
return {
list = list,
wrap = wrap,
};

Revision as of 22:17, 19 August 2018

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

require('Module:No globals');

local error_msg = '<span style=\"font-size:100%\" class=\"error\"><code style=\"color:inherit; border:inherit; padding:inherit;\">&#124;_template=</code> missing or empty</span>';


--[[--------------------------< I S _ I N _ T A B L E >--------------------------------------------------------

scan through tbl looking for value; return true if found, false else

]]

local function is_in_table (tbl, value)
    for k, v in pairs (tbl) do
        if v == value then return true end
    end
    return false;
end


--[[--------------------------< A D D _ P A R A M E T E R >----------------------------------------------------

adds parameter name and its value to args table according to the state of boolean list argument; kv pair for
template execution; k=v string for template listing.

]]

local function add_parameter (k, v, args, list)
	if list then
		table.insert( args, table.concat ({k, '=', v}));						-- write parameter names and values to args table as string
	else
		args[k] = v;															-- copy parameters to args table
	end
end


--[[--------------------------< F R A M E _ A R G S _ G E T >--------------------------------------------------

Fetch the wrapper template's 'default' and control parameters; adds default parameters to args

returns content of |_template= parameter (name of the working template); nil else

]]

local function frame_args_get (frame_args, args, list)
	local template;

	for k, v in pairs (frame_args) do											-- here we get the wrapper template's 'default' parameters
		if 'string' == type (k) and (v and ('' ~= v)) then						-- do not pass along positional or empty parameters
			if '_template' == k then
				template = v;													-- save the name of template that we are wrapping
			elseif '_exclude' ~= k and '_include-positional' ~= k then			-- these already handled so ignore here; 
				add_parameter (k, v, args, list);								-- add all other parameters to args in the style dictated by list
			end
		end
	end

	return template;															-- return contents of |_template= parameter
end


--[[--------------------------< P F R A M E _ A R G S _ G E T >------------------------------------------------

Fetches the wrapper template's 'live' parameters; adds live parameters that aren't members of the exclude table to
args table; positional parameters may not be excluded

no return value

]]

local function pframe_args_get (pframe_args, args, exclude, _include_positional, list)
	for k, v in pairs (pframe_args) do
		if 'string' == type (k) and not is_in_table (exclude, k) then			-- do not pass along excluded parameters
			if v and ('' ~= v) then												-- pass along only those parameters that have assigned values
				if 'unset' == v:lower() then									-- special keyword to unset 'default' parameters set in the wrapper template
					v = '';														-- unset the value in the args table
				end
				add_parameter (k, v, args, list)								-- add all other parameters to args in the style dictated by list
			end
		end
	end

	if _include_positional then
		for i, v in ipairs (pframe_args) do										-- pass along positional parameters
			if 'unset' == v:lower() then										-- special keyword to unset 'default' parameters set in the wrapper template
				v = '';															-- unset the value in the args table
			end
			add_parameter (i, v, args, list);
		end
	end
end


--[[--------------------------< _ M A I N >--------------------------------------------------------------------

Collect the various default and live parameters into args styled according to boolean list.

returns name of the working or listed template or nil for an error message

]]

local function _main (frame, args, list)
	local template;
	local exclude = {};															-- table of parameter names for parameters that are not passed to the working template
	local _include_positional;
	
	if frame.args._exclude and ('' ~= frame.args._exclude) then					-- if there is |_exclude= and it's not empty
		exclude = mw.text.split (frame.args._exclude, "%s*,%s*");				-- make a table from its contents
	end

	template = frame_args_get (frame.args, args, list);							-- get parameters provided in the {{#invoke:template wrapper|...|...}}
	if nil == template or '' == template then									-- this is the one parameter that is required by this module
		return nil;																-- not present, tell calling function to emit an error message
	end
	
	_include_positional = 'yes' == frame.args['_include-positional'];			-- when true pass all positional parameters along with non-excluded named parameters to ...
																				-- ... the working template; positional parameters are not excludable
																				
	local pframe = frame:getParent();											-- here we get the wrapper template's 'live' parameters from pframe.args
	pframe_args_get (pframe.args, args, exclude, _include_positional, list);	-- add parameters and values to args that are not listed in the exclude table

	return template;															-- args now has all default and live parameters, return working template name
end


--[[--------------------------< W R A P >----------------------------------------------------------------------

Template entry point.  Call this function to 'execute' the working template

]]

local function wrap (frame)
	local args = {};															-- table of default and live parameters and their values to be passed to the wrapped template
	local template;																-- the name of the working template

	template = _main (frame, args, false);										-- get default and live parameters and the name of the working template
	if not template then														-- template name is required
		return error_msg;														-- emit error message and abandon if template name not present
	end
	
	return frame:expandTemplate {title=template, args=args};					-- render the working template
end


--[[--------------------------< L I S T >----------------------------------------------------------------------

Template entry point.  Call this function to 'display' the source for the working template.  This function added
as a result of a TfD here: Wikipedia:Templates_for_discussion/Log/2018_April_28#Module:PassArguments

This function replaces a similarly named function which was used in {{cite compare}} and {{cite compare2}}

Values in the args table are numerically indexed strings in the form 'name=value'

]]


local function list (frame)
	local args = {};															-- table of default and live parameters and their values to be passed to the listed template
	local template;																-- the name of the listed template

	template = _main (frame, args, true);										-- get default and live parameters and the name of the listed template
	if not template then														-- template name is required
		return error_msg;														-- emit error message and abandon if template name not present
	end

	return frame:preprocess (table.concat ({'<code style="color:inherit; background:inherit; border:none;"><nowiki>{{', template, ' |', table.concat( args, ' |' ), '}}</nowiki></code>'}));	-- render the template
end


--[[--------------------------< E X P O R T E D   F U N C T I O N S >------------------------------------------
]]

return {
	list = list,
	wrap = wrap,
	};