JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
implement real up-arrow key
[peach-html5-editor.git] / editor.coffee
index a9d0a3c..9b4ad4f 100644 (file)
@@ -388,13 +388,15 @@ 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_prev = n?
+       found_prev = null
        found = null
        traverse_tree tree, (node) ->
                if node.type is 'text'
+                       unless n?
+                               found = node
+                               return true
                        if node is n
-                               if found_prev?
-                                       found = found_prev
+                               found = found_prev # null if n is the first text node
                                return true
                        found_prev = node
                return false
@@ -739,6 +741,47 @@ class PeachHTML5Editor
                                                        break
                                return false
                        when KEY_UP
+                               if @cursor?
+                                       new_cursor = @cursor
+                                       old_loc = cursor_to_xyh new_cursor[0], new_cursor[1]
+                                       new_loc = x: old_loc.x, y: old_loc.y
+                                       while new_loc.y >= old_loc.y
+                                               new_cursor = find_prev_cursor_position @tree, new_cursor[0], new_cursor[1]
+                                               return false unless new_cursor?
+                                               new_loc = cursor_to_xyh new_cursor[0], new_cursor[1]
+                                       if new_cursor?
+                                               # now we're above
+                                               if new_loc.x <= old_loc.x
+                                                       @move_cursor new_cursor
+                                                       return false
+                                               target_y = new_loc.y
+                                               # search leftward, until we find the closest position
+                                               while new_loc.x > old_loc.x and new_loc.y is target_y
+                                                       prev_loc = new_loc
+                                                       prev_cursor = new_cursor
+                                                       new_cursor = find_prev_cursor_position @tree, new_cursor[0], new_cursor[1]
+                                                       break unless new_cursor?
+                                                       new_loc = cursor_to_xyh new_cursor[0], new_cursor[1]
+                                               # move cursor to prev_cursor or new_cursor
+                                               if new_cursor?
+                                                       if new_loc.y is target_y
+                                                               # both valid, and on the same line, use closest
+                                                               if (old_loc.x - new_loc.x) < (prev_loc.x - old_loc.x)
+                                                                       @move_cursor new_cursor
+                                                               else
+                                                                       @move_cursor prev_cursor
+                                                       else
+                                                               # new_cursor on wrong line, use prev_cursor
+                                                               @move_cursor prev_cursor
+                                               else
+                                                       # can't go any further prev, use prev_cursor
+                                                       @move_cursor prev_cursor
+                               else
+                                       # move cursor to first position in document
+                                       new_cursor = find_prev_cursor_position @tree
+                                       if new_cursor?
+                                               @move_cursor new_cursor
+                                               break
                                return false
                        when KEY_RIGHT
                                if @cursor?
@@ -746,11 +789,11 @@ class PeachHTML5Editor
                                        if new_cursor?
                                                @move_cursor new_cursor
                                else
-                                       for c in @tree
-                                               new_cursor = find_prev_cursor_position @tree, c, -1
-                                               if new_cursor?
-                                                       @move_cursor new_cursor
-                                                       break
+                                       # move cursor to first position in document
+                                       new_cursor = find_prev_cursor_position @tree
+                                       if new_cursor?
+                                               @move_cursor new_cursor
+                                               break
                                return false
                        when KEY_DOWN
                                return false