Module:Args: Difference between revisions
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) |
(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) |
||
Line 50: | Line 50: | ||
return parsedArgs | 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 | end | ||
Revision as of 06:15, 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 = 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