@@ -3,11 +3,13 @@ import Editor from 'mobiledoc-kit/editor/editor';
3
3
import layout from '../templates/components/koenig-basic-html-input' ;
4
4
import parserPlugins from '../options/basic-html-parser-plugins' ;
5
5
import registerKeyCommands , { BASIC_KEY_COMMANDS } from '../options/key-commands' ;
6
+ import validator from 'npm:validator' ;
6
7
import { MOBILEDOC_VERSION } from 'mobiledoc-kit/renderers/mobiledoc' ;
7
8
import { arrayToMap , toggleSpecialFormatEditState } from './koenig-editor' ;
8
9
import { assign } from '@ember/polyfills' ;
9
10
import { cleanBasicHtml } from '../helpers/clean-basic-html' ;
10
11
import { computed } from '@ember/object' ;
12
+ import { getContentFromPasteEvent } from 'mobiledoc-kit/utils/parse-utils' ;
11
13
import { getLinkMarkupFromRange } from '../utils/markup-utils' ;
12
14
import { registerBasicTextExpansions } from '../options/text-expansions' ;
13
15
import { run } from '@ember/runloop' ;
@@ -28,6 +30,8 @@ const BLANK_DOC = {
28
30
]
29
31
} ;
30
32
33
+ // TODO: extract core to share functionality between this and `{{koenig-editor}}`
34
+
31
35
export default Component . extend ( {
32
36
layout,
33
37
@@ -204,6 +208,14 @@ export default Component.extend({
204
208
this . didCreateEditor ( editor ) ;
205
209
} ,
206
210
211
+ didInsertElement ( ) {
212
+ this . _super ( ...arguments ) ;
213
+ let editorElement = this . element . querySelector ( '[data-kg="editor"]' ) ;
214
+
215
+ this . _pasteHandler = run . bind ( this , this . handlePaste ) ;
216
+ editorElement . addEventListener ( 'paste' , this . _pasteHandler ) ;
217
+ } ,
218
+
207
219
// our ember component has rendered, now we need to render the mobiledoc
208
220
// editor itself if necessary
209
221
didRender ( ) {
@@ -219,6 +231,10 @@ export default Component.extend({
219
231
220
232
willDestroyElement ( ) {
221
233
this . _super ( ...arguments ) ;
234
+
235
+ let editorElement = this . element . querySelector ( '[data-kg="editor"]' ) ;
236
+ editorElement . removeEventListener ( 'paste' , this . _pasteHandler ) ;
237
+
222
238
this . editor . destroy ( ) ;
223
239
} ,
224
240
@@ -261,6 +277,33 @@ export default Component.extend({
261
277
}
262
278
} ,
263
279
280
+ /* custom event handlers ------------------------------------------------ */
281
+
282
+ handlePaste ( event ) {
283
+ let { editor, editor : { range} } = this ;
284
+ let { text} = getContentFromPasteEvent ( event ) ;
285
+
286
+ if ( ! editor . cursor . isAddressable ( event . target ) ) {
287
+ return ;
288
+ }
289
+
290
+ if ( text && validator . isURL ( text ) ) {
291
+ // if we have a text selection, make that selection a link
292
+ if ( range && ! range . isCollapsed && range . headSection === range . tailSection && range . headSection . isMarkerable ) {
293
+ let linkMarkup = editor . builder . createMarkup ( 'a' , { href : text } ) ;
294
+ editor . run ( ( postEditor ) => {
295
+ postEditor . addMarkupToRange ( range , linkMarkup ) ;
296
+ } ) ;
297
+ editor . selectRange ( range . tail ) ;
298
+
299
+ // prevent mobiledoc's default paste event handler firing
300
+ event . preventDefault ( ) ;
301
+ event . stopImmediatePropagation ( ) ;
302
+ return ;
303
+ }
304
+ }
305
+ } ,
306
+
264
307
/* mobiledoc event handlers ----------------------------------------------*/
265
308
266
309
willHandleNewline ( event ) {
0 commit comments