UNPKG

@atlaskit/editor-plugin-hyperlink

Version:

Hyperlink plugin for @atlaskit/editor-core

100 lines (96 loc) 4.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createKeymapPlugin = createKeymapPlugin; exports.default = void 0; var _adfSchema = require("@atlaskit/adf-schema"); var _analytics = require("@atlaskit/editor-common/analytics"); var _card = require("@atlaskit/editor-common/card"); var _keymaps = require("@atlaskit/editor-common/keymaps"); var _utils = require("@atlaskit/editor-common/utils"); var _keymap = require("@atlaskit/editor-prosemirror/keymap"); var _commands = require("../editor-commands/commands"); var _main = require("../pm-plugins/main"); var _toolbarButtons = require("./toolbar-buttons"); function createKeymapPlugin(editorAnalyticsApi) { var list = {}; (0, _keymaps.bindKeymapWithEditorCommand)( // Ignored via go/ees005 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion _keymaps.addLink.common, (0, _commands.showLinkToolbar)(_analytics.INPUT_METHOD.SHORTCUT, editorAnalyticsApi), list); // Ignored via go/ees005 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion (0, _keymaps.bindKeymapWithCommand)(_keymaps.enter.common, mayConvertLastWordToHyperlink(editorAnalyticsApi), list); (0, _keymaps.bindKeymapWithCommand)( // Ignored via go/ees005 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion _keymaps.insertNewLine.common, mayConvertLastWordToHyperlink(editorAnalyticsApi), list); (0, _keymaps.bindKeymapWithCommand)( // Ignored via go/ees005 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion _keymaps.escape.common, function (state, dispatch, view) { var hyperlinkPlugin = _main.stateKey.getState(state); if (hyperlinkPlugin.activeLinkMark) { (0, _commands.hideLinkToolbar)()(state, dispatch); if (view) { view.focus(); } return false; } return false; }, list); return (0, _keymap.keymap)(list); } /** * Convert the last word before the selection to a hyperlink if it's a valid URL with a tld we want to linkify */ var mayConvertLastWordToHyperlink = function mayConvertLastWordToHyperlink(editorAnalyticsApi) { return function (state, dispatch) { var _toolbarKey$getState$, _toolbarKey$getState; var skipAnalytics = (_toolbarKey$getState$ = (_toolbarKey$getState = _toolbarButtons.toolbarKey.getState(state)) === null || _toolbarKey$getState === void 0 ? void 0 : _toolbarKey$getState.skipAnalytics) !== null && _toolbarKey$getState$ !== void 0 ? _toolbarKey$getState$ : false; var nodeBefore = state.selection.$from.nodeBefore; if (!nodeBefore || !nodeBefore.isText || !nodeBefore.text) { return false; } // Ignored via go/ees005 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion var words = nodeBefore.text.split(' '); var lastWord = words[words.length - 1]; var match = (0, _adfSchema.getLinkMatch)(lastWord); if (match) { if (!(0, _utils.shouldAutoLinkifyMatch)(match)) { return false; } var hyperlinkedText = match.raw; var start = state.selection.$from.pos - hyperlinkedText.length; var end = state.selection.$from.pos; if (state.doc.rangeHasMark(start, end, state.schema.marks.link)) { return false; } var url = match.url; var markType = state.schema.mark('link', { href: url }); var filepaths = (0, _utils.findFilepaths)(nodeBefore.text, start - (nodeBefore.text.length - hyperlinkedText.length) // The position referenced by 'start' is relative to the start of the document, findFilepaths deals with index in a node only. ); if ((0, _utils.isLinkInMatches)(start, filepaths)) { return false; } var tr = state.tr.addMark(start, end, markType); if (dispatch) { (0, _card.addLinkMetadata)(state.selection, tr, { inputMethod: _analytics.INPUT_METHOD.AUTO_DETECT }); if (skipAnalytics) { dispatch(tr); } else { editorAnalyticsApi === null || editorAnalyticsApi === void 0 || editorAnalyticsApi.attachAnalyticsEvent((0, _utils.getLinkCreationAnalyticsEvent)(_analytics.INPUT_METHOD.AUTO_DETECT, url))(tr); dispatch(tr); } } } return false; }; }; var _default = exports.default = createKeymapPlugin;