Skip to content
This repository was archived by the owner on Nov 28, 2022. It is now read-only.

Commit 84059cd

Browse files
committed
🎨 Koenig - Added paste-url-over-selection link creation to caption inputs
refs TryGhost/Ghost#9724 - the "paste url on a selection to make it a link" feature from the main editor was missing in caption inputs - copied functionality across (shared functionality needs extracting at some point)
1 parent 1f3d77d commit 84059cd

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

‎lib/koenig-editor/addon/components/koenig-basic-html-input.js

+43
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ import Editor from 'mobiledoc-kit/editor/editor';
33
import layout from '../templates/components/koenig-basic-html-input';
44
import parserPlugins from '../options/basic-html-parser-plugins';
55
import registerKeyCommands, {BASIC_KEY_COMMANDS} from '../options/key-commands';
6+
import validator from 'npm:validator';
67
import {MOBILEDOC_VERSION} from 'mobiledoc-kit/renderers/mobiledoc';
78
import {arrayToMap, toggleSpecialFormatEditState} from './koenig-editor';
89
import {assign} from '@ember/polyfills';
910
import {cleanBasicHtml} from '../helpers/clean-basic-html';
1011
import {computed} from '@ember/object';
12+
import {getContentFromPasteEvent} from 'mobiledoc-kit/utils/parse-utils';
1113
import {getLinkMarkupFromRange} from '../utils/markup-utils';
1214
import {registerBasicTextExpansions} from '../options/text-expansions';
1315
import {run} from '@ember/runloop';
@@ -28,6 +30,8 @@ const BLANK_DOC = {
2830
]
2931
};
3032

33+
// TODO: extract core to share functionality between this and `{{koenig-editor}}`
34+
3135
export default Component.extend({
3236
layout,
3337

@@ -204,6 +208,14 @@ export default Component.extend({
204208
this.didCreateEditor(editor);
205209
},
206210

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+
207219
// our ember component has rendered, now we need to render the mobiledoc
208220
// editor itself if necessary
209221
didRender() {
@@ -219,6 +231,10 @@ export default Component.extend({
219231

220232
willDestroyElement() {
221233
this._super(...arguments);
234+
235+
let editorElement = this.element.querySelector('[data-kg="editor"]');
236+
editorElement.removeEventListener('paste', this._pasteHandler);
237+
222238
this.editor.destroy();
223239
},
224240

@@ -261,6 +277,33 @@ export default Component.extend({
261277
}
262278
},
263279

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+
264307
/* mobiledoc event handlers ----------------------------------------------*/
265308

266309
willHandleNewline(event) {

0 commit comments

Comments
 (0)