mirror of
https://github.com/flynx/pWiki.git
synced 2025-10-29 18:10:09 +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