Module:Args: Difference between revisions
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 = | 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*' ) ) | ||
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