X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=editor.coffee;h=0d6e761be9c2f2e2383e4d638f381927ea49bce0;hb=7d1268a16a6de4cf42178315beef913331309feb;hp=e3b922e4a80ed78fadf11c3d5718a869daf4860d;hpb=7eb32af0eb10fd084b9179b1a266bd5236caebc9;p=peach-html5-editor.git diff --git a/editor.coffee b/editor.coffee index e3b922e..0d6e761 100644 --- a/editor.coffee +++ b/editor.coffee @@ -19,20 +19,17 @@ TYPE_TEXT = peach_parser.TYPE_TEXT TYPE_COMMENT = peach_parser.TYPE_COMMENT TYPE_DOCTYPE = peach_parser.TYPE_DOCTYPE -# text nodes don't have getBoundingClientRect(), so wrap it in a span, measure -# and then put it back +# text nodes don't have getBoundingClientRect(), so use selection api to find +# it. get_text_bounding_rect = (el) -> - span = el.ownerDocument.createElement 'span' - el.parentNode.replaceChild span, el - span.appendChild el - ret = span.getBoundingClientRect() - span.parentNode.replaceChild el, span - return ret get_el_bounds = (el) -> - if el.getBoundingClientRect + if el.getBoundingClientRect? rect = el.getBoundingClientRect() else - rect = get_text_bounding_rect el + # text nodes don't have getBoundingClientRect(), so use range api + range = document.createRange() + range.selectNodeContents el + rect = range.getBoundingClientRect() doc = el.ownerDocument.documentElement win = el.ownerDocument.defaultView y_fix = win.pageYOffset - doc.clientTop @@ -174,17 +171,15 @@ css += 'height: 1em;' css += 'width: 2px;' css += 'margin-left: -1px;' css += 'margin-right: -1px;' -css += 'background: #000;' -css += '-webkit-animation: 1s blink step-end infinite;' -css += 'animation: 1s blink step-end infinite;' +css += 'background: #444;' +css += '-webkit-animation: blink 1s steps(2, start) infinite;' +css += 'animation: blink 1s steps(2, start) infinite;' css += '}' -css += '@-webkit-keyframes "blink" {' -css += 'from, to { background: #000; }' -css += '50% { background: transparent; }' +css += '@-webkit-keyframes blink {' +css += 'to { visibility: hidden; }' css += '}' -css += '@keyframes "blink" {' -css += 'from, to { background: #000; }' -css += '50% { background: transparent; }' +css += '@keyframes blink {' +css += 'to { visibility: hidden; }' css += '}' # key codes: @@ -231,7 +226,11 @@ traverse_tree = (tree, state, cb) -> # TODO make it so cursor can go places that don't have text but could find_next_cursor_position = (tree, n, i) -> if n? and n.type is TYPE_TEXT and n.text.length > i - return [n, i + 1] + orig_xyh = cursor_to_xyh n, i + for next_i in [i+1 .. n.text.length] # inclusive is valid (after last char) + next_xyh = cursor_to_xyh n, next_i + if next_xyh.x > orig_xyh.x or next_xyh.y > orig_xyh.y + return [n, next_i] found = traverse_tree tree, before: n?, (node, state) -> if node.type is TYPE_TEXT and state.before is false state.node = node @@ -245,6 +244,11 @@ find_next_cursor_position = (tree, n, i) -> # TODO make it so cursor can go places that don't have text but could find_prev_cursor_position = (tree, n, i) -> if n? and n.type is TYPE_TEXT and i > 0 + orig_xyh = cursor_to_xyh n, i + for prev_i in [i-1 .. 0] + prev_xyh = cursor_to_xyh n, prev_i + if prev_xyh.x < orig_xyh.x or prev_xyh.y < orig_xyh.y + return [n, prev_i] return [n, i - 1] found = traverse_tree tree, before: n?, (node, state) -> if node.type is TYPE_TEXT @@ -389,8 +393,18 @@ class PeachHTML5Editor when KEY_END return false when KEY_BACKSPACE + return false unless @cursor? + return false unless @cursor[1] > 0 + @cursor[0].text = @cursor[0].text.substr(0, @cursor[1] - 1) + @cursor[0].text.substr(@cursor[1]) + @cursor[0].el.nodeValue = @cursor[0].text + @move_cursor [@cursor[0], @cursor[1] - 1] return false when KEY_DELETE + return false unless @cursor? + return false unless @cursor[1] < @cursor[0].text.length + @cursor[0].text = @cursor[0].text.substr(0, @cursor[1]) + @cursor[0].text.substr(@cursor[1] + 1) + @cursor[0].el.nodeValue = @cursor[0].text + @move_cursor [@cursor[0], @cursor[1]] return false when KEY_ENTER return false @@ -448,7 +462,6 @@ class PeachHTML5Editor @clear_dom() instantiate_tree @tree, @idoc.body move_cursor: (cursor) -> - return if @cursor? and cursor? and @cursor[0] is cursor[0] and @cursor[1] is cursor[1] @cursor = cursor # replace cursor, to reset blink animation if @cursor_visible