Module:Arguments: Difference between revisions
Jump to navigation
Jump to search
en>Mr. Stradivarius (create argument-processing module) |
en>Mr. Stradivarius (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 | 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 | return arguments |
Revision as of 02:19, 9 December 2013
This is a meta module.
This module is meant to be used only by other modules. It should not be invoked in wikitext.
This module was adapted from Module:Arguments on Wikipedia.
Adaptation is noted for reference and attribution only. This module may differ from the original in function or in usage. The documentation on Wikipedia may be helpful in understanding this module.
Adaptation is noted for reference and attribution only. This module may differ from the original in function or in usage. The documentation on Wikipedia may be helpful in understanding this module.
The above documentation is transcluded from Module:Arguments/doc.
Editors can experiment in this module's sandbox and testcases pages.
Subpages of this module.
Editors can experiment in this module's sandbox and testcases pages.
Subpages of this module.
-- 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