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) |
(remove the Arg class) |
||
(4 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
local | 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 myKey = first or key | |||
myKey = tonumber( myKey ) or myKey | |||
-- | 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 | |||
if type( args[myKey] ) == 'table' then args[myKey].__value = value | |||
else args[myKey] = value | |||
end | |||
end | |||
end | end | ||
-- | -- expand the arg tree for the given flattened args | ||
function p.expand( args ) | |||
function | local expandedArgs = {} | ||
local | for k, v in pairs( args ) do | ||
for k, v in pairs( | p.expandInto( expandedArgs, k, v ) | ||
end | end | ||
return | return expandedArgs | ||
end | 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 | |||
function | -- 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 = {} | |||
for k, v in pairs( frame.args ) do | |||
p.expandInto( parsedArgs, k, v ) | |||
end | end | ||
local parentFrame = frame:getParent() | |||
local | if parentFrame and parentFrame.args then | ||
for k, v in pairs( args ) do | for k, v in pairs (parentFrame.args ) do | ||
p.expandInto( parsedArgs, k, v ) | |||
end | |||
end | end | ||
Line 52: | Line 57: | ||
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' | ||
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 |
Latest revision as of 16:51, June 27, 2020
Documentation for this module may be created at Module:Args/doc
local p = {} -- 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 myKey = first or key myKey = tonumber( myKey ) or myKey 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 if type( args[myKey] ) == 'table' then args[myKey].__value = value else args[myKey] = value end end end -- expand the arg tree for the given flattened args function p.expand( args ) local expandedArgs = {} for k, v in pairs( args ) do p.expandInto( expandedArgs, k, v ) end 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 -- expand the arg tree from the given frame and its parent function p.fromFrame( frame ) local parsedArgs = {} 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 ) 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