<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.mechsploit.me/index.php?action=history&amp;feed=atom&amp;title=Module%3AArguments%2Fdoc</id>
	<title>Module:Arguments/doc - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.mechsploit.me/index.php?action=history&amp;feed=atom&amp;title=Module%3AArguments%2Fdoc"/>
	<link rel="alternate" type="text/html" href="https://wiki.mechsploit.me/index.php?title=Module:Arguments/doc&amp;action=history"/>
	<updated>2026-04-08T13:19:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.mechsploit.me/index.php?title=Module:Arguments/doc&amp;diff=198&amp;oldid=prev</id>
		<title>MechsploWikiSysop: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.mechsploit.me/index.php?title=Module:Arguments/doc&amp;diff=198&amp;oldid=prev"/>
		<updated>2025-09-02T02:50:11Z</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 22:50, 1 September 2025&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>MechsploWikiSysop</name></author>
	</entry>
	<entry>
		<id>https://wiki.mechsploit.me/index.php?title=Module:Arguments/doc&amp;diff=197&amp;oldid=prev</id>
		<title>mw&gt;Shirayuki: avoid span bug</title>
		<link rel="alternate" type="text/html" href="https://wiki.mechsploit.me/index.php?title=Module:Arguments/doc&amp;diff=197&amp;oldid=prev"/>
		<updated>2024-12-06T14:02:49Z</updated>

		<summary type="html">&lt;p&gt;avoid span bug&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;noinclude&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#ifeq:{{SUBPAGENAME}}|doc||{{Documentation subpage}}}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;languages /&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;/noinclude&amp;gt;{{#switch:&amp;lt;translate&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
| =&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{Languages|Module:Arguments/doc}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&amp;lt;!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata --&amp;gt;&lt;br /&gt;
{{Shared Template Warning|Module:Arguments|Module:Arguments}}&lt;br /&gt;
{{Used in system}}&lt;br /&gt;
{{Module rating|release}}&lt;br /&gt;
{{Module rating|protected}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:1--&amp;gt; This module provides easy processing of arguments passed from &amp;lt;tvar name=1&amp;gt;{{Magic word|#invoke|...|ext=Scribunto|code=1|nowrap=1}}&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:2--&amp;gt; It is a meta-module, meant for use by other modules, and should not be called from &amp;lt;tvar name=1&amp;gt;{{tlc|&amp;lt;nowiki&amp;gt;#invoke:...&amp;lt;/nowiki&amp;gt;}}&amp;lt;/tvar&amp;gt; directly.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:3--&amp;gt; Its features include:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:4--&amp;gt; Easy trimming of arguments and removal of blank arguments.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:5--&amp;gt; Arguments can be passed by both the current frame and by the parent frame at the same time.&amp;lt;/translate&amp;gt; &amp;lt;translate&amp;gt;&amp;lt;!--T:6--&amp;gt; (More details below.)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:7--&amp;gt; Arguments can be passed in directly from another Lua module or from the debug console.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:8--&amp;gt; Arguments are fetched as needed, which can help avoid (some) problems with &amp;lt;tvar name=1&amp;gt;{{xtag|ref}}&amp;lt;/tvar&amp;gt; tags.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:9--&amp;gt; Most features can be customized.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Basic use == &amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:11--&amp;gt; First, you need to load the module.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:12--&amp;gt; It contains one function, named &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;getArgs&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:13--&amp;gt; In the most basic scenario, you can use &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;getArgs&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; inside your main function.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:14--&amp;gt; The variable &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; is a table containing the arguments from &amp;lt;tvar name=2&amp;gt;{{tlc|&amp;lt;nowiki&amp;gt;#invoke:...&amp;lt;/nowiki&amp;gt;}}&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:15--&amp;gt; (See below for details.)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	-- &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:16--&amp;gt; Main module code goes here.&amp;lt;/translate&amp;gt;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:17--&amp;gt; However, the recommended practice is to use a function just for processing arguments from &amp;lt;tvar name=1&amp;gt;{{tlc|&amp;lt;nowiki&amp;gt;#invoke:...&amp;lt;/nowiki&amp;gt;}}&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:18--&amp;gt; This means that if someone calls your module from another Lua module you don&amp;#039;t have to have a frame object available, which improves performance.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	-- &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:19--&amp;gt; Main module code goes here.&amp;lt;/translate&amp;gt;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
If you want multiple functions to use the arguments, and you also want them to be accessible from &amp;lt;tvar name=1&amp;gt;{{tlc|&amp;lt;nowiki&amp;gt;#invoke:...&amp;lt;/nowiki&amp;gt;}}&amp;lt;/tvar&amp;gt;, you can use a wrapper function.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function makeInvokeFunc(funcName)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		local args = getArgs(frame)&lt;br /&gt;
		return p[funcName](args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.func1 = makeInvokeFunc(&amp;#039;_func1&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p._func1(args)&lt;br /&gt;
	-- &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:21--&amp;gt; Code for the first function goes here.&amp;lt;/translate&amp;gt;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.func2 = makeInvokeFunc(&amp;#039;_func2&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p._func2(args)&lt;br /&gt;
	-- &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:22--&amp;gt; Code for the second function goes here.&amp;lt;/translate&amp;gt;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Options === &amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:24--&amp;gt; The following options are available.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:25--&amp;gt; They are explained in the sections below.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	trim = false,&lt;br /&gt;
	removeBlanks = false,&lt;br /&gt;
	valueFunc = function (key, value)&lt;br /&gt;
		-- &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:26--&amp;gt; Code for processing one argument&amp;lt;/translate&amp;gt;&lt;br /&gt;
	end,&lt;br /&gt;
	frameOnly = true,&lt;br /&gt;
	parentOnly = true,&lt;br /&gt;
	parentFirst = true,&lt;br /&gt;
	wrappers = {&lt;br /&gt;
		&amp;#039;Template:A wrapper template&amp;#039;,&lt;br /&gt;
		&amp;#039;Template:Another wrapper template&amp;#039;&lt;br /&gt;
	},&lt;br /&gt;
	readOnly = true,&lt;br /&gt;
	noOverwrite = true&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Trimming and removing blanks === &amp;lt;!--T:27--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:28--&amp;gt; Blank arguments often trip up coders new to converting MediaWiki templates to Lua.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:29--&amp;gt; In template syntax, blank strings and strings consisting only of whitespace are considered &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:30--&amp;gt; However, in Lua, blank strings and strings consisting of whitespace are considered &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:31--&amp;gt; This means that if you don&amp;#039;t pay attention to such arguments when you write your Lua modules, you might treat something as &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; that should actually be treated as &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:32--&amp;gt; To avoid this, by default this module removes all blank arguments.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:33--&amp;gt; Similarly, whitespace can cause problems when dealing with positional arguments.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:34--&amp;gt; Although whitespace is trimmed for named arguments coming from &amp;lt;tvar name=1&amp;gt;{{tlc|&amp;lt;nowiki&amp;gt;#invoke:...&amp;lt;/nowiki&amp;gt;}}&amp;lt;/tvar&amp;gt;, it is preserved for positional arguments.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:35--&amp;gt; Most of the time this additional whitespace is not desired, so this module trims it off by default.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:36--&amp;gt; However, sometimes you want to use blank arguments as input, and sometimes you want to keep additional whitespace.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:37--&amp;gt; This can be necessary to convert some templates exactly as they were written.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:38--&amp;gt; If you want to do this, you can set the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;trim&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; and &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;removeBlanks&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; arguments to &amp;lt;tvar name=3&amp;gt;&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	trim = false,&lt;br /&gt;
	removeBlanks = false&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Custom formatting of arguments === &amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:40--&amp;gt; Sometimes you want to remove some blank arguments but not others, or perhaps you might want to put all of the positional arguments in lower case.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:41--&amp;gt; To do things like this you can use the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;valueFunc&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; option.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:42--&amp;gt; The input to this option must be a function that takes two parameters, &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; and &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;, and returns a single value.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:43--&amp;gt; This value is what you will get when you access the field &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; in the &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; table.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;translate&amp;gt;&amp;lt;!--T:44--&amp;gt; Example 1:&amp;lt;/translate&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:45--&amp;gt; This function preserves whitespace for the first positional argument, but trims all other arguments and removes all other blank arguments.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	valueFunc = function (key, value)&lt;br /&gt;
		if key == 1 then&lt;br /&gt;
			return value&lt;br /&gt;
		elseif value then&lt;br /&gt;
			value = mw.text.trim(value)&lt;br /&gt;
			if value ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				return value&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;translate&amp;gt;&amp;lt;!--T:46--&amp;gt; Example 2:&amp;lt;/translate&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:47--&amp;gt; This function removes blank arguments and converts all arguments to lower case, but doesn&amp;#039;t trim whitespace from positional parameters.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	valueFunc = function (key, value)&lt;br /&gt;
		if not value then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		value = mw.ustring.lower(value)&lt;br /&gt;
		if mw.ustring.find(value, &amp;#039;%S&amp;#039;) then&lt;br /&gt;
			return value&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|text=&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:48--&amp;gt; The above functions will fail if passed input that is not of type &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; or &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:49--&amp;gt; This might be the case if you use the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;getArgs&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; function in the main function of your module, and that function is called by another Lua module.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:50--&amp;gt; In this case, you will need to check the type of your input.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:51--&amp;gt; This is not a problem if you are using a function specially for arguments from &amp;lt;tvar name=1&amp;gt;{{tlc|&amp;lt;nowiki&amp;gt;#invoke:...&amp;lt;/nowiki&amp;gt;}}&amp;lt;/tvar&amp;gt; (i.e. you have &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;p.main&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; and &amp;lt;tvar name=3&amp;gt;&amp;lt;code&amp;gt;p._main&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; functions, or something similar).&amp;lt;/translate&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Collapse top|1=&amp;lt;translate&amp;gt;&amp;lt;!--T:52--&amp;gt; Examples 1 and 2 with type checking&amp;lt;/translate&amp;gt;}}&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:53--&amp;gt;&lt;br /&gt;
Example 1:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	valueFunc = function (key, value)&lt;br /&gt;
		if key == 1 then&lt;br /&gt;
			return value&lt;br /&gt;
		elseif type(value) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			value = mw.text.trim(value)&lt;br /&gt;
			if value ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				return value&lt;br /&gt;
			else&lt;br /&gt;
				return nil&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return value&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:54--&amp;gt;&lt;br /&gt;
Example 2:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	valueFunc = function (key, value)&lt;br /&gt;
		if type(value) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			value = mw.ustring.lower(value)&lt;br /&gt;
			if mw.ustring.find(value, &amp;#039;%S&amp;#039;) then&lt;br /&gt;
				return value&lt;br /&gt;
			else&lt;br /&gt;
				return nil&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return value&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Collapse bottom}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:55--&amp;gt;&lt;br /&gt;
Also, please note that the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;valueFunc&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; function is called more or less every time an argument is requested from the &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; table, so if you care about performance you should make sure you aren&amp;#039;t doing anything inefficient with your code.&lt;br /&gt;
&lt;br /&gt;
=== Frames and parent frames === &amp;lt;!--T:56--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:57--&amp;gt; Arguments in the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; table can be passed from the current frame or from its parent frame at the same time.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:58--&amp;gt; To understand what this means, it is easiest to give an example.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:59--&amp;gt; Let&amp;#039;s say that we have a module called &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;Module:ExampleArgs&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:60--&amp;gt; This module prints the first two positional arguments that it is passed.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Collapse top|1=&amp;lt;translate&amp;gt;&amp;lt;!--T:61--&amp;gt; &amp;lt;tvar name=1&amp;gt;Module:ExampleArgs&amp;lt;/tvar&amp;gt; code&amp;lt;/translate&amp;gt;}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	local first = args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local second = args[2] or &amp;#039;&amp;#039;&lt;br /&gt;
	return first .. &amp;#039; &amp;#039; .. second&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{Collapse bottom}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:62--&amp;gt; &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;Module:ExampleArgs&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; is then called by &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;Template:ExampleArgs&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;, which contains the code &amp;lt;tvar name=3&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:ExampleArgs|main|firstInvokeArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:63--&amp;gt; This produces the result &amp;lt;tvar name=1&amp;gt;&amp;quot;firstInvokeArg&amp;quot;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:64--&amp;gt;&lt;br /&gt;
Now if we were to call &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;Template:ExampleArgs&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;, the following would happen:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{(!}} class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 50em; max-width: 100%;&amp;quot;&lt;br /&gt;
{{!}}-&lt;br /&gt;
! style=&amp;quot;width: 60%;&amp;quot; {{!}} &amp;lt;translate&amp;gt;&amp;lt;!--T:65--&amp;gt; Code&amp;lt;/translate&amp;gt;&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; {{!}} &amp;lt;translate&amp;gt;&amp;lt;!--T:66--&amp;gt; Result&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}} firstInvokeArg&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}} firstInvokeArg&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg|secondTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}} firstInvokeArg secondTemplateArg&lt;br /&gt;
{{!)}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:67--&amp;gt; There are three options you can set to change this behaviour: &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;frameOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;, &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;parentOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; and &amp;lt;tvar name=3&amp;gt;&amp;lt;code&amp;gt;parentFirst&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:68--&amp;gt; If you set &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;frameOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; then only arguments passed from the current frame will be accepted; if you set &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;parentOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; then only arguments passed from the parent frame will be accepted; and if you set &amp;lt;tvar name=3&amp;gt;&amp;lt;code&amp;gt;parentFirst&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; then arguments will be passed from both the current and parent frames, but the parent frame will have priority over the current frame.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:69--&amp;gt; Here are the results in terms of &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;Template:ExampleArgs&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dl&amp;gt;&lt;br /&gt;
&amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;frameOnly&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
&amp;lt;dd&amp;gt;&lt;br /&gt;
{{(!}} class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 50em; max-width: 100%;&amp;quot;&lt;br /&gt;
{{!}}-&lt;br /&gt;
! style=&amp;quot;width: 60%;&amp;quot; {{!}} &amp;lt;translate&amp;gt;&amp;lt;!--T:70--&amp;gt; Code&amp;lt;/translate&amp;gt;&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; {{!}} &amp;lt;translate&amp;gt;&amp;lt;!--T:71--&amp;gt; Result&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}} firstInvokeArg&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}} firstInvokeArg&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg|secondTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}} firstInvokeArg&lt;br /&gt;
{{!)}}&lt;br /&gt;
&amp;lt;/dd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;parentOnly&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
&amp;lt;dd&amp;gt;&lt;br /&gt;
{{(!}} class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 50em; max-width: 100%;&amp;quot;&lt;br /&gt;
{{!}}-&lt;br /&gt;
! style=&amp;quot;width: 60%;&amp;quot; {{!}} &amp;lt;translate&amp;gt;&amp;lt;!--T:72--&amp;gt; Code&amp;lt;/translate&amp;gt;&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; {{!}} &amp;lt;translate&amp;gt;&amp;lt;!--T:73--&amp;gt; Result&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}} firstTemplateArg&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg|secondTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}} firstTemplateArg secondTemplateArg&lt;br /&gt;
{{!)}}&lt;br /&gt;
&amp;lt;/dd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dt&amp;gt;&amp;lt;code&amp;gt;parentFirst&amp;lt;/code&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
&amp;lt;dd&amp;gt;&lt;br /&gt;
{{(!}} class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 50em; max-width: 100%;&amp;quot;&lt;br /&gt;
{{!}}-&lt;br /&gt;
! style=&amp;quot;width: 60%;&amp;quot; {{!}} &amp;lt;translate&amp;gt;&amp;lt;!--T:74--&amp;gt; Code&amp;lt;/translate&amp;gt;&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; {{!}} &amp;lt;translate&amp;gt;&amp;lt;!--T:75--&amp;gt; Result&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}} firstInvokeArg&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}} firstTemplateArg&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ExampleArgs|firstTemplateArg|secondTemplateArg}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}} firstTemplateArg secondTemplateArg&lt;br /&gt;
{{!)}}&lt;br /&gt;
&amp;lt;/dd&amp;gt;&lt;br /&gt;
&amp;lt;/dl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|text=&lt;br /&gt;
{{Ordered list&lt;br /&gt;
|1=&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:76--&amp;gt; If you set both the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;frameOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; and &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;parentOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; options, the module won&amp;#039;t fetch any arguments at all from &amp;lt;tvar name=3&amp;gt;{{tlc|&amp;lt;nowiki&amp;gt;#invoke:...&amp;lt;/nowiki&amp;gt;}}&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:77--&amp;gt; This is probably not what you want.&amp;lt;/translate&amp;gt;&lt;br /&gt;
|2=&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:78--&amp;gt; In some situations a parent frame may not be available, e.g. if &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;getArgs&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; is passed the parent frame rather than the current frame.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:79--&amp;gt; In this case, only the frame arguments will be used (unless &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;parentOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; is set, in which case no arguments will be used) and the &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;parentFirst&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; and &amp;lt;tvar name=3&amp;gt;&amp;lt;code&amp;gt;frameOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; options will have no effect.&amp;lt;/translate&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Wrappers === &amp;lt;!--T:80--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:81--&amp;gt; The &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;wrappers&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; option is used to specify a limited number of templates as &amp;#039;&amp;#039;wrapper templates&amp;#039;&amp;#039;, that is, templates whose only purpose is to call a module.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:82--&amp;gt; If the module detects that it is being called from a wrapper template, it will only check for arguments in the parent frame; otherwise it will only check for arguments in the frame passed to &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;getArgs&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:83--&amp;gt; This allows modules to be called by either &amp;lt;tvar name=1&amp;gt;{{tlc|&amp;lt;nowiki&amp;gt;#invoke:...&amp;lt;/nowiki&amp;gt;}}&amp;lt;/tvar&amp;gt; or through a wrapper template without the loss of performance associated with having to check both the frame and the parent frame for each argument lookup.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:84--&amp;gt; For example, the only content of &amp;lt;tvar name=1&amp;gt;{{tlx|Navbox}}&amp;lt;/tvar&amp;gt; (excluding content in &amp;lt;tvar name=2&amp;gt;{{tag|noinclude}}&amp;lt;/tvar&amp;gt; tags) is &amp;lt;tvar name=3&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:Navbox|navbox}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:85--&amp;gt; There is no point in checking the arguments passed directly to the &amp;lt;tvar name=1&amp;gt;{{tlc|&amp;lt;nowiki&amp;gt;#invoke:...&amp;lt;/nowiki&amp;gt;}}&amp;lt;/tvar&amp;gt; statement for this template, as no arguments will ever be specified there.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:86--&amp;gt; We can avoid checking arguments passed to &amp;lt;tvar name=1&amp;gt;{{tlc|&amp;lt;nowiki&amp;gt;#invoke:...&amp;lt;/nowiki&amp;gt;}}&amp;lt;/tvar&amp;gt; by using the &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;parentOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; option, but if we do this then &amp;lt;tvar name=1&amp;gt;{{tlc|&amp;lt;nowiki&amp;gt;#invoke:...&amp;lt;/nowiki&amp;gt;}}&amp;lt;/tvar&amp;gt; will not work from other pages either.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:87--&amp;gt; If this were the case, then {{&amp;lt;tvar name=1&amp;gt;tmpl|0={{para|text|$1}}&amp;lt;/tvar&amp;gt;|Some text}} in the code {{&amp;lt;tvar name=2&amp;gt;tmpl|0={{tlc|&amp;lt;nowiki&amp;gt;#invoke:Navbox&amp;lt;/nowiki&amp;gt;|navbox|3=text=$1}}&amp;lt;/tvar&amp;gt;|Some text}} would be ignored completely, no matter what page it was used from.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:88--&amp;gt; By using the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;wrappers&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; option to specify &amp;lt;tvar name=2&amp;gt;[[Template:Navbox]]&amp;lt;/tvar&amp;gt; as a wrapper, we can make {{&amp;lt;tvar name=3&amp;gt;tmpl|0={{tlc|&amp;lt;nowiki&amp;gt;#invoke:Navbox&amp;lt;/nowiki&amp;gt;|main|3=text=$1}}&amp;lt;/tvar&amp;gt;|Some text}} work from most pages, while still not requiring that the module check for arguments on the &amp;lt;tvar name=2&amp;gt;[[Template:Navbox]]&amp;lt;/tvar&amp;gt; page itself.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:89--&amp;gt;&lt;br /&gt;
Wrappers can be specified either as a string, or as an array of strings.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	wrappers = &amp;#039;Template:Wrapper template&amp;#039;&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local args = getArgs(frame, {&lt;br /&gt;
	wrappers = {&lt;br /&gt;
		&amp;#039;Template:Wrapper 1&amp;#039;,&lt;br /&gt;
		&amp;#039;Template:Wrapper 2&amp;#039;,&lt;br /&gt;
		-- &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:90--&amp;gt; Any number of wrapper templates can be added here.&amp;lt;/translate&amp;gt;&lt;br /&gt;
	}&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|text=&lt;br /&gt;
{{Ordered list&lt;br /&gt;
|1=&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:91--&amp;gt; The module will automatically detect if it is being called from a wrapper template&amp;#039;s &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;/sandbox&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; subpage, so there is no need to specify sandbox pages explicitly.&amp;lt;/translate&amp;gt;&lt;br /&gt;
|2=&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:92--&amp;gt; The &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;wrappers&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; option effectively changes the default of the &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;frameOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; and &amp;lt;tvar name=3&amp;gt;&amp;lt;code&amp;gt;parentOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; options.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:93--&amp;gt; If, for example, &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;parentOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; were explicitly set to &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; with &amp;lt;tvar name=3&amp;gt;&amp;lt;code&amp;gt;wrappers&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; set, calls via wrapper templates would result in both frame and parent arguments being loaded, though calls not via wrapper templates would result in only frame arguments being loaded.&amp;lt;/translate&amp;gt;&lt;br /&gt;
|3=&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:94--&amp;gt; If the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;wrappers&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; option is set and no parent frame is available, the module will always get the arguments from the frame passed to &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;getArgs&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate nowrap&amp;gt;&lt;br /&gt;
=== Writing to the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; table === &amp;lt;!--T:95--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:96--&amp;gt; Sometimes it can be useful to write new values to the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; table.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:97--&amp;gt; This is possible with the default settings of this module.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:98--&amp;gt; (However, bear in mind that it is usually better coding style to create a new table with your new values and copy arguments from the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; table as needed.)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
args.foo = &amp;#039;&amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:99--&amp;gt; some value&amp;lt;/translate&amp;gt;&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:100--&amp;gt; It is possible to alter this behaviour with the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;readOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; and &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;noOverwrite&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; options.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:101--&amp;gt; If &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;readOnly&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; is set then it is not possible to write any values to the &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; table at all.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:102--&amp;gt; If &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;noOverwrite&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; is set, then it is possible to add new values to the table, but it is not possible to add a value if it would overwrite any arguments that are passed from &amp;lt;tvar name=2&amp;gt;{{tlc|&amp;lt;nowiki&amp;gt;#invoke:...&amp;lt;/nowiki&amp;gt;}}&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Ref tags === &amp;lt;!--T:103--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:104--&amp;gt; This module uses [[&amp;lt;tvar name=1&amp;gt;mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual#Metatables&amp;lt;/tvar&amp;gt;|metatables]] to fetch arguments from &amp;lt;tvar name=2&amp;gt;{{tlc|&amp;lt;nowiki&amp;gt;#invoke:...&amp;lt;/nowiki&amp;gt;}}&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:105--&amp;gt; This allows access to both the frame arguments and the parent frame arguments without using the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; function.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:106--&amp;gt; This can help if your module might be passed &amp;lt;tvar name=1&amp;gt;{{xtag|ref}}&amp;lt;/tvar&amp;gt; tags as input.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:107--&amp;gt; As soon as &amp;lt;tvar name=1&amp;gt;{{xtag|ref}}&amp;lt;/tvar&amp;gt; tags are accessed from Lua, they are processed by the MediaWiki software and the reference will appear in the reference list at the bottom of the article.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:108--&amp;gt; If your module proceeds to omit the reference tag from the output, you will end up with a phantom reference - a reference that appears in the reference list, but no number that links to it.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:109--&amp;gt; This has been a problem with modules that use &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;pairs()&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; to detect whether to use the arguments from the frame or the parent frame, as those modules automatically process every available argument.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:110--&amp;gt; This module solves this problem by allowing access to both frame and parent frame arguments, while still only fetching those arguments when it is necessary.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:111--&amp;gt; The problem will still occur if you use &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;pairs(args)&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; elsewhere in your module, however.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Known limitations === &amp;lt;!--T:112--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:113--&amp;gt; The use of metatables also has its downsides.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:114--&amp;gt; Most of the normal Lua table tools won&amp;#039;t work properly on the &amp;lt;tvar name=4&amp;gt;&amp;lt;code&amp;gt;args&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; table, including the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; operator, the &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;next()&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; function, and the functions in the &amp;lt;tvar name=3&amp;gt;&amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; library.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:115--&amp;gt; If using these is important for your module, you should use your own argument processing function instead of this module.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Tests == &amp;lt;!--T:116--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{ModuleQuality}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{Sandbox other||&lt;br /&gt;
&amp;lt;!-- Categories below this line; interwikis at Wikidata --&amp;gt;&lt;br /&gt;
[[Category:Lua metamodules{{#translation:}}]]&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Module documentation pages{{#translation:}}]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
| #default=&lt;br /&gt;
  {{#invoke:Template translation|renderTranslatedTemplate|template=Module:Arguments/doc|noshift=1|uselang={{int:lang}}}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>mw&gt;Shirayuki</name></author>
	</entry>
</feed>