Difference between revisions of "Module:Arguments"
From BESA® Wiki
m (Changed protection level of Module:Arguments: used in the mediawiki interface ex: MediaWiki:Watchlist-details ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))) |
(create argument-processing module) |
||
| (20 intermediate revisions by 3 users not shown) | |||
| Line 1: | Line 1: | ||
| − | -- This module provides easy processing of arguments passed to Scribunto from | + | -- This module provides easy processing of arguments passed to Scribunto from #invoke. |
| − | + | ||
| − | + | ||
| − | local | + | local function getArguments(frame, options) |
| − | + | options = type(options) == 'table' and options or {} | |
| − | local | + | local fargs, pargs |
| − | + | if frame == mw.getCurrentFrame() then | |
| − | + | fargs = frame.args | |
| − | + | pargs = frame:getParent().args | |
| − | + | ||
| − | + | ||
| − | if | + | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
else | else | ||
| − | + | fargs = type(frame) == 'table' and frame or {} | |
| + | pargs = {} | ||
end | end | ||
| − | |||
| − | local | + | local args, metaArgs, metatable = {}, {}, {} |
| − | + | setmetatable(args, metatable) | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | local function | + | 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 | end | ||
| − | + | if options.removeBlanks == false or mw.ustring.find(val, '%S') then | |
| − | + | return val | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
end | end | ||
else | else | ||
| − | + | return val | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
end | end | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
end | end | ||
| − | + | local valueFunc = options.valueFunc | |
| − | + | if valueFunc then | |
| − | + | local valueFuncType = type(valueFunc) | |
| − | local | + | if valueFuncType == 'function' then |
| − | + | tidyVal = valueFunc | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | if | + | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | if | + | |
| − | tidyVal = | + | |
else | else | ||
| − | + | error('type error in option "valueFunc": expected function, got ' .. valueFuncType, 2) | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
end | end | ||
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 = {...} | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | -- Accepts multiple tables as input and merges their keys and values | + | |
| − | -- | + | |
| − | + | ||
| − | + | ||
| − | + | ||
for _, t in ipairs(tables) do | for _, t in ipairs(tables) do | ||
| − | for key, val in | + | for key, val in iterator(t) do |
| − | if metaArgs[key] == nil | + | if metaArgs[key] == nil then |
| − | + | metaArgs[key] = tidyVal(key, val) | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
end | end | ||
end | end | ||
| Line 218: | Line 54: | ||
end | end | ||
| − | + | local firstArgs, secondArgs = fargs, pargs | |
| − | + | if options.parentFirst then | |
| − | + | firstArgs, secondArgs = pargs, fargs | |
| − | + | end | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
metatable.__index = function (t, key) | metatable.__index = function (t, key) | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
local val = metaArgs[key] | local val = metaArgs[key] | ||
if val ~= nil then | if val ~= nil then | ||
return val | return val | ||
| − | + | else | |
| − | + | local firstVal = tidyVal(key, firstArgs[key]) | |
| − | + | if firstVal ~= nil then | |
| − | + | return firstVal | |
| − | local | + | else |
| − | if | + | return tidyVal(key, secondArgs[key]) |
| − | + | ||
| − | + | ||
end | end | ||
end | end | ||
| − | |||
| − | |||
end | end | ||
metatable.__newindex = function (t, key, val) | metatable.__newindex = function (t, key, val) | ||
| − | + | if not options.readOnly and (not options.noOverwrite or metaArgs[key] == nil) then | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | if options.readOnly | + | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
metaArgs[key] = val | metaArgs[key] = val | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
end | end | ||
end | end | ||
metatable.__pairs = function () | metatable.__pairs = function () | ||
| − | |||
if not metatable.donePairs then | if not metatable.donePairs then | ||
| − | mergeArgs( | + | mergeArgs(pairs, firstArgs, secondArgs) |
metatable.donePairs = true | metatable.donePairs = true | ||
| + | metatable.doneIpairs = true | ||
end | end | ||
| − | return | + | return pairs(metaArgs) |
end | end | ||
| − | + | metatable.__ipairs = function () | |
| − | + | if not metatable.doneIpairs then | |
| − | + | mergeArgs(ipairs, firstArgs, secondArgs) | |
| − | if | + | metatable.doneIpairs = true |
| − | + | ||
end | end | ||
| + | return ipairs(metaArgs) | ||
end | end | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
return args | return args | ||
end | end | ||
| − | return | + | return getArguments |
Revision as of 17:01, 7 December 2013
Documentation for this module may be created at Module:Arguments/doc
Script error: Lua error: Internal error: The interpreter exited with status 126.
-- This module provides easy processing of arguments passed to Scribunto from #invoke.
local function getArguments(frame, options)
options = type(options) == 'table' and options or {}
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
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
local firstArgs, secondArgs = fargs, pargs
if options.parentFirst then
firstArgs, secondArgs = pargs, fargs
end
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 getArguments