Content added Content deleted
(check fargs and pargs before writing new values to args if options.noOverwrite is set) |
(use an array to hold argument tables rather than firstArgs and secondArgs variables) |
||
Line 8: | Line 8: | ||
-- Get the arguments from the frame object if available. If the frame object is not available, we are being called |
-- 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 |
-- from another Lua module or from the debug console, so put the args in a special table so we can differentiate them. |
||
local fargs, pargs |
local fargs, pargs, luaArgs |
||
if frame == mw.getCurrentFrame() then |
if frame == mw.getCurrentFrame() then |
||
fargs = frame.args |
fargs = frame.args |
||
pargs = frame:getParent().args |
pargs = frame:getParent().args |
||
else |
else |
||
luaArgs = type(frame) == 'table' and frame or {} |
|||
pargs = {} |
|||
end |
end |
||
-- Set up the args and metaArgs tables. args will be the one accessed from functions, and metaArgs will hold the actual arguments. |
|||
-- The metatable connects the two together. |
|||
local args, metaArgs, metatable = {}, {}, {} |
local args, metaArgs, metatable = {}, {}, {} |
||
setmetatable(args, metatable) |
setmetatable(args, metatable) |
||
Line 36: | Line 37: | ||
end |
end |
||
-- Use a user-generated |
-- Use a user-generated function to tidy the values if specified. |
||
local valueFunc = options.valueFunc |
local valueFunc = options.valueFunc |
||
if valueFunc then |
if valueFunc then |
||
Line 47: | Line 48: | ||
end |
end |
||
local function mergeArgs(iterator, |
local function mergeArgs(iterator, tables) |
||
-- Accepts multiple tables as input and merges their keys and values into one table using the specified 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. |
-- If a value is already present it is not overwritten; tables listed earlier have precendence. |
||
⚫ | |||
for _, t in ipairs(tables) do |
for _, t in ipairs(tables) do |
||
for key, val in iterator(t) do |
for key, val in iterator(t) do |
||
Line 60: | Line 60: | ||
end |
end |
||
-- Set the order of precedence of |
-- Set the order of precedence of the argument tables. If the variables are nil, nothing will be added to the table, |
||
-- which is how we avoid clashes between the frame/parent args and the Lua args. |
|||
local firstArgs, secondArgs = fargs, pargs |
|||
⚫ | |||
if options.parentFirst then |
if options.parentFirst then |
||
table.insert(argTables, pargs) |
|||
firstArgs, secondArgs = pargs, fargs |
|||
table.insert(argTables, fargs) |
|||
⚫ | |||
table.insert(argTables, fargs) |
|||
table.insert(argTables, pargs) |
|||
end |
end |
||
table.insert(argTables, luaArgs) |
|||
--[[ |
--[[ |
||
-- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the |
-- Define metatable behaviour. Arguments are stored in the metaArgs table, and are only fetched from the |
||
-- |
-- argument tables once. Also, we keep a record in the metatable of when pairs and ipairs have been called, |
||
-- |
-- so we do not run pairs and ipairs on fargs and pargs more than once. We also do not run ipairs on fargs |
||
-- |
-- and pargs if pairs has already been run, as all the arguments will already have been copied over. |
||
-- copied over. |
|||
--]] |
--]] |
||
metatable.__index = function (t, key) |
metatable.__index = function (t, key) |
||
Line 78: | Line 83: | ||
return val |
return val |
||
else |
else |
||
for i, argTable in ipairs(argTables) do |
|||
local |
local argTableVal = tidyVal(argTable[key]) |
||
if |
if argTableVal ~= nil then |
||
return firstVal |
|||
metaArgs[key] = argTableVal |
|||
⚫ | |||
return |
return argTableVal |
||
end |
|||
end |
end |
||
end |
end |
||
Line 95: | Line 101: | ||
metatable.__pairs = function () |
metatable.__pairs = function () |
||
if not metatable.donePairs then |
if not metatable.donePairs then |
||
mergeArgs(pairs, |
mergeArgs(pairs, argTables) |
||
metatable.donePairs = true |
metatable.donePairs = true |
||
metatable.doneIpairs = true |
metatable.doneIpairs = true |
||
Line 104: | Line 110: | ||
metatable.__ipairs = function () |
metatable.__ipairs = function () |
||
if not metatable.doneIpairs then |
if not metatable.doneIpairs then |
||
mergeArgs(ipairs, |
mergeArgs(ipairs, argTables) |
||
metatable.doneIpairs = true |
metatable.doneIpairs = true |
||
end |
end |