mirror of
				https://github.com/flynx/pWiki.git
				synced 2025-10-31 02:50:08 +00:00 
			
		
		
		
	bugfix + refactoring...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
		
							parent
							
								
									38e90d6071
								
							
						
					
					
						commit
						0ed930231d
					
				| @ -29,52 +29,55 @@ function clickPoint(x,y){ | |||||||
| // box corresponds the to desired coordinates. This accounts for nested 
 | // box corresponds the to desired coordinates. This accounts for nested 
 | ||||||
| // elements.
 | // elements.
 | ||||||
| //
 | //
 | ||||||
| // XXX with multi-line text when clicking outside the text to the left/right
 |  | ||||||
| // 		need to select the appropriate line...
 |  | ||||||
| // XXX it would be a better idea to do a binary search instead of a liner 
 | // XXX it would be a better idea to do a binary search instead of a liner 
 | ||||||
| // 		pass...
 | // 		pass...
 | ||||||
| // 		...though b-search will get us to the target, we stll need to count...
 | // 		...though b-search will get us to the target, we stll need to count...
 | ||||||
| // XXX HACK -- is there a better way to do this???
 | var getCharOffset = function(elem, x, y, options={}){ | ||||||
| var getCharOffset = function(elem, x, y, c){ |  | ||||||
| 	c = c ?? 0 |  | ||||||
| 	var r = document.createRange() | 	var r = document.createRange() | ||||||
| 	for(var e of [...elem.childNodes]){ | 	for(var e of [...elem.childNodes]){ | ||||||
|  | 		var c = options.c ?? 0 | ||||||
| 		// text node...
 | 		// text node...
 | ||||||
| 		if(e instanceof Text){ | 		if(e instanceof Text){ | ||||||
| 			var prev, b | 			var prev, rect, cursor_line, col | ||||||
| 			for(var i=0; i <= e.length; i++){ | 			for(var i=0; i <= e.length; i++){ | ||||||
| 				r.setStart(e, i) | 				r.setStart(e, i) | ||||||
| 				r.setEnd(e, i) | 				r.setEnd(e, i) | ||||||
| 				prev = b | 				prev = rect  | ||||||
| 				b = r.getBoundingClientRect() | 					?? options.prev | ||||||
| 				// found target...
 | 				rect = r.getBoundingClientRect() | ||||||
| 				if(b.x >= x  | 				// line change...
 | ||||||
| 						&& b.y <= y  | 				// NOTE: this is almost identical to .getTextOffsetAt(..) see
 | ||||||
| 						&& b.bottom >= y){ | 				// 		that for more docs...
 | ||||||
| 					// get the closest gap between chars to the click...
 | 				if(prev  | ||||||
| 					return (!prev  | 						&& prev.y != rect.y){ | ||||||
| 							|| Math.abs(b.x - x) <= Math.abs(prev.x - x)) ? | 					if(cursor_line){ | ||||||
|  | 						return col  | ||||||
|  | 							?? c + i - 2 }  | ||||||
|  | 					col = undefined } | ||||||
|  | 				cursor_line =  | ||||||
|  | 					rect.y <= y  | ||||||
|  | 						&& rect.bottom >= y | ||||||
|  | 				if(col == null | ||||||
|  | 						&& rect.x >= x){ | ||||||
|  | 					col = (c + i == 0  | ||||||
|  | 							|| Math.abs(rect.x - x) <= Math.abs(prev.x - x)) ? | ||||||
| 						c + i | 						c + i | ||||||
| 						: c + i - 1 } } | 						: c + i - 1 | ||||||
| 			c += i - 1 | 					if(cursor_line){ | ||||||
|  | 						return col } } } | ||||||
|  | 			options.c += c - 1 | ||||||
| 		// html node...
 | 		// html node...
 | ||||||
| 		} else { | 		} else { | ||||||
| 			var res = getCharOffset(e, x, y, c) | 			options.prev = prev | ||||||
| 			if(!(res instanceof Array)){ | 			options = getCharOffset(e, x, y, options) | ||||||
| 				return res }  | 			if(typeof(options) != 'object'){ | ||||||
| 			;[c, res] = res } } | 				return options } } } | ||||||
| 	// no result was found...
 | 	// no result was found...
 | ||||||
| 	return arguments.length > 3 ? | 	return arguments.length > 3 ? | ||||||
| 		[c, null] | 		options | ||||||
| 		: null } | 		: null } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| var getTextAreaOffset = function(elem, x, y){ |  | ||||||
| 	return elem.getTextGeometry(function(res, elem){ |  | ||||||
| 		// XXX this will not work as it needs correct placement of elem under the cursor...
 |  | ||||||
| 		return getCharOffset(elem, x, y) }) } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| // Get offset in markdown relative to the resulting text...
 | // Get offset in markdown relative to the resulting text...
 | ||||||
| //                     
 | //                     
 | ||||||
| //					    v <----- position
 | //					    v <----- position
 | ||||||
|  | |||||||
| @ -198,7 +198,6 @@ HTMLTextAreaElement.prototype.getTextOffsetAt = function(x, y){ | |||||||
| 		// cursor col -- set once per line...
 | 		// cursor col -- set once per line...
 | ||||||
| 		if(col == null  | 		if(col == null  | ||||||
| 				&& ox <= rect.x - clone.x){ | 				&& ox <= rect.x - clone.x){ | ||||||
| 			// XXX not sure about this test...
 |  | ||||||
| 			col = (ox > 0  | 			col = (ox > 0  | ||||||
| 					|| i == 0) ? | 					|| i == 0) ? | ||||||
| 				i | 				i | ||||||
|  | |||||||
| @ -48,13 +48,6 @@ var setup = function(){ | |||||||
|   -  |   -  | ||||||
| - ## Bugs: | - ## Bugs: | ||||||
|   focused:: true |   focused:: true | ||||||
|   - BUG? clicking a block right of the lines places the cursor at end of last line -- should be the end of the cursor line (see: `.getTextOffsetAt(..)`) |  | ||||||
|     - example click right of the text: |  | ||||||
|       - example text |  | ||||||
|         example text |  | ||||||
|         example text |  | ||||||
|         example text |  | ||||||
|     - _appears that the initial caret placement is correct, but then it gets moved to the end of the block..._ |  | ||||||
|   - BUG: mobile browsers behave quite chaotically ignoring parts of the styling... |   - BUG: mobile browsers behave quite chaotically ignoring parts of the styling... | ||||||
|     - FF: |     - FF: | ||||||
|       - zooming on edited field |       - zooming on edited field | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user