diff --git a/pwiki/page.js b/pwiki/page.js index 42bb2ee..21ace0d 100755 --- a/pwiki/page.js +++ b/pwiki/page.js @@ -845,8 +845,8 @@ object.Constructor('Page', BasePage, { key = key ?? 'included' } var base = this.get(this.path.split(/\*/).shift()) var src = args.src - //&& await base.parse(args.src, state) - && this.resolvePathVars(await base.parse(args.src, state)) + && this.resolvePathVars( + await base.parse(args.src, state)) if(!src){ return } var recursive = args.recursive ?? body @@ -884,7 +884,6 @@ object.Constructor('Page', BasePage, { var parent_seen = 'seen' in state var seen = state.seen = new Set(state.seen ?? []) - // recursion detected... if(seen.has(full) // nesting path recursion... || (full.length % (this.NESTING_RECURSION_TEST_THRESHOLD || 50) == 0 @@ -1384,13 +1383,21 @@ object.Constructor('Page', BasePage, { // actions... // // XXX revise name... + // XXX NOEXPANDACTION + asPages: async function*(path='.:$ARGS', strict=false){ + /*/ asPages: async function*(path='.:$ARGS', strict=false, noexpandactions=false){ + //*/ // options... var args = [...arguments] var opts = typeof(args.at(-1)) == 'object' ? args.pop() : {} + // XXX NOEXPANDACTION + var {path, strict} = { + /*/ var {path, strict, noexpandactions} = { + //*/ ...opts, path: typeof(args[0]) == 'string' ? args.shift() @@ -1400,8 +1407,27 @@ object.Constructor('Page', BasePage, { } var page = this.get(path, strict) + // each... + if(page.isPattern){ + yield* page // handle lists in pages (actions, ... etc.)... - if(!page.isPattern){ + } else { + // XXX NOEXPANDACTION + var data = await page.data + data = typeof(data) == 'function' ? + data + : 'text' in data ? + data.text + : null + if(data instanceof Array + || data instanceof types.Generator){ + yield* data + .map(function(p){ + return page.virtual({text: p}) }) + return } + + yield page } }, + /*/ if(noexpandactions && await page.type == 'action'){ //yield this.get(this.QUOTE_ACTION_PAGE) @@ -1414,10 +1440,8 @@ object.Constructor('Page', BasePage, { raw .map(function(p){ return page.virtual({text: p}) }) - : [page] - // each... - } else { - yield* page } }, + : [page] } }, + //*/ // expanded page text... // @@ -2002,9 +2026,14 @@ module.System = { var Test = module.Test = { - 'list/action': function(){ - return [...'abcdef'] }, - 'list/statuc': { + // XXX do we support this??? + //'list/action': function(){ + // return [...'abcdef'] }, + // XXX BUG CHROME: this hangs under chrome... + // (see: pwiki2.js) + 'list/generator': function*(){ + yield* [...'abcdef'] }, + 'list/static': { text: [...'abcdef'] }, slots: { diff --git a/pwiki2.js b/pwiki2.js index 1b6f892..7bd46a2 100755 --- a/pwiki2.js +++ b/pwiki2.js @@ -1,10 +1,9 @@ /********************************************************************** * * -* XXX BUG?: the action is called twice here: -* await pwiki.get('/path/testDirect:x:y:z').parse('@include(.:$ARGS)') -* and: -* await pwiki.get('/path/testDirect:x:y:z').text +* XXX add support for generator actions... +* XXX BUG CHROME: can't .get(..) a generator... +* https://bugs.chromium.org/p/chromium/issues/detail?id=1361981 * XXX CACHE need to explicitly prevent caching of some actions/pages... * XXX FEATURE tags and accompanying API... * - add tags to page -- macro/filter