mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-10-31 19:10:08 +00:00 
			
		
		
		
	made the parser async -- quite ugly, needs a rethink...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									f0c217ef4b
								
							
						
					
					
						commit
						9a1324e544
					
				
							
								
								
									
										168
									
								
								pwiki2.js
									
									
									
									
									
								
							
							
						
						
									
										168
									
								
								pwiki2.js
									
									
									
									
									
								
							| @ -405,7 +405,8 @@ module.BaseStore = { | |||||||
| 		path = await this.resolve(path, strict) | 		path = await this.resolve(path, strict) | ||||||
| 		return path instanceof Array ? | 		return path instanceof Array ? | ||||||
| 			// XXX should we return matched paths???
 | 			// XXX should we return matched paths???
 | ||||||
|    			path.map(function(p){ |    			Promise.iter(path) | ||||||
|  | 				.map(function(p){ | ||||||
| 					// NOTE: p can match a non existing page at this point, 
 | 					// NOTE: p can match a non existing page at this point, 
 | ||||||
| 					// 		this can be the result of matching a/* in a a/b/c
 | 					// 		this can be the result of matching a/* in a a/b/c
 | ||||||
| 					// 		and returning a a/b which can be undefined...
 | 					// 		and returning a a/b which can be undefined...
 | ||||||
| @ -533,7 +534,6 @@ function(meth, drop_cache=false, post){ | |||||||
| 			//: this.data[store][meth](path.slice(store.length), ...args) 
 | 			//: this.data[store][meth](path.slice(store.length), ...args) 
 | ||||||
| 			: this.data[store][target](path.slice(store.length), ...args)  | 			: this.data[store][target](path.slice(store.length), ...args)  | ||||||
| 
 | 
 | ||||||
| 		//console.log('---', path, target, '(', store, ...args, ') ->', res)
 |  | ||||||
| 		if(drop_cache){ | 		if(drop_cache){ | ||||||
| 			delete this.__substores } | 			delete this.__substores } | ||||||
| 		post  | 		post  | ||||||
| @ -617,7 +617,7 @@ module.localStorageStore = { | |||||||
| 			localStorage | 			localStorage | ||||||
| 			: undefined, | 			: undefined, | ||||||
| 	 | 	 | ||||||
| 	__paths__: async function(){ | 	__paths__: function(){ | ||||||
| 		var that = this | 		var that = this | ||||||
| 		return Object.keys(this.data) | 		return Object.keys(this.data) | ||||||
| 			.map(function(k){  | 			.map(function(k){  | ||||||
| @ -625,22 +625,22 @@ module.localStorageStore = { | |||||||
| 					k.slice((that.__prefix__ ?? '').length)  | 					k.slice((that.__prefix__ ?? '').length)  | ||||||
| 					: [] })  | 					: [] })  | ||||||
| 			.flat() }, | 			.flat() }, | ||||||
| 	__exists__: async function(path){ | 	__exists__: function(path){ | ||||||
| 		return ((this.__prefix__ ?? '')+ path) in this.data  | 		return ((this.__prefix__ ?? '')+ path) in this.data  | ||||||
| 			&& path }, | 			&& path }, | ||||||
| 	__get__: async function(path){ | 	__get__: function(path){ | ||||||
| 		path = (this.__prefix__ ?? '')+ path | 		path = (this.__prefix__ ?? '')+ path | ||||||
| 		return path in this.data ? | 		return path in this.data ? | ||||||
| 			JSON.parse(this.data[path])  | 			JSON.parse(this.data[path])  | ||||||
| 			: undefined }, | 			: undefined }, | ||||||
| 	__update__: async function(path, data={}){ | 	__update__: function(path, data={}){ | ||||||
| 		this.data[(this.__prefix__ ?? '')+ path] =  | 		this.data[(this.__prefix__ ?? '')+ path] =  | ||||||
| 			JSON.stringify(data) }, | 			JSON.stringify(data) }, | ||||||
| 	__delete__: async function(path){ | 	__delete__: function(path){ | ||||||
| 		delete this.data[(this.__prefix__ ?? '')+ path] }, | 		delete this.data[(this.__prefix__ ?? '')+ path] }, | ||||||
| 
 | 
 | ||||||
| 	// XXX 
 | 	// XXX 
 | ||||||
| 	load: async function(){ | 	load: function(){ | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -720,8 +720,10 @@ module.FileStore = { | |||||||
| 		// XXX
 | 		// XXX
 | ||||||
| 	}, | 	}, | ||||||
| 	load: function(data){ | 	load: function(data){ | ||||||
|  | 		// XXX
 | ||||||
| 	}, | 	}, | ||||||
| 	json: function(asstring=false){ | 	json: function(asstring=false){ | ||||||
|  | 		// XXX
 | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -970,9 +972,9 @@ object.Constructor('BasePage', { | |||||||
| 	//
 | 	//
 | ||||||
| 	// XXX we are only doing modifiers here...
 | 	// XXX we are only doing modifiers here...
 | ||||||
| 	// 		...these ar mainly used to disable writing in .ro(..)
 | 	// 		...these ar mainly used to disable writing in .ro(..)
 | ||||||
| 	__update__: async function(data){ | 	__update__: function(data){ | ||||||
| 		return this.store.update(this.location, data) }, | 		return this.store.update(this.location, data) }, | ||||||
| 	__delete__: async function(path='.'){ | 	__delete__: function(path='.'){ | ||||||
| 		return this.store.delete(module.path.relative(this.location, path)) }, | 		return this.store.delete(module.path.relative(this.location, path)) }, | ||||||
| 
 | 
 | ||||||
| 	// page data...
 | 	// page data...
 | ||||||
| @ -1004,10 +1006,16 @@ object.Constructor('BasePage', { | |||||||
| 		this.__update__(value) }, | 		this.__update__(value) }, | ||||||
| 
 | 
 | ||||||
| 	// number of matching pages...
 | 	// number of matching pages...
 | ||||||
|  | 	// NOTE: this can be both sync and async...
 | ||||||
| 	get length(){ | 	get length(){ | ||||||
| 		var p = this.resolve(this.location) | 		var p = this.resolve(this.location) | ||||||
| 		return p instanceof Array ? | 		return p instanceof Array ? | ||||||
| 				p.length | 				p.length | ||||||
|  | 			: p instanceof Promise ? | ||||||
|  | 				p.then(function(res){ | ||||||
|  | 					return res instanceof Array ? | ||||||
|  | 						res.length | ||||||
|  | 						: 1 }) | ||||||
| 			: 1 }, | 			: 1 }, | ||||||
| 
 | 
 | ||||||
| 	// relative proxies to store...
 | 	// relative proxies to store...
 | ||||||
| @ -1016,8 +1024,6 @@ object.Constructor('BasePage', { | |||||||
| 	match: relMatchProxy('match'),  | 	match: relMatchProxy('match'),  | ||||||
| 	resolve: relMatchProxy('resolve'), | 	resolve: relMatchProxy('resolve'), | ||||||
| 	delete: function(path='.'){ | 	delete: function(path='.'){ | ||||||
| 		//this.store.delete(module.path.relative(this.location, path))
 |  | ||||||
| 		//return this },
 |  | ||||||
| 		return this.__delete__() }, | 		return this.__delete__() }, | ||||||
| 
 | 
 | ||||||
| 	//
 | 	//
 | ||||||
| @ -1051,6 +1057,8 @@ object.Constructor('BasePage', { | |||||||
| 			: path | 			: path | ||||||
| 		paths = paths instanceof Array ?  | 		paths = paths instanceof Array ?  | ||||||
| 				paths  | 				paths  | ||||||
|  | 			: paths instanceof Promise ? | ||||||
|  | 				paths.iter() | ||||||
| 			: [paths] | 			: [paths] | ||||||
| 		return paths | 		return paths | ||||||
| 			.map(function(path){ | 			.map(function(path){ | ||||||
| @ -1066,22 +1074,22 @@ object.Constructor('BasePage', { | |||||||
| 	// sorting...
 | 	// sorting...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// XXX should this be page-level (current) store level???
 | 	// XXX should this be page-level (current) store level???
 | ||||||
| 	sort: function(cmp){ | 	// XXX when this is async, should this return a promise????
 | ||||||
|  | 	sort: async function(cmp){ | ||||||
| 		// not sorting single pages...
 | 		// not sorting single pages...
 | ||||||
| 		if(this.length <= 1){ | 		if(this.length <= 1){ | ||||||
| 			return this } | 			return this } | ||||||
| 		// sort...
 | 		// sort...
 | ||||||
| 		this.metadata =  | 		this.metadata = { order: await this.each() | ||||||
| 			{ order: this.each() |  | ||||||
| 			.sort(...arguments) | 			.sort(...arguments) | ||||||
| 			.map(function(p){ | 			.map(function(p){ | ||||||
| 				return p.path }) } | 				return p.path }) } | ||||||
| 		return this }, | 		return this }, | ||||||
| 	reverse: function(){ | 	reverse: async function(){ | ||||||
| 		// not sorting single pages...
 | 		// not sorting single pages...
 | ||||||
| 		if(this.length <= 1){ | 		if(this.length <= 1){ | ||||||
| 			return this } | 			return this } | ||||||
| 		this.metadata = { order: this.match().reverse() } | 		this.metadata = { order: (await this.match()).reverse() } | ||||||
| 		return this }, | 		return this }, | ||||||
| 
 | 
 | ||||||
| 	//
 | 	//
 | ||||||
| @ -1196,6 +1204,7 @@ object.Constructor('BasePage', { | |||||||
| 	// XXX how should this work on multiple pages...
 | 	// XXX how should this work on multiple pages...
 | ||||||
| 	// 		...right now this will write what-ever is given, even if it
 | 	// 		...right now this will write what-ever is given, even if it
 | ||||||
| 	// 		will never be explicitly be accessible...
 | 	// 		will never be explicitly be accessible...
 | ||||||
|  | 	// XXX sync/async???
 | ||||||
| 	update: function(...data){ | 	update: function(...data){ | ||||||
| 		return Object.assign(this, ...data) }, | 		return Object.assign(this, ...data) }, | ||||||
| 
 | 
 | ||||||
| @ -1409,8 +1418,8 @@ module.BaseParser = { | |||||||
| 	//
 | 	//
 | ||||||
| 	// NOTE: this internally uses macros' keys to generate the lexing pattern.
 | 	// NOTE: this internally uses macros' keys to generate the lexing pattern.
 | ||||||
| 	lex: function*(page, str){ | 	lex: function*(page, str){ | ||||||
| 		str = str  | 		//str = str 
 | ||||||
| 			?? page.raw | 		//	?? page.raw
 | ||||||
| 		// NOTE: we are doing a separate pass for comments to completely 
 | 		// NOTE: we are doing a separate pass for comments to completely 
 | ||||||
| 		// 		decouple them from the base macro syntax, making them fully 
 | 		// 		decouple them from the base macro syntax, making them fully 
 | ||||||
| 		// 		transparent...
 | 		// 		transparent...
 | ||||||
| @ -1509,8 +1518,8 @@ module.BaseParser = { | |||||||
| 	// NOTE: this internaly uses macros to check for propper nesting
 | 	// NOTE: this internaly uses macros to check for propper nesting
 | ||||||
| 	//group: function*(page, lex, to=false){
 | 	//group: function*(page, lex, to=false){
 | ||||||
| 	group: function*(page, lex, to=false, parent){ | 	group: function*(page, lex, to=false, parent){ | ||||||
| 		lex = lex | 		//lex = lex
 | ||||||
| 			?? this.lex(page)  | 		//	?? this.lex(page) 
 | ||||||
| 		lex = typeof(lex) == 'string' ? | 		lex = typeof(lex) == 'string' ? | ||||||
| 			this.lex(page, lex) | 			this.lex(page, lex) | ||||||
| 			: lex | 			: lex | ||||||
| @ -1585,9 +1594,10 @@ module.BaseParser = { | |||||||
| 	// 			data: [ <item>, .. ],
 | 	// 			data: [ <item>, .. ],
 | ||||||
| 	// 		}
 | 	// 		}
 | ||||||
| 	//
 | 	//
 | ||||||
| 	expand: function*(page, ast, state={}){ | 	expand: async function*(page, ast, state={}){ | ||||||
| 		ast = ast == null ? | 		ast = ast == null ? | ||||||
| 				this.group(page) | 				//this.group(page)
 | ||||||
|  | 				this.group(page, await page.raw) | ||||||
| 			: typeof(ast) == 'string' ? | 			: typeof(ast) == 'string' ? | ||||||
| 				this.group(page, ast) | 				this.group(page, ast) | ||||||
| 			: ast instanceof types.Generator ? | 			: ast instanceof types.Generator ? | ||||||
| @ -1617,7 +1627,7 @@ module.BaseParser = { | |||||||
| 				state) | 				state) | ||||||
| 			// call...
 | 			// call...
 | ||||||
| 			var res =  | 			var res =  | ||||||
| 				page.macros[name].call(page, args, body, state, value) | 				await page.macros[name].call(page, args, body, state, value) | ||||||
| 					?? '' | 					?? '' | ||||||
| 			// result...
 | 			// result...
 | ||||||
| 			if(res instanceof Array  | 			if(res instanceof Array  | ||||||
| @ -1636,16 +1646,24 @@ module.BaseParser = { | |||||||
| 	// 	- apply filters
 | 	// 	- apply filters
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// XXX add a special filter to clear pending filters... (???)
 | 	// XXX add a special filter to clear pending filters... (???)
 | ||||||
| 	parse: function(page, ast, state={}){ | 	parse: async function(page, ast, state={}){ | ||||||
| 		var that = this | 		var that = this | ||||||
| 		// XXX should we handle strings as input???
 | 		// XXX should we handle strings as input???
 | ||||||
| 		ast = ast  | 		ast = ast  | ||||||
| 			?? this.expand(page, null, state) | 			?? await this.expand(page, null, state) | ||||||
| 		ast = typeof(ast) == 'string' ? | 		ast = typeof(ast) == 'string' ? | ||||||
| 			this.expand(page, ast, state) | 			await this.expand(page, ast, state) | ||||||
| 			: ast | 			: ast | ||||||
| 
 | 
 | ||||||
|  | 		//* XXX this is quite ugly...
 | ||||||
|  | 		var blocks = [] | ||||||
|  | 		for await (var a of ast){ | ||||||
|  | 			blocks.push(a) } | ||||||
|  | 
 | ||||||
|  | 		return blocks | ||||||
|  | 		/*/ | ||||||
| 		return [...ast] | 		return [...ast] | ||||||
|  | 		//*/
 | ||||||
| 			// post handlers...
 | 			// post handlers...
 | ||||||
| 			.map(function(section){ | 			.map(function(section){ | ||||||
| 				return typeof(section) == 'function' ?  | 				return typeof(section) == 'function' ?  | ||||||
| @ -1845,11 +1863,11 @@ object.Constructor('Page', BasePage, { | |||||||
| 				state.filters = outer_filters | 				state.filters = outer_filters | ||||||
| 
 | 
 | ||||||
| 				// parse the body after we are done expanding...
 | 				// parse the body after we are done expanding...
 | ||||||
| 				return function(state){ | 				return async function(state){ | ||||||
| 					var outer_filters = state.filters | 					var outer_filters = state.filters | ||||||
| 					state.filters = this.__parser__.normalizeFilters(filters) | 					state.filters = this.__parser__.normalizeFilters(filters) | ||||||
| 					var res = | 					var res = | ||||||
| 						[...this.parse(ast, state)] | 						[...await this.parse(ast, state)] | ||||||
| 							.flat() | 							.flat() | ||||||
| 							.join('')  | 							.join('')  | ||||||
| 					state.filters = outer_filters | 					state.filters = outer_filters | ||||||
| @ -1870,7 +1888,7 @@ object.Constructor('Page', BasePage, { | |||||||
| 		// XXX should this be lazy???
 | 		// XXX should this be lazy???
 | ||||||
| 		include: Macro( | 		include: Macro( | ||||||
| 			['src', 'recursive', ['isolated']], | 			['src', 'recursive', ['isolated']], | ||||||
| 			function(args, body, state, key='included', handler){ | 			async function(args, body, state, key='included', handler){ | ||||||
| 				var macro = 'include' | 				var macro = 'include' | ||||||
| 				if(typeof(args) == 'string'){ | 				if(typeof(args) == 'string'){ | ||||||
| 					var [macro, args, body, state, key="included", handler] = arguments } | 					var [macro, args, body, state, key="included", handler] = arguments } | ||||||
| @ -1882,7 +1900,7 @@ object.Constructor('Page', BasePage, { | |||||||
| 				if(!src){ | 				if(!src){ | ||||||
| 					return } | 					return } | ||||||
| 				// parse arg values...
 | 				// parse arg values...
 | ||||||
| 				src = this.parse(src, state) | 				src = await this.parse(src, state) | ||||||
| 
 | 
 | ||||||
| 				handler = handler  | 				handler = handler  | ||||||
| 					?? function(){ | 					?? function(){ | ||||||
| @ -1908,7 +1926,7 @@ object.Constructor('Page', BasePage, { | |||||||
| 				seen.push(src) | 				seen.push(src) | ||||||
| 
 | 
 | ||||||
| 				// load the included page...
 | 				// load the included page...
 | ||||||
| 				var res = handler.call(this) | 				var res = await handler.call(this) | ||||||
| 
 | 
 | ||||||
| 				// restore previous include chain...
 | 				// restore previous include chain...
 | ||||||
| 				if(parent_seen){ | 				if(parent_seen){ | ||||||
| @ -1919,17 +1937,17 @@ object.Constructor('Page', BasePage, { | |||||||
| 				return res }), | 				return res }), | ||||||
| 		source: Macro( | 		source: Macro( | ||||||
| 			['src'], | 			['src'], | ||||||
| 			function(args, body, state){ | 			async function(args, body, state){ | ||||||
| 				var src = args.src | 				var src = args.src | ||||||
| 				// parse arg values...
 | 				// parse arg values...
 | ||||||
| 				src = src ?  | 				src = src ?  | ||||||
| 					this.parse(src, state)  | 					await this.parse(src, state)  | ||||||
| 					: src | 					: src | ||||||
| 				return this.macros.include.call(this,  | 				return this.macros.include.call(this,  | ||||||
| 					'source', | 					'source', | ||||||
| 					args, body, state, 'sources',  | 					args, body, state, 'sources',  | ||||||
| 					function(){ | 					async function(){ | ||||||
| 						return this.parse(this.get(src).raw +'', state) }) }), | 						return await this.parse(await this.get(src).raw +'', state) }) }), | ||||||
| 		//
 | 		//
 | ||||||
| 		// 	@quote(<src>)
 | 		// 	@quote(<src>)
 | ||||||
| 		//
 | 		//
 | ||||||
| @ -1951,18 +1969,18 @@ object.Constructor('Page', BasePage, { | |||||||
| 		// XXX need a way to escape macros -- i.e. include </quote> in a quoted text...
 | 		// XXX need a way to escape macros -- i.e. include </quote> in a quoted text...
 | ||||||
| 		quote: Macro( | 		quote: Macro( | ||||||
| 			['src', 'filter', 'text'], | 			['src', 'filter', 'text'], | ||||||
| 			function(args, body, state){ | 			async function(args, body, state){ | ||||||
| 				var src = args.src //|| args[0]
 | 				var src = args.src //|| args[0]
 | ||||||
| 				var text = args.text  | 				var text = args.text  | ||||||
| 					?? body  | 					?? body  | ||||||
| 					?? [] | 					?? [] | ||||||
| 				// parse arg values...
 | 				// parse arg values...
 | ||||||
| 				src = src ?  | 				src = src ?  | ||||||
| 					this.parse(src, state) | 					await this.parse(src, state) | ||||||
| 					: src | 					: src | ||||||
| 				text = src ? | 				text = src ? | ||||||
| 						// source page...
 | 						// source page...
 | ||||||
| 						this.get(src).raw | 						await this.get(src).raw | ||||||
| 					: text instanceof Array ? | 					: text instanceof Array ? | ||||||
| 						text.join('') | 						text.join('') | ||||||
| 					: text | 					: text | ||||||
| @ -2027,7 +2045,7 @@ object.Constructor('Page', BasePage, { | |||||||
| 		// 		...seems that we'll fall into recursion on definition...
 | 		// 		...seems that we'll fall into recursion on definition...
 | ||||||
| 		slot: Macro( | 		slot: Macro( | ||||||
| 			['name', 'text', ['shown', 'hidden']], | 			['name', 'text', ['shown', 'hidden']], | ||||||
| 			function(args, body, state){ | 			async function(args, body, state){ | ||||||
| 				var name = args.name | 				var name = args.name | ||||||
| 				var text = args.text  | 				var text = args.text  | ||||||
| 					?? body  | 					?? body  | ||||||
| @ -2041,7 +2059,7 @@ object.Constructor('Page', BasePage, { | |||||||
| 
 | 
 | ||||||
| 				// parse arg values...
 | 				// parse arg values...
 | ||||||
| 				name = name ? | 				name = name ? | ||||||
| 					this.parse(name, state) | 					await this.parse(name, state) | ||||||
| 					: name | 					: name | ||||||
| 
 | 
 | ||||||
| 				//var hidden = name in slots
 | 				//var hidden = name in slots
 | ||||||
| @ -2055,7 +2073,7 @@ object.Constructor('Page', BasePage, { | |||||||
| 							// show first instance...
 | 							// show first instance...
 | ||||||
| 							: name in slots) | 							: name in slots) | ||||||
| 
 | 
 | ||||||
| 				slots[name] = [...this.__parser__.expand(this, text, state)] | 				slots[name] = [...await this.__parser__.expand(this, text, state)] | ||||||
| 
 | 
 | ||||||
| 				return hidden ? | 				return hidden ? | ||||||
| 					'' | 					'' | ||||||
| @ -2095,7 +2113,7 @@ object.Constructor('Page', BasePage, { | |||||||
| 		// 		...does not work yet...
 | 		// 		...does not work yet...
 | ||||||
| 		macro: Macro( | 		macro: Macro( | ||||||
| 			['name', 'src', 'sort', 'text', 'join', 'else', ['strict', 'nonstrict']], | 			['name', 'src', 'sort', 'text', 'join', 'else', ['strict', 'nonstrict']], | ||||||
| 			function(args, body, state){ | 			async function(args, body, state){ | ||||||
| 				var that = this | 				var that = this | ||||||
| 				var name = args.name //?? args[0]
 | 				var name = args.name //?? args[0]
 | ||||||
| 				var src = args.src | 				var src = args.src | ||||||
| @ -2134,7 +2152,7 @@ object.Constructor('Page', BasePage, { | |||||||
| 					return block } | 					return block } | ||||||
| 
 | 
 | ||||||
| 				if(name){ | 				if(name){ | ||||||
| 					name = this.parse(name, state) | 					name = await this.parse(name, state) | ||||||
| 					// define new named macro...
 | 					// define new named macro...
 | ||||||
| 					if(text){ | 					if(text){ | ||||||
| 						;(state.macros = state.macros ?? {})[name] = text | 						;(state.macros = state.macros ?? {})[name] = text | ||||||
| @ -2144,24 +2162,24 @@ object.Constructor('Page', BasePage, { | |||||||
| 						text = state.macros[name] } } | 						text = state.macros[name] } } | ||||||
| 
 | 
 | ||||||
| 				if(src){ | 				if(src){ | ||||||
| 					src = this.parse(src, state) | 					src = await this.parse(src, state) | ||||||
| 					/* XXX ARRAY page... | 					/* XXX ARRAY page... | ||||||
| 					var pages = this.get(src, strict).each() | 					var pages = this.get(src, strict).each() | ||||||
| 					/*/ | 					/*/ | ||||||
| 					var pages = this.get(src, strict) | 					var pages = this.get(src, strict) | ||||||
| 					pages = pages.isArray ? | 					pages = await pages.isArray ? | ||||||
| 						// XXX should we wrap this in pages...
 | 						// XXX should we wrap this in pages...
 | ||||||
| 						pages.raw | 						(await pages.raw) | ||||||
| 							.map(function(data){ | 							.map(function(data){ | ||||||
| 								return that.virtual({text: data}) }) | 								return that.virtual({text: data}) }) | ||||||
| 						: pages.each() | 						: await pages.each() | ||||||
| 					//*/
 | 					//*/
 | ||||||
| 					// no matching pages -> get the else block...
 | 					// no matching pages -> get the else block...
 | ||||||
| 					if(pages.length == 0  | 					if(pages.length == 0  | ||||||
| 							&& (text || args['else'])){ | 							&& (text || args['else'])){ | ||||||
| 						var else_block = _getBlock('else') | 						var else_block = _getBlock('else') | ||||||
| 						return else_block ? | 						return else_block ? | ||||||
| 							[...this.__parser__.expand(this, else_block, state)] | 							[...await this.__parser__.expand(this, else_block, state)] | ||||||
| 							: undefined } | 							: undefined } | ||||||
| 
 | 
 | ||||||
| 					// sort pages...
 | 					// sort pages...
 | ||||||
| @ -2172,14 +2190,25 @@ object.Constructor('Page', BasePage, { | |||||||
| 
 | 
 | ||||||
| 					var join_block = _getBlock('join')  | 					var join_block = _getBlock('join')  | ||||||
| 					// apply macro text...
 | 					// apply macro text...
 | ||||||
| 					return pages | 					return Promise.iter(pages) | ||||||
| 						.map(function(page, i){ | 						.map(async function(page, i){ | ||||||
|  | 							//* XXX really ugly...
 | ||||||
|  | 							var res = [] | ||||||
|  | 							for await (var c of that.__parser__.expand(page, text, state)){ | ||||||
|  | 								res.push(c) } | ||||||
|  | 							if(join_block && i < pages.length-1){ | ||||||
|  | 								for await (var c of that.__parser__.expand(page, join_block, state)){ | ||||||
|  | 									res.push(c) } } | ||||||
|  | 							return res | ||||||
|  | 							/*/ | ||||||
| 							return [ | 							return [ | ||||||
| 								...that.__parser__.expand(page, text, state), | 								...await that.__parser__.expand(page, text, state), | ||||||
| 								...((join_block && i < pages.length-1) ? | 								...((join_block && i < pages.length-1) ? | ||||||
| 									that.__parser__.expand(page, join_block, state) | 									await that.__parser__.expand(page, join_block, state) | ||||||
| 									: []), | 									: []), | ||||||
| 							] }) | 							]  | ||||||
|  | 							//*/
 | ||||||
|  | 						}) | ||||||
| 						.flat() } }), | 						.flat() } }), | ||||||
| 
 | 
 | ||||||
| 		// nesting rules...
 | 		// nesting rules...
 | ||||||
| @ -2204,7 +2233,8 @@ object.Constructor('Page', BasePage, { | |||||||
| 	// page parser...
 | 	// page parser...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	__parser__: module.parser, | 	__parser__: module.parser, | ||||||
| 	parse: function(text, state){ | 	parse: async function(text, state){ | ||||||
|  | 		var that = this | ||||||
| 		// .parser(<state>)
 | 		// .parser(<state>)
 | ||||||
| 		if(arguments.length == 1  | 		if(arguments.length == 1  | ||||||
| 				&& text instanceof Object | 				&& text instanceof Object | ||||||
| @ -2212,10 +2242,12 @@ object.Constructor('Page', BasePage, { | |||||||
| 			state = text | 			state = text | ||||||
| 			text = null } | 			text = null } | ||||||
| 		state = state ?? {} | 		state = state ?? {} | ||||||
| 		text = text ?? this.raw | 		text = text  | ||||||
|  | 			?? await this.raw | ||||||
| 		return text instanceof Array ? | 		return text instanceof Array ? | ||||||
| 			text.map(function(text){ | 			Promise.iter(text) | ||||||
| 				return this.__parser__.parse(this, text, state) }.bind(this)) | 				.map(function(text){ | ||||||
|  | 					return that.__parser__.parse(that, text, state) }) | ||||||
| 			: this.__parser__.parse(this, text, state) }, | 			: this.__parser__.parse(this, text, state) }, | ||||||
| 
 | 
 | ||||||
| 	// true if page has an array value but is not a pattern page...
 | 	// true if page has an array value but is not a pattern page...
 | ||||||
| @ -2223,19 +2255,19 @@ object.Constructor('Page', BasePage, { | |||||||
| 	// XXX the split into pattern and array pages feels a bit overcomplicated...
 | 	// XXX the split into pattern and array pages feels a bit overcomplicated...
 | ||||||
| 	// 		...can we merge the two and simplify things???
 | 	// 		...can we merge the two and simplify things???
 | ||||||
| 	// XXX EXPERIMENTAL
 | 	// XXX EXPERIMENTAL
 | ||||||
| 	get isArray(){ | 	get isArray(){ return (async function(){ | ||||||
| 		return !this.isPattern  | 		return !this.isPattern  | ||||||
| 			// NOTE: we can't only use .data here as it can be a function 
 | 			// NOTE: we can't only use .data here as it can be a function 
 | ||||||
| 			// 		that will return an array...
 | 			// 		that will return an array...
 | ||||||
| 			&& this.raw instanceof Array }, | 			&& await this.raw instanceof Array }).call(this) }, | ||||||
| 
 | 
 | ||||||
| 	// raw page text...
 | 	// raw page text...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// NOTE: writing to .raw is the same as writing to .text...
 | 	// NOTE: writing to .raw is the same as writing to .text...
 | ||||||
| 	// NOTE: when matching multiple pages this will return a list...
 | 	// NOTE: when matching multiple pages this will return a list...
 | ||||||
| 	get raw(){ | 	get raw(){ return (async function(){ | ||||||
| 		var that = this | 		var that = this | ||||||
| 		var data = this.data | 		var data = await this.data | ||||||
| 		// no data...
 | 		// no data...
 | ||||||
| 		// NOTE: if we hit this it means that nothing was resolved, 
 | 		// NOTE: if we hit this it means that nothing was resolved, 
 | ||||||
| 		// 		not even the System/NotFound page, i.e. something 
 | 		// 		not even the System/NotFound page, i.e. something 
 | ||||||
| @ -2261,7 +2293,7 @@ object.Constructor('Page', BasePage, { | |||||||
| 							d.call(that) | 							d.call(that) | ||||||
| 							: d.text }) | 							: d.text }) | ||||||
| 					.flat() | 					.flat() | ||||||
|    			: data.text }, |    			: data.text }).call(this) }, | ||||||
| 	set raw(value){ | 	set raw(value){ | ||||||
| 		this.__update__({text: value}) }, | 		this.__update__({text: value}) }, | ||||||
| 		//this.onTextUpdate(value) },
 | 		//this.onTextUpdate(value) },
 | ||||||
| @ -2270,14 +2302,14 @@ object.Constructor('Page', BasePage, { | |||||||
| 	//
 | 	//
 | ||||||
| 	// NOTE: this uses .PAGE_TPL to render the page.
 | 	// NOTE: this uses .PAGE_TPL to render the page.
 | ||||||
| 	// NOTE: writing to .raw is the same as writing to .text...
 | 	// NOTE: writing to .raw is the same as writing to .text...
 | ||||||
| 	get text(){ | 	get text(){ return (async function(){ | ||||||
| 		var tpl = '/'+ this.find('./'+ this.PAGE_TPL) | 		var tpl = '/'+ await this.find('./'+ this.PAGE_TPL) | ||||||
| 		return [this.parse( | 		return [await this.parse( | ||||||
| 				tpl.endsWith(this.PAGE_TPL.split(/[\\\/]/).pop()) ? | 				tpl.endsWith(this.PAGE_TPL.split(/[\\\/]/).pop()) ? | ||||||
| 					[this.get(tpl).raw] | 					[await this.get(tpl).raw] | ||||||
| 					: [] )] | 					: [] )] | ||||||
| 			.flat() | 			.flat() | ||||||
| 			.join('\n') },  | 			.join('\n') }).call(this) },  | ||||||
| 	set text(value){ | 	set text(value){ | ||||||
| 		this.__update__({text: value}) }, | 		this.__update__({text: value}) }, | ||||||
| 		//this.onTextUpdate(value) },
 | 		//this.onTextUpdate(value) },
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user