UNPKG

slate-edit-code

Version:

A Slate plugin to handle keyboard events in code blocks.

82 lines (65 loc) 1.79 kB
'use strict'; var onEnter = require('./onEnter'); var onTab = require('./onTab'); var onBackspace = require('./onBackspace'); var KEY_ENTER = 'enter'; var KEY_TAB = 'tab'; var KEY_BACKSPACE = 'backspace'; /** * Default filter for code blocks * @param {Node} node * @return {Boolean} */ function defaultOnlyIn(node) { return node.type === 'code_block'; } /** * A Slate plugin to handle keyboard events in code blocks. * @return {Object} */ function EditCode(opts) { opts = opts || {}; opts.onlyIn = opts.onlyIn || defaultOnlyIn; /** * User is pressing a key in the editor */ function onKeyDown(e, data, state) { var startBlock = state.startBlock; if (!opts.onlyIn(startBlock)) { return; } switch (data.key) { case KEY_ENTER: return onEnter(e, data, state); case KEY_TAB: return onTab(e, data, state); case KEY_BACKSPACE: return onBackspace(e, data, state); } } /** * User is pasting content, insert it as text */ function onPaste(event, data, state) { var startBlock = state.startBlock; var endBlock = state.endBlock; // Only paste when selection is completly in the code block if (startBlock.key !== endBlock.key) { return; } // Only accept text/html if (data.type !== 'text' && data.type !== 'html') { return; } // Is it a code block if (!opts.onlyIn(startBlock)) { return; } return state.transform().insertText(data.text).apply(); } return { onKeyDown: onKeyDown, onPaste: onPaste }; } module.exports = EditCode;