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 an alternative method ("expand") that isn't so convoluted to work with but is slightly more limited. still looking for better ways of doing this)
(change fromPageContent to use expandInto instead of parseInto, and trim whitespace from key and value)
Line 77: Line 77:
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

Revision as of 06:45, June 26, 2020

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

local Arg = {}
Arg.__index = Arg

function Arg.new( value )
  return setmetatable( {
    __value = value
  }, Arg )
end

-- get the Arg node's value, if it has one
function Arg:val()
  return self.__value
end

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

  return vals
end

local p = {}

function insertInto( tbl, key, value )
  local first, rest = string.match( key, '^(.-)_(.*)$' )
  local myKey = first or key
  myKey = tonumber( myKey ) or myKey

  -- make sure the node exists
  if not tbl[myKey] then tbl[myKey] = Arg.new() end

  if first then -- this is an internal node so insert children
    insertInto( tbl[myKey], rest, value )
  else -- this is a leaf so set value
    tbl[myKey].__value = value
  end
end

function p.parse( args )
  local parsedArgs = Arg.new()
  for k, v in pairs( args ) do
    insertInto( parsedArgs, k, v )
  end

  return parsedArgs
end

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
    -- note this will overwrite values in the case of { arg = 'val', arg_sub = 'val' }
    args[myKey] = type( args[myKey] ) == 'table' and args[myKey] or {}
    p.expandInto( args[myKey], rest, value )
  else -- this is a leaf so set value
    args[myKey] = args[myKey] or value -- don't overwrite a table
  end
end

function p.expand( args )
  local expandedArgs = {}
  for k, v in pairs( args ) do
    p.expandInto( expandedArgs, k, v )
  end

  return expandedArgs
end

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