Module:Args: Difference between revisions

From Zelda Dungeon Wiki
Jump to navigation Jump to search
Want an adless experience? Log in or Create an account.
(add fromPageContent function to parse args in template format on raw page text)
(remove the Arg class)
 
(4 intermediate revisions by the same user not shown)
Line 1: Line 1:
local Arg = {}
local p = {}
Arg.__index = Arg


function Arg.new( value )
-- place the value in the right spot in the arg tree, determined by underscores in the key
   return setmetatable( {
function p.expandInto( args, key, value )
    __value = value
   local first, rest = string.match( key, '^(.-)_(.*)$' )
   }, Arg )
  local myKey = first or key
end
   myKey = tonumber( myKey ) or myKey


-- get the Arg node's value, if it has one
  if first then -- this is an internal node so insert children
function Arg:val()
    args[myKey] = type( args[myKey] ) == 'table' and args[myKey] -- already a table
   return self.__value
      or args[myKey] and { __value = args[myKey] } -- move existing value into a new table
      or {} -- create new table
    p.expandInto( args[myKey], rest, value )
   else -- this is a leaf so set value
    if type( args[myKey] ) == 'table' then args[myKey].__value = value
    else args[myKey] = value
    end
  end
end
end


-- get the values of the Arg node's direct children
-- expand the arg tree for the given flattened args
-- this is used to re-flatten/unwrap a particular piece of an Arg tree
function p.expand( args )
function Arg:values()
   local expandedArgs = {}
   local vals = {}
   for k, v in pairs( args ) do
   for k, v in pairs( self ) do
     p.expandInto( expandedArgs, k, v )
     if type( v ) == 'table' and v.val then
      vals[k] = v:val()
    end
   end
   end


   return vals
   return expandedArgs
end
end


local p = {}
-- coerce the given node into a table, in case it is a standalone value
function p.getTable( val )
  return type( val ) == 'table' and val or { __value = val }
end


function insertInto( tbl, key, value )
-- get the value at the given node, in case the node contains a table
   local first, rest = string.match( key, '^(.-)_(.*)$' )
function p.getValue( val )
  local myKey = first or key
   return type( val ) == 'table' and val.__value or val
  myKey = tonumber( myKey ) or myKey
end


  -- make sure the node exists
-- expand the arg tree from the given frame and its parent
  if not tbl[myKey] then tbl[myKey] = Arg.new() end
function p.fromFrame( frame )
  local parsedArgs = {}


   if first then -- this is an internal node so insert children
   for k, v in pairs( frame.args ) do
     insertInto( tbl[myKey], rest, value )
     p.expandInto( parsedArgs, k, v )
  else -- this is a leaf so set value
    tbl[myKey].__value = value
   end
   end
end


function p.parse( args )
   local parentFrame = frame:getParent()
   local parsedArgs = Arg.new()
   if parentFrame and parentFrame.args then
   for k, v in pairs( args ) do
    for k, v in pairs (parentFrame.args ) do
    insertInto( parsedArgs, k, v )
      p.expandInto( parsedArgs, k, v )
    end
   end
   end


Line 52: Line 57:
end
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'
   local parsedArgs = Arg.new()
   local parsedArgs = {}


   local templateContents = string.match( content, '{{%s*' .. templateName .. '%s*|%s*(.-)%s*}}' )
   local templateContents = string.match( content, '{{%s*' .. templateName .. '%s*|%s*(.-)%s*}}' )


   if templateContents then
   if templateContents then
     for prop in mw.text.gsplit( templateContents, '|' ) do
     for prop in mw.text.gsplit( templateContents, '%s*|%s*' ) do
       local k, v = unpack( mw.text.split( prop, '=' ) )
       local k, v = unpack( mw.text.split( prop, '%s*=%s*' ) )
       insertInto( parsedArgs, k, v )
       p.expandInto( parsedArgs, k, v )
     end
     end
   end
   end

Latest revision as of 16:51, June 27, 2020

Documentation for this module may be created at Module:Args/doc

local p = {}

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

  if first then -- this is an internal node so insert children
    args[myKey] = type( args[myKey] ) == 'table' and args[myKey] -- already a table
      or args[myKey] and { __value = args[myKey] } -- move existing value into a new table
      or {} -- create new table
    p.expandInto( args[myKey], rest, value )
  else -- this is a leaf so set value
    if type( args[myKey] ) == 'table' then args[myKey].__value = value
    else args[myKey] = value
    end
  end
end

-- expand the arg tree for the given flattened args
function p.expand( args )
  local expandedArgs = {}
  for k, v in pairs( args ) do
    p.expandInto( expandedArgs, k, v )
  end

  return expandedArgs
end

-- coerce the given node into a table, in case it is a standalone value
function p.getTable( val )
  return type( val ) == 'table' and val or { __value = val }
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 = {}

  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 )
  templateName = templateName or 'Properties'
  local parsedArgs = {}

  local templateContents = string.match( content, '{{%s*' .. templateName .. '%s*|%s*(.-)%s*}}' )

  if templateContents then
    for prop in mw.text.gsplit( templateContents, '%s*|%s*' ) do
      local k, v = unpack( mw.text.split( prop, '%s*=%s*' ) )
      p.expandInto( parsedArgs, k, v )
    end
  end

  return parsedArgs
end

return p