@accordproject/markdown-editor
Version:
A rich text editor that can read and write markdown text. Based on Slate.js.
104 lines (81 loc) • 2.66 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireDefault(require("react"));
var CONST = _interopRequireWildcard(require("../constants"));
var _toolbarMethods = require("../FormattingToolbar/toolbarMethods");
/**
* This is a plugin into the markdown editor to handle lists
*/
function List() {
const name = 'list';
/**
* @param {Event} event
* @param {Editor} editor
* @param {Function} next
*/
const onEnter = (event, editor, next) => {
const value = editor.value;
const startBlock = value.startBlock;
event.preventDefault(); // Hitting enter on a blank list item will break out of the enclosing list
if ((0, _toolbarMethods.isSelectionInput)(value, CONST.LIST_ITEM) && startBlock.text.length === 0) {
editor.withoutNormalizing(() => {
event.preventDefault();
editor.setBlocks(CONST.PARAGRAPH).unwrapBlock(CONST.LIST_ITEM).unwrapBlock((0, _toolbarMethods.currentList)(value).type);
});
return false;
} // Hitting enter on a non-empty list item will add a new list_item
if ((0, _toolbarMethods.isSelectionInput)(value, CONST.LIST_ITEM) && startBlock.text.length !== 0) {
editor.withoutNormalizing(() => {
event.preventDefault();
editor.splitBlock().unwrapBlock(CONST.LIST_ITEM).wrapBlock(CONST.LIST_ITEM);
});
return true;
}
return next();
};
/**
* @param {Event} event
* @param {Editor} editor
* @param {Function} next
*/
const onKeyDown = (event, editor, next) => {
switch (event.key) {
case 'Enter':
return onEnter(event, editor, next);
default:
return next();
}
};
/**
* @param {Object} props
* @param {Editor} editor
* @param {Function} next
*/
const renderBlock = (props, editor, next) => {
const node = props.node,
attributes = props.attributes,
children = props.children;
switch (node.type) {
case CONST.OL_LIST:
return _react.default.createElement("ol", attributes, children);
case CONST.UL_LIST:
return _react.default.createElement("ul", attributes, children);
case CONST.LIST_ITEM:
return _react.default.createElement("li", attributes, children);
default:
return next();
}
};
return {
name,
onKeyDown,
renderBlock
};
}
var _default = List;
exports.default = _default;