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