From cf1024d01686e7731ae571b058252e853ca5cd69 Mon Sep 17 00:00:00 2001 From: Dale Ma Date: Tue, 6 Sep 2016 22:49:10 -0700 Subject: [PATCH] add willhandlenewline hook --- src/js/editor/editor.js | 16 ++++++++++++++++ tests/acceptance/basic-editor-test.js | 14 ++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/js/editor/editor.js b/src/js/editor/editor.js index 5e7a7d290..0091c75c7 100644 --- a/src/js/editor/editor.js +++ b/src/js/editor/editor.js @@ -63,6 +63,7 @@ const CALLBACK_QUEUES = { DID_RENDER: 'didRender', WILL_DELETE: 'willDelete', DID_DELETE: 'didDelete', + WILL_HANDLE_NEWLINE: 'willHandleNewline', CURSOR_DID_CHANGE: 'cursorDidChange', DID_REPARSE: 'didReparse', POST_DID_CHANGE: 'postDidChange', @@ -339,6 +340,13 @@ class Editor { return; } } + + // Above logic might delete redundant range, so callback must run after it. + let defaultPrevented = false; + const event = { preventDefault() { defaultPrevented = true; } }; + this.runCallbacks(CALLBACK_QUEUES.WILL_HANDLE_NEWLINE, [event]); + if (defaultPrevented) { return; } + cursorSection = postEditor.splitSection(range.head)[1]; postEditor.setRange(cursorSection.headPosition()); }); @@ -786,6 +794,14 @@ class Editor { this.addCallback(CALLBACK_QUEUES.DID_DELETE, callback); } + /** + * @param {Function} callback This callback will be called before handling new line. + * @public + */ + willHandleNewline(callback) { + this.addCallback(CALLBACK_QUEUES.WILL_HANDLE_NEWLINE, callback); + } + /** * @param {Function} callback This callback will be called every time the cursor * position (or selection) changes. diff --git a/tests/acceptance/basic-editor-test.js b/tests/acceptance/basic-editor-test.js index 74757b764..74239ff6c 100644 --- a/tests/acceptance/basic-editor-test.js +++ b/tests/acceptance/basic-editor-test.js @@ -210,3 +210,17 @@ test('keypress events when the editor does not have selection are ignored', (ass done(); }); }); + +test('prevent handling newline', (assert) => { + editor = Helpers.editor.buildFromText('', {element: editorElement}); + + editor.willHandleNewline(event => { + assert.ok(true, 'willHandleNewline should be triggered'); + event.preventDefault(); + }); + let {post: expected} = Helpers.postAbstract.buildFromText(['Line1']); + + Helpers.dom.insertText(editor, 'Line1'); + Helpers.dom.insertText(editor, ENTER); + assert.postIsSimilar(editor.post, expected); +});