1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-08-26 16:44:22 +02:00

fix for deleting across an inline (#384)

* failing test for deleting across an inline

* fix deleting across inlines (#384)

* Add jsdom devDepencency

Required as peer dependency by mocha-jsdom
This commit is contained in:
Tyler Johnson
2016-10-26 13:59:03 -06:00
committed by Ian Storm Taylor
parent 8851855b5b
commit db95f4bdec
4 changed files with 59 additions and 13 deletions

View File

@@ -61,39 +61,46 @@ export function deleteAtRange(transform, range) {
let { state } = transform let { state } = transform
let { document } = state let { document } = state
// split the nodes at range, within the common ancestor
let ancestor = document.getCommonAncestor(startKey, endKey) let ancestor = document.getCommonAncestor(startKey, endKey)
let startChild = ancestor.getHighestChild(startKey) let startChild = ancestor.getHighestChild(startKey)
let endChild = ancestor.getHighestChild(endKey) let endChild = ancestor.getHighestChild(endKey)
const startOff = startChild.getOffset(startKey) + startOffset const startOff = (startChild.key === startKey ? 0 : startChild.getOffset(startKey)) + startOffset
const endOff = endChild.getOffset(endKey) + endOffset const endOff = (endChild.key === endKey ? 0 : endChild.getOffset(endKey)) + endOffset
transform.splitNodeByKey(startChild.key, startOff) transform.splitNodeByKey(startChild.key, startOff)
transform.splitNodeByKey(endChild.key, endOff) transform.splitNodeByKey(endChild.key, endOff)
state = transform.state state = transform.state
document = state.document document = state.document
ancestor = document.getCommonAncestor(startKey, endKey)
const startBlock = document.getClosestBlock(startKey) const startBlock = document.getClosestBlock(startKey)
const endBlock = document.getClosestBlock(document.getNextText(endKey)) const endBlock = document.getClosestBlock(document.getNextText(endKey))
startChild = ancestor.getHighestChild(startBlock)
endChild = ancestor.getHighestChild(endBlock)
// remove all of the nodes between range
ancestor = document.getCommonAncestor(startKey, endKey)
startChild = ancestor.getHighestChild(startKey)
endChild = ancestor.getHighestChild(endKey)
const startIndex = ancestor.nodes.indexOf(startChild) const startIndex = ancestor.nodes.indexOf(startChild)
const endIndex = ancestor.nodes.indexOf(endChild) const endIndex = ancestor.nodes.indexOf(endChild)
const middles = ancestor.nodes.slice(startIndex + 1, endIndex) const middles = ancestor.nodes.slice(startIndex + 1, endIndex + 1)
middles.forEach((child) => { middles.forEach((child) => {
transform.removeNodeByKey(child.key) transform.removeNodeByKey(child.key)
}) })
endBlock.nodes.forEach((child, i) => { // "normalize" the document so blocks in the range are also removed
const newKey = startBlock.key if (startBlock.key !== endBlock.key) {
const newIndex = startBlock.nodes.size + i endBlock.nodes.forEach((child, i) => {
transform.moveNodeByKey(child.key, newKey, newIndex) const newKey = startBlock.key
}) const newIndex = startBlock.nodes.size + i
transform.moveNodeByKey(child.key, newKey, newIndex)
})
const lonely = document.getFurthest(endBlock, p => p.nodes.size == 1) || endBlock
transform.removeNodeByKey(lonely.key)
}
const lonely = document.getFurthest(endBlock, p => p.nodes.size == 1) || endBlock
transform.removeNodeByKey(lonely.key)
transform.normalizeDocument() transform.normalizeDocument()
return transform return transform
} }

View File

@@ -0,0 +1,18 @@
export default function (state) {
const { document, selection } = state
const texts = document.getTexts()
const first = texts.first()
const last = texts.last()
const range = selection.merge({
anchorKey: first.key,
anchorOffset: 1,
focusKey: last.key,
focusOffset: last.length - 1
})
return state
.transform()
.deleteAtRange(range)
.apply()
}

View File

@@ -0,0 +1,14 @@
nodes:
- kind: block
type: paragraph
nodes:
- kind: text
text: before
- kind: inline
type: link
nodes:
- kind: text
text: word
- kind: text
text: after

View File

@@ -0,0 +1,7 @@
nodes:
- kind: block
type: paragraph
nodes:
- kind: text
text: "br"