bugfix + refactoring...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2023-11-05 03:15:13 +03:00
parent 38e90d6071
commit 0ed930231d
3 changed files with 31 additions and 36 deletions

View File

@ -29,52 +29,55 @@ function clickPoint(x,y){
// box corresponds the to desired coordinates. This accounts for nested
// 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
// pass...
// ...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, c){
c = c ?? 0
var getCharOffset = function(elem, x, y, options={}){
var r = document.createRange()
for(var e of [...elem.childNodes]){
var c = options.c ?? 0
// text node...
if(e instanceof Text){
var prev, b
var prev, rect, cursor_line, col
for(var i=0; i <= e.length; i++){
r.setStart(e, i)
r.setEnd(e, i)
prev = b
b = r.getBoundingClientRect()
// found target...
if(b.x >= x
&& b.y <= y
&& b.bottom >= y){
// get the closest gap between chars to the click...
return (!prev
|| Math.abs(b.x - x) <= Math.abs(prev.x - x)) ?
prev = rect
?? options.prev
rect = r.getBoundingClientRect()
// line change...
// NOTE: this is almost identical to .getTextOffsetAt(..) see
// that for more docs...
if(prev
&& prev.y != rect.y){
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 - 1 } }
c += i - 1
: c + i - 1
if(cursor_line){
return col } } }
options.c += c - 1
// html node...
} else {
var res = getCharOffset(e, x, y, c)
if(!(res instanceof Array)){
return res }
;[c, res] = res } }
options.prev = prev
options = getCharOffset(e, x, y, options)
if(typeof(options) != 'object'){
return options } } }
// no result was found...
return arguments.length > 3 ?
[c, null]
options
: 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...
//
// v <----- position

View File

@ -198,7 +198,6 @@ HTMLTextAreaElement.prototype.getTextOffsetAt = function(x, y){
// cursor col -- set once per line...
if(col == null
&& ox <= rect.x - clone.x){
// XXX not sure about this test...
col = (ox > 0
|| i == 0) ?
i

View File

@ -48,13 +48,6 @@ var setup = function(){
-
- ## Bugs:
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...
- FF:
- zooming on edited field