mirror of
https://github.com/ianstormtaylor/slate.git
synced 2025-08-29 09:59:48 +02:00
Merge branch 'fix-word-char-deletes'
This commit is contained in:
@@ -131,9 +131,13 @@ export function deleteAtRange(transform, range, options = {}) {
|
|||||||
|
|
||||||
export function deleteCharBackwardAtRange(transform, range, options) {
|
export function deleteCharBackwardAtRange(transform, range, options) {
|
||||||
const { state } = transform
|
const { state } = transform
|
||||||
const { startOffset, startBlock } = state
|
const { document } = state
|
||||||
|
const { startKey, startOffset } = range
|
||||||
|
const startBlock = document.getClosestBlock(startKey)
|
||||||
|
const offset = startBlock.getOffset(startKey)
|
||||||
|
const o = offset + startOffset
|
||||||
const { text } = startBlock
|
const { text } = startBlock
|
||||||
const n = String.getCharOffsetBackward(text, startOffset)
|
const n = String.getCharOffsetBackward(text, o)
|
||||||
transform.deleteBackwardAtRange(range, n, options)
|
transform.deleteBackwardAtRange(range, n, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,8 +152,12 @@ export function deleteCharBackwardAtRange(transform, range, options) {
|
|||||||
|
|
||||||
export function deleteLineBackwardAtRange(transform, range, options) {
|
export function deleteLineBackwardAtRange(transform, range, options) {
|
||||||
const { state } = transform
|
const { state } = transform
|
||||||
const { startOffset } = state
|
const { document } = state
|
||||||
transform.deleteBackwardAtRange(range, startOffset, options)
|
const { startKey, startOffset } = range
|
||||||
|
const startBlock = document.getClosestBlock(startKey)
|
||||||
|
const offset = startBlock.getOffset(startKey)
|
||||||
|
const o = offset + startOffset
|
||||||
|
transform.deleteBackwardAtRange(range, o, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -163,9 +171,13 @@ export function deleteLineBackwardAtRange(transform, range, options) {
|
|||||||
|
|
||||||
export function deleteWordBackwardAtRange(transform, range, options) {
|
export function deleteWordBackwardAtRange(transform, range, options) {
|
||||||
const { state } = transform
|
const { state } = transform
|
||||||
const { startOffset, startBlock } = state
|
const { document } = state
|
||||||
|
const { startKey, startOffset } = range
|
||||||
|
const startBlock = document.getClosestBlock(startKey)
|
||||||
|
const offset = startBlock.getOffset(startKey)
|
||||||
|
const o = offset + startOffset
|
||||||
const { text } = startBlock
|
const { text } = startBlock
|
||||||
const n = String.getWordOffsetBackward(text, startOffset)
|
const n = String.getWordOffsetBackward(text, o)
|
||||||
transform.deleteBackwardAtRange(range, n, options)
|
transform.deleteBackwardAtRange(range, n, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,22 +242,58 @@ export function deleteBackwardAtRange(transform, range, n = 1, options = {}) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the previous text's block is inside the current block, then we need
|
// If we're deleting by one character and the previous text node is not
|
||||||
// to remove a character when deleteing. Otherwise, we just want to join
|
// inside the current block, we need to join the two blocks together.
|
||||||
// the two blocks together.
|
if (n == 1 && prevBlock != block) {
|
||||||
range = range.merge({
|
range = range.merge({
|
||||||
anchorKey: prev.key,
|
anchorKey: prev.key,
|
||||||
anchorOffset: prevBlock == block ? prev.length - 1 : prev.length,
|
anchorOffset: prev.length,
|
||||||
|
})
|
||||||
|
|
||||||
|
transform.deleteAtRange(range, { normalize })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the focus offset is farther than the number of characters to delete,
|
||||||
|
// just remove the characters backwards inside the current node.
|
||||||
|
if (n < focusOffset) {
|
||||||
|
range = range.merge({
|
||||||
|
focusOffset: focusOffset - n,
|
||||||
|
isBackward: true,
|
||||||
})
|
})
|
||||||
|
|
||||||
transform.deleteAtRange(range, { normalize })
|
transform.deleteAtRange(range, { normalize })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise, just remove a character backwards.
|
// Otherwise, we need to see how many nodes backwards to go.
|
||||||
|
let node = text
|
||||||
|
let offset = 0
|
||||||
|
let traversed = focusOffset
|
||||||
|
|
||||||
|
while (n > traversed) {
|
||||||
|
node = document.getPreviousText(node.key)
|
||||||
|
const next = traversed + node.length
|
||||||
|
if (n <= next) {
|
||||||
|
offset = next - n
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
traversed = next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the focus node is inside a void, go up until right after it.
|
||||||
|
if (document.hasVoidParent(node.key)) {
|
||||||
|
const parent = document.getClosest(node.key, p => p.isVoid)
|
||||||
|
node = document.getNextText(parent.key)
|
||||||
|
offset = 0
|
||||||
|
}
|
||||||
|
|
||||||
range = range.merge({
|
range = range.merge({
|
||||||
focusOffset: focusOffset - n,
|
focusKey: node.key,
|
||||||
isBackward: true,
|
focusOffset: offset,
|
||||||
|
isBackward: true
|
||||||
})
|
})
|
||||||
|
|
||||||
transform.deleteAtRange(range, { normalize })
|
transform.deleteAtRange(range, { normalize })
|
||||||
@@ -262,9 +310,13 @@ export function deleteBackwardAtRange(transform, range, n = 1, options = {}) {
|
|||||||
|
|
||||||
export function deleteCharForwardAtRange(transform, range, options) {
|
export function deleteCharForwardAtRange(transform, range, options) {
|
||||||
const { state } = transform
|
const { state } = transform
|
||||||
const { startOffset, startBlock } = state
|
const { document } = state
|
||||||
|
const { startKey, startOffset } = range
|
||||||
|
const startBlock = document.getClosestBlock(startKey)
|
||||||
|
const offset = startBlock.getOffset(startKey)
|
||||||
|
const o = offset + startOffset
|
||||||
const { text } = startBlock
|
const { text } = startBlock
|
||||||
const n = String.getCharOffsetForward(text, startOffset)
|
const n = String.getCharOffsetForward(text, o)
|
||||||
transform.deleteForwardAtRange(range, n, options)
|
transform.deleteForwardAtRange(range, n, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -279,8 +331,12 @@ export function deleteCharForwardAtRange(transform, range, options) {
|
|||||||
|
|
||||||
export function deleteLineForwardAtRange(transform, range, options) {
|
export function deleteLineForwardAtRange(transform, range, options) {
|
||||||
const { state } = transform
|
const { state } = transform
|
||||||
const { startOffset, startBlock } = state
|
const { document } = state
|
||||||
transform.deleteForwardAtRange(range, startBlock.length - startOffset, options)
|
const { startKey, startOffset } = range
|
||||||
|
const startBlock = document.getClosestBlock(startKey)
|
||||||
|
const offset = startBlock.getOffset(startKey)
|
||||||
|
const o = offset + startOffset
|
||||||
|
transform.deleteForwardAtRange(range, o, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -294,9 +350,13 @@ export function deleteLineForwardAtRange(transform, range, options) {
|
|||||||
|
|
||||||
export function deleteWordForwardAtRange(transform, range, options) {
|
export function deleteWordForwardAtRange(transform, range, options) {
|
||||||
const { state } = transform
|
const { state } = transform
|
||||||
const { startOffset, startBlock } = state
|
const { document } = state
|
||||||
|
const { startKey, startOffset } = range
|
||||||
|
const startBlock = document.getClosestBlock(startKey)
|
||||||
|
const offset = startBlock.getOffset(startKey)
|
||||||
|
const o = offset + startOffset
|
||||||
const { text } = startBlock
|
const { text } = startBlock
|
||||||
const n = String.getWordOffsetForward(text, startOffset)
|
const n = String.getWordOffsetForward(text, o)
|
||||||
transform.deleteForwardAtRange(range, n, options)
|
transform.deleteForwardAtRange(range, n, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -316,57 +376,102 @@ export function deleteForwardAtRange(transform, range, n = 1, options = {}) {
|
|||||||
const { document } = state
|
const { document } = state
|
||||||
const { startKey, focusOffset } = range
|
const { startKey, focusOffset } = range
|
||||||
|
|
||||||
|
// If the range is expanded, perform a regular delete instead.
|
||||||
if (range.isExpanded) {
|
if (range.isExpanded) {
|
||||||
transform.deleteAtRange(range, { normalize })
|
transform.deleteAtRange(range, { normalize })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the closest block is void, delete it.
|
||||||
const block = document.getClosestBlock(startKey)
|
const block = document.getClosestBlock(startKey)
|
||||||
if (block && block.isVoid) {
|
if (block && block.isVoid) {
|
||||||
transform.removeNodeByKey(block.key, { normalize })
|
transform.removeNodeByKey(block.key, { normalize })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the closest inline is void, delete it.
|
||||||
const inline = document.getClosestInline(startKey)
|
const inline = document.getClosestInline(startKey)
|
||||||
if (inline && inline.isVoid) {
|
if (inline && inline.isVoid) {
|
||||||
transform.removeNodeByKey(inline.key, { normalize })
|
transform.removeNodeByKey(inline.key, { normalize })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the range is at the start of the document, abort.
|
||||||
if (range.isAtEndOf(document)) {
|
if (range.isAtEndOf(document)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the range is at the start of the text node, we need to figure out what
|
||||||
|
// is behind it to know how to delete...
|
||||||
const text = document.getDescendant(startKey)
|
const text = document.getDescendant(startKey)
|
||||||
if (range.isAtEndOf(text)) {
|
if (range.isAtEndOf(text)) {
|
||||||
const next = document.getNextText(text.key)
|
const next = document.getNextText(text.key)
|
||||||
const nextBlock = document.getClosestBlock(next.key)
|
const nextBlock = document.getClosestBlock(next.key)
|
||||||
const nextInline = document.getClosestInline(next.key)
|
const nextInline = document.getClosestInline(next.key)
|
||||||
|
|
||||||
|
// If the previous block is void, remove it.
|
||||||
if (nextBlock && nextBlock.isVoid) {
|
if (nextBlock && nextBlock.isVoid) {
|
||||||
transform.removeNodeByKey(nextBlock.key, { normalize })
|
transform.removeNodeByKey(nextBlock.key, { normalize })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the previous inline is void, remove it.
|
||||||
if (nextInline && nextInline.isVoid) {
|
if (nextInline && nextInline.isVoid) {
|
||||||
transform.removeNodeByKey(nextInline.key, { normalize })
|
transform.removeNodeByKey(nextInline.key, { normalize })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the next text's block is inside the current block, then we need
|
// If we're deleting by one character and the previous text node is not
|
||||||
// to remove a character when deleteing. Otherwise, we just want to join
|
// inside the current block, we need to join the two blocks together.
|
||||||
// the two blocks together.
|
if (n == 1 && nextBlock != block) {
|
||||||
range = range.merge({
|
range = range.merge({
|
||||||
focusKey: next.key,
|
focusKey: next.key,
|
||||||
focusOffset: nextBlock == block ? 1 : 0
|
focusOffset: 0
|
||||||
|
})
|
||||||
|
|
||||||
|
transform.deleteAtRange(range, { normalize })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the remaining characters to the end of the node is greater than or equal
|
||||||
|
// to the number of characters to delete, just remove the characters forwards
|
||||||
|
// inside the current node.
|
||||||
|
if (n <= (text.length - focusOffset)) {
|
||||||
|
range = range.merge({
|
||||||
|
focusOffset: focusOffset + n
|
||||||
})
|
})
|
||||||
|
|
||||||
transform.deleteAtRange(range, { normalize })
|
transform.deleteAtRange(range, { normalize })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Otherwise, we need to see how many nodes forwards to go.
|
||||||
|
let node = text
|
||||||
|
let offset = focusOffset
|
||||||
|
let traversed = text.length - focusOffset
|
||||||
|
|
||||||
|
while (n > traversed) {
|
||||||
|
node = document.getNextText(node.key)
|
||||||
|
const next = traversed + node.length
|
||||||
|
if (n <= next) {
|
||||||
|
offset = n - traversed
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
traversed = next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the focus node is inside a void, go up until right before it.
|
||||||
|
if (document.hasVoidParent(node.key)) {
|
||||||
|
const parent = document.getClosest(node.key, p => p.isVoid)
|
||||||
|
node = document.getPreviousText(parent.key)
|
||||||
|
offset = node.length
|
||||||
|
}
|
||||||
|
|
||||||
range = range.merge({
|
range = range.merge({
|
||||||
focusOffset: focusOffset + n
|
focusKey: node.key,
|
||||||
|
focusOffset: offset,
|
||||||
})
|
})
|
||||||
|
|
||||||
transform.deleteAtRange(range, { normalize })
|
transform.deleteAtRange(range, { normalize })
|
||||||
|
@@ -59,8 +59,9 @@ function isWord(char, remaining) {
|
|||||||
|
|
||||||
// If it's a chameleon character, recurse to see if the next one is or not.
|
// If it's a chameleon character, recurse to see if the next one is or not.
|
||||||
if (CHAMELEON.test(char)) {
|
if (CHAMELEON.test(char)) {
|
||||||
const next = remaining.charAt(0)
|
let next = remaining.charAt(0)
|
||||||
const length = getCharLength(next)
|
const length = getCharLength(next)
|
||||||
|
next = remaining.slice(0, length)
|
||||||
const rest = remaining.slice(length)
|
const rest = remaining.slice(length)
|
||||||
if (isWord(next, rest)) return true
|
if (isWord(next, rest)) return true
|
||||||
}
|
}
|
||||||
@@ -136,13 +137,14 @@ function getWordOffset(text) {
|
|||||||
|
|
||||||
while (char = text.charAt(i)) {
|
while (char = text.charAt(i)) {
|
||||||
const l = getCharLength(char)
|
const l = getCharLength(char)
|
||||||
|
char = text.slice(i, i + l)
|
||||||
const rest = text.slice(i + l)
|
const rest = text.slice(i + l)
|
||||||
|
|
||||||
if (isWord(char, rest)) {
|
if (isWord(char, rest)) {
|
||||||
started = true
|
started = true
|
||||||
length++
|
length += l
|
||||||
} else if (!started) {
|
} else if (!started) {
|
||||||
length++
|
length += l
|
||||||
} else {
|
} else {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -164,7 +166,8 @@ function getWordOffset(text) {
|
|||||||
function getWordOffsetBackward(text, offset) {
|
function getWordOffsetBackward(text, offset) {
|
||||||
text = text.slice(0, offset)
|
text = text.slice(0, offset)
|
||||||
text = reverse(text)
|
text = reverse(text)
|
||||||
return getWordOffset(text)
|
const o = getWordOffset(text)
|
||||||
|
return o
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -177,7 +180,8 @@ function getWordOffsetBackward(text, offset) {
|
|||||||
|
|
||||||
function getWordOffsetForward(text, offset) {
|
function getWordOffsetForward(text, offset) {
|
||||||
text = text.slice(offset)
|
text = text.slice(offset)
|
||||||
return getWordOffset(text)
|
const o = getWordOffset(text)
|
||||||
|
return o
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const last = texts.last()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: last.key,
|
||||||
|
anchorOffset: last.length,
|
||||||
|
focusKey: last.key,
|
||||||
|
focusOffset: last.length
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteCharBackwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: one
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: two
|
||||||
|
- kind: text
|
||||||
|
text: 📛
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: one
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: two
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const last = texts.last()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: last.key,
|
||||||
|
anchorOffset: last.length,
|
||||||
|
focusKey: last.key,
|
||||||
|
focusOffset: last.length
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteCharBackwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: one
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: tw📛
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: one
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: tw
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const second = texts.get(1)
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: second.key,
|
||||||
|
anchorOffset: second.length - 1,
|
||||||
|
focusKey: second.key,
|
||||||
|
focusOffset: second.length - 1
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteCharBackwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: one
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: tw📛o
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: one
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: two
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const last = texts.last()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: last.key,
|
||||||
|
anchorOffset: last.length,
|
||||||
|
focusKey: last.key,
|
||||||
|
focusOffset: last.length
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteCharBackwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "one two three"
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "one two thre"
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const last = texts.last()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: last.key,
|
||||||
|
anchorOffset: last.length - 2,
|
||||||
|
focusKey: last.key,
|
||||||
|
focusOffset: last.length - 2
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteCharBackwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "one two three"
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "one two thee"
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const first = texts.first()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: first.key,
|
||||||
|
anchorOffset: 0,
|
||||||
|
focusKey: first.key,
|
||||||
|
focusOffset: 0,
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteCharForwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: 📛
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: two
|
||||||
|
- kind: text
|
||||||
|
text: three
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: two
|
||||||
|
- kind: text
|
||||||
|
text: three
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const second = texts.get(1)
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: second.key,
|
||||||
|
anchorOffset: 2,
|
||||||
|
focusKey: second.key,
|
||||||
|
focusOffset: 2
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteCharForwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: one
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: tw📛o
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: one
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: two
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const first = texts.first()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: first.key,
|
||||||
|
anchorOffset: 0,
|
||||||
|
focusKey: first.key,
|
||||||
|
focusOffset: 0,
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteCharForwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: 📛two
|
||||||
|
- kind: text
|
||||||
|
text: three
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: two
|
||||||
|
- kind: text
|
||||||
|
text: three
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const first = texts.first()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: first.key,
|
||||||
|
anchorOffset: 1,
|
||||||
|
focusKey: first.key,
|
||||||
|
focusOffset: 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteCharForwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "one two three"
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "oe two three"
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const first = texts.first()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: first.key,
|
||||||
|
anchorOffset: 0,
|
||||||
|
focusKey: first.key,
|
||||||
|
focusOffset: 0,
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteCharForwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "one two three"
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "ne two three"
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const last = texts.last()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: last.key,
|
||||||
|
anchorOffset: last.length,
|
||||||
|
focusKey: last.key,
|
||||||
|
focusOffset: last.length
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteWordBackwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: one
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: two
|
||||||
|
- kind: text
|
||||||
|
text: 📛
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const last = texts.last()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: last.key,
|
||||||
|
anchorOffset: last.length,
|
||||||
|
focusKey: last.key,
|
||||||
|
focusOffset: last.length
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteWordBackwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: one
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: tw📛o
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const last = texts.last()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: last.key,
|
||||||
|
anchorOffset: last.length,
|
||||||
|
focusKey: last.key,
|
||||||
|
focusOffset: last.length
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteWordBackwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "one two three"
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "one two "
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const last = texts.last()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: last.key,
|
||||||
|
anchorOffset: last.length - 2,
|
||||||
|
focusKey: last.key,
|
||||||
|
focusOffset: last.length - 2
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteWordBackwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "one two three"
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "one two ee"
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const first = texts.first()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: first.key,
|
||||||
|
anchorOffset: 0,
|
||||||
|
focusKey: first.key,
|
||||||
|
focusOffset: 0
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteWordForwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: one
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: two
|
||||||
|
- kind: text
|
||||||
|
text: 📛
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const first = texts.first()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: first.key,
|
||||||
|
anchorOffset: 0,
|
||||||
|
focusKey: first.key,
|
||||||
|
focusOffset: 0
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteWordForwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: one
|
||||||
|
- kind: inline
|
||||||
|
type: link
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: tw📛o
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: ""
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const first = texts.first()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: first.key,
|
||||||
|
anchorOffset: 1,
|
||||||
|
focusKey: first.key,
|
||||||
|
focusOffset: 1,
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteWordForwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "one two three"
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "o two three"
|
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
export default function (state) {
|
||||||
|
const { document, selection } = state
|
||||||
|
const texts = document.getTexts()
|
||||||
|
const first = texts.first()
|
||||||
|
const range = selection.merge({
|
||||||
|
anchorKey: first.key,
|
||||||
|
anchorOffset: 0,
|
||||||
|
focusKey: first.key,
|
||||||
|
focusOffset: 0
|
||||||
|
})
|
||||||
|
|
||||||
|
return state
|
||||||
|
.transform()
|
||||||
|
.deleteWordForwardAtRange(range)
|
||||||
|
.apply()
|
||||||
|
}
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: "one two three"
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- kind: block
|
||||||
|
type: paragraph
|
||||||
|
nodes:
|
||||||
|
- kind: text
|
||||||
|
text: " two three"
|
Reference in New Issue
Block a user