1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-08-13 02:34:05 +02:00

fix core schema to not leave selection unset

This commit is contained in:
Ian Storm Taylor
2016-11-22 13:17:02 -08:00
parent 6346ef3aa2
commit b3fe0eb679

View File

@@ -22,12 +22,13 @@ const DOCUMENT_CHILDREN_RULE = {
return node.kind == 'document' return node.kind == 'document'
}, },
validate: (document) => { validate: (document) => {
const { nodes } = document const invalids = document.nodes.filter(n => n.kind != 'block')
const invalids = nodes.filter(n => n.kind != 'block')
return invalids.size ? invalids : null return invalids.size ? invalids : null
}, },
normalize: (transform, document, invalids) => { normalize: (transform, document, invalids) => {
return invalids.reduce((t, n) => t.removeNodeByKey(n.key, OPTS), transform) invalids.forEach((node) => {
transform.removeNodeByKey(node.key, OPTS)
})
} }
} }
@@ -47,7 +48,9 @@ const BLOCK_CHILDREN_RULE = {
return invalids.size ? invalids : null return invalids.size ? invalids : null
}, },
normalize: (transform, block, invalids) => { normalize: (transform, block, invalids) => {
return invalids.reduce((t, n) => t.removeNodeByKey(n.key, OPTS), transform) invalids.forEach((node) => {
transform.removeNodeByKey(node.key, OPTS)
})
} }
} }
@@ -63,11 +66,11 @@ const MIN_TEXT_RULE = {
}, },
validate: (node) => { validate: (node) => {
const { nodes } = node const { nodes } = node
return nodes.size === 0 ? true : null return nodes.size == 0 ? true : null
}, },
normalize: (transform, node) => { normalize: (transform, node) => {
const text = Text.create() const text = Text.create()
return transform.insertNodeByKey(node.key, 0, text, OPTS) transform.insertNodeByKey(node.key, 0, text, OPTS)
} }
} }
@@ -87,7 +90,9 @@ const INLINE_CHILDREN_RULE = {
return invalids.size ? invalids : null return invalids.size ? invalids : null
}, },
normalize: (transform, inline, invalids) => { normalize: (transform, inline, invalids) => {
return invalids.reduce((t, n) => t.removeNodeByKey(n.key, OPTS), transform) invalids.forEach((node) => {
transform.removeNodeByKey(node.key, OPTS)
})
} }
} }
@@ -107,20 +112,20 @@ const INLINE_NO_EMPTY = {
return object.kind == 'block' return object.kind == 'block'
}, },
validate: (block) => { validate: (block) => {
return block.nodes.some((child) => { const invalids = block.nodes.filter(n => n.kind == 'inline' && n.text == '')
return child.kind == 'inline' && child.text == '' return invalids.size ? invalids : null
})
}, },
normalize: (transform, block) => { normalize: (transform, block, invalids) => {
return block.nodes.reduce((tr, child, index) => { // If all of the block's nodes are invalid, insert an empty text node so
if (child.kind == 'inline' && child.text == '') { // that the selection will be preserved when they are all removed.
return transform if (block.nodes.size == invalids.size) {
.removeNodeByKey(child.key, OPTS) const text = Text.create()
.insertNodeByKey(block.key, index, Text.createFromString(''), OPTS) transform.insertNodeByKey(block.key, 1, text, OPTS)
} else {
return tr
} }
}, transform)
invalids.forEach((node) => {
transform.removeNodeByKey(node.key, OPTS)
})
} }
} }
@@ -138,10 +143,7 @@ const VOID_TEXT_RULE = {
) )
}, },
validate: (node) => { validate: (node) => {
return ( return node.text !== ' ' || node.nodes.size !== 1
node.text !== ' ' ||
node.nodes.size !== 1
)
}, },
normalize: (transform, node, result) => { normalize: (transform, node, result) => {
const text = Text.createFromString(' ') const text = Text.createFromString(' ')
@@ -149,11 +151,9 @@ const VOID_TEXT_RULE = {
transform.insertNodeByKey(node.key, index, text, OPTS) transform.insertNodeByKey(node.key, index, text, OPTS)
node.nodes.forEach((child) => { node.nodes.forEach(child => {
transform.removeNodeByKey(child.key, OPTS) transform.removeNodeByKey(child.key, OPTS)
}) })
return transform
} }
} }
@@ -233,13 +233,12 @@ const NO_ADJACENT_TEXT_RULE = {
return invalids.size ? invalids : null return invalids.size ? invalids : null
}, },
normalize: (transform, node, pairs) => { normalize: (transform, node, pairs) => {
return pairs // We reverse the list to handle consecutive joins, since the earlier nodes
// We reverse the list since we want to handle 3 consecutive text nodes. // will always exist after each join.
.reverse() pairs.reverse().forEach((pair) => {
.reduce((t, pair) => {
const [ first, second ] = pair const [ first, second ] = pair
return t.joinNodeByKey(second.key, first.key, OPTS) return transform.joinNodeByKey(second.key, first.key, OPTS)
}, transform) })
} }
} }
@@ -291,9 +290,9 @@ const NO_EMPTY_TEXT_RULE = {
return invalids.size ? invalids : null return invalids.size ? invalids : null
}, },
normalize: (transform, node, invalids) => { normalize: (transform, node, invalids) => {
return invalids.reduce((t, text) => { invalids.forEach((text) => {
return t.removeNodeByKey(text.key, OPTS) transform.removeNodeByKey(text.key, OPTS)
}, transform) })
} }
} }