mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-10-31 11:00:08 +00:00 
			
		
		
		
	cleanup...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									7e51905850
								
							
						
					
					
						commit
						8acb914237
					
				
							
								
								
									
										154
									
								
								pwiki/page.js
									
									
									
									
									
								
							
							
						
						
									
										154
									
								
								pwiki/page.js
									
									
									
									
									
								
							| @ -267,7 +267,6 @@ object.Constructor('BasePage', { | ||||
| 		return this.store.delete(pwpath.relative(this.path, path)) }, | ||||
| 
 | ||||
| 	__energetic: undefined, | ||||
| 	//* XXX EXPERIMENTAL
 | ||||
| 	get energetic(){ | ||||
| 		return this.__energetic === true | ||||
| 			|| ((this.actions  | ||||
| @ -280,24 +279,12 @@ object.Constructor('BasePage', { | ||||
| 				this.store.isEnergetic(this.path), | ||||
| 		   		function(res){ | ||||
| 					return !!res })) }, | ||||
| 	/*/ // XXX ASYNC
 | ||||
| 	get energetic(){ return async function(){ | ||||
| 		return this.__energetic === true | ||||
| 			|| ((this.actions  | ||||
| 				&& this.actions[this.name] | ||||
| 				&& !!this[ | ||||
| 					this.actions[this.name] === true ? | ||||
| 						this.name | ||||
| 						: this.actions[this.name] ].energetic) | ||||
| 			|| !!await this.store.isEnergetic(this.path)) }.call(this) }, | ||||
| 	//*/
 | ||||
| 	set energetic(value){ | ||||
| 		this.__energetic = value }, | ||||
| 
 | ||||
| 	// page data...
 | ||||
| 	//
 | ||||
| 	strict: undefined, | ||||
| 	//* XXX EXPERIMENTAL
 | ||||
| 	get data(){ | ||||
| 		var that = this | ||||
| 		// direct actions...
 | ||||
| @ -351,51 +338,6 @@ object.Constructor('BasePage', { | ||||
| 						return typeof(res) == 'function' ? | ||||
| 							res.bind(that) | ||||
| 							: res }) }) }, | ||||
| 	/*/ // XXX ASYNC
 | ||||
| 	get data(){ return (async function(){ | ||||
| 		// direct actions...
 | ||||
| 		if(this.actions  | ||||
| 				&& this.actions[this.name]){ | ||||
| 			var name =  | ||||
| 				this.actions[this.name] === true ? | ||||
| 					this.name | ||||
| 					: this.actions[this.name] | ||||
| 			var args = this.args | ||||
| 			var page = this.get('..', {args}) | ||||
| 			var res = (this.isPattern  | ||||
| 					&& !this.__energetic | ||||
| 					&& !page[name].energetic) ? | ||||
| 				await page | ||||
| 					.map(function(page){ | ||||
| 						var res = page[name]  | ||||
| 						return typeof(res) == 'function' ? | ||||
| 							res.bind(page.get(name, {args})) | ||||
| 							: function(){  | ||||
| 								return res } }) | ||||
| 				: await page[name]  | ||||
| 			return typeof(res) == 'function' ? | ||||
| 					res.bind(this) | ||||
| 				: res instanceof Array ? | ||||
| 					res | ||||
| 				: function(){  | ||||
| 					return res } } | ||||
| 
 | ||||
| 		var that = this | ||||
| 		// NOTE: we need to make sure each page gets the chance to handle 
 | ||||
| 		// 		its context (i.e. bind action to page)....
 | ||||
| 		if(this.isPattern  | ||||
| 				// XXX ENERGETIC...
 | ||||
| 				&& !await this.energetic){ | ||||
| 			return this | ||||
| 				.map(function(page){ | ||||
| 					return page.data }) } | ||||
| 		// single page...
 | ||||
| 		// XXX ENERGETIC...
 | ||||
| 		var res = await this.store.get(this.path, !!this.strict, !!await this.energetic) | ||||
| 		return typeof(res) == 'function' ? | ||||
| 			res.bind(this) | ||||
| 			: res }).call(this) }, | ||||
| 	//*/
 | ||||
| 	set data(value){ | ||||
| 		if(this.actions  | ||||
| 				&& this.actions[this.name]){ | ||||
| @ -1815,7 +1757,6 @@ object.Constructor('Page', BasePage, { | ||||
| 	// 		and debugging, set comment it out to disable...
 | ||||
| 	//__debug_last_render_state: undefined,
 | ||||
| 	// XXX should this handle pattern paths???
 | ||||
| 	//* XXX EXPERIMENTAL
 | ||||
| 	parse: function(text, state){ | ||||
| 		var that = this | ||||
| 		return Promise.awaitOrRun( | ||||
| @ -1840,30 +1781,6 @@ object.Constructor('Page', BasePage, { | ||||
| 					}),  | ||||
| 					text,  | ||||
| 					state) }) }, | ||||
| 	/*/ // XXX ASYNC
 | ||||
| 	parse: async function(text, state){ | ||||
| 		var that = this | ||||
| 		text = await text | ||||
| 		// .parser(<state>)
 | ||||
| 		if(arguments.length == 1  | ||||
| 				&& text instanceof Object | ||||
| 				&& !(text instanceof Array)){ | ||||
| 			state = text | ||||
| 			text = null } | ||||
| 		state = state ?? {} | ||||
| 		state.renderer = state.renderer ?? this | ||||
| 		// this is here for debugging and introspection...
 | ||||
| 		'__debug_last_render_state' in this | ||||
| 			&& (this.__debug_last_render_state = state) | ||||
| 		// parse...
 | ||||
| 		return this.__parser__.parse( | ||||
| 			this.get('.', { | ||||
| 				renderer: state.renderer, | ||||
| 				args: this.args,  | ||||
| 			}),  | ||||
| 			text,  | ||||
| 			state) }, | ||||
| 	//*/
 | ||||
| 
 | ||||
| 	// raw page text...
 | ||||
| 	//
 | ||||
| @ -1871,7 +1788,6 @@ object.Constructor('Page', BasePage, { | ||||
| 	// NOTE: when matching multiple pages this will return a list...
 | ||||
| 	//
 | ||||
| 	// XXX revise how we handle .strict mode...
 | ||||
| 	// XXX EXPERIMENTAL
 | ||||
| 	get raw(){ | ||||
| 		var that = this | ||||
| 		return Promise.awaitOrRun( | ||||
| @ -1909,38 +1825,6 @@ object.Constructor('Page', BasePage, { | ||||
| 							.flat()) | ||||
| 					: data.text ) },  | ||||
| 			null) }, | ||||
| 	/*/ // XXX ASYNC
 | ||||
| 	get raw(){ return (async function(){ | ||||
| 		var data = await this.data | ||||
| 		// no data...
 | ||||
| 		// NOTE: if we hit this it means that nothing was resolved, 
 | ||||
| 		// 		not even the System/NotFound page, i.e. something 
 | ||||
| 		// 		went really wrong...
 | ||||
| 		// NOTE: in .strict mode this will explicitly fail and not try 
 | ||||
| 		// 		to recover...
 | ||||
| 		if(data == null){ | ||||
| 			if(!this.strict  | ||||
| 					&& this.NOT_FOUND_ERROR){ | ||||
| 				var msg = this.get(this.NOT_FOUND_ERROR) | ||||
| 				if(await msg.match()){ | ||||
| 					return msg.raw } } | ||||
| 			// last resort...
 | ||||
| 			throw new Error('NOT FOUND ERROR: '+ this.path) } | ||||
| 		// get the data...
 | ||||
| 		return ( | ||||
| 			// action...
 | ||||
| 			typeof(data) == 'function' ? | ||||
| 				data() | ||||
| 			// multiple matches...
 | ||||
| 			: data instanceof Array ? | ||||
| 				Promise.all(data | ||||
| 					.map(function(d){ | ||||
| 						return typeof(d) == 'function'? | ||||
| 							d() | ||||
| 							: d.text }) | ||||
| 					.flat()) | ||||
|    			: data.text )}).call(this) }, | ||||
| 	//*/
 | ||||
| 	set raw(value){ | ||||
| 		this.data = {text: value} }, | ||||
| 		//this.onTextUpdate(value) },
 | ||||
| @ -2010,8 +1894,6 @@ object.Constructor('Page', BasePage, { | ||||
| 	// 		...currently they are rendered in the context of the page and
 | ||||
| 	// 		not in their own context...
 | ||||
| 	// XXX revise how we handle strict mode...
 | ||||
| 	//
 | ||||
| 	// XXX EXPERIMENTAL
 | ||||
| 	// XXX would be nice to be able to chain .awaitOrRun(..) calls instead 
 | ||||
| 	// 		of nesting them like here...
 | ||||
| 	get text(){ | ||||
| @ -2054,42 +1936,6 @@ object.Constructor('Page', BasePage, { | ||||
| 									depends,  | ||||
| 									renderer: that, | ||||
| 								}) }) }) }, | ||||
| 	/*/ // XXX ASYNC
 | ||||
| 	get text(){ return (async function(){ | ||||
| 		// strict mode -- break on non-existing pages...
 | ||||
| 		if(this.strict  | ||||
| 				&& !await this.resolve(true)){ | ||||
| 			throw new Error('NOT FOUND ERROR: '+ this.location) } | ||||
| 
 | ||||
| 		var path = pwpath.split(this.path) | ||||
| 		;(path.at(-1) ?? '')[0] == '_' | ||||
| 			|| path.push(this.PAGE_TEMPLATE) | ||||
| 		var tpl = pwpath.join(path) | ||||
| 		var tpl_name = path.pop() | ||||
| 		//var tpl_name = path.at(-1)
 | ||||
| 
 | ||||
| 		// get the template relative to the top most pattern...
 | ||||
| 		tpl = await this.get(tpl).find(true) | ||||
| 		if(!tpl){ | ||||
| 			console.warn('UNKNOWN RENDER TEMPLATE: '+ tpl_name)  | ||||
| 			return this.get(this.NOT_FOUND_TEMPLATE_ERROR).parse() } | ||||
| 
 | ||||
| 		var depends = this.depends = new Set([tpl]) | ||||
| 		// do the parse...
 | ||||
| 		// NOTE: we render the template in context of page...
 | ||||
| 		return this | ||||
| 			// NOTE: this.path can both contain a template and not, this
 | ||||
| 			// 		normalizes it to the path up to the template path...
 | ||||
| 			.get(path, {args: this.args}) | ||||
| 			.parse( | ||||
| 				this.get( | ||||
| 					'/'+tpl,  | ||||
| 					{args: this.args}).raw,  | ||||
| 				{ | ||||
| 					depends,  | ||||
| 					renderer: this, | ||||
| 				}) }).call(this) }, | ||||
| 	//*/
 | ||||
| 	set text(value){ | ||||
| 		this.data = {text: value} }, | ||||
| 		//this.onTextUpdate(value) },
 | ||||
|  | ||||
							
								
								
									
										132
									
								
								pwiki/parser.js
									
									
									
									
									
								
							
							
						
						
									
										132
									
								
								pwiki/parser.js
									
									
									
									
									
								
							| @ -461,7 +461,6 @@ module.BaseParser = { | ||||
| 	//		an await of something does not fix the issue, we need to await 
 | ||||
| 	//		for something significant -- await this.parse('') works, while
 | ||||
| 	//		await vars[name] does not -- to the contrary of the above example...
 | ||||
| 	// XXX EXPERIMENTAL -- this seems to be slower than the original version...
 | ||||
| 	expand: function(page, ast, state={}){ | ||||
| 		var that = this | ||||
| 		ast = ast == null ? | ||||
| @ -519,67 +518,6 @@ module.BaseParser = { | ||||
| 									.replace(/=/g, '=') | ||||
| 							+'")')] }) | ||||
| 				.sync() }, | ||||
| 	/*/ // XXX ASYNC
 | ||||
| 	expand: async function*(page, ast, state={}){ | ||||
| 		try{ | ||||
| 			ast = ast == null ? | ||||
| 					this.group(page, await page.raw ?? '') | ||||
| 				: typeof(ast) != 'object' ? | ||||
| 					this.group(page, ast) | ||||
| 				: ast instanceof types.Generator ? | ||||
| 					ast | ||||
| 				: ast.iter() | ||||
| 
 | ||||
| 			while(true){ | ||||
| 				var {value, done} = ast.next() | ||||
| 				if(done){ | ||||
| 					return } | ||||
| 
 | ||||
| 				// text block...
 | ||||
| 				if(typeof(value) == 'string'){ | ||||
| 					yield value  | ||||
| 					continue } | ||||
| 
 | ||||
| 				// macro...
 | ||||
| 				var {name, args, body} = value | ||||
| 				// nested macro -- skip...
 | ||||
| 				if(typeof(page.macros[name]) != 'function'){ | ||||
| 					yield {...value, skip: true} | ||||
| 					continue } | ||||
| 
 | ||||
| 				var res =  | ||||
| 					await this.callMacro(page, name, args, body, state)  | ||||
| 						?? '' | ||||
| 
 | ||||
| 				// result...
 | ||||
| 				if(res instanceof Array  | ||||
| 						|| page.macros[name] instanceof types.Generator){ | ||||
| 					yield* res | ||||
| 				} else { | ||||
| 					yield res } }  | ||||
| 
 | ||||
| 			// error...
 | ||||
| 			}catch(err){ | ||||
| 				console.error(err) | ||||
| 				yield page.parse( | ||||
| 					// XXX add line number and page path...
 | ||||
| 					'@include("./ParseError' | ||||
| 						+':path=' | ||||
| 							// XXX use pwpath.encodeElem(..) ???
 | ||||
| 							+ page.path  | ||||
| 						+':msg=' | ||||
| 							+ err.message  | ||||
| 								// quote html stuff...
 | ||||
| 								.replace(/&/g, '&') | ||||
| 								.replace(/</g, '<') | ||||
| 								.replace(/>/g, '>') | ||||
| 								// quote argument syntax...
 | ||||
| 								.replace(/["']/g, function(c){ | ||||
| 									return '%'+ c.charCodeAt().toString(16) }) | ||||
| 								.replace(/:/g, ':') | ||||
| 								.replace(/=/g, '=') | ||||
| 						+'")') } }, | ||||
| 	//*/
 | ||||
| 
 | ||||
| 	// recursively resolve and enumerate the ast...
 | ||||
| 	//
 | ||||
| @ -596,7 +534,6 @@ module.BaseParser = { | ||||
| 	// NOTE: <func>(..) is called in the context of page...
 | ||||
| 	//
 | ||||
| 	// XXX should this also resolve e.data???
 | ||||
| 	//* XXX EXPERIMENTAL...
 | ||||
| 	resolve: function(page, ast, state={}){ | ||||
| 		var that = this | ||||
| 		ast = ast  | ||||
| @ -635,37 +572,6 @@ module.BaseParser = { | ||||
| 			// keep the API consistently array-like...
 | ||||
| 			ast.iter() | ||||
| 			: ast }, | ||||
| 	/*/ // XXX ASYNC
 | ||||
| 	resolve: async function*(page, ast, state={}){ | ||||
| 		ast = ast  | ||||
| 			?? this.expand(page, null, state) | ||||
| 		ast = typeof(ast) != 'object' ? | ||||
| 			this.expand(page, ast, state) | ||||
| 			: ast | ||||
| 
 | ||||
| 		// NOTE: we need to await for ast here as we need stage 2 of 
 | ||||
| 		// 		parsing to happen AFTER everything else completes...
 | ||||
| 		// XXX GENERATOR -- this breaks the parser...
 | ||||
| 		//		...investigate the data flow...
 | ||||
| 		//for await (var e of ast){
 | ||||
| 		for(var e of await ast){ | ||||
| 			// expand delayed sections...
 | ||||
| 			e = typeof(e) == 'function' ? | ||||
| 				e.call(page, state) | ||||
| 				: e | ||||
| 			// expand arrays...
 | ||||
| 			if(e instanceof Array  | ||||
| 					| e instanceof types.Generator){ | ||||
| 				yield* this.resolve(page, e, state) | ||||
| 			// data -- unwrap content...
 | ||||
| 			} else if(e instanceof Object && 'data' in e){ | ||||
| 				yield { data: await this.resolve(page, e.data, state) } | ||||
| 			// skipped items...
 | ||||
| 			} else if(e instanceof Object && e.skip){ | ||||
| 				continue | ||||
| 			} else { | ||||
| 				yield e } } }, | ||||
| 	//*/
 | ||||
| 
 | ||||
| 	// Fully parse a page...
 | ||||
| 	//
 | ||||
| @ -687,7 +593,6 @@ module.BaseParser = { | ||||
| 	// 			a slot when loaded will replace the prior occurrences...
 | ||||
| 	//
 | ||||
| 	// XXX add a special filter to clear pending filters... (???)
 | ||||
| 	//* XXX EXPERIMENTAL...
 | ||||
| 	parse: function(page, ast, state={}){ | ||||
| 		var that = this | ||||
| 		return this.resolve(page, ast, state) | ||||
| @ -723,43 +628,6 @@ module.BaseParser = { | ||||
| 					: section ) }) | ||||
| 			.flat() | ||||
| 			.join('') }, | ||||
| 	/*/ // XXX ASYNC
 | ||||
| 	parse: async function(page, ast, state={}){ | ||||
| 		var that = this | ||||
| 		return await this.resolve(page, ast, state) | ||||
| 			// filters...
 | ||||
| 			.map(function(section){ | ||||
| 				// normalize types...
 | ||||
| 				section =  | ||||
| 					typeof(section) == 'number' ? | ||||
| 						section + '' | ||||
| 					: section == null ? | ||||
| 						'' | ||||
| 					: section | ||||
| 				return ( | ||||
| 					// expand section...
 | ||||
| 					typeof(section) != 'string' ? | ||||
| 						section.data | ||||
| 					// global filters... 
 | ||||
| 					: state.filters ? | ||||
| 						that.normalizeFilters(state.filters) | ||||
| 							.reduce(function(res, filter){ | ||||
| 								// unknown filter...
 | ||||
| 								// NOTE: we try not to break on user errors
 | ||||
| 								// 		if we can help it...
 | ||||
| 								if(page.filters[filter] == null){ | ||||
| 									console.warn( | ||||
| 										'.parse(..): unsupported filter: '+ filter)  | ||||
| 									return res } | ||||
| 								// NOTE: if a filter returns falsy then it 
 | ||||
| 								// 		will have no effect on the result...
 | ||||
| 								return page.filters[filter].call(page, res)  | ||||
| 									?? res }, section) | ||||
| 					// no global filters...
 | ||||
| 					: section ) }) | ||||
| 			.flat() | ||||
| 			.join('') }, | ||||
| 	//*/
 | ||||
| } | ||||
| 
 | ||||
| var parser = | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user