<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://themidnight.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AParams</id>
	<title>Module:Params - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://themidnight.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AParams"/>
	<link rel="alternate" type="text/html" href="https://themidnight.wiki/index.php?title=Module:Params&amp;action=history"/>
	<updated>2026-04-03T19:12:12Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://themidnight.wiki/index.php?title=Module:Params&amp;diff=13148&amp;oldid=prev</id>
		<title>Timothy: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://themidnight.wiki/index.php?title=Module:Params&amp;diff=13148&amp;oldid=prev"/>
		<updated>2024-04-03T04:22:29Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:22, 3 April 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Timothy</name></author>
	</entry>
	<entry>
		<id>https://themidnight.wiki/index.php?title=Module:Params&amp;diff=13147&amp;oldid=prev</id>
		<title>wikipedia&gt;MusikBot II: Changed protection settings for &quot;Module:Params&quot;: High-risk template or module: 35137 transclusions (more info) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://themidnight.wiki/index.php?title=Module:Params&amp;diff=13147&amp;oldid=prev"/>
		<updated>2024-03-21T18:00:36Z</updated>

		<summary type="html">&lt;p&gt;Changed protection settings for &amp;quot;&lt;a href=&quot;/wiki/Module:Params&quot; title=&quot;Module:Params&quot;&gt;Module:Params&lt;/a&gt;&amp;quot;: &lt;a href=&quot;https://en.wikipedia.org/wiki/High-risk_templates&quot; class=&quot;extiw&quot; title=&quot;wikipedia:High-risk templates&quot;&gt;High-risk template or module&lt;/a&gt;: 35137 transclusions (&lt;a href=&quot;/index.php?title=User:MusikBot_II/TemplateProtector&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:MusikBot II/TemplateProtector (page does not exist)&quot;&gt;more info&lt;/a&gt;) ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;	---                                        ---&lt;br /&gt;
	---     LOCAL ENVIRONMENT                  ---&lt;br /&gt;
	---    ________________________________    ---&lt;br /&gt;
	---                                        ---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Special user-given keywords (functions and modifiers MUST avoid these names)&lt;br /&gt;
local mkeywords = {&lt;br /&gt;
--	[&amp;#039;pattern&amp;#039;] = false,&lt;br /&gt;
	[&amp;#039;plain&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;or&amp;#039;] = 0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Set directives&lt;br /&gt;
local memoryslots = {&lt;br /&gt;
	i = &amp;#039;itersep&amp;#039;,&lt;br /&gt;
	l = &amp;#039;lastsep&amp;#039;,&lt;br /&gt;
	p = &amp;#039;pairsep&amp;#039;,&lt;br /&gt;
	h = &amp;#039;header&amp;#039;,&lt;br /&gt;
	f = &amp;#039;footer&amp;#039;,&lt;br /&gt;
	n = &amp;#039;ifngiven&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- The private table of functions&lt;br /&gt;
local library = {}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Return a copy or a reference to a table&lt;br /&gt;
local function copy_or_ref_table(src, refonly)&lt;br /&gt;
	if refonly then return src end&lt;br /&gt;
	newtab = {}&lt;br /&gt;
	for key, val in pairs(src) do newtab[key] = val end&lt;br /&gt;
	return newtab&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Prepare the context&lt;br /&gt;
local function context_init(frame, funcname, refpipe, refparams)&lt;br /&gt;
	local ctx = {}&lt;br /&gt;
	ctx.luaname = &amp;#039;Module:Params&amp;#039;	--[[ or `frame:getTitle()` ]]--&lt;br /&gt;
	ctx.iterfunc = pairs&lt;br /&gt;
	ctx.pipe = copy_or_ref_table(frame.args, refpipe)&lt;br /&gt;
	ctx.frame = frame:getParent()&lt;br /&gt;
	ctx.params = copy_or_ref_table(ctx.frame.args, refparams)&lt;br /&gt;
	return funcname(ctx)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Move to the next action within the user-given list&lt;br /&gt;
local function context_iterate(ctx, n_forward)&lt;br /&gt;
	local nextfn&lt;br /&gt;
	if ctx.pipe[n_forward] ~= nil then&lt;br /&gt;
		nextfn = ctx.pipe[n_forward]:match&amp;#039;^%s*(.*%S)&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if nextfn == nil then&lt;br /&gt;
		error(ctx.luaname .. &amp;#039;: You must specify a function to call&amp;#039;, 0)&lt;br /&gt;
	end&lt;br /&gt;
	if library[nextfn] == nil then&lt;br /&gt;
		error(ctx.luaname .. &amp;#039;: The function ‘&amp;#039; .. nextfn .. &amp;#039;’ does not exist&amp;#039;, 0)&lt;br /&gt;
	end&lt;br /&gt;
	for idx = n_forward, 1, -1 do table.remove(ctx.pipe, idx) end&lt;br /&gt;
	return library[nextfn](ctx)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Concatenate the numerical keys from the table of parameters to the numerical&lt;br /&gt;
-- keys from the table of options; non-numerical keys from the table of options&lt;br /&gt;
-- will prevail over colliding non-numerical keys from the table of parameters&lt;br /&gt;
local function concat_params(ctx)&lt;br /&gt;
	local shift = table.maxn(ctx.pipe) &lt;br /&gt;
	local newargs = {}&lt;br /&gt;
	if ctx.subset == 1 then&lt;br /&gt;
		-- We need only the sequence&lt;br /&gt;
		for key, val in ipairs(ctx.params) do&lt;br /&gt;
			newargs[key + shift] = val&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if ctx.subset == -1 then&lt;br /&gt;
			for key, val in ipairs(ctx.params) do&lt;br /&gt;
				ctx.params[key] = nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for key, val in pairs(ctx.params) do&lt;br /&gt;
			if type(key) == &amp;#039;number&amp;#039; then&lt;br /&gt;
				newargs[key + shift] = val&lt;br /&gt;
			else&lt;br /&gt;
				newargs[key] = val&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for key, val in pairs(ctx.pipe) do newargs[key] = val end&lt;br /&gt;
	return newargs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function flush_params(ctx, fn)&lt;br /&gt;
	local tbl = ctx.params&lt;br /&gt;
	if ctx.subset == 1 then&lt;br /&gt;
		for key, val in ipairs(tbl) do fn(key, val) end&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	if ctx.subset == -1 then&lt;br /&gt;
		for key, val in ipairs(tbl) do tbl[key] = nil end&lt;br /&gt;
	end&lt;br /&gt;
	if ctx.dosort then&lt;br /&gt;
		local nums = {}&lt;br /&gt;
		local words = {}&lt;br /&gt;
		local nlen = 0&lt;br /&gt;
		local wlen = 0&lt;br /&gt;
		for key, val in pairs(tbl) do&lt;br /&gt;
			if type(key) == &amp;#039;number&amp;#039; then&lt;br /&gt;
				nlen = nlen + 1&lt;br /&gt;
				nums[nlen] = key&lt;br /&gt;
			else&lt;br /&gt;
				wlen = wlen + 1&lt;br /&gt;
				words[wlen] = key&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(nums)&lt;br /&gt;
		table.sort(words)&lt;br /&gt;
		for idx = 1, nlen do fn(nums[idx], tbl[nums[idx]]) end&lt;br /&gt;
		for idx = 1, wlen do fn(words[idx], tbl[words[idx]]) end&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	if ctx.subset ~= -1 then&lt;br /&gt;
		for key, val in ipairs(tbl) do&lt;br /&gt;
			fn(key, val)&lt;br /&gt;
			tbl[key] = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for key, val in pairs(tbl) do fn(key, val) end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Parse the arguments of the `with_*_matching` class of modifiers&lt;br /&gt;
local function parse_match_args(opts, ptns, fname)&lt;br /&gt;
	local state = 0&lt;br /&gt;
	local cnt = 1&lt;br /&gt;
	local keyw&lt;br /&gt;
	local nptns = 0&lt;br /&gt;
	for _, val in ipairs(opts) do&lt;br /&gt;
		if state == 0 then&lt;br /&gt;
			nptns = nptns + 1&lt;br /&gt;
			ptns[nptns] = { val, false }&lt;br /&gt;
			state = -1&lt;br /&gt;
		else&lt;br /&gt;
			keyw = val:match&amp;#039;^%s*(.*%S)&amp;#039;&lt;br /&gt;
			if keyw == nil or mkeywords[keyw] == nil then break&lt;br /&gt;
			else&lt;br /&gt;
				state = mkeywords[keyw]&lt;br /&gt;
				if state ~= 0 then ptns[nptns][2] = state end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		cnt = cnt + 1&lt;br /&gt;
	end&lt;br /&gt;
	if state == 0 then error(ctx.luaname .. &amp;#039;, ‘&amp;#039; .. fname .. &amp;#039;’: No pattern was given&amp;#039;, 0) end&lt;br /&gt;
	return cnt&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	--[[ Library&amp;#039;s modifiers ]]--&lt;br /&gt;
	--------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.sequential()&lt;br /&gt;
library.sequential = function(ctx)&lt;br /&gt;
	if ctx.subset == -1 then error(ctx.luaname .. &amp;#039;: The two directives ‘non-sequential’ and ‘sequential’ are in contradiction with each other&amp;#039;, 0) end&lt;br /&gt;
	if ctx.dosort then error(ctx.luaname .. &amp;#039;: The ‘all_sorted’ directive is redundant when followed by ‘sequential’&amp;#039;, 0) end&lt;br /&gt;
	ctx.iterfunc = ipairs&lt;br /&gt;
	ctx.subset = 1&lt;br /&gt;
	return context_iterate(ctx, 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface[&amp;#039;non-sequential&amp;#039;]()&lt;br /&gt;
library[&amp;#039;non-sequential&amp;#039;] = function(ctx)&lt;br /&gt;
	if ctx.subset == 1 then error(ctx.luaname .. &amp;#039;: The two directives ‘sequential’ and ‘non-sequential’ are in contradiction with each other&amp;#039;, 0) end&lt;br /&gt;
	ctx.iterfunc = pairs&lt;br /&gt;
	ctx.subset = -1&lt;br /&gt;
	return context_iterate(ctx, 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.all_sorted()&lt;br /&gt;
library.all_sorted = function(ctx)&lt;br /&gt;
	if ctx.subset == 1 then error(ctx.luaname .. &amp;#039;: The ‘all_sorted’ directive is redundant after ‘sequential’&amp;#039;, 0) end&lt;br /&gt;
	ctx.dosort = true&lt;br /&gt;
	return context_iterate(ctx, 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.setting()&lt;br /&gt;
library.setting = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local cmd&lt;br /&gt;
	if opts[1] ~= nil then&lt;br /&gt;
		cmd = opts[1]:gsub(&amp;#039;%s+&amp;#039;, &amp;#039;&amp;#039;):gsub(&amp;#039;/+&amp;#039;, &amp;#039;/&amp;#039;):match&amp;#039;^/*(.*[^/])&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if cmd == nil then error(ctx.luaname .. &amp;#039;, ‘setting’: No directive was given&amp;#039;, 0) end&lt;br /&gt;
	local sep = string.byte(&amp;#039;/&amp;#039;)&lt;br /&gt;
	local argc = 2&lt;br /&gt;
	local dest = {}&lt;br /&gt;
	local vname&lt;br /&gt;
	local chr&lt;br /&gt;
	for idx = 1, #cmd do&lt;br /&gt;
		chr = cmd:byte(idx)&lt;br /&gt;
		if chr == sep then&lt;br /&gt;
			for key, val in ipairs(dest) do&lt;br /&gt;
				ctx[val] = opts[argc]&lt;br /&gt;
				dest[key] = nil&lt;br /&gt;
			end&lt;br /&gt;
			argc = argc + 1&lt;br /&gt;
		else&lt;br /&gt;
			vname = memoryslots[string.char(chr)]&lt;br /&gt;
			if vname == nil then error(ctx.luaname .. &amp;#039;, ‘setting’: Unknown slot &amp;quot;&amp;#039; ..&lt;br /&gt;
				string.char(chr) .. &amp;#039;&amp;quot;&amp;#039;, 0) end&lt;br /&gt;
			table.insert(dest, vname)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for key, val in ipairs(dest) do ctx[val] = opts[argc] end&lt;br /&gt;
	return context_iterate(ctx, argc + 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.squeezing()&lt;br /&gt;
library.squeezing = function(ctx)&lt;br /&gt;
	local tbl = ctx.params&lt;br /&gt;
	local store = {}&lt;br /&gt;
	local indices = {}&lt;br /&gt;
	local newlen = 0&lt;br /&gt;
	for key, val in pairs(tbl) do&lt;br /&gt;
		if type(key) == &amp;#039;number&amp;#039; then&lt;br /&gt;
			newlen = newlen + 1&lt;br /&gt;
			indices[newlen] = key&lt;br /&gt;
			store[key] = val&lt;br /&gt;
			tbl[key] = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(indices)&lt;br /&gt;
	for idx = 1, newlen do tbl[idx] = store[indices[idx]] end&lt;br /&gt;
	return context_iterate(ctx, 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.cutting()&lt;br /&gt;
library.cutting = function(ctx)&lt;br /&gt;
	local lcut = tonumber(ctx.pipe[1])&lt;br /&gt;
	if lcut == nil then error(ctx.luaname .. &amp;#039;, ‘cutting’: Left cut must be a number&amp;#039;, 0) end&lt;br /&gt;
	local rcut = tonumber(ctx.pipe[2])&lt;br /&gt;
	if rcut == nil then error(ctx.luaname .. &amp;#039;, ‘cutting’: Right cut must be a number&amp;#039;, 0) end&lt;br /&gt;
	local tbl = ctx.params&lt;br /&gt;
	local len = #tbl&lt;br /&gt;
	if lcut &amp;lt; 0 then lcut = len + lcut end&lt;br /&gt;
	if rcut &amp;lt; 0 then rcut = len + rcut end&lt;br /&gt;
	local tot = lcut + rcut&lt;br /&gt;
	if tot &amp;gt; 0 then&lt;br /&gt;
		local cache = {}&lt;br /&gt;
		if tot &amp;gt;= len then&lt;br /&gt;
			for key, val in ipairs(tbl) do tbl[key] = nil end&lt;br /&gt;
			tot = len&lt;br /&gt;
		else&lt;br /&gt;
			for idx = len - rcut + 1, len, 1 do tbl[idx] = nil end&lt;br /&gt;
			for idx = 1, lcut, 1 do tbl[idx] = nil end&lt;br /&gt;
		end&lt;br /&gt;
		for key, val in pairs(tbl) do&lt;br /&gt;
			if type(key) == &amp;#039;number&amp;#039; and key &amp;gt; 0 then&lt;br /&gt;
				if key &amp;gt; len then&lt;br /&gt;
					cache[key - tot] = val&lt;br /&gt;
				else&lt;br /&gt;
					cache[key - lcut] = val&lt;br /&gt;
				end&lt;br /&gt;
				tbl[key] = nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for key, val in pairs(cache) do tbl[key] = val end&lt;br /&gt;
	end&lt;br /&gt;
	return context_iterate(ctx, 3)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.with_name_matching()&lt;br /&gt;
library.with_name_matching = function(ctx)&lt;br /&gt;
	local tbl = ctx.params&lt;br /&gt;
	local patterns = {}&lt;br /&gt;
	local argc = parse_match_args(ctx.pipe, patterns, &amp;#039;with_name_matching&amp;#039;)&lt;br /&gt;
	local nomatch&lt;br /&gt;
	for key in pairs(tbl) do&lt;br /&gt;
		nomatch = true&lt;br /&gt;
		for _, ptn in ipairs(patterns) do&lt;br /&gt;
			if string.find(key, ptn[1], 1, ptn[2]) then&lt;br /&gt;
				nomatch = false&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if nomatch then tbl[key] = nil end&lt;br /&gt;
	end&lt;br /&gt;
	return context_iterate(ctx, argc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.with_name_not_matching()&lt;br /&gt;
library.with_name_not_matching = function(ctx)&lt;br /&gt;
	local tbl = ctx.params&lt;br /&gt;
	local patterns = {}&lt;br /&gt;
	local argc = parse_match_args(ctx.pipe, patterns,&lt;br /&gt;
		&amp;#039;with_name_not_matching&amp;#039;)&lt;br /&gt;
	local yesmatch&lt;br /&gt;
	for key in pairs(tbl) do&lt;br /&gt;
		yesmatch = true&lt;br /&gt;
		for _, ptn in ipairs(patterns) do&lt;br /&gt;
			if not string.find(key, ptn[1], 1, ptn[2]) then&lt;br /&gt;
				yesmatch = false&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if yesmatch then tbl[key] = nil end&lt;br /&gt;
	end&lt;br /&gt;
	return context_iterate(ctx, argc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.with_value_matching()&lt;br /&gt;
library.with_value_matching = function(ctx)&lt;br /&gt;
	local tbl = ctx.params&lt;br /&gt;
	local patterns = {}&lt;br /&gt;
	local argc = parse_match_args(ctx.pipe, patterns,&lt;br /&gt;
		&amp;#039;with_value_matching&amp;#039;)&lt;br /&gt;
	local nomatch&lt;br /&gt;
	for key, val in pairs(tbl) do&lt;br /&gt;
		nomatch = true&lt;br /&gt;
		for _, ptn in ipairs(patterns) do&lt;br /&gt;
			if string.find(val, ptn[1], 1, ptn[2]) then&lt;br /&gt;
				nomatch = false&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if nomatch then tbl[key] = nil end&lt;br /&gt;
	end&lt;br /&gt;
	return context_iterate(ctx, argc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.with_value_not_matching()&lt;br /&gt;
library.with_value_not_matching = function(ctx)&lt;br /&gt;
	local tbl = ctx.params&lt;br /&gt;
	local patterns = {}&lt;br /&gt;
	local argc = parse_match_args(ctx.pipe, patterns,&lt;br /&gt;
		&amp;#039;with_value_not_matching&amp;#039;)&lt;br /&gt;
	local yesmatch&lt;br /&gt;
	for key, val in pairs(tbl) do&lt;br /&gt;
		yesmatch = true&lt;br /&gt;
		for _, ptn in ipairs(patterns) do&lt;br /&gt;
			if not string.find(val, ptn[1], 1, ptn[2]) then&lt;br /&gt;
				yesmatch = false&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if yesmatch then tbl[key] = nil end&lt;br /&gt;
	end&lt;br /&gt;
	return context_iterate(ctx, argc)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.trimming_values()&lt;br /&gt;
library.trimming_values = function(ctx)&lt;br /&gt;
	local tbl = ctx.params&lt;br /&gt;
	for key, val in pairs(tbl) do tbl[key] = val:match&amp;#039;^%s*(.-)%s*$&amp;#039; end&lt;br /&gt;
	return context_iterate(ctx, 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.mapping_values_by_calling()&lt;br /&gt;
library.mapping_values_by_calling = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local tname&lt;br /&gt;
	if opts[1] ~= nil then tname = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if tname == nil then error(ctx.luaname .. &amp;#039;, ‘mapping_values_by_calling’: No template name was provided&amp;#039;, 0) end&lt;br /&gt;
	local nargs&lt;br /&gt;
	local margs = {}&lt;br /&gt;
	local tmp = tonumber(opts[2])&lt;br /&gt;
	if tmp == nil then&lt;br /&gt;
		nargs = 1&lt;br /&gt;
	elseif tmp &amp;lt; 1 then&lt;br /&gt;
		nargs = 2&lt;br /&gt;
	else&lt;br /&gt;
		nargs = tmp + 2&lt;br /&gt;
		for idx = 3, nargs do margs[idx] = opts[idx] end&lt;br /&gt;
	end&lt;br /&gt;
	local model = { title = tname, args = margs }&lt;br /&gt;
	local tbl = ctx.params&lt;br /&gt;
	if ctx.subset == 1 then&lt;br /&gt;
		for key, val in ipairs(tbl) do&lt;br /&gt;
			margs[1] = key&lt;br /&gt;
			margs[2] = val&lt;br /&gt;
			tbl[key] = ctx.frame:expandTemplate(model)&lt;br /&gt;
		end&lt;br /&gt;
	elseif ctx.subset == -1 then&lt;br /&gt;
		tmp = {}&lt;br /&gt;
		for key, val in pairs(tbl) do tmp[key] = true end&lt;br /&gt;
		for key, val in ipairs(tmp) do tmp[key] = nil end&lt;br /&gt;
		for key in pairs(tmp) do&lt;br /&gt;
			margs[1] = key&lt;br /&gt;
			margs[2] = tbl[key]&lt;br /&gt;
			tbl[key] = ctx.frame:expandTemplate(model)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for key, val in pairs(tbl) do&lt;br /&gt;
			margs[1] = key&lt;br /&gt;
			margs[2] = val&lt;br /&gt;
			tbl[key] = ctx.frame:expandTemplate(model)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
	return context_iterate(ctx, nargs + 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.mapping_values_by_invoking()&lt;br /&gt;
library.mapping_values_by_invoking = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local mname&lt;br /&gt;
	local fname&lt;br /&gt;
	if opts[1] ~= nil then mname = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if mname == nil then error(ctx.luaname .. &amp;#039;, ‘mapping_values_by_invoking’: No module name was provided&amp;#039;, 0) end&lt;br /&gt;
	if opts[2] ~= nil then fname = opts[2]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if fname == nil then error(ctx.luaname .. &amp;#039;, ‘mapping_values_by_invoking’: No function name was provided&amp;#039;, 0) end&lt;br /&gt;
	local nargs&lt;br /&gt;
	local margs = {}&lt;br /&gt;
	local tmp = tonumber(opts[3])&lt;br /&gt;
	if tmp == nil then&lt;br /&gt;
		nargs = 2&lt;br /&gt;
	elseif tmp &amp;lt; 1 then&lt;br /&gt;
		nargs = 3&lt;br /&gt;
	else&lt;br /&gt;
		nargs = tmp + 3&lt;br /&gt;
		for idx = 4, nargs do margs[idx - 1] = opts[idx] end&lt;br /&gt;
	end&lt;br /&gt;
	local model = { title = &amp;#039;Module:&amp;#039; .. mname, args = margs }&lt;br /&gt;
	local mfunc = require(model.title)[fname]&lt;br /&gt;
	local tbl = ctx.params&lt;br /&gt;
	if ctx.subset == 1 then&lt;br /&gt;
		for key, val in ipairs(tbl) do&lt;br /&gt;
			margs[1] = key&lt;br /&gt;
			margs[2] = val&lt;br /&gt;
			tbl[key] = mfunc(ctx.frame:newChild(model))&lt;br /&gt;
		end&lt;br /&gt;
	elseif ctx.subset == -1 then&lt;br /&gt;
		tmp = {}&lt;br /&gt;
		for key, val in pairs(tbl) do tmp[key] = true end&lt;br /&gt;
		for key, val in ipairs(tmp) do tmp[key] = nil end&lt;br /&gt;
		for key in pairs(tmp) do&lt;br /&gt;
			margs[1] = key&lt;br /&gt;
			margs[2] = tbl[key]&lt;br /&gt;
			tbl[key] = mfunc(ctx.frame:newChild(model))&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for key, val in pairs(tbl) do&lt;br /&gt;
			margs[1] = key&lt;br /&gt;
			margs[2] = val&lt;br /&gt;
			tbl[key] = mfunc(ctx.frame:newChild(model))&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
	return context_iterate(ctx, nargs + 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.mapping_values_blindly_by_calling()&lt;br /&gt;
library.mapping_values_blindly_by_calling = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local tname&lt;br /&gt;
	if opts[1] ~= nil then tname = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if tname == nil then error(ctx.luaname .. &amp;#039;, ‘mapping_values_blindly_by_calling’: No template name was provided&amp;#039;, 0) end&lt;br /&gt;
	local nargs&lt;br /&gt;
	local margs = {}&lt;br /&gt;
	local tmp = tonumber(opts[2])&lt;br /&gt;
	if tmp == nil then&lt;br /&gt;
		nargs = 1&lt;br /&gt;
	elseif tmp &amp;lt; 1 then&lt;br /&gt;
		nargs = 2&lt;br /&gt;
	else&lt;br /&gt;
		nargs = tmp + 2&lt;br /&gt;
		for idx = 3, nargs do margs[idx - 1] = opts[idx] end&lt;br /&gt;
	end&lt;br /&gt;
	local model = { title = tname, args = margs }&lt;br /&gt;
	local tbl = ctx.params&lt;br /&gt;
	if ctx.subset == 1 then&lt;br /&gt;
		for key, val in ipairs(tbl) do&lt;br /&gt;
			margs[1] = val&lt;br /&gt;
			tbl[key] = ctx.frame:expandTemplate(model)&lt;br /&gt;
		end&lt;br /&gt;
	elseif ctx.subset == -1 then&lt;br /&gt;
		tmp = {}&lt;br /&gt;
		for key, val in pairs(tbl) do tmp[key] = true end&lt;br /&gt;
		for key, val in ipairs(tmp) do tmp[key] = nil end&lt;br /&gt;
		for key in pairs(tmp) do&lt;br /&gt;
			margs[1] = tbl[key]&lt;br /&gt;
			tbl[key] = ctx.frame:expandTemplate(model)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for key, val in pairs(tbl) do&lt;br /&gt;
			margs[1] = val&lt;br /&gt;
			tbl[key] = ctx.frame:expandTemplate(model)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
	return context_iterate(ctx, nargs + 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.mapping_values_blindly_by_invoking()&lt;br /&gt;
library.mapping_values_blindly_by_invoking = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local mname&lt;br /&gt;
	local fname&lt;br /&gt;
	if opts[1] ~= nil then mname = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if mname == nil then error(ctx.luaname .. &amp;#039;, ‘mapping_values_blindly_by_invoking’: No module name was provided&amp;#039;, 0) end&lt;br /&gt;
	if opts[2] ~= nil then fname = opts[2]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if fname == nil then error(ctx.luaname .. &amp;#039;, ‘mapping_values_blindly_by_invoking’: No function name was provided&amp;#039;, 0) end&lt;br /&gt;
	local nargs&lt;br /&gt;
	local margs = {}&lt;br /&gt;
	local tmp = tonumber(opts[3])&lt;br /&gt;
	if tmp == nil then&lt;br /&gt;
		nargs = 2&lt;br /&gt;
	elseif tmp &amp;lt; 1 then&lt;br /&gt;
		nargs = 3&lt;br /&gt;
	else&lt;br /&gt;
		nargs = tmp + 3&lt;br /&gt;
		for idx = 4, nargs do margs[idx - 2] = opts[idx] end&lt;br /&gt;
	end&lt;br /&gt;
	local model = { title = &amp;#039;Module:&amp;#039; .. mname, args = margs }&lt;br /&gt;
	local mfunc = require(model.title)[fname]&lt;br /&gt;
	local tbl = ctx.params&lt;br /&gt;
	if ctx.subset == 1 then&lt;br /&gt;
		for key, val in ipairs(tbl) do&lt;br /&gt;
			margs[1] = val&lt;br /&gt;
			tbl[key] = mfunc(ctx.frame:newChild(model))&lt;br /&gt;
		end&lt;br /&gt;
	elseif ctx.subset == -1 then&lt;br /&gt;
		tmp = {}&lt;br /&gt;
		for key, val in pairs(tbl) do tmp[key] = true end&lt;br /&gt;
		for key, val in ipairs(tmp) do tmp[key] = nil end&lt;br /&gt;
		for key in pairs(tmp) do&lt;br /&gt;
			margs[1] = tbl[key]&lt;br /&gt;
			tbl[key] = mfunc(ctx.frame:newChild(model))&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for key, val in pairs(tbl) do&lt;br /&gt;
			margs[1] = val&lt;br /&gt;
			tbl[key] = mfunc(ctx.frame:newChild(model))&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
	return context_iterate(ctx, nargs + 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	--[[ Library&amp;#039;s functions ]]--&lt;br /&gt;
	------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.count()&lt;br /&gt;
library.count = function(ctx)&lt;br /&gt;
	local count = 0&lt;br /&gt;
	for _ in ctx.iterfunc(ctx.params) do count = count + 1 end&lt;br /&gt;
	if ctx.subset == -1 then count = count - #ctx.params end&lt;br /&gt;
	return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.concat_and_call()&lt;br /&gt;
library.concat_and_call = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local tname&lt;br /&gt;
	if opts[1] ~= nil then tname = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if tname == nil then error(ctx.luaname .. &amp;#039;, ‘concat_and_call’: No template name was provided&amp;#039;, 0) end&lt;br /&gt;
	table.remove(opts, 1)&lt;br /&gt;
	return ctx.frame:expandTemplate{&lt;br /&gt;
		title = tname,&lt;br /&gt;
		args = concat_params(ctx)&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.concat_and_invoke()&lt;br /&gt;
library.concat_and_invoke = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local mname&lt;br /&gt;
	local fname&lt;br /&gt;
	if opts[1] ~= nil then mname = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if mname == nil then error(ctx.luaname .. &amp;#039;, ‘concat_and_invoke’: No module name was provided&amp;#039;, 0) end&lt;br /&gt;
	if opts[2] ~= nil then fname = opts[2]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if fname == nil then error(ctx.luaname .. &amp;#039;, ‘concat_and_invoke’: No function name was provided&amp;#039;, 0) end&lt;br /&gt;
	table.remove(opts, 2)&lt;br /&gt;
	table.remove(opts, 1)&lt;br /&gt;
	return require(&amp;#039;Module:&amp;#039; .. mname)[fname](ctx.frame:newChild{&lt;br /&gt;
		title = &amp;#039;Module:&amp;#039; .. fname,&lt;br /&gt;
		args = concat_params(ctx)&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.concat_and_magic()&lt;br /&gt;
library.concat_and_magic = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local magic&lt;br /&gt;
	if opts[1] ~= nil then magic = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if magic == nil then error(ctx.luaname .. &amp;#039;, ‘concat_and_magic’: No parser function was provided&amp;#039;, 0) end&lt;br /&gt;
	table.remove(opts, 1)&lt;br /&gt;
	return ctx.frame:callParserFunction(magic, concat_params(ctx))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.value_of()&lt;br /&gt;
library.value_of = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local keystr&lt;br /&gt;
	if opts[1] ~= nil then keystr = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if keystr == nil then error(ctx.luaname .. &amp;#039;, ‘value_of’: No parameter name was provided&amp;#039;, 0) end&lt;br /&gt;
	local keynum = tonumber(keystr)&lt;br /&gt;
	local len = #ctx.params&lt;br /&gt;
	if (&lt;br /&gt;
		ctx.subset == -1 and keynum ~= nil and len &amp;gt;= keynum&lt;br /&gt;
	) or (&lt;br /&gt;
		ctx.subset == 1 and (keynum == nil or len &amp;lt; keynum)&lt;br /&gt;
	) then return (ctx.ifngiven or &amp;#039;&amp;#039;) end&lt;br /&gt;
	local val = ctx.params[keynum or keystr]&lt;br /&gt;
	if val == nil then return (ctx.ifngiven or &amp;#039;&amp;#039;) end&lt;br /&gt;
	return (ctx.header or &amp;#039;&amp;#039;) .. val .. (ctx.footer or &amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.list()&lt;br /&gt;
library.list = function(ctx)&lt;br /&gt;
	local kvs = ctx.pairsep or &amp;#039;&amp;#039;&lt;br /&gt;
	local pps = ctx.itersep or &amp;#039;&amp;#039;&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nss = 0&lt;br /&gt;
	flush_params(&lt;br /&gt;
		ctx,&lt;br /&gt;
		function(key, val)&lt;br /&gt;
			ret[nss + 1] = pps&lt;br /&gt;
			ret[nss + 2] = key&lt;br /&gt;
			ret[nss + 3] = kvs&lt;br /&gt;
			ret[nss + 4] = val&lt;br /&gt;
			nss = nss + 4&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	if nss &amp;gt; 0 then&lt;br /&gt;
		if nss &amp;gt; 4 and ctx.lastsep ~= nil then&lt;br /&gt;
			ret[nss - 3] = ctx.lastsep&lt;br /&gt;
		end&lt;br /&gt;
		ret[1] = ctx.header or &amp;#039;&amp;#039;&lt;br /&gt;
		if ctx.footer ~= nil then ret[nss + 1] = ctx.footer end&lt;br /&gt;
		return table.concat(ret)&lt;br /&gt;
	end&lt;br /&gt;
	return ctx.ifngiven or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.list_values()&lt;br /&gt;
library.list_values = function(ctx)&lt;br /&gt;
	local pps = ctx.itersep or &amp;#039;&amp;#039;&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nss = 0&lt;br /&gt;
	flush_params(&lt;br /&gt;
		ctx,&lt;br /&gt;
		function(key, val)&lt;br /&gt;
			ret[nss + 1] = pps&lt;br /&gt;
			ret[nss + 2] = val&lt;br /&gt;
			nss = nss + 2&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	if nss &amp;gt; 0 then&lt;br /&gt;
		if nss &amp;gt; 2 and ctx.lastsep ~= nil then&lt;br /&gt;
			ret[nss - 1] = ctx.lastsep&lt;br /&gt;
		end&lt;br /&gt;
		ret[1] = ctx.header or &amp;#039;&amp;#039;&lt;br /&gt;
		if ctx.footer ~= nil then ret[nss + 1] = ctx.footer end&lt;br /&gt;
		return table.concat(ret)&lt;br /&gt;
	end&lt;br /&gt;
	return ctx.ifngiven or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.for_each()&lt;br /&gt;
library.for_each = function(ctx)&lt;br /&gt;
	local txt = ctx.pipe[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local pps = ctx.itersep or &amp;#039;&amp;#039;&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nss = 0&lt;br /&gt;
	flush_params(&lt;br /&gt;
		ctx,&lt;br /&gt;
		function(key, val)&lt;br /&gt;
			ret[nss + 1] = pps&lt;br /&gt;
			ret[nss + 2] = txt:gsub(&amp;#039;%$#&amp;#039;, key):gsub(&amp;#039;%$@&amp;#039;, val)&lt;br /&gt;
			nss = nss + 2&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	if nss &amp;gt; 0 then&lt;br /&gt;
		if nss &amp;gt; 2 and ctx.lastsep ~= nil then&lt;br /&gt;
			ret[nss - 1] = ctx.lastsep&lt;br /&gt;
		end&lt;br /&gt;
		ret[1] = ctx.header or &amp;#039;&amp;#039;&lt;br /&gt;
		if ctx.footer ~= nil then ret[nss + 1] = ctx.footer end&lt;br /&gt;
		return table.concat(ret)&lt;br /&gt;
	end&lt;br /&gt;
	return ctx.ifngiven or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.call_for_each()&lt;br /&gt;
library.call_for_each = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local tname&lt;br /&gt;
	if opts[1] ~= nil then tname = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if tname == nil then error(ctx.luaname .. &amp;#039;, ‘call_for_each’: No template name was provided&amp;#039;, 0) end&lt;br /&gt;
	local model = { title = tname, args = opts }&lt;br /&gt;
	local ccs = ctx.itersep or &amp;#039;&amp;#039;&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nss = 0&lt;br /&gt;
	table.insert(opts, 1, true)&lt;br /&gt;
	flush_params(&lt;br /&gt;
		ctx,&lt;br /&gt;
		function(key, val)&lt;br /&gt;
			opts[1] = key&lt;br /&gt;
			opts[2] = val&lt;br /&gt;
			ret[nss + 1] = ccs&lt;br /&gt;
			ret[nss + 2] = ctx.frame:expandTemplate(model)&lt;br /&gt;
			nss = nss + 2&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	if nss &amp;gt; 0 then&lt;br /&gt;
		if nss &amp;gt; 2 and ctx.lastsep ~= nil then&lt;br /&gt;
			ret[nss - 1] = ctx.lastsep&lt;br /&gt;
		end&lt;br /&gt;
		ret[1] = ctx.header or &amp;#039;&amp;#039;&lt;br /&gt;
		if ctx.footer ~= nil then ret[nss + 1] = ctx.footer end&lt;br /&gt;
		return table.concat(ret)&lt;br /&gt;
	end&lt;br /&gt;
	return ctx.ifngiven or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.invoke_for_each()&lt;br /&gt;
library.invoke_for_each = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local mname&lt;br /&gt;
	local fname&lt;br /&gt;
	if opts[1] ~= nil then mname = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if mname == nil then error(ctx.luaname .. &amp;#039;, ‘invoke_for_each’: No module name was provided&amp;#039;, 0) end&lt;br /&gt;
	if opts[2] ~= nil then fname = opts[2]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if fname == nil then error(ctx.luaname .. &amp;#039;, ‘invoke_for_each’: No function name was provided&amp;#039;, 0) end&lt;br /&gt;
	local model = { title = &amp;#039;Module:&amp;#039; .. mname, args = opts }&lt;br /&gt;
	local mfunc = require(model.title)[fname]&lt;br /&gt;
	local ccs = ctx.itersep or &amp;#039;&amp;#039;&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nss = 0&lt;br /&gt;
	flush_params(&lt;br /&gt;
		ctx,&lt;br /&gt;
		function(key, val)&lt;br /&gt;
			opts[1] = key&lt;br /&gt;
			opts[2] = val&lt;br /&gt;
			ret[nss + 1] = ccs&lt;br /&gt;
			ret[nss + 2] = mfunc(ctx.frame:newChild(model))&lt;br /&gt;
			nss = nss + 2&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	if nss &amp;gt; 0 then&lt;br /&gt;
		if nss &amp;gt; 2 and ctx.lastsep ~= nil then&lt;br /&gt;
			ret[nss - 1] = ctx.lastsep&lt;br /&gt;
		end&lt;br /&gt;
		ret[1] = ctx.header or &amp;#039;&amp;#039;&lt;br /&gt;
		if ctx.footer ~= nil then ret[nss + 1] = ctx.footer end&lt;br /&gt;
		return table.concat(ret)&lt;br /&gt;
	end&lt;br /&gt;
	return ctx.ifngiven or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.magic_for_each()&lt;br /&gt;
library.magic_for_each = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local magic&lt;br /&gt;
	if opts[1] ~= nil then magic = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if magic == nil then error(ctx.luaname .. &amp;#039;, ‘magic_for_each’: No parser function was provided&amp;#039;, 0) end&lt;br /&gt;
	local ccs = ctx.itersep or &amp;#039;&amp;#039;&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nss = 0&lt;br /&gt;
	table.insert(opts, 1, true)&lt;br /&gt;
	flush_params(&lt;br /&gt;
		ctx,&lt;br /&gt;
		function(key, val)&lt;br /&gt;
			opts[1] = key&lt;br /&gt;
			opts[2] = val&lt;br /&gt;
			ret[nss + 1] = ccs&lt;br /&gt;
			ret[nss + 2] = ctx.frame:callParserFunction(magic,&lt;br /&gt;
				opts)&lt;br /&gt;
			nss = nss + 2&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	if nss &amp;gt; 0 then&lt;br /&gt;
		if nss &amp;gt; 2 and ctx.lastsep ~= nil then&lt;br /&gt;
			ret[nss - 1] = ctx.lastsep&lt;br /&gt;
		end&lt;br /&gt;
		ret[1] = ctx.header or &amp;#039;&amp;#039;&lt;br /&gt;
		if ctx.footer ~= nil then ret[nss + 1] = ctx.footer end&lt;br /&gt;
		return table.concat(ret)&lt;br /&gt;
	end&lt;br /&gt;
	return ctx.ifngiven or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.call_for_each_value()&lt;br /&gt;
library.call_for_each_value = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local tname&lt;br /&gt;
	if opts[1] ~= nil then tname = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if tname == nil then error(ctx.luaname .. &amp;#039;, ‘call_for_each_value’: No template name was provided&amp;#039;, 0) end&lt;br /&gt;
	local model = { title = tname, args = opts }&lt;br /&gt;
	local ccs = ctx.itersep or &amp;#039;&amp;#039;&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nss = 0&lt;br /&gt;
	flush_params(&lt;br /&gt;
		ctx,&lt;br /&gt;
		function(key, val)&lt;br /&gt;
			opts[1] = val&lt;br /&gt;
			ret[nss + 1] = ccs&lt;br /&gt;
			ret[nss + 2] = ctx.frame:expandTemplate(model)&lt;br /&gt;
			nss = nss + 2&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	if nss &amp;gt; 0 then&lt;br /&gt;
		if nss &amp;gt; 2 and ctx.lastsep ~= nil then&lt;br /&gt;
			ret[nss - 1] = ctx.lastsep&lt;br /&gt;
		end&lt;br /&gt;
		ret[1] = ctx.header or &amp;#039;&amp;#039;&lt;br /&gt;
		if ctx.footer ~= nil then ret[nss + 1] = ctx.footer end&lt;br /&gt;
		return table.concat(ret)&lt;br /&gt;
	end&lt;br /&gt;
	return ctx.ifngiven or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.invoke_for_each_value()&lt;br /&gt;
library.invoke_for_each_value = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local mname&lt;br /&gt;
	local fname&lt;br /&gt;
	if opts[1] ~= nil then mname = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if mname == nil then error(ctx.luaname .. &amp;#039;, ‘invoke_for_each_value’: No module name was provided&amp;#039;, 0) end&lt;br /&gt;
	if opts[2] ~= nil then fname = opts[2]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if fname == nil then error(ctx.luaname .. &amp;#039;, ‘invoke_for_each_value’: No function name was provided&amp;#039;, 0) end&lt;br /&gt;
	local model = { title = &amp;#039;Module:&amp;#039; .. mname, args = opts }&lt;br /&gt;
	local mfunc = require(model.title)[fname]&lt;br /&gt;
	local ccs = ctx.itersep or &amp;#039;&amp;#039;&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nss = 0&lt;br /&gt;
	table.remove(opts, 1)&lt;br /&gt;
	flush_params(&lt;br /&gt;
		ctx,&lt;br /&gt;
		function(key, val)&lt;br /&gt;
			opts[1] = val&lt;br /&gt;
			ret[nss + 1] = ccs&lt;br /&gt;
			ret[nss + 2] = mfunc(ctx.frame:newChild(model))&lt;br /&gt;
			nss = nss + 2&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	if nss &amp;gt; 0 then&lt;br /&gt;
		if nss &amp;gt; 2 and ctx.lastsep ~= nil then&lt;br /&gt;
			ret[nss - 1] = ctx.lastsep&lt;br /&gt;
		end&lt;br /&gt;
		ret[1] = ctx.header or &amp;#039;&amp;#039;&lt;br /&gt;
		if ctx.footer ~= nil then ret[nss + 1] = ctx.footer end&lt;br /&gt;
		return table.concat(ret)&lt;br /&gt;
	end&lt;br /&gt;
	return ctx.ifngiven or &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.magic_for_each_value()&lt;br /&gt;
library.magic_for_each_value = function(ctx)&lt;br /&gt;
	local opts = ctx.pipe&lt;br /&gt;
	local magic&lt;br /&gt;
	if opts[1] ~= nil then magic = opts[1]:match&amp;#039;^%s*(.*%S)&amp;#039; end&lt;br /&gt;
	if magic == nil then error(ctx.luaname .. &amp;#039;, ‘magic_for_each_value’: No parser function was provided&amp;#039;, 0) end&lt;br /&gt;
	local ccs = ctx.itersep or &amp;#039;&amp;#039;&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nss = 0&lt;br /&gt;
	flush_params(&lt;br /&gt;
		ctx,&lt;br /&gt;
		function(key, val)&lt;br /&gt;
			opts[1] = val&lt;br /&gt;
			ret[nss + 1] = ccs&lt;br /&gt;
			ret[nss + 2] = ctx.frame:callParserFunction(magic,&lt;br /&gt;
				opts)&lt;br /&gt;
			nss = nss + 2&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	if nss &amp;gt; 0 then&lt;br /&gt;
		if nss &amp;gt; 2 and ctx.lastsep ~= nil then&lt;br /&gt;
			ret[nss - 1] = ctx.lastsep&lt;br /&gt;
		end&lt;br /&gt;
		ret[1] = ctx.header or &amp;#039;&amp;#039;&lt;br /&gt;
		if ctx.footer ~= nil then ret[nss + 1] = ctx.footer end&lt;br /&gt;
		return table.concat(ret)&lt;br /&gt;
	end&lt;br /&gt;
	return ctx.ifngiven or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- See iface.self()&lt;br /&gt;
library.self = function(ctx)&lt;br /&gt;
	return ctx.frame:getTitle()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	---                                        ---&lt;br /&gt;
	---     PUBLIC ENVIRONMENT                 ---&lt;br /&gt;
	---    ________________________________    ---&lt;br /&gt;
	---                                        ---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- The public table of functions&lt;br /&gt;
local iface = {}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	--[[ Modifiers ]]--&lt;br /&gt;
	------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|sequential|function name&lt;br /&gt;
iface.sequential = function(frame)&lt;br /&gt;
	return context_init(frame, library.sequential, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|non-sequential|function name&lt;br /&gt;
iface[&amp;#039;non-sequential&amp;#039;] = function(frame)&lt;br /&gt;
	return context_init(frame, library[&amp;#039;non-sequential&amp;#039;], false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|sort|function name&lt;br /&gt;
iface.all_sorted = function(frame)&lt;br /&gt;
	return context_init(frame, library.all_sorted, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|setting|directives|...|function name&lt;br /&gt;
iface.setting = function(frame)&lt;br /&gt;
	return context_init(frame, library.setting, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|squeezing|function name&lt;br /&gt;
iface.squeezing = function(frame)&lt;br /&gt;
	return context_init(frame, library.squeezing, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|cutting|left cut|right cut|function name&lt;br /&gt;
iface.cutting = function(frame)&lt;br /&gt;
	return context_init(frame, library.cutting, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|with_name_matching|pattern 1|[plain flag 1]|[or]&lt;br /&gt;
--            |[pattern 2]|[plain flag 2]|[or]|[...]|[pattern N]|[plain flag&lt;br /&gt;
--            N]|function name&lt;br /&gt;
iface.with_name_matching = function(frame)&lt;br /&gt;
	return context_init(frame, library.with_name_matching, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|with_name_not_matching|pattern 1|[plain flag 1]&lt;br /&gt;
--            |[and]|[pattern 2]|[plain flag 2]|[and]|[...]|[pattern N]|[plain&lt;br /&gt;
--            flag N]|function name&lt;br /&gt;
iface.with_name_not_matching = function(frame)&lt;br /&gt;
	return context_init(frame, library.with_name_not_matching, false,&lt;br /&gt;
		false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|with_value_matching|pattern 1|[plain flag 1]|[or]&lt;br /&gt;
--            |[pattern 2]|[plain flag 2]|[or]|[...]|[pattern N]|[plain flag&lt;br /&gt;
--            N]|function name&lt;br /&gt;
iface.with_value_matching = function(frame)&lt;br /&gt;
	return context_init(frame, library.with_value_matching, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|with_value_not_matching|pattern 1|[plain flag 1]&lt;br /&gt;
--            |[and]|[pattern 2]|[plain flag 2]|[and]|[...]|[pattern N]|[plain&lt;br /&gt;
--            flag N]|function name&lt;br /&gt;
iface.with_value_not_matching = function(frame)&lt;br /&gt;
	return context_init(frame, library.with_value_not_matching, false,&lt;br /&gt;
		false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|trimming_values|function name&lt;br /&gt;
iface.trimming_values = function(frame)&lt;br /&gt;
	return context_init(frame, library.trimming_values, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|mapping_values_by_calling|template name|[number of additional&lt;br /&gt;
--            arguments]|[argument 1]|[argument 2]|[...]|[argument N]|function&lt;br /&gt;
--            name&lt;br /&gt;
iface.mapping_values_by_calling = function(frame)&lt;br /&gt;
	return context_init(frame, library.mapping_values_by_calling, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|mapping_values_by_invoking|module name|function name|[number of&lt;br /&gt;
--            additional arguments]|[argument 1]|[argument 2]|[...]|[argument&lt;br /&gt;
--            N]|function name&lt;br /&gt;
iface.mapping_values_by_invoking = function(frame)&lt;br /&gt;
	return context_init(frame, library.mapping_values_by_invoking, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|mapping_values_blindly_by_calling|template name|[number of&lt;br /&gt;
--            additional arguments]|[argument 1]|[argument 2]|[...]|[argument&lt;br /&gt;
--            N]|function name&lt;br /&gt;
iface.mapping_values_blindly_by_calling = function(frame)&lt;br /&gt;
	return context_init(frame, library.mapping_values_blindly_by_calling, false,&lt;br /&gt;
		false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|mapping_values_blindly_by_invoking|module name|function name&lt;br /&gt;
--            |[number of additional arguments]|[argument 1]|[argument 2]|[...]&lt;br /&gt;
--            |[argument N]|function name&lt;br /&gt;
iface.mapping_values_blindly_by_invoking = function(frame)&lt;br /&gt;
	return context_init(frame, library.mapping_values_blindly_by_invoking, false,&lt;br /&gt;
		false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	--[[ Functions ]]--&lt;br /&gt;
	----------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|count&lt;br /&gt;
iface.count = function(frame)&lt;br /&gt;
	return context_init(frame, library.count, true, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:args|concat_and_call|template name|[prepend 1]|[prepend 2]&lt;br /&gt;
--            |[...]|[item n]|[named item 1=value 1]|[...]|[named item n=value&lt;br /&gt;
--            n]|[...]&lt;br /&gt;
iface.concat_and_call = function(frame)&lt;br /&gt;
	return context_init(frame, library.concat_and_call, false, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:args|concat_and_invoke|module name|function name|[prepend&lt;br /&gt;
--            1]|[prepend 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named&lt;br /&gt;
--            item n=value n]|[...]&lt;br /&gt;
iface.concat_and_invoke = function(frame)&lt;br /&gt;
	return context_init(frame, library.concat_and_invoke, false, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:args|concat_and_magic|parser function|[prepend 1]|[prepend&lt;br /&gt;
--            2]|[...]|[item n]|[named item 1=value 1]|[...]|[named item n=&lt;br /&gt;
--            value n]|[...]&lt;br /&gt;
iface.concat_and_magic = function(frame)&lt;br /&gt;
	return context_init(frame, library.concat_and_magic, false, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|value_of|parameter name&lt;br /&gt;
iface.value_of = function(frame)&lt;br /&gt;
	return context_init(frame, library.value_of, true, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|list&lt;br /&gt;
iface.list = function(frame)&lt;br /&gt;
	return context_init(frame, library.list, true, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|list_values&lt;br /&gt;
iface.list_values = function(frame)&lt;br /&gt;
	return context_init(frame, library.list_values, true, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|for_each|wikitext&lt;br /&gt;
iface.for_each = function(frame)&lt;br /&gt;
	return context_init(frame, library.for_each, true, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|call_for_each|template name|[append 1]|[append 2]&lt;br /&gt;
--            |[...]|[append n]|[named param 1=value 1]|[...]|[named param&lt;br /&gt;
--            n=value n]|[...]&lt;br /&gt;
iface.call_for_each = function(frame)&lt;br /&gt;
	return context_init(frame, library.call_for_each, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|invoke_for_each|module name|module function|[append&lt;br /&gt;
--            1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]&lt;br /&gt;
--            |[named param n=value n]|[...]&lt;br /&gt;
iface.invoke_for_each = function(frame)&lt;br /&gt;
	return context_init(frame, library.invoke_for_each, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|magic_for_each|parser function|[append 1]|[append 2]&lt;br /&gt;
--            |[...]|[append n]|[named param 1=value 1]|[...]|[named param&lt;br /&gt;
--            n=value n]|[...]&lt;br /&gt;
iface.magic_for_each = function(frame)&lt;br /&gt;
	return context_init(frame, library.magic_for_each, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|call_for_each_value|template name|[append 1]|[append&lt;br /&gt;
--            2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param&lt;br /&gt;
--            n=value n]|[...]&lt;br /&gt;
iface.call_for_each_value = function(frame)&lt;br /&gt;
	return context_init(frame, library.call_for_each_value, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|invoke_for_each_value|module name|[append 1]|[append&lt;br /&gt;
--            2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param&lt;br /&gt;
--            n=value n]|[...]&lt;br /&gt;
iface.invoke_for_each_value = function(frame)&lt;br /&gt;
	return context_init(frame, library.invoke_for_each_value, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|magic_for_each_value|parser function|[append 1]&lt;br /&gt;
--            |[append 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named&lt;br /&gt;
--            param n=value n]|[...]&lt;br /&gt;
iface.magic_for_each_value = function(frame)&lt;br /&gt;
	return context_init(frame, library.magic_for_each_value, false, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Syntax:  #invoke:params|self&lt;br /&gt;
iface.self = function(frame)&lt;br /&gt;
	return frame:getParent():getTitle()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return iface&lt;/div&gt;</summary>
		<author><name>wikipedia&gt;MusikBot II</name></author>
	</entry>
</feed>