mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-10-31 19:10: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)) }, | 		return this.store.delete(pwpath.relative(this.path, path)) }, | ||||||
| 
 | 
 | ||||||
| 	__energetic: undefined, | 	__energetic: undefined, | ||||||
| 	//* XXX EXPERIMENTAL
 |  | ||||||
| 	get energetic(){ | 	get energetic(){ | ||||||
| 		return this.__energetic === true | 		return this.__energetic === true | ||||||
| 			|| ((this.actions  | 			|| ((this.actions  | ||||||
| @ -280,24 +279,12 @@ object.Constructor('BasePage', { | |||||||
| 				this.store.isEnergetic(this.path), | 				this.store.isEnergetic(this.path), | ||||||
| 		   		function(res){ | 		   		function(res){ | ||||||
| 					return !!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){ | 	set energetic(value){ | ||||||
| 		this.__energetic = value }, | 		this.__energetic = value }, | ||||||
| 
 | 
 | ||||||
| 	// page data...
 | 	// page data...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	strict: undefined, | 	strict: undefined, | ||||||
| 	//* XXX EXPERIMENTAL
 |  | ||||||
| 	get data(){ | 	get data(){ | ||||||
| 		var that = this | 		var that = this | ||||||
| 		// direct actions...
 | 		// direct actions...
 | ||||||
| @ -351,51 +338,6 @@ object.Constructor('BasePage', { | |||||||
| 						return typeof(res) == 'function' ? | 						return typeof(res) == 'function' ? | ||||||
| 							res.bind(that) | 							res.bind(that) | ||||||
| 							: res }) }) }, | 							: 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){ | 	set data(value){ | ||||||
| 		if(this.actions  | 		if(this.actions  | ||||||
| 				&& this.actions[this.name]){ | 				&& this.actions[this.name]){ | ||||||
| @ -1815,7 +1757,6 @@ object.Constructor('Page', BasePage, { | |||||||
| 	// 		and debugging, set comment it out to disable...
 | 	// 		and debugging, set comment it out to disable...
 | ||||||
| 	//__debug_last_render_state: undefined,
 | 	//__debug_last_render_state: undefined,
 | ||||||
| 	// XXX should this handle pattern paths???
 | 	// XXX should this handle pattern paths???
 | ||||||
| 	//* XXX EXPERIMENTAL
 |  | ||||||
| 	parse: function(text, state){ | 	parse: function(text, state){ | ||||||
| 		var that = this | 		var that = this | ||||||
| 		return Promise.awaitOrRun( | 		return Promise.awaitOrRun( | ||||||
| @ -1840,30 +1781,6 @@ object.Constructor('Page', BasePage, { | |||||||
| 					}),  | 					}),  | ||||||
| 					text,  | 					text,  | ||||||
| 					state) }) }, | 					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...
 | 	// raw page text...
 | ||||||
| 	//
 | 	//
 | ||||||
| @ -1871,7 +1788,6 @@ object.Constructor('Page', BasePage, { | |||||||
| 	// NOTE: when matching multiple pages this will return a list...
 | 	// NOTE: when matching multiple pages this will return a list...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// XXX revise how we handle .strict mode...
 | 	// XXX revise how we handle .strict mode...
 | ||||||
| 	// XXX EXPERIMENTAL
 |  | ||||||
| 	get raw(){ | 	get raw(){ | ||||||
| 		var that = this | 		var that = this | ||||||
| 		return Promise.awaitOrRun( | 		return Promise.awaitOrRun( | ||||||
| @ -1909,38 +1825,6 @@ object.Constructor('Page', BasePage, { | |||||||
| 							.flat()) | 							.flat()) | ||||||
| 					: data.text ) },  | 					: data.text ) },  | ||||||
| 			null) }, | 			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){ | 	set raw(value){ | ||||||
| 		this.data = {text: value} }, | 		this.data = {text: value} }, | ||||||
| 		//this.onTextUpdate(value) },
 | 		//this.onTextUpdate(value) },
 | ||||||
| @ -2010,8 +1894,6 @@ object.Constructor('Page', BasePage, { | |||||||
| 	// 		...currently they are rendered in the context of the page and
 | 	// 		...currently they are rendered in the context of the page and
 | ||||||
| 	// 		not in their own context...
 | 	// 		not in their own context...
 | ||||||
| 	// XXX revise how we handle strict mode...
 | 	// XXX revise how we handle strict mode...
 | ||||||
| 	//
 |  | ||||||
| 	// XXX EXPERIMENTAL
 |  | ||||||
| 	// XXX would be nice to be able to chain .awaitOrRun(..) calls instead 
 | 	// XXX would be nice to be able to chain .awaitOrRun(..) calls instead 
 | ||||||
| 	// 		of nesting them like here...
 | 	// 		of nesting them like here...
 | ||||||
| 	get text(){ | 	get text(){ | ||||||
| @ -2054,42 +1936,6 @@ object.Constructor('Page', BasePage, { | |||||||
| 									depends,  | 									depends,  | ||||||
| 									renderer: that, | 									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){ | 	set text(value){ | ||||||
| 		this.data = {text: value} }, | 		this.data = {text: value} }, | ||||||
| 		//this.onTextUpdate(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 
 | 	//		an await of something does not fix the issue, we need to await 
 | ||||||
| 	//		for something significant -- await this.parse('') works, while
 | 	//		for something significant -- await this.parse('') works, while
 | ||||||
| 	//		await vars[name] does not -- to the contrary of the above example...
 | 	//		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={}){ | 	expand: function(page, ast, state={}){ | ||||||
| 		var that = this | 		var that = this | ||||||
| 		ast = ast == null ? | 		ast = ast == null ? | ||||||
| @ -519,67 +518,6 @@ module.BaseParser = { | |||||||
| 									.replace(/=/g, '=') | 									.replace(/=/g, '=') | ||||||
| 							+'")')] }) | 							+'")')] }) | ||||||
| 				.sync() }, | 				.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...
 | 	// recursively resolve and enumerate the ast...
 | ||||||
| 	//
 | 	//
 | ||||||
| @ -596,7 +534,6 @@ module.BaseParser = { | |||||||
| 	// NOTE: <func>(..) is called in the context of page...
 | 	// NOTE: <func>(..) is called in the context of page...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// XXX should this also resolve e.data???
 | 	// XXX should this also resolve e.data???
 | ||||||
| 	//* XXX EXPERIMENTAL...
 |  | ||||||
| 	resolve: function(page, ast, state={}){ | 	resolve: function(page, ast, state={}){ | ||||||
| 		var that = this | 		var that = this | ||||||
| 		ast = ast  | 		ast = ast  | ||||||
| @ -635,37 +572,6 @@ module.BaseParser = { | |||||||
| 			// keep the API consistently array-like...
 | 			// keep the API consistently array-like...
 | ||||||
| 			ast.iter() | 			ast.iter() | ||||||
| 			: ast }, | 			: 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...
 | 	// Fully parse a page...
 | ||||||
| 	//
 | 	//
 | ||||||
| @ -687,7 +593,6 @@ module.BaseParser = { | |||||||
| 	// 			a slot when loaded will replace the prior occurrences...
 | 	// 			a slot when loaded will replace the prior occurrences...
 | ||||||
| 	//
 | 	//
 | ||||||
| 	// XXX add a special filter to clear pending filters... (???)
 | 	// XXX add a special filter to clear pending filters... (???)
 | ||||||
| 	//* XXX EXPERIMENTAL...
 |  | ||||||
| 	parse: function(page, ast, state={}){ | 	parse: function(page, ast, state={}){ | ||||||
| 		var that = this | 		var that = this | ||||||
| 		return this.resolve(page, ast, state) | 		return this.resolve(page, ast, state) | ||||||
| @ -723,43 +628,6 @@ module.BaseParser = { | |||||||
| 					: section ) }) | 					: section ) }) | ||||||
| 			.flat() | 			.flat() | ||||||
| 			.join('') }, | 			.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 = | var parser = | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user