From e1cb7bde7741f06ee23ba076557a300cf66b603f Mon Sep 17 00:00:00 2001 From: Jason Woofenden Date: Tue, 8 Mar 2016 13:15:21 -0500 Subject: [PATCH] remove empty text nodes, code cleanup --- editor.coffee | 92 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 55 insertions(+), 37 deletions(-) diff --git a/editor.coffee b/editor.coffee index 07bf2c7..c70ebbe 100644 --- a/editor.coffee +++ b/editor.coffee @@ -318,17 +318,18 @@ instantiate_tree = (tree, parent) -> for i in remove tree.splice i, 1 -traverse_tree = (tree, state, cb) -> +traverse_tree = (tree, cb) -> + done = false for c in tree - cb c, state - break if state.done? + done = cb c + return done if done if c.children.length - traverse_tree c.children, state, cb - break if state.done? - return state + done = traverse_tree c.children, cb + return done if done + return done find_next_cursor_position = (tree, n, i) -> - if n? and n.type is TYPE_TEXT and n.text.length > i + if n.type is TYPE_TEXT and n.text.length > i orig_xyh = cursor_to_xyh n, i unless orig_xyh? console.log "ERROR: couldn't find xy for current cursor location" @@ -338,15 +339,18 @@ find_next_cursor_position = (tree, n, i) -> if next_xyh? 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_before = true + found = null + traverse_tree tree, (node, state) -> + if node.type is TYPE_TEXT and state_before is false if cursor_to_xyh(node, 0)? - state.node = node - state.done = true + found = node + return true if node is n - state.before = false - if found.node? - return [found.node, 0] + state_before = false + return false + if found? + return [found, 0] return null find_prev_cursor_position = (tree, n, i) -> @@ -361,23 +365,19 @@ find_prev_cursor_position = (tree, n, 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) -> + found_prev = n? + found = null + traverse_tree tree, (node) -> if node.type is TYPE_TEXT - unless n? - state.node = node - state.done = true if node is n - if state.prev? - state.node = state.prev - state.done = true - if node - state.prev = node - if found.node? - ret = [found.node, found.node.text.length] - # check for unusual case: text not visible - loc = cursor_to_xyh ret[0], ret[1] - if loc? - return ret + if found_prev? + found = found_prev + return true + found_prev = node + return false + if found? + if cursor_to_xyh found, found.text.length # text visible? + return [found, found.text.length] return find_prev_cursor_position tree, ret[0], 0 return null @@ -445,6 +445,28 @@ is_space_code = (char_code) -> is_space = (chr) -> return is_space_code chr.charCodeAt 0 +tree_remove_empty_text_nodes = (tree) -> + empties = [] + traverse_tree tree, (n) -> + if n.type is TYPE_TEXT + if n.text.length is 0 + empties.unshift n + return false + console.log empties + for n in empties + # don't completely empty the tree + if tree.length is 1 + if tree[0].type is TYPE_TEXT + console.log "oop, leaving a blank node because it's the only thing" + return + n.el.parentNode.removeChild n.el + console.log 'removing' + for c, i in n.parent.children + if c is n + n.parent.children.splice i, 1 + console.log 'removed' + break + # pass a array of nodes (from parser library, ie it should have .el and .text) tree_dedup_space = (tree) -> prev = cur = next = null @@ -454,6 +476,8 @@ tree_dedup_space = (tree) -> first = true removed_char = null + tree_remove_empty_text_nodes(tree) + iterate = (tree, cb) -> for n in tree if n.type is TYPE_TEXT @@ -527,14 +551,6 @@ tree_dedup_space = (tree) -> return put_it_back() #else # console.log "removing space becase space after it is collapsed" - # if there's no prev or next (single space inside a block-level element?) check - # TODO scrapt this, or fix it so it works when there's no parent - # if prev is null and next is null - # new_parent_px = cur.parent.el.getBoundingClientRect() - # if new_parent_px.left isnt parent_px.left or new_parent_px.top isnt parent_px.top or new_parent_px.right isnt parent_px.right or new_parent_px.bottom isnt parent_px.bottom - # console.log "WEIRD: parent moved" - # return put_it_back() - # we didn't put it back return true # pass null at start/end of display:block queue = (n, i) -> @@ -563,6 +579,8 @@ tree_dedup_space = (tree) -> iterate tree, queue queue null + tree_remove_empty_text_nodes(tree) + class PeachHTML5Editor # Options: (all optional) # editor_id: "id" attribute for outer-most element created by/for editor -- 1.7.10.4