<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.freecapitalists.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AArguments</id>
	<title>Module:Arguments - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.freecapitalists.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AArguments"/>
	<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Module:Arguments&amp;action=history"/>
	<updated>2026-08-13T02:30:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Module:Arguments&amp;diff=23892&amp;oldid=prev</id>
		<title>FormerContributor-78162cb3: 1 revision</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Module:Arguments&amp;diff=23892&amp;oldid=prev"/>
		<updated>2014-01-25T20:57:30Z</updated>

		<summary type="html">&lt;p&gt;1 revision&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 20:57, 25 January 2014&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>FormerContributor-78162cb3</name></author>
	</entry>
	<entry>
		<id>https://wiki.freecapitalists.org/index.php?title=Module:Arguments&amp;diff=23891&amp;oldid=prev</id>
		<title>0.0.0.0: tweak one of the comments and make some beautification fixes, now that this is in the job queue</title>
		<link rel="alternate" type="text/html" href="https://wiki.freecapitalists.org/index.php?title=Module:Arguments&amp;diff=23891&amp;oldid=prev"/>
		<updated>2014-01-13T05:40:58Z</updated>

		<summary type="html">&lt;p&gt;tweak one of the comments and make some beautification fixes, now that this is in the job queue&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module provides easy processing of arguments passed to Scribunto from #invoke.&lt;br /&gt;
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
&lt;br /&gt;
local arguments = {}&lt;br /&gt;
&lt;br /&gt;
local nilArg = {} -- Used for memoizing nil arguments in metaArgs.&lt;br /&gt;
&lt;br /&gt;
-- Generate four different tidyVal functions, so that we don&amp;#039;t have to check the options every time we call it.&lt;br /&gt;
&lt;br /&gt;
local function tidyValDefault(key, val)&lt;br /&gt;
	if type(val) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		val = val:match(&amp;#039;^%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
		if val == &amp;#039;&amp;#039; then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValTrimOnly(key, val)&lt;br /&gt;
	if type(val) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		return val:match(&amp;#039;^%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValRemoveBlanksOnly(key, val)&lt;br /&gt;
	if type(val) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		if val:find(&amp;#039;%S&amp;#039;) then&lt;br /&gt;
			return val&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValNoChange(key, val)&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function arguments.getArgs(frame, options)&lt;br /&gt;
	checkType(&amp;#039;getArgs&amp;#039;, 1, frame, &amp;#039;table&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;getArgs&amp;#039;, 2, options, &amp;#039;table&amp;#039;, true)&lt;br /&gt;
	frame = frame or {}&lt;br /&gt;
	options = options or {}&lt;br /&gt;
&lt;br /&gt;
	-- Get the arguments from the frame object if available. If the frame object is not available, we are being called&lt;br /&gt;
	-- from another Lua module or from the debug console, so assign the args to a new variable so we can differentiate them.&lt;br /&gt;
	local fargs, pargs, luaArgs&lt;br /&gt;
	if type(frame.args) == &amp;#039;table&amp;#039; and type(frame.getParent) == &amp;#039;function&amp;#039; then&lt;br /&gt;
		if not options.parentOnly then&lt;br /&gt;
			fargs = frame.args&lt;br /&gt;
		end&lt;br /&gt;
		if not options.frameOnly then&lt;br /&gt;
			pargs = frame:getParent().args&lt;br /&gt;
		end&lt;br /&gt;
		if options.parentFirst then&lt;br /&gt;
			fargs, pargs = pargs, fargs&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		luaArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments.&lt;br /&gt;
	-- The metatable connects the two together.&lt;br /&gt;
	local args, metaArgs, metatable = {}, {}, {}&lt;br /&gt;
	setmetatable(args, metatable)&lt;br /&gt;
&lt;br /&gt;
	-- Generate the tidyVal function. If it has been specified by the user, we use that; if not, we choose one of four functions&lt;br /&gt;
	-- depending on the options chosen. This is so that we don&amp;#039;t have to call the options table every time the function is called.&lt;br /&gt;
	local tidyVal = options.valueFunc&lt;br /&gt;
	if tidyVal then&lt;br /&gt;
		if type(tidyVal) ~= &amp;#039;function&amp;#039; then&lt;br /&gt;
			error(&amp;quot;bad value assigned to option &amp;#039;valueFunc&amp;#039; (function expected, got &amp;quot; .. type(tidyVal) .. &amp;#039;)&amp;#039;, 2)&lt;br /&gt;
		end&lt;br /&gt;
	elseif options.trim ~= false then&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValDefault&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValTrimOnly&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValRemoveBlanksOnly&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValNoChange&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function mergeArgs(iterator, tables)&lt;br /&gt;
		-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.&lt;br /&gt;
		-- If a value is already present it is not overwritten; tables listed earlier have precedence.&lt;br /&gt;
		-- We are also memoizing nil values, but those values can be overwritten.&lt;br /&gt;
		for _, t in ipairs(tables) do&lt;br /&gt;
			for key, val in iterator(t) do&lt;br /&gt;
				local metaArgsVal = metaArgs[key]&lt;br /&gt;
				if metaArgsVal == nil or metaArgsVal == nilArg then&lt;br /&gt;
					local tidiedVal = tidyVal(key, val)&lt;br /&gt;
					if tidiedVal == nil then&lt;br /&gt;
						metaArgs[key] = nilArg&lt;br /&gt;
					else&lt;br /&gt;
						metaArgs[key] = tidiedVal&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table,&lt;br /&gt;
	-- which is how we avoid clashes between the frame/parent args and the Lua args.	&lt;br /&gt;
	local argTables = {fargs}&lt;br /&gt;
	argTables[#argTables + 1] = pargs&lt;br /&gt;
	argTables[#argTables + 1] = luaArgs&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Define metatable behaviour. Arguments are memoized in the metaArgs table, and are only fetched from the&lt;br /&gt;
	-- argument tables once. Nil arguments are also memoized using the nilArg variable in order to increase&lt;br /&gt;
	-- performance. Also, we keep a record in the metatable of when pairs and ipairs have been called, so we&lt;br /&gt;
	-- do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs and&lt;br /&gt;
	-- pargs if pairs has already been run, as all the arguments will already have been copied over.&lt;br /&gt;
	--]]&lt;br /&gt;
&lt;br /&gt;
	metatable.__index = function (t, key)&lt;br /&gt;
		local val = metaArgs[key]&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			if val == nilArg then&lt;br /&gt;
				return nil&lt;br /&gt;
			else&lt;br /&gt;
				return val&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for _, argTable in ipairs(argTables) do&lt;br /&gt;
			local argTableVal = tidyVal(key, argTable[key])&lt;br /&gt;
			if argTableVal == nil then&lt;br /&gt;
				metaArgs[key] = nilArg&lt;br /&gt;
			else&lt;br /&gt;
				metaArgs[key] = argTableVal&lt;br /&gt;
				return argTableVal&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__newindex = function (t, key, val)&lt;br /&gt;
		if options.readOnly then&lt;br /&gt;
			error(&amp;#039;could not write to argument table key &amp;quot;&amp;#039; .. tostring(key) .. &amp;#039;&amp;quot;; the table is read-only&amp;#039;, 2)&lt;br /&gt;
		elseif options.noOverwrite and args[key] ~= nil then&lt;br /&gt;
			error(&amp;#039;could not write to argument table key &amp;quot;&amp;#039; .. tostring(key) .. &amp;#039;&amp;quot;; overwriting existing arguments is not permitted&amp;#039;, 2)&lt;br /&gt;
		elseif val == nil then&lt;br /&gt;
			metaArgs[key] = nilArg -- Memoize nils.&lt;br /&gt;
		else&lt;br /&gt;
			metaArgs[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__pairs = function ()&lt;br /&gt;
		if not metatable.donePairs then&lt;br /&gt;
			mergeArgs(pairs, argTables)&lt;br /&gt;
			metatable.donePairs = true&lt;br /&gt;
			metatable.doneIpairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return function (t, k)&lt;br /&gt;
			local nk, val = next(metaArgs, k)&lt;br /&gt;
			if val == nilArg then&lt;br /&gt;
				val = nil&lt;br /&gt;
			end&lt;br /&gt;
			return nk, val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__ipairs = function ()&lt;br /&gt;
		if not metatable.doneIpairs then&lt;br /&gt;
			mergeArgs(ipairs, argTables)&lt;br /&gt;
			metatable.doneIpairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return function (t, i)&lt;br /&gt;
			local val = metaArgs[i + 1]&lt;br /&gt;
			if val == nil then&lt;br /&gt;
				return nil&lt;br /&gt;
			elseif val == nilArg then&lt;br /&gt;
				val = nil&lt;br /&gt;
			end&lt;br /&gt;
			return i + 1, val&lt;br /&gt;
		end, nil, 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return arguments&lt;/div&gt;</summary>
		<author><name>0.0.0.0</name></author>
	</entry>
</feed>