From ed02987dc95ebbb5ac4e0449f4c5249fd3fbdbd9 Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Sat, 23 Sep 2023 17:21:36 +0300 Subject: [PATCH] refactoring... Signed-off-by: Alex A. Naanou --- v2/pwiki/parser.js | 71 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/v2/pwiki/parser.js b/v2/pwiki/parser.js index ff5b5dc..e8198bc 100755 --- a/v2/pwiki/parser.js +++ b/v2/pwiki/parser.js @@ -9,6 +9,10 @@ var types = require('ig-types') +var pwpath = require('./path') + + + //--------------------------------------------------------------------- @@ -343,9 +347,7 @@ module.BaseParser = { yield str } macro = true } } }, - // XXX move macros here from page.js... - macros: { - }, + macros: undefined, // Group block elements (generator)... // @@ -652,9 +654,72 @@ module.BaseParser = { .join('') }, } + +// XXX do we need anything else like .doc, attrs??? +// XXX might be a good idea to offload arg value parsing to here... +var Macro = +module.Macro = +function(spec, func){ + var args = [...arguments] + // function... + func = args.pop() + // arg sepc... + ;(args.length > 0 + && args[args.length-1] instanceof Array) + && (func.arg_spec = args.pop()) + return func } + + var parser = module.parser = { __proto__: BaseParser, + + // list of macros that will get raw text of their content... + QUOTING_MACROS: ['quote'], + + // XXX move macros here from page.js... + macros: { + // + // @([ ][ local]) + // @(name=[ else=][ local]) + // + // @arg([ ][ local]) + // @arg(name=[ else=][ local]) + // + // [ ][ local]/> + // [ else=][ local]/> + // + // Resolution order: + // - local + // - .renderer + // - .root + // + // NOTE: else (default) value is parsed when accessed... + arg: Macro( + ['name', 'else', ['local']], + function(args){ + var v = this.args[args.name] + || (!args.local + && (this.renderer + && this.renderer.args[args.name]) + || (this.root + && this.root.args[args.name])) + v = v === true ? + args.name + : v + return v + || (args['else'] + && this.parse(args['else'])) }), + '': Macro( + ['name', 'else', ['local']], + function(args){ + return this.macros.arg.call(this, args) }), + args: function(){ + return pwpath.obj2args(this.args) }, + + // XXX + }, + }