Module:Args
Want an adless experience? Log in or Create an account.
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 = Arg.new() local templateContents = string.match( content, '{{%s*' .. templateName .. '%s*|%s*(.-)%s*}}' ) if templateContents then for prop in mw.text.gsplit( templateContents, '|' ) do local k, v = unpack( mw.text.split( prop, '=' ) ) insertInto( parsedArgs, k, v ) end end return parsedArgs end return p