Module:Args: Difference between revisions
Jump to navigation
Jump to search
Want an adless experience? Log in or Create an account.
(don't try to parse values to numbers because a module might be expecting a string and the input just happens to be a number) |
(add fromPageContent function to parse args in template format on raw page text) |
||
Line 47: | Line 47: | ||
for k, v in pairs( args ) do | for k, v in pairs( args ) do | ||
insertInto( parsedArgs, k, v ) | insertInto( parsedArgs, k, v ) | ||
end | |||
return parsedArgs | |||
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 | end | ||
Revision as of 04:41, 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.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