mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-10-31 19:10:08 +00:00 
			
		
		
		
	refactoring + fixed most of the path args issues...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									b5e19f6821
								
							
						
					
					
						commit
						6f4e2caa7a
					
				| @ -23,7 +23,7 @@ var markdown = require('./filters/markdown') | ||||
| 
 | ||||
| var relProxy =  | ||||
| function(name){ | ||||
| 	var func = function(path='.', ...args){ | ||||
| 	var func = function(path='.:$ARGS', ...args){ | ||||
| 		return this.store[name]( | ||||
| 			pwpath.relative(this.path, path),  | ||||
| 			...args) }  | ||||
| @ -31,10 +31,10 @@ function(name){ | ||||
| 	return func }  | ||||
| var relMatchProxy =  | ||||
| function(name){ | ||||
| 	var func = function(path='.', strict=this.strict){ | ||||
| 	var func = function(path='.:$ARGS', strict=this.strict){ | ||||
| 		if(path === true || path === false){ | ||||
| 			strict = path | ||||
| 			path = '.' } | ||||
| 			path = '.:$ARGS' } | ||||
| 		return this.store[name]( | ||||
| 			pwpath.relative(this.path, path),  | ||||
| 			strict) }  | ||||
| @ -372,6 +372,7 @@ object.Constructor('BasePage', { | ||||
| 	// 		-> path
 | ||||
| 	// 		-> undefined
 | ||||
| 	//
 | ||||
| 	// XXX ARGS preserve args...
 | ||||
| 	find: function(path='.', strict=false){ | ||||
| 		if(path === true || path === false){ | ||||
| 			strict = path | ||||
| @ -403,7 +404,7 @@ object.Constructor('BasePage', { | ||||
| 		// 		we really have to...
 | ||||
| 		path = path ? | ||||
| 			pwpath.relative(this.path, path) | ||||
| 			: this.path | ||||
| 			: this.location | ||||
| 		var paths = path.includes('*')  | ||||
| 				// XXX ENERGETIC...
 | ||||
| 				&& !(await this.energetic | ||||
| @ -844,7 +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) | ||||
| 					//&& await base.parse(args.src, state)
 | ||||
| 					&& this.resolvePathVars(await base.parse(args.src, state)) | ||||
| 				if(!src){ | ||||
| 					return } | ||||
| 				var recursive = args.recursive ?? body | ||||
| @ -875,7 +877,8 @@ object.Constructor('Page', BasePage, { | ||||
| 						yield join } | ||||
| 					first = false | ||||
| 
 | ||||
| 					var full = page.path | ||||
| 					//var full = page.path
 | ||||
| 					var full = page.location | ||||
| 
 | ||||
| 					// handle recursion...
 | ||||
| 					var parent_seen = 'seen' in state | ||||
| @ -1266,7 +1269,7 @@ object.Constructor('Page', BasePage, { | ||||
| 
 | ||||
| 	'!': Object.assign( | ||||
| 		function(){ | ||||
| 			return this.get('.', {energetic: true}).raw }, | ||||
| 			return this.get('.:$ARGS', {energetic: true}).raw }, | ||||
| 		{energetic: true}), | ||||
| 
 | ||||
| 	// XXX DEBUG -- remove these...
 | ||||
| @ -1315,17 +1318,6 @@ object.Constructor('Page', BasePage, { | ||||
| 		state = state ?? {} | ||||
| 		return this.__parser__.parse(this, text, state) }, | ||||
| 
 | ||||
| 	// true if page has an array value but is not a pattern page...
 | ||||
| 	//
 | ||||
| 	// XXX the split into pattern and array pages feels a bit overcomplicated...
 | ||||
| 	// 		...can we merge the two and simplify things???
 | ||||
| 	// XXX EXPERIMENTAL
 | ||||
| 	get isArray(){ return (async function(){ | ||||
| 		return !this.isPattern  | ||||
| 			// NOTE: we can't only use .data here as it can be a function 
 | ||||
| 			// 		that will return an array...
 | ||||
| 			&& await this.raw instanceof Array }).call(this) }, | ||||
| 
 | ||||
| 	// raw page text...
 | ||||
| 	//
 | ||||
| 	// NOTE: writing to .raw is the same as writing to .text...
 | ||||
| @ -1379,7 +1371,7 @@ object.Constructor('Page', BasePage, { | ||||
| 	// 		actions...
 | ||||
| 	//
 | ||||
| 	// XXX revise name...
 | ||||
| 	asPages: async function*(path='.', strict=false, noexpandactions=false){ | ||||
| 	asPages: async function*(path='.:$ARGS', strict=false, noexpandactions=false){ | ||||
| 		// options...
 | ||||
| 		var args = [...arguments] | ||||
| 		var opts = typeof(args.at(-1)) == 'object' ? | ||||
| @ -1389,7 +1381,7 @@ object.Constructor('Page', BasePage, { | ||||
| 			...opts, | ||||
| 			path: typeof(args[0]) == 'string' ? | ||||
| 				args.shift() | ||||
| 				: '.', | ||||
| 				: '.:$ARGS', | ||||
| 			strict: args.shift()  | ||||
| 				?? false, | ||||
| 		} | ||||
|  | ||||
| @ -315,7 +315,6 @@ module = { | ||||
| 	splitArgs: function(path){ | ||||
| 		path = this.normalize(path, 'string') | ||||
| 		var [path, ...args] = path.split(/(?<!\\):/g) | ||||
| 
 | ||||
| 		return { | ||||
| 			path, | ||||
| 			args: args.reduce(function(res, arg){ | ||||
|  | ||||
| @ -241,7 +241,8 @@ module.BaseStore = { | ||||
| 		/*/ | ||||
| 		path = pwpath.normalize(path, 'string') | ||||
| 		//*/
 | ||||
| 		return (await this.__exists__(path)) | ||||
| 		var {path, args} = pwpath.splitArgs(path) | ||||
| 		var res = (await this.__exists__(path)) | ||||
| 			// NOTE: all paths at this point and in store are 
 | ||||
| 			// 		absolute, so we check both with the leading 
 | ||||
| 			// 		'/' and without it to make things a bit more 
 | ||||
| @ -266,10 +267,15 @@ module.BaseStore = { | ||||
| 							: ('/'+ path))))  | ||||
| 					//*/
 | ||||
| 			// normalize the output...
 | ||||
| 			|| false }, | ||||
| 			|| false  | ||||
| 		if(!res){ | ||||
| 			return false } | ||||
| 		return pwpath.joinArgs(res, args) }, | ||||
| 	// find the closest existing alternative path...
 | ||||
| 	// XXX CACHED....
 | ||||
| 	find: async function(path, strict=false){ | ||||
| 		var {path, args} = pwpath.splitArgs(path) | ||||
| 		args = pwpath.joinArgs('', args) | ||||
| 		// build list of existing page candidates...
 | ||||
| 		var names = await this.names() | ||||
| 		var pages = new Set( | ||||
| @ -280,12 +286,12 @@ module.BaseStore = { | ||||
| 		// select accessible candidate...
 | ||||
| 		for(var p of pwpath.paths(path, !!strict)){ | ||||
| 			if(pages.has(p)){ | ||||
| 				return p } | ||||
| 				return p+args } | ||||
| 			p = p[0] == '/' ?  | ||||
| 				p.slice(1)  | ||||
| 				: '/'+p | ||||
| 			if(pages.has(p)){ | ||||
| 				return p } } }, | ||||
| 				return p+args } } }, | ||||
| 	/*/ | ||||
| 	find: async function(path, strict=false){ | ||||
| 		for(var p of pwpath.paths(path, !!strict)){ | ||||
| @ -317,12 +323,14 @@ module.BaseStore = { | ||||
| 		if(path.includes('*')  | ||||
| 				|| path.includes('**')){ | ||||
| 			var order = (this.metadata(path) ?? {}).order || [] | ||||
| 			var {path, args} = pwpath.splitArgs(path) | ||||
| 			args = pwpath.joinArgs('', args) | ||||
| 			// NOTE: we are matching full paths only here so leading and 
 | ||||
| 			// 		trainling '/' are optional...
 | ||||
| 			// NOTE: we ensure that we match full names and always split 
 | ||||
| 			// 		at '/' only...
 | ||||
| 			var pattern = new RegExp(`^\\/?${ | ||||
| 					pwpath.normalize(path, 'string') | ||||
| 					path | ||||
| 						.replace(/^\/|\/$/g, '') | ||||
| 						.replace(/\//g, '\\/') | ||||
| 						.replace(/\*\*/g, '.*') | ||||
| @ -353,7 +361,9 @@ module.BaseStore = { | ||||
| 									m[0].slice(1)  | ||||
| 									: m[0]) | ||||
| 						return res }, new Set())] | ||||
| 			   .sortAs(order) } | ||||
| 				.sortAs(order) | ||||
| 				.map(function(p){ | ||||
| 					return p+args })} | ||||
| 		// direct search...
 | ||||
| 		return this.find(path, strict) }, | ||||
| 	//
 | ||||
| @ -378,8 +388,9 @@ module.BaseStore = { | ||||
| 		// pattern match * / **
 | ||||
| 		if(path.includes('*')  | ||||
| 				|| path.includes('**')){ | ||||
| 			path = pwpath.split(path) | ||||
| 			var p = path.slice() | ||||
| 			var p = pwpath.splitArgs(path) | ||||
| 			var args = pwpath.joinArgs('', p.args) | ||||
| 			p = pwpath.split(p.path) | ||||
| 			var tail = [] | ||||
| 			while(!p.at(-1).includes('*')){ | ||||
| 				tail.unshift(p.pop()) } | ||||
| @ -387,7 +398,7 @@ module.BaseStore = { | ||||
| 			if(tail.length > 0){ | ||||
| 				return (await this.match(p.join('/'), strict)) | ||||
| 					.map(function(p){ | ||||
| 						return pwpath.join(p, tail) }) } } | ||||
| 						return pwpath.join(p, tail) + args }) } } | ||||
| 		// direct...
 | ||||
| 		return this.match(path, strict) }, | ||||
| 	// 
 | ||||
| @ -419,6 +430,7 @@ module.BaseStore = { | ||||
| 		// XXX SANITIZE...
 | ||||
| 		path = pwpath.sanitize(path, 'string') | ||||
| 		//*/
 | ||||
| 		var path = pwpath.splitArgs(path).path | ||||
| 		path = path.includes('*')  | ||||
| 			&& (energetic == true ? | ||||
| 				await this.find(path) | ||||
| @ -461,6 +473,7 @@ module.BaseStore = { | ||||
| 	// NOTE: setting/removing metadata is done via .update(..) / .delete(..)
 | ||||
| 	// NOTE: this uses .__get__(..) internally...
 | ||||
| 	metadata: async function(path, ...args){ | ||||
| 		path = pwpath.splitArgs(path).path | ||||
| 		// set...
 | ||||
| 		if(args.length > 0){ | ||||
| 			return this.update(path, ...args) } | ||||
| @ -491,6 +504,7 @@ module.BaseStore = { | ||||
| 			/*/ | ||||
| 			|| pwpath.normalize(path, 'string') | ||||
| 			//*/
 | ||||
| 		path = pwpath.splitArgs(path).path | ||||
| 		data = data instanceof Promise ? | ||||
| 			await data | ||||
| 			: data | ||||
| @ -517,6 +531,7 @@ module.BaseStore = { | ||||
| 		// read-only...
 | ||||
| 		if(this.__delete__ == null){ | ||||
| 			return this } | ||||
| 		path = pwpath.splitArgs(path).path | ||||
| 		path = await this.exists(path) | ||||
| 		if(path){ | ||||
| 			await this.__delete__(path) | ||||
|  | ||||
							
								
								
									
										18
									
								
								pwiki2.js
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								pwiki2.js
									
									
									
									
									
								
							| @ -19,6 +19,7 @@ | ||||
| * 		examples: | ||||
| * 			// NOTE: .text is redered via _view and thus is on a different
 | ||||
| *			//		level to .raw...
 | ||||
| * 			// XXX should renderer.args be the same in .text and .parse(..)???
 | ||||
| *			// XXX for .text and .parse(..), the action is called twice...
 | ||||
| * 			// root path: /System/testAction:a:b:c
 | ||||
| * 			await pwiki.get('/path/testDirect:x:y:z').raw | ||||
| @ -29,28 +30,23 @@ | ||||
| * 				.args			- x y z  | ||||
| * 				.renderer.args	- a b c | ||||
| * 				.root.args		- a b c | ||||
| * 			await pwiki.get('/path/testDirect:x:y:z').parse('@include(.)')  | ||||
| * 				.args			- empty | ||||
| * 			await pwiki.get('/path/testDirect:x:y:z').parse('@include(.:$ARGS)')  | ||||
| * 				.args			- x y z | ||||
| * 				.renderer.args	- a b c | ||||
| * 				.root.args		- a b c | ||||
| * 				XXX losing args on this path... | ||||
| * 				XXX triggered twice... | ||||
| * 			await pwiki.get('/path/testAction:x:y:z').parse('@include(.)')  | ||||
| * 				.args			- empty | ||||
| * 			await pwiki.get('/path/testAction:x:y:z').parse('@include(.:$ARGS)')  | ||||
| * 				.args			- x y z | ||||
| * 				.renderer.args	- a b c | ||||
| * 				.root.args		- a b c | ||||
| * 				XXX losing args on this path... | ||||
| * 				XXX triggered twice... | ||||
| * 			XXX .text uses .parse(..) internally... | ||||
| * 			await pwiki.get('/path/testDirect:x:y:z').text | ||||
| * 				.args			- empty | ||||
| * 				.args			- x y z | ||||
| * 				.renderer.args	- x y z | ||||
| * 				.root.args		- a b c | ||||
| * 				XXX args should be local... | ||||
| * 					... @include(.:$ARGS) not working??? | ||||
| * 				XXX triggered twice... | ||||
| * 			await pwiki.get('/path/testAction:x:y:z').text  | ||||
| * 				.args			- empty | ||||
| * 				.args			- x y z | ||||
| * 				.renderer.args	- x y z | ||||
| * 				.root.args		- a b c | ||||
| * 				XXX triggered twice... | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user