mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-31 11:20:09 +00:00 
			
		
		
		
	experimenting with jQ.fn.transform(..) -- appears to do what I need but not yet fully featured + need to revise...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									62d5b45e7f
								
							
						
					
					
						commit
						d0d2f108db
					
				| @ -77,71 +77,67 @@ function(path){ | |||||||
| 
 | 
 | ||||||
| /*********************************************************************/ | /*********************************************************************/ | ||||||
| 
 | 
 | ||||||
|  | // func -> [{attr|alt: unit, ..}, ..]
 | ||||||
| var _transform_parse = { | var _transform_parse = { | ||||||
| 	// 2d transforms:
 | 	// 2d transforms:
 | ||||||
| 	//martix: [],
 | 	//martix: [],
 | ||||||
| 
 | 
 | ||||||
| 	translate: ['left|0', 'top|0'], | 	translate: [{'left|0': 'px', 'top|0': 'px'}], | ||||||
| 	translateX: ['left'], | 	translateX: [{'left|x': 'px'}], | ||||||
| 	translateY: ['top'], | 	translateY: [{'top|y': 'px'}], | ||||||
| 
 | 
 | ||||||
| 	scale: [ | 	scale: [ | ||||||
| 		['scale'], | 		{scale: null}, | ||||||
| 		['scaleX|scale', 'scaleY|scale'], | 		{'scaleX|scale': null, 'scaleY|scale': null}, | ||||||
| 	], | 	], | ||||||
| 	scaleX: ['scaleX'], | 	scaleX: [{'scaleX': null}], | ||||||
| 	scaleY: ['scaleY'], | 	scaleY: [{'scaleY': null}], | ||||||
| 
 | 
 | ||||||
| 	rotate: ['rotate'], | 	rotate: [{'rotate': 'deg'}], | ||||||
| 	 | 	 | ||||||
| 	skew: ['skewX', 'skewY'], | 	skew: [{'skewX': 'px', 'skewY': 'px'}], | ||||||
| 	skewX: ['skewX'], | 	skewX: [{'skewX': 'px'}], | ||||||
| 	skewY: ['skewY'], | 	skewY: [{'skewY': 'px'}], | ||||||
| 
 | 
 | ||||||
| 	// 3d transforms:
 | 	// 3d transforms:
 | ||||||
| 	//martix3d: [],
 | 	//martix3d: [],
 | ||||||
| 
 | 
 | ||||||
| 	translate3d: ['x|0', 'y|0', 'z|0'], | 	translate3d: [{'x|0': 'px', 'y|0': 'px', 'z|0': 'px'}], | ||||||
| 	translateZ: ['z'], | 	translateZ: [{'z': 'px'}], | ||||||
| 
 | 
 | ||||||
| 	scale3d: ['scaleX', 'scaleY', 'scaleZ'], | 	scale3d: [{'scaleX': null, 'scaleY': null, 'scaleZ': null}], | ||||||
| 	scaleZ: ['scaleZ'], | 	scaleZ: [{'scaleZ': null}], | ||||||
| 
 | 
 | ||||||
| 	// XXX
 | 	// XXX
 | ||||||
| 	//rotate3d: [x, y, z, angle],
 | 	//rotate3d: [x, y, z, angle]],
 | ||||||
| 	// 	rotateX
 | 	// 	rotateX
 | ||||||
| 	// 	rotateY
 | 	// 	rotateY
 | ||||||
| 	// 	rotateZ
 | 	// 	rotateZ
 | ||||||
| 	 | 	 | ||||||
| 	perspective: ['perspective'], | 	perspective: [{'perspective': null}], | ||||||
| } | } | ||||||
| var _transform_parse_rev = {} | 
 | ||||||
|  | 
 | ||||||
|  | // attr -> [alt, ..]
 | ||||||
|  | var _transform_parse_alt = {} | ||||||
|  | // attr -> [func, ..]
 | ||||||
|  | var _transform_parse_func = {} | ||||||
| Object.keys(_transform_parse).forEach(function(func){ | Object.keys(_transform_parse).forEach(function(func){ | ||||||
| 	var args = _transform_parse[func] | 	_transform_parse[func].forEach(function(variant){ | ||||||
|  | 		Object.keys(variant).forEach(function(arg){ | ||||||
|  | 			var alt = arg.split(/\|/g) | ||||||
|  | 			var arg = alt.shift() | ||||||
| 
 | 
 | ||||||
| 	// we got multiple signatures == merge...
 | 			_transform_parse_func[arg] = _transform_parse_func[arg] || [] | ||||||
| 	if(!(args[0] instanceof Array)){ | 			_transform_parse_func[arg].push(func) | ||||||
| 		args = [args] | 			_transform_parse_alt[arg] = _transform_parse_alt[arg] || [] | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	args | 			if(alt.length > 0){ | ||||||
| 		// merge lists of args...
 | 				_transform_parse_alt[arg] = (_transform_parse_alt[alt] || []) | ||||||
| 		.reduce(function(a, b){ return [].concat.call(a, b) }) | 					.concat(alt) | ||||||
| 					.unique() | 					.unique() | ||||||
| 		// split alternatives...
 | 			} | ||||||
| 		.map(function(a){ return a.split(/\|/g) }) | 		}) | ||||||
| 		.forEach(function(a){ |  | ||||||
| 			var arg = a[0] |  | ||||||
| 			var alt = a.slice(1) |  | ||||||
| 
 |  | ||||||
| 			var e = _transform_parse_rev[arg] = _transform_parse_rev[arg] || {} |  | ||||||
| 
 |  | ||||||
| 			e.funcs = e.funcs || [] |  | ||||||
| 			e.funcs.indexOf(func) < 0 && e.funcs.push(func) |  | ||||||
| 
 |  | ||||||
| 			e.alt = e.alt || [] |  | ||||||
| 			// XXX we explicitly support only one alternative now...
 |  | ||||||
| 			e.alt = e.alt.concat(alt).unique() |  | ||||||
| 	}) | 	}) | ||||||
| }) | }) | ||||||
| 
 | 
 | ||||||
| @ -188,16 +184,19 @@ jQuery.fn.transform = function(){ | |||||||
| 	var origin_str = elem.style[prefix + 'transformOrigin'] | 	var origin_str = elem.style[prefix + 'transformOrigin'] | ||||||
| 	var transform_str = elem.style[prefix + 'transform'] | 	var transform_str = elem.style[prefix + 'transform'] | ||||||
| 
 | 
 | ||||||
|  | 	// origin...
 | ||||||
|  | 	var origin = origin_str | ||||||
|  | 		.split(/\s+/) | ||||||
|  | 		// XXX add this to transform...
 | ||||||
|  | 
 | ||||||
| 	// build the current state...
 | 	// build the current state...
 | ||||||
| 	// NOTE: we'll need this for both fetching (parsing) and writing 
 | 	// NOTE: we'll need this for both fetching (parsing) and writing 
 | ||||||
| 	// 		(checking)...
 | 	// 		(checking)...
 | ||||||
| 	var transform = {} | 	var transform = {} | ||||||
| 	var functions = {} | 	var functions = {} | ||||||
| 
 | 	var attrs = {} | ||||||
| 	// origin...
 | 	//var implicit = {}
 | ||||||
| 	var origin = origin_str | 	//var implicit_attrs = {}
 | ||||||
| 		.split(/\s+/) |  | ||||||
| 		// XXX add this to transform...
 |  | ||||||
| 
 | 
 | ||||||
| 	// transform...
 | 	// transform...
 | ||||||
| 	transform_str | 	transform_str | ||||||
| @ -223,20 +222,24 @@ jQuery.fn.transform = function(){ | |||||||
| 
 | 
 | ||||||
| 			// we do not know this function...
 | 			// we do not know this function...
 | ||||||
| 			if(spec == null){ | 			if(spec == null){ | ||||||
| 				transform[func] = args | 				transform[func] = [args] | ||||||
| 
 | 
 | ||||||
| 			} else { | 			} else { | ||||||
| 				spec = spec[0] instanceof Array ? spec : [spec] | 				var seen = [] | ||||||
| 				spec.forEach(function(s){  | 				transform[func] = [] | ||||||
|  | 				var proc = function(res, attrs, explicit){ | ||||||
|  | 					return function(s){  | ||||||
|  | 						var keys = Object.keys(s) | ||||||
| 						// skip non-matching signatures...
 | 						// skip non-matching signatures...
 | ||||||
| 						// XXX is this correct???
 | 						// XXX is this correct???
 | ||||||
| 					if(s.length != args.length){ | 						if(explicit && keys.length != args.length){ | ||||||
| 							return | 							return | ||||||
| 						} | 						} | ||||||
| 					s.forEach(function(e, i){  | 
 | ||||||
| 						// this is for things that have optional arguments
 | 						var data = {} | ||||||
| 						// like scale(..)
 | 						res.push(data) | ||||||
| 						// XXX should we treat this in some special way???
 | 
 | ||||||
|  | 						keys.forEach(function(e, i){ | ||||||
| 							if(args[i] == null){ | 							if(args[i] == null){ | ||||||
| 								return | 								return | ||||||
| 							} | 							} | ||||||
| @ -244,121 +247,135 @@ jQuery.fn.transform = function(){ | |||||||
| 							var alternatives = e.split(/\|/g) | 							var alternatives = e.split(/\|/g) | ||||||
| 							var k = alternatives.shift().trim() | 							var k = alternatives.shift().trim() | ||||||
| 
 | 
 | ||||||
| 						transform[k] = args[i].slice(-2) == 'px'  | 							var val = args[i].slice(-2) == 'px'  | ||||||
| 								|| /[0-9\.]+/.test(args[i]) ? | 									|| /^[0-9\.]+$/.test(args[i]) ? | ||||||
| 								parseFloat(args[i])  | 								parseFloat(args[i])  | ||||||
| 								: args[i]  | 								: args[i]  | ||||||
|  | 
 | ||||||
|  | 							var unit = args[i].split(val+'').pop() | ||||||
|  | 
 | ||||||
|  | 							attrs[k] = function(v, d){ | ||||||
|  | 								v = v || val | ||||||
|  | 								d = d || data | ||||||
|  | 
 | ||||||
|  | 								// set attrs -- for getting data...
 | ||||||
|  | 								d[k] = v | ||||||
|  | 								// set funcs -- for setting data...
 | ||||||
|  | 								functions[func][i] = typeof(v) == typeof('str') ? | ||||||
|  | 									v | ||||||
|  | 									: v + unit | ||||||
|  | 
 | ||||||
|  | 								return v | ||||||
|  | 							} | ||||||
|  | 							attrs[k]() | ||||||
| 						}) | 						}) | ||||||
| 				}) | 					} | ||||||
|  | 				} | ||||||
|  | 				spec.forEach(proc(transform[func], attrs, true)) | ||||||
| 			} | 			} | ||||||
| 		}) | 		}) | ||||||
| 
 | 
 | ||||||
|  | 	// handler origin...
 | ||||||
|  | 	if(origin_str != ''){ | ||||||
|  | 		transform['origin'] = [origin_str.split(/\s+/g) | ||||||
|  | 			.map(function(e){ | ||||||
|  | 				return e.slice(-2) == 'px'  | ||||||
|  | 						|| /^[0-9\.]+$/.test(e) ? | ||||||
|  | 					parseFloat(e)  | ||||||
|  | 					: e  | ||||||
|  | 			})] | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	// get data...
 | 	// get data...
 | ||||||
|  | 	// 	functions -> transform
 | ||||||
| 	if(args.constructor === Array){ | 	if(args.constructor === Array){ | ||||||
| 		var res = {} | 		var res = {} | ||||||
| 
 | 
 | ||||||
| 		// return the full transform...
 | 		// get everything set...
 | ||||||
| 		if(args.length == 0){ | 		if(args.length == 0){ | ||||||
| 			return transform | 			Object.keys(attrs).forEach(function(k){ attrs[k](null, res) }) | ||||||
|  | 			return res | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		args.forEach(function(arg){ | 		args.forEach(function(arg){ | ||||||
| 			// direct match in shorthand data...
 | 			do { | ||||||
|  | 				// we got an explicitly defined attr name...
 | ||||||
|  | 				if(arg in attrs){ | ||||||
|  | 					res[arg] = attrs[arg]() | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				// we got a explicit function name...
 | ||||||
| 				if(arg in transform){ | 				if(arg in transform){ | ||||||
| 				res[arg] = transform[arg] | 					res[arg] = transform[arg][0] | ||||||
| 
 | 					break | ||||||
| 			// try and find an alias...
 |  | ||||||
| 			} else if(arg in _transform_parse_rev){ |  | ||||||
| 				var funcs = _transform_parse_rev[arg].funcs |  | ||||||
| 				var alt = _transform_parse_rev[arg].alt[0] |  | ||||||
| 
 |  | ||||||
| 				// no alternatives...
 |  | ||||||
| 				if(!alt){ |  | ||||||
| 					res[arg] = '' |  | ||||||
| 
 |  | ||||||
| 				// explicit number value...
 |  | ||||||
| 				} else if(/^[0-9\.]+$/.test(alt)){ |  | ||||||
| 					res[arg] = parseFloat(alt) |  | ||||||
| 
 |  | ||||||
| 				// explicit string value...
 |  | ||||||
| 				} else if(/^(['"]).*\1$/.test(alt)){ |  | ||||||
| 					res[arg] = alt.slice(1, -1) |  | ||||||
| 
 |  | ||||||
| 				} else { |  | ||||||
| 					var v = $(that).transform(alt) |  | ||||||
| 					res[arg] = v == '' ? alt : v |  | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 
 | 				// we got an implicitly defined function...
 | ||||||
| 			// collect from function...
 | 				if(arg in _transform_parse){ | ||||||
| 			} else if(arg in _transform_parse){ | 					// XXX
 | ||||||
| 				var v = res[arg] = {} |  | ||||||
| 				_transform_parse[arg].forEach(function(e){ |  | ||||||
| 					var alternatives = e.split(/\|/g) |  | ||||||
| 					var k = alternatives.shift().trim() |  | ||||||
| 
 |  | ||||||
| 					v[k] = transform[k] != null ? transform[k] : '' |  | ||||||
| 				}) |  | ||||||
| 
 |  | ||||||
| 			// don't know about this attr...
 |  | ||||||
| 			} else { |  | ||||||
| 				res[arg] = '' |  | ||||||
| 				} | 				} | ||||||
|  | 
 | ||||||
|  | 				// search for aliases...
 | ||||||
|  | 				if(arg in _transform_parse_alt){ | ||||||
|  | 					arg = _transform_parse_alt[arg][0]  | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				break | ||||||
|  | 			} while(arg in _transform_parse_alt  | ||||||
|  | 				|| arg in attrs  | ||||||
|  | 				|| arg in transform) | ||||||
| 		}) | 		}) | ||||||
| 		 | 		 | ||||||
| 		// special case: we asked for a single value...
 |  | ||||||
| 		if(args.length == 1){ | 		if(args.length == 1){ | ||||||
| 			return res[args[0]] | 			return res[Object.keys(res)[0]] | ||||||
| 		} | 		} | ||||||
| 		return res | 		return res | ||||||
| 	 | 	 | ||||||
| 	// set data...
 | 	// set data...
 | ||||||
|  | 	// 	transform -> functions
 | ||||||
| 	} else { | 	} else { | ||||||
| 		transform = Object.create(transform) | 		Object.keys(args).forEach(function(arg){ | ||||||
| 		Object.keys(args).forEach(function(key){ | 			var val = args[arg] | ||||||
| 			// the changing value already exists...
 | 
 | ||||||
| 			if(key in transform | 			// special case: origin...
 | ||||||
| 					// get one of the shorthand keys...
 | 			if(arg == 'origin'){ | ||||||
| 					// NOTE: we might need to pack or re-pack the date but we 
 | 				transform['origin'] = val | ||||||
| 					// 		can't decide here...
 | 
 | ||||||
| 					|| key in _transform_parse_rev | 			// full function...
 | ||||||
| 					// got one of the standard keys...
 | 			} else if(arg in _transform_parse){ | ||||||
| 					|| key in _transform_parse){ | 				if(val == ''){ | ||||||
| 				transform[key] = args[key] | 					delete functions[arg] | ||||||
| 
 | 
 | ||||||
| 			// key undefined...
 |  | ||||||
| 				} else { | 				} else { | ||||||
| 				console.warn('Ignoring key "%s".', key) | 					val = val instanceof Array ? val : [val] | ||||||
| 				transform[key] = args[key] | 					var units = _transform_parse[arg] | ||||||
|  | 						.filter(function(s){  | ||||||
|  | 							return Object.keys(s).length == val.length })[0] | ||||||
|  | 					functions[arg] = val.map(function(a, i){  | ||||||
|  | 						var u = units[Object.keys(units)[i]] || '' | ||||||
|  | 						return typeof(a) != typeof('str') ? a + u : a }) | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 			// got an arg...
 | ||||||
|  | 			} else if(arg in attrs){ | ||||||
|  | 				attrs[arg](val) | ||||||
| 			} | 			} | ||||||
| 		}) | 		}) | ||||||
| 
 | 
 | ||||||
|  | 		elem.style.transform = Object.keys(functions) | ||||||
|  | 			.map(function(func){ | ||||||
|  | 				return func +'('+ functions[func].join(', ') + ')' | ||||||
|  | 			}) | ||||||
|  | 			.join(' ') | ||||||
| 
 | 
 | ||||||
| 		console.log('>>>>', transform) | 		elem.style.transformOrigin = transform['origin'] != '' ? | ||||||
| 
 | 			transform['origin'] | ||||||
| 		// XXX set new values and resolve new functions...
 | 				.map(function(e){ | ||||||
| 		// XXX
 | 					return typeof(e) == typeof('str') ? e : e + 'px' | ||||||
| 		 | 				}).join(' ') | ||||||
| 
 | 			: '' | ||||||
| 		// build the value string...
 |  | ||||||
| 		var transform_str = '' |  | ||||||
| 		for(var f in functions){ |  | ||||||
| 			transform_str += f +'(' |  | ||||||
| 				+(functions[f] |  | ||||||
| 					// XXX test if px value...
 |  | ||||||
| 					.map(function(e){ return typeof(e) == typeof(123) ? e + 'px' : e }) |  | ||||||
| 					.join(', '))+') ' |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		console.log(transform_str) |  | ||||||
| 
 |  | ||||||
| 		// XXX STUB
 |  | ||||||
| 		return functions |  | ||||||
| 
 |  | ||||||
| 		// set the values...
 |  | ||||||
| 		elem.style.transform = transform_str |  | ||||||
| 		elem.style.transformOrigin = origin_str |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return $(this) | 	return $(this) | ||||||
| @ -372,9 +389,11 @@ jQuery.fn.scale = function(value){ | |||||||
| 		return $(this).transform('scale') | 		return $(this).transform('scale') | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| jQuery.fn.origin = function(value){ | jQuery.fn.origin = function(a, b, c){ | ||||||
| 	if(value){ | 	if(a && b && c){ | ||||||
| 		return $(this).transform({origin: value}) | 		return $(this).transform({origin: [a, b, c]}) | ||||||
|  | 	} else if(a == '' || a instanceof Array){ | ||||||
|  | 		return $(this).transform({origin: a}) | ||||||
| 	} else { | 	} else { | ||||||
| 		return $(this).transform('origin') | 		return $(this).transform('origin') | ||||||
| 	} | 	} | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user