tuning...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2023-10-19 15:35:42 +03:00
parent 1842223a79
commit dea1a6d7ff
2 changed files with 21 additions and 5 deletions

View File

@ -6,6 +6,7 @@
//--------------------------------------------------------------------- //---------------------------------------------------------------------
// Helpers...
// XXX do a caret api... // XXX do a caret api...
@ -44,7 +45,15 @@ 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 might be a good idea to tweak this just a bit (1/2 letter) to the left... // XXX it would be a better idea to do a binary search instead of a liner
// pass... but at this point this is not critical (unless we get
// gigantic blocks)
// XXX this misbehaves on boondies between text/node elements...
// Example:
// '# Heading with _Italics_'
// ^ ^
// clicking in the marked areas will either land the cursor at
// the last char of one block or after the first in the second...
// XXX HACK -- is there a better way to do this??? // XXX HACK -- is there a better way to do this???
var getCharOffset = function(elem, x, y, c){ var getCharOffset = function(elem, x, y, c){
c = c ?? 0 c = c ?? 0
@ -52,15 +61,20 @@ var getCharOffset = function(elem, x, y, c){
for(var e of [...elem.childNodes]){ for(var e of [...elem.childNodes]){
// text node... // text node...
if(e instanceof Text){ if(e instanceof Text){
for(var i=0; i < e.length; i++){ var prev, b
for(var i=0; i <= e.length; i++){
r.setStart(e, i) r.setStart(e, i)
r.setEnd(e, i) r.setEnd(e, i)
var b = r.getBoundingClientRect() prev = b
b = r.getBoundingClientRect()
// found target... // found target...
if(b.x >= x if(b.x >= x
&& b.y <= y && b.y <= y
&& b.bottom >= y){ && b.bottom >= y){
return c + i } } // get the closest gap between chars to the click...
return Math.abs(b.x - x) <= Math.abs(prev.x - x) ?
c + i
: c + i - 1 } }
c += i c += i
// html node... // html node...
} else { } else {
@ -1341,6 +1355,7 @@ var Outline = {
elem.selectionEnd = elem.value.length elem.selectionEnd = elem.value.length
} else { } else {
var m = getMarkdownOffset(elem.value, view.innerText, c) var m = getMarkdownOffset(elem.value, view.innerText, c)
console.log('---', c, m)
elem.focus() elem.focus()
elem.selectionStart = c + m elem.selectionStart = c + m
elem.selectionEnd = c + m } } }) elem.selectionEnd = c + m } } })

View File

@ -50,7 +50,8 @@ var setup = function(){
- ## ToDo: - ## ToDo:
- ASAP: scroll into view is bad... - ASAP: scroll into view is bad...
- ASAP: mobile browsers behave quite chaotically ignoring parts of the styling... - ASAP: mobile browsers behave quite chaotically ignoring parts of the styling...
- ASAP: tweak the getCharOffset(..) by about 1/2 a letter to the left... - ASAP: `getCharOffset(..)` needs more tuning...
- gaps between nested nodes and text are off -- see code for notes...
- FEATURE: read-only mode - FEATURE: read-only mode
- export html - export html
- embed css - embed css