Compare commits

..

3 Commits

Author SHA1 Message Date
54b7ae94ca notes...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2023-11-06 03:18:08 +03:00
df8d14690e more tweaking and notes...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2023-11-06 03:00:19 +03:00
8df290604c bugfix..
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2023-11-05 18:55:03 +03:00
2 changed files with 98 additions and 25 deletions

View File

@ -29,52 +29,84 @@ 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 it would be a better idea to do a binary search instead of a liner // XXX do a binary search??
// pass... var getCharOffset = function(elem, x, y, data){
// ...though b-search will get us to the target, we stll need to count... data = data ?? {}
var getCharOffset = function(elem, x, y, options={}){
var r = document.createRange() var r = document.createRange()
var elem_rect = data.elem_rect =
data.elem_rect
?? elem.getBoundingClientRect()
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, rect, cursor_line, col var c = data.c =
for(var i=0; i <= e.length; i++){ data.c
?? 0
var prev, rect, cursor_line, line_start, offset
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 = rect prev = rect
?? options.prev ?? data.prev
rect = r.getBoundingClientRect() rect = r.getBoundingClientRect()
// line change... // line change...
// NOTE: this is almost identical to .getTextOffsetAt(..) see // NOTE: this is almost identical to .getTextOffsetAt(..) see
// that for more docs... // that for more docs...
if(prev line_start = prev
&& prev.y != rect.y){ && prev.y != rect.y
if(line_start){
if(cursor_line){ if(cursor_line){
return col return offset
?? c + i - 2 } ?? c + i - 2 }
col = undefined } offset = undefined }
cursor_line = cursor_line =
rect.y <= y rect.y <= y
&& rect.bottom >= y && rect.bottom >= y
if(col == null if(offset == null
&& rect.x >= x){ && rect.x >= x){
col = (c + i == 0 // get closest edge of element under cursor...
|| Math.abs(rect.x - x) <= Math.abs(prev.x - x)) ? var dp = Math.abs(
(line_start ?
elem_rect
: prev).x
- x)
var dx = Math.abs(rect.x - x)
offset = dx <= dp ?
c + i c + i
: c + i - 1 : c + i - 1
if(cursor_line){ if(cursor_line){
return col } } } return offset } } }
options.c += c - 1 data.c += i
data.last = e.data[i-1]
// html node... // html node...
} else { } else {
options.prev = prev prev = data.prev =
options = getCharOffset(e, x, y, options) prev
if(typeof(options) != 'object'){ ?? data.prev
return options } } } // special case: line break between cursor line and next element...
if(prev
// cursor line...
&& prev.y <= y
&& prev.bottom >= y
// line break...
&& prev.y < e.getBoundingClientRect().y
// no whitespace at end, no compensation needed... (XXX test)
&& ' \t\n'.includes(data.last)){
return data.c - 1 }
// block element -- compensate for a lacking '\n'...
if(['block', 'table', 'flex', 'grid']
.includes(
getComputedStyle(e).display)){
data.c += 1 }
// handle the node...
data = getCharOffset(e, x, y, data)
if(typeof(data) != 'object'){
return data } } }
// no result was found... // no result was found...
console.log('---', data)
return data.c ?? data
return arguments.length > 3 ? return arguments.length > 3 ?
options data
: null } : null }
@ -87,12 +119,13 @@ var getCharOffset = function(elem, x, y, options={}){
// | // |
// markdown: '# Hea|ding' // markdown: '# Hea|ding'
// //
// XXX we are not checking both lengths of markdown AND text...
var getMarkdownOffset = function(markdown, text, i){ var getMarkdownOffset = function(markdown, text, i){
i = i ?? text.length i = i ?? text.length
var m = 0 var m = 0
// walk both strings skipping/counting non-matching stuff... // walk both strings skipping/counting non-matching stuff...
for(var n=0; n <= i; n++, m++){ for(var t=0; t <= i; t++, m++){
var c = text[n] var c = text[t]
var p = m var p = m
// walk to next match... // walk to next match...
while(c != markdown[m] && m < markdown.length){ while(c != markdown[m] && m < markdown.length){
@ -101,7 +134,7 @@ var getMarkdownOffset = function(markdown, text, i){
// entity, symbol, ...) // entity, symbol, ...)
if(m >= markdown.length){ if(m >= markdown.length){
m = p } } m = p } }
return m - n } return m - t }
@ -2041,6 +2074,7 @@ var Outline = {
var initial = elem.selectionStart var initial = elem.selectionStart
var c = getCharOffset(view, evt.clientX, evt.clientY) var c = getCharOffset(view, evt.clientX, evt.clientY)
var m = getMarkdownOffset(elem.value, view.innerText, c) var m = getMarkdownOffset(elem.value, view.innerText, c)
console.log('---', c, m)
// selecting an element with text offset by markup... // selecting an element with text offset by markup...
if(m != 0){ if(m != 0){
evt.preventDefault() evt.preventDefault()

View File

@ -48,6 +48,45 @@ var setup = function(){
- -
- ## Bugs: - ## Bugs:
focused:: true focused:: true
- BUG: caret positioning broken
- Example:
- text text text
<div>
block element
</div>
this line, and above placement of completely broken
- _this seems to be an issue with: `.getMarkdownOffset(..)`_
- ```
m = `text text text
<div>
block element
</div>
this line, and above placement of completely broken`
t = 'text text text\n\n\nblock element\n\n\nthis line, and above placement of completely broken '
getMarkdownOffset(m, t, 26)
```
this returns `69` while it should return `5`
_...replacing `\n\n\n` with `\n\n` seems to fix the issue (also works with spaces)_
(BUG also the above line is not italic -- can't reproduce)
- DONE clicking right of this line will select last line of block
```
text text text
```
this line, placement is offset by 2
- DONE text text text
_text text text_
text text text
- DONE M
M can't place cursor before first char
M
- BUG: parser: code blocks do not ignore single back-quotes...
- ```
x = `moo`
```
- _this also leads to double quoting of html..._
```
x = `<i>moo</i>`
```
- 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