17,230
edits
(change fromPageContent to use expandInto instead of parseInto, and trim whitespace from key and value) |
(remove the Arg class) |
||
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
function | -- place the value in the right spot in the arg tree, determined by underscores in the key | ||
function p.expandInto( args, key, value ) | |||
local first, rest = string.match( key, '^(.-)_(.*)$' ) | local first, rest = string.match( key, '^(.-)_(.*)$' ) | ||
local myKey = first or key | local myKey = first or key | ||
myKey = tonumber( myKey ) or myKey | myKey = tonumber( myKey ) or myKey | ||
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 | |||
or args[myKey] and { __value = args[myKey] } -- move existing value into a new table | |||
or {} -- create new table | |||
p.expandInto( args[myKey], rest, value ) | |||
else -- this is a leaf so set value | else -- this is a leaf so set value | ||
if type( args[myKey] ) == 'table' then args[myKey].__value = value | |||
else args[myKey] = value | |||
end | |||
end | end | ||
end | end | ||
function p. | -- expand the arg tree for the given flattened args | ||
local | function p.expand( args ) | ||
local expandedArgs = {} | |||
for k, v in pairs( args ) do | for k, v in pairs( args ) do | ||
p.expandInto( expandedArgs, k, v ) | |||
end | end | ||
return | return expandedArgs | ||
end | |||
-- coerce the given node into a table, in case it is a standalone value | |||
function p.getTable( val ) | |||
return type( val ) == 'table' and val or { __value = val } | |||
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 | end | ||
function p. | -- expand the arg tree from the given frame and its parent | ||
function p.fromFrame( frame ) | |||
local | local parsedArgs = {} | ||
for k, v in pairs( frame.args ) do | |||
p.expandInto( parsedArgs, k, v ) | |||
p.expandInto( | |||
end | 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 | end | ||
return | return parsedArgs | ||
end | 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' |