@options = options ? {}
@in_el = in_el
@tree = null
+ @tree_parent = null # top-level nodes in @tree should have this .parent
@matting = []
@init_1_called = false # when iframes have loaded
@outer_iframe # iframe to hold editor
return unless cur_block.parent?
cur_block = cur_block.parent
# find array to insert new element into
- if cur_block.parent?.el?
- parent_el = cur_block.parent.el
- pc = cur_block.parent.children
- else
+ if cur_block.parent is @tree_parent # top-level
parent_el = @idoc.body
pc = @tree
+ else
+ parent_el = cur_block.parent.el
+ pc = cur_block.parent.children
# find index of current block in its parent
for n, i in pc
break if n is cur_block
new_node.el = domify @idoc, p: style: 'white-space: pre-wrap', children: [new_text.el]
pc.splice i, 0, new_node
parent_el.insertBefore new_node.el, before
+ @changed()
new_cursor = new_cursor_position n: new_text, i: 0
throw 'bork bork' unless new_cursor?
@move_cursor new_cursor
return
load_html: (html) ->
@tree = peach_parser.parse html, @parser_opts
+ @tree_parent = @tree[0]?.parent
@clear_dom()
instantiate_tree @tree, @idoc.body
tree_dedup_space @tree
if needle is n.attrs.style.substr n.attrs.style.length - needle
n.attrs.style = n.attrs.style.substr 0, n.attrs.style.length - needle
n.el.setAttribute n.attrs.style
+ # detect special case: typing before a space that's the only thing in a block/doc
+ # reason: enter key creates blocks with just a space in them
+ insert_should_replace: (n, i) ->
+ return false unless i is 0
+ return false unless n.text is ' '
+ return true if n.parent is @tree_parent
+ if n.parent.children.length is 1
+ if n.parent.children[0] is n
+ # n is only child
+ return true
+ return false
# after calling this, you MUST call changed() and adjust_whitespace_style()
insert_character: (n, i, char) ->
+ return if @cursor.n.parent is @tree_parent # top-level text not supported atm
parent = @cursor.n.parent
- return unless parent
- return unless parent.el?
# insert the character
- if i is 0
- # special case: typing before a space that's the only thing in a block/doc
- # reason: enter key creates blocks with just a space in them
- special_case = false
- if n.text is ' '
- if n.parent?.el?
- if n.parent.children.length is 1
- if n.parent.children[0] is n
- special_case = true
- else
- special_case = true
- if special_case
- n.text = char
- else
- n.text = char + n.text
+ if @insert_should_replace n, i
+ n.text = char
+ else if i is 0
+ n.text = char + n.text
else if i is n.text.length
# replace the space
n.text += char