Bearbeiten von „Modul:Arguments“
Die Bearbeitung kann rückgängig gemacht werden. Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und veröffentliche dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.
Aktuelle Version | Dein Text | ||
Zeile 47: | Zeile 47: | ||
return val | return val | ||
end | end | ||
function arguments.getArgs(frame, options) | function arguments.getArgs(frame, options) | ||
Zeile 60: | Zeile 53: | ||
frame = frame or {} | frame = frame or {} | ||
options = options or {} | options = options or {} | ||
--[[ | --[[ | ||
Zeile 114: | Zeile 82: | ||
local title = parent:getTitle():gsub('/sandbox$', '') | local title = parent:getTitle():gsub('/sandbox$', '') | ||
local found = false | local found = false | ||
if | if type(options.wrappers) == 'table' then | ||
for _,v in pairs(options.wrappers) do | for _,v in pairs(options.wrappers) do | ||
if | if v == title then | ||
found = true | found = true | ||
break | break | ||
end | end | ||
end | end | ||
elseif options.wrappers == title then | |||
found = true | |||
end | end | ||
-- We test for false specifically here so that nil (the default) acts like true. | -- We test for false specifically here so that nil (the default) acts like true. | ||
if found or options.frameOnly == false then | if found or options.frameOnly == false then | ||
Zeile 149: | Zeile 117: | ||
luaArgs = frame | luaArgs = frame | ||
end | end | ||
-- Set the order of precedence of the argument tables. If the variables are | -- 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 | -- nil, nothing will be added to the table, which is how we avoid clashes | ||
-- between the frame/parent args and the Lua args. | -- between the frame/parent args and the Lua args. | ||
local argTables = {fargs} | local argTables = {fargs} | ||
argTables[#argTables + 1] = pargs | argTables[#argTables + 1] = pargs | ||
Zeile 197: | Zeile 165: | ||
setmetatable(args, metatable) | setmetatable(args, metatable) | ||
local function mergeArgs(tables) | local function mergeArgs(iterator, tables) | ||
--[[ | --[[ | ||
-- Accepts multiple tables as input and merges their keys and values | -- Accepts multiple tables as input and merges their keys and values | ||
-- into one table. If a value is already present it is not overwritten; | -- into one table using the specified iterator. If a value is already | ||
-- present it is not overwritten; tables listed earlier have precedence. | |||
-- | -- We are also memoizing nil values, but those values can be | ||
-- overwritten. | |||
--]] | --]] | ||
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 | ||
local tidiedVal = tidyVal(key, val) | local tidiedVal = tidyVal(key, val) | ||
if tidiedVal == nil then | if tidiedVal == nil then | ||
nilArgs[key] = | nilArgs[key] = true | ||
else | else | ||
metaArgs[key] = tidiedVal | metaArgs[key] = tidiedVal | ||
Zeile 242: | Zeile 211: | ||
-- must be nil. | -- must be nil. | ||
--]] | --]] | ||
local val = metaArgs[key] | local val = metaArgs[key] | ||
if val ~= nil then | if val ~= nil then | ||
Zeile 253: | Zeile 219: | ||
for _, argTable in ipairs(argTables) do | for _, argTable in ipairs(argTables) do | ||
local argTableVal = tidyVal(key, argTable[key]) | local argTableVal = tidyVal(key, argTable[key]) | ||
if argTableVal | if argTableVal == nil then | ||
nilArgs[key] = true | |||
else | |||
metaArgs[key] = argTableVal | metaArgs[key] = argTableVal | ||
return argTableVal | return argTableVal | ||
end | end | ||
end | end | ||
return nil | return nil | ||
end | end | ||
Zeile 265: | Zeile 232: | ||
-- This function is called when a module tries to add a new value to the | -- This function is called when a module tries to add a new value to the | ||
-- args table, or tries to change an existing value. | -- args table, or tries to change an existing value. | ||
if options.readOnly then | if options.readOnly then | ||
error( | error( | ||
Zeile 291: | Zeile 255: | ||
--]] | --]] | ||
metaArgs[key] = nil | metaArgs[key] = nil | ||
nilArgs[key] = | nilArgs[key] = true | ||
else | else | ||
metaArgs[key] = val | metaArgs[key] = val | ||
end | end | ||
end | end | ||
Zeile 318: | Zeile 264: | ||
-- Called when pairs is run on the args table. | -- Called when pairs is run on the args table. | ||
if not metatable.donePairs then | if not metatable.donePairs then | ||
mergeArgs(argTables) | mergeArgs(pairs, argTables) | ||
metatable.donePairs = true | metatable.donePairs = true | ||
metatable.doneIpairs = true | |||
end | end | ||
return | return pairs(metaArgs) | ||
end | end | ||
metatable.__ipairs = function () | |||
-- | -- Called when ipairs is run on the args table. | ||
if not metatable.doneIpairs then | |||
if | mergeArgs(ipairs, argTables) | ||
metatable.doneIpairs = true | |||
end | end | ||
return ipairs(metaArgs) | |||
end | end | ||