Module:ProcessArgs

local p = {}

local function trim( origArgs, keepEmptyArgs ) local keepEmptyArgs = keepEmptyArgs or false local args = {} for k, v in pairs( origArgs ) do		v = mw.text.trim( tostring( v ) ) if v ~= '' or keepEmptyArgs then args[k] = v		end end return args end

-- If default is set to true (p.normDefault), the args will default to the current -- frame's args if the parent frame is nil or its args are empty. -- If "fromThis" is set, will use this frame's args regardless. -- -- If default is set to false (p.norm), the parent frame args will always be used -- or return an empty table if they do not exist. local function norm( origArgs, default, keepEmptyArgs ) if type( origArgs ) ~= 'table' or origArgs == mw.getCurrentFrame then local frame = mw.getCurrentFrame local parent = frame:getParent local normedParent = {} if parent ~= nil then -- A frame's arg table can never be nil since it is a metatable! -- trim also always at least returns an empty table normedParent = trim( parent.args, keepEmptyArgs ) end if not default then -- p.norm functionality return normedParent end -- Table is empty if this is nil if next( normedParent ) == nil or frame.args.fromThis then return trim( frame.args, keepEmptyArgs ) -- normedCurrent else return normedParent end end return trim( origArgs, keepEmptyArgs ) end

function p.norm( origArgs ) return norm( origArgs, false, false ) end

function p.normDefault( origArgs, keepEmptyArgs ) return norm( origArgs, true, keepEmptyArgs or false ) end

-- This method uses the current frame's args (from #invoke), -- unless fromParent is set, then uses the parent frame's args. -- fromParent should only be set in a template wrapper function p.fromParent( origArgs ) local args if type( origArgs ) ~= 'table' or origArgs == mw.getCurrentFrame then -- Normalize to make sure arg fromParent is non-empty if it exists args = trim( mw.getCurrentFrame.args, false ) if args.fromParent then args = trim( mw.getCurrentFrame:getParent.args, false ) end else args = trim( origArgs, false ) end -- This will always return a table normalized from norm return args end

function p.merge( origArgs, parentArgs, norm ) if type( origArgs ) ~= 'table' then norm = origArgs local f = mw.getCurrentFrame origArgs = f.args parentArgs = f:getParent.args end local args = {} for k, v in pairs( origArgs ) do		v = mw.text.trim( tostring( v ) ) if not norm or norm and v ~= '' then args[k] = v		end end for k, v in pairs( parentArgs ) do		v = mw.text.trim( v ) if ( not norm or norm and v ~= '' ) and not args[k] then args[k] = v		end end return args end

return p