The wiki has moved!

Visit the new wiki at stationeers-wiki.com The old wiki here at legacy.stationeers-wiki.com will sunset eventually.

Edits made after the 7th of March 6PM EST were NOT carried over to the new server as previously announced right here in this box.

 Actions

Module

Difference between revisions of "Arguments"

From Unofficial Stationeers Wiki

(create argument-processing module)
 
(return a table rather than a function, improve the comments)
Line 1: Line 1:
 
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
 
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
 +
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.
  
local function getArguments(frame, options)
+
local arguments = {}
 +
 
 +
function arguments.getArgs(frame, options)
 
options = type(options) == 'table' and options or {}
 
options = type(options) == 'table' and options or {}
  
 +
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
 +
-- from another Lua module or from the debug console, so assume arguments are passed directly in.
 
local fargs, pargs
 
local fargs, pargs
 
if frame == mw.getCurrentFrame() then
 
if frame == mw.getCurrentFrame() then
Line 31: Line 36:
 
end
 
end
  
 +
-- Use a user-generated functions to tidy the values if specified.
 
local valueFunc = options.valueFunc
 
local valueFunc = options.valueFunc
 
if valueFunc then
 
if valueFunc then
Line 54: Line 60:
 
end
 
end
  
 +
-- Set the order of precedence of frame args and parent args.
 
local firstArgs, secondArgs = fargs, pargs
 
local firstArgs, secondArgs = fargs, pargs
 
if options.parentFirst then
 
if options.parentFirst then
Line 59: Line 66:
 
end
 
end
  
 +
-- Define metatable behaviour.
 
metatable.__index = function (t, key)
 
metatable.__index = function (t, key)
 
local val = metaArgs[key]
 
local val = metaArgs[key]
Line 99: Line 107:
 
end
 
end
  
return getArguments
+
return arguments

Revision as of 21:19, 8 December 2013

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

-- This module provides easy processing of arguments passed to Scribunto from #invoke.
-- It is intended for use by other Lua modules, and should not be called from #invoke directly.

local arguments = {}

function arguments.getArgs(frame, options)
	options = type(options) == 'table' and options or {}

	-- Get the arguments from the frame object if available. If the frame object is not available, we are being called
	-- from another Lua module or from the debug console, so assume arguments are passed directly in.
	local fargs, pargs
	if frame == mw.getCurrentFrame() then
		fargs = frame.args
		pargs = frame:getParent().args
	else
		fargs = type(frame) == 'table' and frame or {}
		pargs = {}
	end

	local args, metaArgs, metatable = {}, {}, {}
	setmetatable(args, metatable)

	local function tidyVal(key, val)
		-- Processes a value according to the options given to getArguments. Can trim whitespace and remove blanks.
		-- Keys are not used here, but they can be used by user-generated functions, so defining it here to avoid breakage.
		if type(val) == 'string' then
			if options.trim ~= false then
				val = mw.text.trim(val)
			end
			if options.removeBlanks == false or mw.ustring.find(val, '%S') then
				return val
			end
		else
			return val
		end
	end

	-- Use a user-generated functions to tidy the values if specified.
	local valueFunc = options.valueFunc
	if valueFunc then
		local valueFuncType = type(valueFunc)
		if valueFuncType == 'function' then
			tidyVal = valueFunc
		else
			error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2)
		end
	end

	local function mergeArgs(iterator, ...)
		-- Accepts multiple tables as input and merges their keys and values into one table using the specified iterator.
		-- If a value is already present it is not overwritten; tables listed earlier have precendence.
		local tables = {...}
		for _, t in ipairs(tables) do
			for key, val in iterator(t) do
				if metaArgs[key] == nil then
					metaArgs[key] = tidyVal(key, val)
				end
			end
		end
	end

	-- Set the order of precedence of frame args and parent args.
	local firstArgs, secondArgs = fargs, pargs
	if options.parentFirst then
		firstArgs, secondArgs = pargs, fargs
	end

	-- Define metatable behaviour.
	metatable.__index = function (t, key)
		local val = metaArgs[key]
		if val ~= nil then
			return val
		else
			local firstVal = tidyVal(key, firstArgs[key])
			if firstVal ~= nil then
				return firstVal
			else
				return tidyVal(key, secondArgs[key])
			end
		end
	end

	metatable.__newindex = function (t, key, val)
		if not options.readOnly and (not options.noOverwrite or metaArgs[key] == nil) then
			metaArgs[key] = val
		end
	end

	metatable.__pairs = function ()
		if not metatable.donePairs then
			mergeArgs(pairs, firstArgs, secondArgs)
			metatable.donePairs = true
			metatable.doneIpairs = true
		end
		return pairs(metaArgs)
	end

	metatable.__ipairs = function ()
		if not metatable.doneIpairs then
			mergeArgs(ipairs, firstArgs, secondArgs)
			metatable.doneIpairs = true
		end
		return ipairs(metaArgs)
	end
	
	return args
end

return arguments