46 lines
1.1 KiB
JavaScript
46 lines
1.1 KiB
JavaScript
import { Block, Text } from 'slate';
|
|
|
|
/**
|
|
* Rules are used to validate the editor state each time it changes, to ensure
|
|
* it is never rendered in an undesirable state.
|
|
*/
|
|
|
|
/**
|
|
* If the editor is ever in an empty state, insert an empty
|
|
* paragraph block.
|
|
*/
|
|
const enforceNeverEmpty = {
|
|
match: object => object.kind === 'document',
|
|
validate: doc => {
|
|
const hasBlocks = !doc.getBlocks().isEmpty();
|
|
return hasBlocks ? null : {};
|
|
},
|
|
normalize: transform => {
|
|
const block = Block.create({
|
|
type: 'paragraph',
|
|
nodes: [Text.createFromString('')],
|
|
});
|
|
const { key } = transform.state.document;
|
|
return transform.insertNodeByKey(key, 0, block).focus();
|
|
},
|
|
};
|
|
|
|
/**
|
|
* Ensure that shortcodes are children of the root node.
|
|
*/
|
|
const shortcodesAtRoot = {
|
|
match: object => object.kind === 'document',
|
|
validate: doc => {
|
|
return doc.findDescendant(node => {
|
|
return node.type === 'shortcode' && doc.getParent(node.key).key !== doc.key;
|
|
});
|
|
},
|
|
normalize: (transform, doc, node) => {
|
|
return transform.unwrapNodeByKey(node.key);
|
|
},
|
|
};
|
|
|
|
const rules = [ enforceNeverEmpty, shortcodesAtRoot ];
|
|
|
|
export default rules;
|