diff --git a/ghost/admin/lib/koenig-editor/addon/components/koenig-editor.js b/ghost/admin/lib/koenig-editor/addon/components/koenig-editor.js index 8b4f493aca..92d82f6023 100644 --- a/ghost/admin/lib/koenig-editor/addon/components/koenig-editor.js +++ b/ghost/admin/lib/koenig-editor/addon/components/koenig-editor.js @@ -20,6 +20,7 @@ import {camelize, capitalize} from '@ember/string'; import {computed} from '@ember/object'; import {copy} from '@ember/object/internals'; import {getContentFromPasteEvent} from 'mobiledoc-kit/utils/parse-utils'; +import {getLinkMarkupFromRange} from '../utils/markup-utils'; import {run} from '@ember/runloop'; const UNDO_DEPTH = 50; @@ -242,7 +243,7 @@ export default Component.extend({ // set up key commands and text expansions (MD conversion) // TODO: this will override any passed in options, we should allow the // default behaviour to be overridden by addon consumers - registerKeyCommands(editor); + registerKeyCommands(editor, this); registerTextExpansions(editor, this); editor.registerKeyCommand({ @@ -427,7 +428,10 @@ export default Component.extend({ // component renders it will re-select when finished which should // trigger the normal toolbar editLink(range) { - this.set('linkRange', range); + let linkMarkup = getLinkMarkupFromRange(range); + if ((!range.isCollapsed || linkMarkup) && range.headSection.isMarkerable) { + this.set('linkRange', range); + } }, cancelEditLink() { diff --git a/ghost/admin/lib/koenig-editor/addon/components/koenig-link-input.js b/ghost/admin/lib/koenig-editor/addon/components/koenig-link-input.js index d46529eac5..de6bcb334d 100644 --- a/ghost/admin/lib/koenig-editor/addon/components/koenig-link-input.js +++ b/ghost/admin/lib/koenig-editor/addon/components/koenig-link-input.js @@ -2,6 +2,7 @@ import Component from '@ember/component'; import layout from '../templates/components/koenig-link-input'; import {TOOLBAR_MARGIN} from './koenig-toolbar'; import {computed} from '@ember/object'; +import {getLinkMarkupFromRange} from '../utils/markup-utils'; import {htmlSafe} from '@ember/string'; import {run} from '@ember/runloop'; @@ -144,13 +145,10 @@ export default Component.extend({ // if we have a single link or a slice of a single link selected, grab the // href and adjust our linkRange to encompass the whole link _getHrefFromMarkup() { - let {headMarker, tailMarker} = this._linkRange; - if (headMarker === tailMarker || headMarker.next === tailMarker) { - let linkMarkup = tailMarker.markups.findBy('tagName', 'a'); - if (linkMarkup) { - this.set('href', linkMarkup.attributes.href); - this._linkRange = this._linkRange.expandByMarker(marker => !!marker.markups.includes(linkMarkup)); - } + let linkMarkup = getLinkMarkupFromRange(this._linkRange); + if (linkMarkup) { + this.set('href', linkMarkup.attributes.href); + this._linkRange = this._linkRange.expandByMarker(marker => !!marker.markups.includes(linkMarkup)); } }, diff --git a/ghost/admin/lib/koenig-editor/addon/options/key-commands.js b/ghost/admin/lib/koenig-editor/addon/options/key-commands.js index 00aa4608d4..b9bb4dd6fc 100644 --- a/ghost/admin/lib/koenig-editor/addon/options/key-commands.js +++ b/ghost/admin/lib/koenig-editor/addon/options/key-commands.js @@ -1,20 +1,44 @@ +import Browser from 'mobiledoc-kit/utils/browser'; + // Key commands will run any time a particular key or key combination is pressed // https://github.com/bustlelabs/mobiledoc-kit#configuring-hot-keys -export default function (editor) { - let softReturnKeyCommand = { - str: 'SHIFT+ENTER', - - run(editor) { - if (!editor.range.headSection.isMarkerable) { - return; - } - - editor.run((postEditor) => { - let softReturn = postEditor.builder.createAtom('soft-return'); - postEditor.insertMarkers(editor.range.head, [softReturn]); - }); +export const DEFAULT_KEY_COMMANDS = [{ + str: 'SHIFT+ENTER', + run(editor) { + if (!editor.range.headSection.isMarkerable) { + return; } - }; - editor.registerKeyCommand(softReturnKeyCommand); + + editor.run((postEditor) => { + let softReturn = postEditor.builder.createAtom('soft-return'); + postEditor.insertMarkers(editor.range.head, [softReturn]); + }); + } +}, { + str: 'CTRL+K', + run(editor, koenig) { + if (Browser.isWin()) { + return koenig.send('editLink', editor.range); + } + + // default behaviour for Mac is delete to end of section + return false; + } +}, { + str: 'META+K', + run(editor, koenig) { + return koenig.send('editLink', editor.range); + } +}]; + +export default function registerKeyCommands(editor, koenig) { + DEFAULT_KEY_COMMANDS.forEach((keyCommand) => { + editor.registerKeyCommand({ + str: keyCommand.str, + run() { + keyCommand.run(editor, koenig); + } + }); + }); } diff --git a/ghost/admin/lib/koenig-editor/addon/utils/markup-utils.js b/ghost/admin/lib/koenig-editor/addon/utils/markup-utils.js new file mode 100644 index 0000000000..191b603ad7 --- /dev/null +++ b/ghost/admin/lib/koenig-editor/addon/utils/markup-utils.js @@ -0,0 +1,6 @@ +export function getLinkMarkupFromRange(range) { + let {headMarker, tailMarker} = range; + if (headMarker === tailMarker || headMarker.next === tailMarker) { + return tailMarker.markups.findBy('tagName', 'a'); + } +}