mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-31 03:10:07 +00:00 
			
		
		
		
	Merge branch 'master' of github.com:flynx/ImageGrid
This commit is contained in:
		
						commit
						9d2698f06e
					
				| @ -107,10 +107,12 @@ var util = require('lib/util') | |||||||
| // 		-> list
 | // 		-> list
 | ||||||
| //
 | //
 | ||||||
| var normalizeSplit = function(args){ | var normalizeSplit = function(args){ | ||||||
| 	return ((args.length == 1 && args[0] instanceof Array) ?  | 	return ((args.length == 1  | ||||||
|  | 				&& args[0] instanceof Array) ?  | ||||||
| 			args.pop() | 			args.pop() | ||||||
| 			: args) | 			: args) | ||||||
| 		.slice() } | 		.slice() } | ||||||
|  | 
 | ||||||
| // Normalize return value from Object.processor.run(..)...
 | // Normalize return value from Object.processor.run(..)...
 | ||||||
| //
 | //
 | ||||||
| // 	Create processor...
 | // 	Create processor...
 | ||||||
| @ -128,10 +130,13 @@ var normalizeSplit = function(args){ | |||||||
| // NOTE: for an example see normalizeSplit(..) docs above.
 | // NOTE: for an example see normalizeSplit(..) docs above.
 | ||||||
| var normalizeRes = function(args){ | var normalizeRes = function(args){ | ||||||
| 	return function(value){ | 	return function(value){ | ||||||
| 		value = value || this | 		value = value  | ||||||
| 		return (args.length == 1 && !(args[0] instanceof Array)) ?  | 			|| this | ||||||
|  | 		return (args.length == 1  | ||||||
|  | 				&& !(args[0] instanceof Array)) ?  | ||||||
| 			value[0] | 			value[0] | ||||||
| 			: value } } | 			: value } } | ||||||
|  | 
 | ||||||
| // Normalize return value...
 | // Normalize return value...
 | ||||||
| //
 | //
 | ||||||
| // 	normalizeResValue(value, args)
 | // 	normalizeResValue(value, args)
 | ||||||
| @ -157,17 +162,21 @@ var makeSplitter = function(separator, unique){ | |||||||
| 				return tag.split(SP) }) | 				return tag.split(SP) }) | ||||||
| 			.flat() | 			.flat() | ||||||
|    			.run(function(){ |    			.run(function(){ | ||||||
| 				return unique ? this.unique() : this }) } } | 				return unique ?  | ||||||
|  | 					this.unique()  | ||||||
|  | 					: this }) } } | ||||||
| var makeJoiner = function(separator){ | var makeJoiner = function(separator){ | ||||||
| 	return function(...items){ | 	return function(...items){ | ||||||
| 		return normalizeSplit(items).join(this[separator]) } } | 		return normalizeSplit(items) | ||||||
|  | 			.join(this[separator]) } } | ||||||
| // Make iterator/reducer methods a-la Array.prototype.map(..) and friends
 | // Make iterator/reducer methods a-la Array.prototype.map(..) and friends
 | ||||||
| // and Array.prototype.reduce(..)....
 | // and Array.prototype.reduce(..)....
 | ||||||
| var makeIter = function(name, lister){ | var makeIter = function(name, lister){ | ||||||
| 	return function(tag, func){ | 	return function(tag, func){ | ||||||
| 		var args = [...arguments] | 		var args = [...arguments] | ||||||
| 		func = args.pop() | 		func = args.pop() | ||||||
| 		tag = args.pop() || '*' | 		tag = args.pop()  | ||||||
|  | 			|| '*' | ||||||
| 		var res = this[lister || 'directMatch'](tag)[name](func.bind(this))  | 		var res = this[lister || 'directMatch'](tag)[name](func.bind(this))  | ||||||
| 		return res == null ?  | 		return res == null ?  | ||||||
| 			this  | 			this  | ||||||
| @ -177,8 +186,10 @@ var makeReducer = function(lister){ | |||||||
| 		var args = [...arguments] | 		var args = [...arguments] | ||||||
| 		initial = args.pop() | 		initial = args.pop() | ||||||
| 		func = args.pop() | 		func = args.pop() | ||||||
| 		tag = args.pop() || '*' | 		tag = args.pop()  | ||||||
| 		return this[lister || 'directMatch'](tag).reduce(func.bind(this), initial) } } | 			|| '*' | ||||||
|  | 		return this[lister || 'directMatch'](tag) | ||||||
|  | 			.reduce(func.bind(this), initial) } } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 | ||||||
| @ -304,7 +315,9 @@ var BaseTagsClassPrototype = { | |||||||
| 					.join(PS) }) }, | 					.join(PS) }) }, | ||||||
| 	// get all the single tags that make up a compound tag...
 | 	// get all the single tags that make up a compound tag...
 | ||||||
| 	subTags: function(...tags){ | 	subTags: function(...tags){ | ||||||
| 		return this.splitTag(...tags).flat(Infinity) }, | 		return this | ||||||
|  | 			.splitTag(...tags) | ||||||
|  | 			.flat(Infinity) }, | ||||||
| 
 | 
 | ||||||
| 	normalizeTagStr: function(...tags){ | 	normalizeTagStr: function(...tags){ | ||||||
| 		var ILLEGAL_CHARS = this.TAG_ILLEGAL_CHARS | 		var ILLEGAL_CHARS = this.TAG_ILLEGAL_CHARS | ||||||
| @ -406,7 +419,8 @@ var BaseTagsClassPrototype = { | |||||||
| 			query  | 			query  | ||||||
| 			: query | 			: query | ||||||
| 				// split by strings whitespace and block comments...
 | 				// split by strings whitespace and block comments...
 | ||||||
| 				.split(this.__query_lexer || this.constructor.__query_lexer) | 				.split(this.__query_lexer  | ||||||
|  | 					|| this.constructor.__query_lexer) | ||||||
| 				// parse numbers...
 | 				// parse numbers...
 | ||||||
| 				// XXX do we need number parsing???
 | 				// XXX do we need number parsing???
 | ||||||
| 				.map(function(e){  | 				.map(function(e){  | ||||||
| @ -414,25 +428,30 @@ var BaseTagsClassPrototype = { | |||||||
| 					if(/^[-+]?[0-9]+\.[0-9]+$/.test(e)){ | 					if(/^[-+]?[0-9]+\.[0-9]+$/.test(e)){ | ||||||
| 						e = parseFloat(e) | 						e = parseFloat(e) | ||||||
| 					} else if(/^[-+]?[0-9]+$/.test(e)){ | 					} else if(/^[-+]?[0-9]+$/.test(e)){ | ||||||
| 						e = parseInt(e) | 						e = parseInt(e) } | ||||||
| 					} | 					return e }) | ||||||
| 					return e |  | ||||||
| 				}) |  | ||||||
| 				// remove undefined groups...
 | 				// remove undefined groups...
 | ||||||
| 				.filter(function(e){  | 				.filter(function(e){  | ||||||
| 					// NOTE: in JS 0 == '' is true ;)
 | 					// NOTE: in JS 0 == '' is true ;)
 | ||||||
| 					return e !== undefined && e !== '' }) | 					return e !== undefined  | ||||||
|  | 						&& e !== '' }) | ||||||
| 
 | 
 | ||||||
| 		var brace = function(code, b){ | 		var brace = function(code, b){ | ||||||
| 			var res = [] | 			var res = [] | ||||||
| 			while(code.length > 0){ | 			while(code.length > 0){ | ||||||
| 				var c = code.shift() | 				var c = code.shift() | ||||||
| 				if(c == '[' || c == '('){ | 				if(c == '[' || c == '('){ | ||||||
| 					res.push( brace(code, c == '[' ? ']' : ')') ) | 					res.push(  | ||||||
|  | 						brace( | ||||||
|  | 							code,  | ||||||
|  | 							c == '['  | ||||||
|  | 								? ']'  | ||||||
|  | 								: ')') ) | ||||||
| 				} else if(c == b){ | 				} else if(c == b){ | ||||||
| 					return res | 					return res | ||||||
| 				} else if(c == ']' || c == ')'){ | 				} else if(c == ']' || c == ')'){ | ||||||
| 					throw new SyntaxError(`.parseQuery(..): Unexpected "${c}".`) | 					throw new SyntaxError( | ||||||
|  | 						`.parseQuery(..): Unexpected "${c}".`) | ||||||
| 				} else { | 				} else { | ||||||
| 					res.push(c) } } | 					res.push(c) } } | ||||||
| 			if(b != null){ | 			if(b != null){ | ||||||
| @ -510,7 +529,8 @@ var BaseTagsPrototype = { | |||||||
| 	//
 | 	//
 | ||||||
| 	// This will combine .persistent and .definitionPaths()
 | 	// This will combine .persistent and .definitionPaths()
 | ||||||
| 	get persistentAll(){ | 	get persistentAll(){ | ||||||
| 		return (this.__persistent || new Set()) | 		return (this.__persistent  | ||||||
|  | 				|| new Set()) | ||||||
| 			.unite(this.definitionPaths()) }, | 			.unite(this.definitionPaths()) }, | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -641,7 +661,9 @@ var BaseTagsPrototype = { | |||||||
| 		} else if(typeof(cmp) == typeof(true)){ | 		} else if(typeof(cmp) == typeof(true)){ | ||||||
| 			no_definitions = cmp | 			no_definitions = cmp | ||||||
| 			cmp = null } | 			cmp = null } | ||||||
| 		b = b instanceof Set ? [...b] : b | 		b = b instanceof Set ?  | ||||||
|  | 			[...b]  | ||||||
|  | 			: b | ||||||
| 
 | 
 | ||||||
| 		// no given tags or multiple tags -> filter...
 | 		// no given tags or multiple tags -> filter...
 | ||||||
| 		if(b == null || b instanceof Array){ | 		if(b == null || b instanceof Array){ | ||||||
| @ -689,7 +711,8 @@ var BaseTagsPrototype = { | |||||||
| 			// NOTE: this does the same job as adding .definitions to 
 | 			// NOTE: this does the same job as adding .definitions to 
 | ||||||
| 			// 		.persistent but much much faster...
 | 			// 		.persistent but much much faster...
 | ||||||
| 			var expand = function(tags, res){ | 			var expand = function(tags, res){ | ||||||
| 				res = (res || new Set()).unite(tags) | 				res = (res || new Set()) | ||||||
|  | 					.unite(tags) | ||||||
| 
 | 
 | ||||||
| 				tags = tags | 				tags = tags | ||||||
| 					.map(function(tag){ | 					.map(function(tag){ | ||||||
| @ -835,7 +858,9 @@ var BaseTagsPrototype = { | |||||||
| 									: search(target, tag, seen.add(tag)) }, false) }, false) } | 									: search(target, tag, seen.add(tag)) }, false) }, false) } | ||||||
| 
 | 
 | ||||||
| 		var seen = new Set() | 		var seen = new Set() | ||||||
| 		var res = (quoted || root || base  | 		var res = (quoted  | ||||||
|  | 				|| root  | ||||||
|  | 				|| base  | ||||||
| 				|| b instanceof Array  | 				|| b instanceof Array  | ||||||
| 				|| b instanceof Set  | 				|| b instanceof Set  | ||||||
| 				|| typeof(b) == typeof('str')) ? | 				|| typeof(b) == typeof('str')) ? | ||||||
| @ -950,9 +975,12 @@ var BaseTagsPrototype = { | |||||||
| 				this.paths()  | 				this.paths()  | ||||||
| 				: this.normalize(normalizeSplit(tags))) | 				: this.normalize(normalizeSplit(tags))) | ||||||
| 			// sort by number of path elements (longest first)...
 | 			// sort by number of path elements (longest first)...
 | ||||||
| 			.map(function(tag){ return that.splitPath(tag) }) | 			.map(function(tag){  | ||||||
| 				.sort(function(a, b){ return b.length - a.length }) | 				return that.splitPath(tag) }) | ||||||
| 				.map(function(p){ return p.join(PS) }) | 			.sort(function(a, b){  | ||||||
|  | 				return b.length - a.length }) | ||||||
|  | 			.map(function(p){  | ||||||
|  | 				return p.join(PS) }) | ||||||
| 			// remove all paths in tail that match the current...
 | 			// remove all paths in tail that match the current...
 | ||||||
| 			.map(function(p, i, tags){ | 			.map(function(p, i, tags){ | ||||||
| 				// skip []...
 | 				// skip []...
 | ||||||
| @ -1028,8 +1056,10 @@ var BaseTagsPrototype = { | |||||||
| 		// get tags of specific value...
 | 		// get tags of specific value...
 | ||||||
| 		} else if(value){ | 		} else if(value){ | ||||||
| 			return Object.entries(this.__index || {}) | 			return Object.entries(this.__index || {}) | ||||||
| 				.filter(function(e){ return e[1].has(value) }) | 				.filter(function(e){  | ||||||
| 				.map(function(e){ return e[0] }) | 					return e[1].has(value) }) | ||||||
|  | 				.map(function(e){  | ||||||
|  | 					return e[0] }) | ||||||
| 				.flat() | 				.flat() | ||||||
| 				.unique() | 				.unique() | ||||||
| 
 | 
 | ||||||
| @ -1041,7 +1071,9 @@ var BaseTagsPrototype = { | |||||||
| 				.unique() } }, | 				.unique() } }, | ||||||
| 	// Same as .tags(..) but returns a list of single tags...
 | 	// Same as .tags(..) but returns a list of single tags...
 | ||||||
| 	singleTags: function(value, ...tags){ | 	singleTags: function(value, ...tags){ | ||||||
| 		return this.subTags(this.tags(...arguments)).unique() }, | 		return this | ||||||
|  | 			.subTags(this.tags(...arguments)) | ||||||
|  | 			.unique() }, | ||||||
| 	paths: function(value){ | 	paths: function(value){ | ||||||
| 		var PP = this.PATH_SEPARATOR_PATTERN | 		var PP = this.PATH_SEPARATOR_PATTERN | ||||||
| 		return this.tags(value) | 		return this.tags(value) | ||||||
| @ -1067,7 +1099,8 @@ var BaseTagsPrototype = { | |||||||
| 				.filter(function(e){  | 				.filter(function(e){  | ||||||
| 					return tag == '*'  | 					return tag == '*'  | ||||||
| 						|| that.match(tag, e[0]) }) | 						|| that.match(tag, e[0]) }) | ||||||
| 				.map(function(s){ return [...s[1]] }) | 				.map(function(s){  | ||||||
|  | 					return [...s[1]] }) | ||||||
| 				.flat() | 				.flat() | ||||||
|    				.unique() }, |    				.unique() }, | ||||||
| 
 | 
 | ||||||
| @ -1185,7 +1218,10 @@ var BaseTagsPrototype = { | |||||||
| 				return that.isPattern(tag) ?  | 				return that.isPattern(tag) ?  | ||||||
| 					// resolve tag patterns...
 | 					// resolve tag patterns...
 | ||||||
| 					// XXX is .match(..) to broad here???
 | 					// XXX is .match(..) to broad here???
 | ||||||
| 					that.match(tag, local ? tags : null)  | 					that.match(tag,  | ||||||
|  | 						local ?  | ||||||
|  | 							tags  | ||||||
|  | 							: null)  | ||||||
| 					: tag }) | 					: tag }) | ||||||
| 			.flat(Infinity) | 			.flat(Infinity) | ||||||
| 
 | 
 | ||||||
| @ -1195,12 +1231,12 @@ var BaseTagsPrototype = { | |||||||
| 				// do the untagging...
 | 				// do the untagging...
 | ||||||
| 				.forEach(function(tag){ | 				.forEach(function(tag){ | ||||||
| 					if(!(tag in index)){ | 					if(!(tag in index)){ | ||||||
| 						return | 						return } | ||||||
| 					} |  | ||||||
| 
 | 
 | ||||||
| 					var s = value == '*' ? | 					var s = value == '*' ? | ||||||
| 						new Set() | 						new Set() | ||||||
| 						: (index[tag] || new Set()).subtract(value) | 						: (index[tag]  | ||||||
|  | 							|| new Set()).subtract(value) | ||||||
| 
 | 
 | ||||||
| 					// remove empty sets...
 | 					// remove empty sets...
 | ||||||
| 					if(s.size == 0){ | 					if(s.size == 0){ | ||||||
| @ -1208,8 +1244,7 @@ var BaseTagsPrototype = { | |||||||
| 
 | 
 | ||||||
| 					// update...
 | 					// update...
 | ||||||
| 					} else { | 					} else { | ||||||
| 						index[tag] = s | 						index[tag] = s } | ||||||
| 					} |  | ||||||
| 				}), this) }, | 				}), this) }, | ||||||
| 	//
 | 	//
 | ||||||
| 	//	Toggle tag for each values...
 | 	//	Toggle tag for each values...
 | ||||||
| @ -1252,7 +1287,10 @@ var BaseTagsPrototype = { | |||||||
| 		// NOTE: this is cheating -- if tag is a list it will get 
 | 		// NOTE: this is cheating -- if tag is a list it will get 
 | ||||||
| 		// 		stringified before the test...
 | 		// 		stringified before the test...
 | ||||||
| 		var pattern = this.isPattern(tag) | 		var pattern = this.isPattern(tag) | ||||||
| 		var ntag = this.normalize(tag instanceof Array ? tag : [tag]) | 		var ntag = this.normalize( | ||||||
|  | 			tag instanceof Array ?  | ||||||
|  | 				tag  | ||||||
|  | 				: [tag]) | ||||||
| 
 | 
 | ||||||
| 		// can't set pattern as tag...
 | 		// can't set pattern as tag...
 | ||||||
| 		if(pattern && action == 'on'){ | 		if(pattern && action == 'on'){ | ||||||
| @ -1280,7 +1318,10 @@ var BaseTagsPrototype = { | |||||||
| 				.reduce(function(res, v){ | 				.reduce(function(res, v){ | ||||||
| 					var state = that.tags(v, tag) | 					var state = that.tags(v, tag) | ||||||
| 
 | 
 | ||||||
| 					res.res.push(state ? 'off' : 'on') | 					res.res.push( | ||||||
|  | 						state ?  | ||||||
|  | 							'off'  | ||||||
|  | 							: 'on') | ||||||
| 					state ? | 					state ? | ||||||
| 						res.untag.push(v) | 						res.untag.push(v) | ||||||
| 						: res.tag.push(v) | 						: res.tag.push(v) | ||||||
| @ -1633,11 +1674,14 @@ var BaseTagsPrototype = { | |||||||
| 	//
 | 	//
 | ||||||
| 	//
 | 	//
 | ||||||
| 	togglePersistent: function(...tags){ | 	togglePersistent: function(...tags){ | ||||||
| 		action = ['on', 'off', 'toggle', '?'].includes(tags[tags.length-1]) ? | 		action = ['on', 'off', 'toggle', '?'] | ||||||
| 			tags.pop() | 			.includes(tags[tags.length-1]) ? | ||||||
| 			: 'toggle' | 				tags.pop() | ||||||
|  | 				: 'toggle' | ||||||
| 		tags = normalizeSplit(tags) | 		tags = normalizeSplit(tags) | ||||||
| 		var persistent = this.persistent = this.persistent || new Set() | 		var persistent = this.persistent =  | ||||||
|  | 			this.persistent  | ||||||
|  | 				|| new Set() | ||||||
| 		return this.normalize(tags) | 		return this.normalize(tags) | ||||||
| 			.map(function(tag){ | 			.map(function(tag){ | ||||||
| 				return action == 'on' ? | 				return action == 'on' ? | ||||||
| @ -1917,10 +1961,15 @@ var BaseTagsPrototype = { | |||||||
| 			return prefix == null ? | 			return prefix == null ? | ||||||
| 				list | 				list | ||||||
| 				: list | 				: list | ||||||
| 					.reduce(function(res, e){ | 					.reduce( | ||||||
| 						return res[res.length-1] == prefix ? | 						function(res, e){ | ||||||
| 							res.slice(0, -1).concat(e instanceof Array ? e : [e]) | 							return res[res.length-1] == prefix ? | ||||||
| 							: res.concat([e]) }, []) | 								res.slice(0, -1).concat( | ||||||
|  | 									e instanceof Array ?  | ||||||
|  | 										e  | ||||||
|  | 										: [e]) | ||||||
|  | 								: res.concat([e]) },  | ||||||
|  | 						[]) | ||||||
| 					.filter(function(e){ | 					.filter(function(e){ | ||||||
| 						return e != prefix }) } | 						return e != prefix }) } | ||||||
| 		// Query Language pre-processor...
 | 		// Query Language pre-processor...
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user