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 // 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

View File

@ -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

View File

@ -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