slate-edit-code
Version:
A Slate plugin to handle keyboard events in code blocks.
82 lines (65 loc) • 1.79 kB
JavaScript
;
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;