UNPKG

@atlaskit/editor-plugin-code-block-advanced

Version:

CodeBlockAdvanced plugin for @atlaskit/editor-core

180 lines (178 loc) 4.28 kB
import { defaultKeymap, indentWithTab } from '@codemirror/commands'; import { keymap as cmKeymap } from '@codemirror/view'; import { getBrowserInfo } from '@atlaskit/editor-common/browser'; import { exitCode, selectAll } from '@atlaskit/editor-prosemirror/commands'; import { undo, redo } from '@atlaskit/prosemirror-history'; import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals'; import { backspaceKeymap } from './backspace'; import { maybeEscapeKeymap } from './maybeEscape'; export const keymapExtension = ({ view, getNode, getPos, selectCodeBlockNode, onMaybeNodeSelection, customFindReplace }) => { return cmKeymap.of(codeBlockKeymap({ view, getNode, getPos, selectCodeBlockNode, onMaybeNodeSelection, customFindReplace })); }; const codeBlockKeymap = ({ view, getNode, getPos, selectCodeBlockNode, onMaybeNodeSelection, customFindReplace }) => { const browser = getBrowserInfo(); return [{ key: 'ArrowUp', run: cm => maybeEscapeKeymap({ unit: 'line', dir: -1, cm, view, getNode, getPos, selectCodeBlockNode, onMaybeNodeSelection }) }, { key: 'ArrowLeft', run: cm => maybeEscapeKeymap({ unit: 'char', dir: -1, cm, view, getNode, getPos, selectCodeBlockNode, onMaybeNodeSelection }) }, { key: 'ArrowDown', run: cm => maybeEscapeKeymap({ unit: 'line', dir: 1, cm, view, getNode, getPos, selectCodeBlockNode, onMaybeNodeSelection }) }, { key: 'Ctrl-a', mac: 'Cmd-a', run: cm => { const isFullBlockSelection = cm.state.selection.main.from === 0 && cm.state.selection.main.to === getNode().content.size; // Allow codemirror to handle if (!isFullBlockSelection) { return false; } // Move the selection and focus into prosemirror onMaybeNodeSelection(); view.focus(); selectAll(view.state, view.dispatch); return true; } }, { key: 'ArrowRight', run: cm => maybeEscapeKeymap({ unit: 'char', dir: 1, cm, view, getNode, getPos, selectCodeBlockNode, onMaybeNodeSelection }) }, { key: 'Ctrl-f', mac: 'Cmd-f', run: () => { // Pass synthetic event to prosemirror if (customFindReplace) { view.dispatchEvent(new KeyboardEvent('keydown', { key: 'f', code: 'KeyF', metaKey: browser.mac ? true : false, ctrlKey: browser.mac ? false : true })); return true; } return false; } }, { key: 'Ctrl-Enter', run: () => { if (!exitCode(view.state, view.dispatch)) { return false; } view.focus(); return true; } }, { key: 'Ctrl-z', mac: 'Cmd-z', run: () => undo(view.state, view.dispatch) }, { key: 'Shift-Ctrl-z', mac: 'Shift-Cmd-z', run: () => redo(view.state, view.dispatch) }, { key: 'Ctrl-y', mac: 'Cmd-y', run: () => redo(view.state, view.dispatch) }, { key: 'Backspace', run: cm => backspaceKeymap({ cm, view, getNode, getPos }) }, { key: 'Ctrl-Alt-]', mac: 'Cmd-Alt-]', run: () => { // Pass synthetic event to prosemirror if (expValEquals('platform_editor_breakout_resizing', 'isEnabled', true)) { view.dispatchEvent(new KeyboardEvent('keydown', { key: ']', code: 'BracketRight', metaKey: browser.mac ? true : false, ctrlKey: browser.mac ? false : true, altKey: true })); return true; } return false; } }, { key: 'Ctrl-Alt-[', mac: 'Cmd-Alt-[', run: () => { // Pass synthetic event to prosemirror if (expValEquals('platform_editor_breakout_resizing', 'isEnabled', true)) { view.dispatchEvent(new KeyboardEvent('keydown', { key: ']', code: 'BracketLeft', metaKey: browser.mac ? true : false, ctrlKey: browser.mac ? false : true, altKey: true })); return true; } return false; } }, ...defaultKeymap.concat(indentWithTab)]; };