17,273
edits
(change fromPageContent to use expandInto instead of parseInto, and trim whitespace from key and value) |
(support value and table collisions in 'expand'; add fromFrame function) |
||
Line 11: | Line 11: | ||
function Arg:val() | function Arg:val() | ||
return self.__value | return self.__value | ||
end | |||
-- get the value at the given key of this Arg node | |||
function Arg:get( key ) | |||
return self[key] and self[key]:val() | |||
end | end | ||
Line 52: | Line 57: | ||
end | end | ||
-- place the value in the right spot in the arg tree, determined by underscores in the key | |||
function p.expandInto( args, key, value ) | function p.expandInto( args, key, value ) | ||
local first, rest = string.match( key, '^(.-)_(.*)$' ) | local first, rest = string.match( key, '^(.-)_(.*)$' ) | ||
Line 58: | Line 64: | ||
if first then -- this is an internal node so insert children | if first then -- this is an internal node so insert children | ||
args[myKey] = type( args[myKey] ) == 'table' and args[myKey] -- already a table | |||
args[myKey] = type( args[myKey] ) == 'table' and args[myKey] or {} | or args[myKey] and { __value = args[myKey] } -- move existing value into a new table | ||
or {} -- create new table | |||
p.expandInto( args[myKey], rest, value ) | p.expandInto( args[myKey], rest, value ) | ||
else -- this is a leaf so set value | else -- this is a leaf so set value | ||
args[myKey] = args[myKey] | if type( args[myKey] ) == 'table' then args[myKey].__value = value | ||
else args[myKey] = value | |||
end | |||
end | end | ||
end | end | ||
-- expand the arg tree for the given flattened args | |||
function p.expand( args ) | function p.expand( args ) | ||
local expandedArgs = {} | local expandedArgs = {} | ||
Line 75: | Line 85: | ||
end | 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 = Arg.new() | |||
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 ) | function p.fromPageContent( content, templateName ) | ||
templateName = templateName or 'Properties' | templateName = templateName or 'Properties' |