Module:Args: Difference between revisions

Want an adless experience? Log in or Create an account.
support value and table collisions in 'expand'; add fromFrame function
(change fromPageContent to use expandInto instead of parseInto, and trim whitespace from key and value)
(support value and table collisions in 'expand'; add fromFrame function)
Line 11: Line 11:
function Arg:val()
function Arg:val()
   return self.__value
   return self.__value
end
-- get the value at the given key of this Arg node
function Arg:get( key )
  return self[key] and self[key]:val()
end
end


Line 52: Line 57:
end
end


-- place the value in the right spot in the arg tree, determined by underscores in the key
function p.expandInto( args, key, value )
function p.expandInto( args, key, value )
   local first, rest = string.match( key, '^(.-)_(.*)$' )
   local first, rest = string.match( key, '^(.-)_(.*)$' )
Line 58: Line 64:


   if first then -- this is an internal node so insert children
   if first then -- this is an internal node so insert children
    -- note this will overwrite values in the case of { arg = 'val', arg_sub = 'val' }
     args[myKey] = type( args[myKey] ) == 'table' and args[myKey] -- already a table
     args[myKey] = type( args[myKey] ) == 'table' and args[myKey] or {}
      or args[myKey] and { __value = args[myKey] } -- move existing value into a new table
      or {} -- create new table
     p.expandInto( args[myKey], rest, value )
     p.expandInto( args[myKey], rest, value )
   else -- this is a leaf so set value
   else -- this is a leaf so set value
     args[myKey] = args[myKey] or value -- don't overwrite a table
     if type( args[myKey] ) == 'table' then args[myKey].__value = value
    else args[myKey] = value
    end
   end
   end
end
end


-- expand the arg tree for the given flattened args
function p.expand( args )
function p.expand( args )
   local expandedArgs = {}
   local expandedArgs = {}
Line 75: Line 85:
end
end


-- get the value at the given node, in case the node contains a table
function p.getValue( val )
  return type( val ) == 'table' and val.__value or val
end
-- expand the arg tree from the given frame and its parent
function p.fromFrame( frame )
  local parsedArgs = Arg.new()
  for k, v in pairs( frame.args ) do
    p.expandInto( parsedArgs, k, v )
  end
  local parentFrame = frame:getParent()
  if parentFrame and parentFrame.args then
    for k, v in pairs (parentFrame.args ) do
      p.expandInto( parsedArgs, k, v )
    end
  end
  return parsedArgs
end
-- parse and expand the arg tree for the given template on the given page
function p.fromPageContent( content, templateName )
function p.fromPageContent( content, templateName )
   templateName = templateName or 'Properties'
   templateName = templateName or 'Properties'