diff --git a/pwiki/page.js b/pwiki/page.js index 40bd933..d94e86f 100755 --- a/pwiki/page.js +++ b/pwiki/page.js @@ -1325,30 +1325,8 @@ object.Constructor('Page', BasePage, { ['strict', 'nonstrict', 'isolated', 'unisolated']], async function*(args, body, state){ var that = this - var name = args.name //?? args[0] - var src = args.src - var base = this.get(this.path.split(/\*/).shift()) - var sort = (args.sort ?? '') - .split(/\s+/g) - .filter(function(e){ - return e != '' }) - // NOTE: args.text will need parsing... - var text = args.text - ?? body - ?? [] - text = typeof(text) == 'string' ? - [...this.__parser__.group(this, text+'', 'macro')] - : text - var strict = args.strict - && !args.nonstrict - var isolated = args.isolated - || !args.unisolated - var join - - var depends = state.depends = - state.depends - ?? new Set() + // helpers... var _getBlock = function(name){ var block = args[name] ? [{ @@ -1369,18 +1347,66 @@ object.Constructor('Page', BasePage, { ?? block.body return block } - if(name){ - name = await base.parse(name, state) + var base = this.get(this.path.split(/\*/).shift()) + + var depends = state.depends = + state.depends + ?? new Set() + + // uninheritable args... + // NOTE: arg handling is split in two, to make things simpler + // to process for retrieved named macros... + var src = args.src + var text = args.text + ?? body + ?? [] + text = typeof(text) == 'string' ? + [...this.__parser__.group(this, text+'', 'macro')] + : text + var join + var iargs = {} + + // stored macros... + if(args.name){ + var name = await base.parse(args.name, state) // define new named macro... if(text.length != 0){ // NOTE: we do not need to worry about saving // stateful text here because it is only // grouped and not expanded... - ;(state.macros = state.macros ?? {})[name] = [text, _getBlock('join')] + ;(state.macros = state.macros ?? {})[name] = + // XXX should we store all the args??? + [text, _getBlock('join'), JSON.parse(JSON.stringify(args))] // use existing macro... } else if(state.macros && name in state.macros){ - [text, join] = state.macros[name] } } + ;[itext, join, iargs] = state.macros[name] } } + + // XXX is there a point in overloading text??? + text = text.length > 0 ? + text + : itext + // inheritable args... + var sort = (args.sort + ?? iargs.sort + ?? '') + .split(/\s+/g) + .filter(function(e){ + return e != '' }) + // default is false... + var strict = + ('strict' in args || 'nonstrict' in args) ? + args.strict + && !args.nonstrict + : iargs.strict + && !iargs.nonstrict + // default is true... + var isolated = + ('isolated' in args || 'unisolated' in args) ? + args.isolated + || !args.unisolated + : iargs.isolated + || !iargs.unisolated if(src){ src = await base.parse(src, state) diff --git a/pwiki2.js b/pwiki2.js index 30f0929..f6b20f5 100755 --- a/pwiki2.js +++ b/pwiki2.js @@ -18,11 +18,11 @@ * - CLI - * * -* XXX MACRO: should 's isolated be on by default??? -* ...do we need to isolate named macros too??? -* ...should this isolation be one-directional??? -* ...i.e. iterations see/overload things defined above but -* can not affect the above context... +* XXX macro: bug: see /NamedMacroTest... +* XXX macro: should isolated and other args be inherited??? +* XXX macro: should macro isolation be one-directional??? +* ...i.e. iterations see/overload things defined above but +* can not affect the above context... * XXX STYLE: should style loading be done via the event mechanics * (see: pwiki2.html) or via the base templates (see: pwiki/page.js:_view * template)???