Editor.prototype.oncreateparagraph = function(e){ e.preventDefault(); var selection = window.getSelection(); var range = selection.getRangeAt(); // if there's a range: Delete the entire selection, // and just delete the selected part of the last paragraph, // leaving cursor at the beggining of that paragraph. if (!range.collapsed) { return deleteParagraphsOnEnter.call(this, range); } var currentParagraph = cursorWithin('p'); // get content after range var clone = document.createRange(); clone.selectNodeContents(currentParagraph); clone.setStart(range.endContainer, range.endOffset); var after = clone.extractContents(); var txt = after.textContent; clone.detach(); var p = createParagraph.call(this, txt && txt.trim()); dom(p).insertAfter(currentParagraph); selectionRange(p, 0); // we need to bind event listener for when user starts typing, and we // can then remove our br. };
function deleteParagraphsOnEnter(range){ var paragraphs = withinSelection('p'); // If we have a selection, but not multiple paragraphs, // then we need to build a new paragraph out of // the text after the selection. if (paragraphs.length < 2) { var clone = range.cloneRange(); var within = cursorWithin('p'); clone.setEndAfter(within.lastChild); var after = contentAfterSelection(within, range); var p = createParagraph.call(this, after); dom(p).insertAfter(within); clone.extractContents(); clone.detach(); selectionRange(p, 0); return; } selectionRange(paragraphs[paragraphs.length - 1], 0); var extract = range.extractContents(); // remove old paragraphs for (var i = 1; i < paragraphs.length; i++) { var p = dom(paragraphs[i]); this.emit('removed paragraph', p.attr('name'), p); } }
Editor.prototype.ontab = function(e){ var selection = window.getSelection(); var range = selection.getRangeAt(0); if (!range.startOffset && !range.endOffset) { var parent = cursorWithin('p'); dom(parent).addClass('ingredient'); e.preventDefault(); } };
Paragraphs.prototype.current = function(){ var range = selection.getRangeAt(0); var within = function(){ var p = cursorWithin('p'); return p ? [this.get(p.getAttribute('name'))] : []; }.bind(this); console.log(cursorWithin('p')); if (range.collapsed) return within(); var ps = withinSelection('p'); if (ps.length) { return ps.map(function(el){ return this.get(el.getAttribute('name')); }, this); } else { return within(); } }
function deleteParagraph(range){ var el = cursorWithin('p'); if (!el) return; var $el = dom(el); var $previous = $el.previous(); if (!$previous.length) return; var previousTextLength = $previous.text().length; // if collapsing 2 paragraphs, combine our html, or ideally we // should create a new range and insert our node there. var txt = $el.text(); if (txt) $previous.html($previous.html() + $el.html()); // destroy our current p $el.remove(); this.emit('removed paragraph', $el.attr('name'), $el); // restore cursor selectionRange($previous[0], previousTextLength); return $el; }
var within = function(){ var p = cursorWithin('p'); return p ? [this.get(p.getAttribute('name'))] : []; }.bind(this);