mirror of
				https://github.com/flynx/diff.js.git
				synced 2025-10-29 19:10:11 +00:00 
			
		
		
		
	working on support for sliced arrays...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									5673ecad97
								
							
						
					
					
						commit
						c8f6173f76
					
				
							
								
								
									
										93
									
								
								diff.js
									
									
									
									
									
								
							
							
						
						
									
										93
									
								
								diff.js
									
									
									
									
									
								
							| @ -31,7 +31,13 @@ | |||||||
| var EMPTY = {type: 'EMPTY'} | var EMPTY = {type: 'EMPTY'} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | //---------------------------------------------------------------------
 | ||||||
| // Helpers...
 | // Helpers...
 | ||||||
|  | 
 | ||||||
|  | // XXX need to account for array insertions...
 | ||||||
|  | // 		i.e. in the current state if a long array gets an item(s) spliced 
 | ||||||
|  | // 		in/out, a really big diff will be produced simply moving all 
 | ||||||
|  | // 		subsequent items by a fixed number of positions...
 | ||||||
| // XXX should we handle properties???
 | // XXX should we handle properties???
 | ||||||
| var _diff_items = function(diff, A, B, options, filter){ | var _diff_items = function(diff, A, B, options, filter){ | ||||||
| 	// JSON mode -> ignore attr order...
 | 	// JSON mode -> ignore attr order...
 | ||||||
| @ -94,6 +100,84 @@ var _diff_item_order = function(diff, A, B, options, filter){ | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | // Format:
 | ||||||
|  | // 	Map([
 | ||||||
|  | // 		[<value>, [<index>, ...]],
 | ||||||
|  | // 		...
 | ||||||
|  | // 	])
 | ||||||
|  | var makeIndex = function(L){ | ||||||
|  | 	return L | ||||||
|  | 		.reduce(function(res, e, i){  | ||||||
|  | 			res.has(e) ?  | ||||||
|  | 				res.get(e).push(i)  | ||||||
|  | 				: res.set(e, [i]) | ||||||
|  | 			return res  | ||||||
|  | 		}, new Map()) } | ||||||
|  | 
 | ||||||
|  | // get common chuncs...
 | ||||||
|  | // XXX Optimize search tree...
 | ||||||
|  | // 		...worst case: 12345 / 54321
 | ||||||
|  | // XXX need to balance the minimum number of chunks and maximum number 
 | ||||||
|  | // 		of elements here...
 | ||||||
|  | // XXX add chunk offsets to results...
 | ||||||
|  | var getCommonSections = function(A, B, a, b, min_chunk){ | ||||||
|  | 	a = a || 0 | ||||||
|  | 	b = b || 0 | ||||||
|  | 	min_chunk = min_chunk || 2 | ||||||
|  | 
 | ||||||
|  | 	// get common chunk...
 | ||||||
|  | 	var l = 0 | ||||||
|  | 	var chunk = [] | ||||||
|  | 	while(a+l < A.length  | ||||||
|  | 			&& b+l < B.length | ||||||
|  | 			&& A[a+l] == B[b+l]){ | ||||||
|  | 		chunk.push(A[a+l]) | ||||||
|  | 		l++ | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// discard small chunks...
 | ||||||
|  | 	if(l < min_chunk){ | ||||||
|  | 		chunk = [] | ||||||
|  | 		l = 0 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// get next chunks...
 | ||||||
|  | 	// XXX this repeats checks, need to optimize...
 | ||||||
|  | 	var L = A.length > a+l + min_chunk ?  | ||||||
|  | 		getCommonSections(A, B, l+a+1, l+b, min_chunk)  | ||||||
|  | 		: [0] | ||||||
|  | 	var R = B.length > b+l + min_chunk ?  | ||||||
|  | 		getCommonSections(A, B, l+a, l+b+1, min_chunk)  | ||||||
|  | 		: [0] | ||||||
|  | 
 | ||||||
|  | 	// select the best chunk-set...
 | ||||||
|  | 	// XXX need to balance the minimum number of chunks and maximum 
 | ||||||
|  | 	// 		number of elements here...
 | ||||||
|  | 	var next = L[0] == R[0] ?  | ||||||
|  | 			(L.length < R.length ? L : R) | ||||||
|  | 		: L[0] > R[0] ?  | ||||||
|  | 			L  | ||||||
|  | 		: R | ||||||
|  | 
 | ||||||
|  | 	return next[0] > 0 && l > 0 ?  | ||||||
|  | 			[l + next[0], chunk].concat(next.slice(1))  | ||||||
|  | 		: l > 0 ?  | ||||||
|  | 			[l, chunk] | ||||||
|  | 		: next | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | // XXX this would require a new diff structure...
 | ||||||
|  | // 		...might be a good idea to treat this as an index diff...
 | ||||||
|  | var _diff_arrays = function(diff, A, B, options){ | ||||||
|  | 	var A_index = makeIndex(A)  | ||||||
|  | 	var B_index = makeIndex(B)  | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //---------------------------------------------------------------------
 | ||||||
|  | //
 | ||||||
| // Format:
 | // Format:
 | ||||||
| // 	- no difference...
 | // 	- no difference...
 | ||||||
| // 		null
 | // 		null
 | ||||||
| @ -134,6 +218,7 @@ var _diff_item_order = function(diff, A, B, options, filter){ | |||||||
| // NOTE: this will include direct links to items.
 | // NOTE: this will include direct links to items.
 | ||||||
| // XXX check seen -- avoid recursion...
 | // XXX check seen -- avoid recursion...
 | ||||||
| // XXX revise format...
 | // XXX revise format...
 | ||||||
|  | // XXX support Map(..) and other new-style types...
 | ||||||
| var _diff = | var _diff = | ||||||
| function(A, B, options){ | function(A, B, options){ | ||||||
| 	options = options || {} | 	options = options || {} | ||||||
| @ -204,7 +289,9 @@ function(A, B, options){ | |||||||
| 			// XXX .__proto___ (???)
 | 			// XXX .__proto___ (???)
 | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		return ((res.item_order || []).length + (res.items || []).length) == 0 ? null : res | 		return ((res.item_order || []).length + (res.items || []).length) == 0 ?  | ||||||
|  | 			null  | ||||||
|  | 			: res | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -257,15 +344,19 @@ function(diff, res, path){ | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | //---------------------------------------------------------------------
 | ||||||
| var diff = | var diff = | ||||||
| module.diff =  | module.diff =  | ||||||
| function(A, B, options){ | function(A, B, options){ | ||||||
|  | 	// XXX
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| var patch = | var patch = | ||||||
| module.patch =  | module.patch =  | ||||||
| function(diff, obj){ | function(diff, obj){ | ||||||
|  | 	// XXX
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user