@atlaskit/editor-plugin-hyperlink
Version:
Hyperlink plugin for @atlaskit/editor-core
100 lines (96 loc) • 4.32 kB
JavaScript
;
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;