mirror of
https://github.com/ianstormtaylor/slate.git
synced 2025-08-28 17:39:57 +02:00
Fix selection after transform.wrapInline (#872)
* Add failing test for wrapInline * Adapt tests for wrap-twice and whole-block * Adapt transform to move selection correctly * Fix lint errors * Use keys in yaml
This commit is contained in:
committed by
Ian Storm Taylor
parent
54d204b87e
commit
57da8da4b4
@@ -424,7 +424,6 @@ Transforms.wrapInline = (transform, properties) => {
|
||||
let after
|
||||
|
||||
const { startKey } = selection
|
||||
const previous = document.getPreviousText(startKey)
|
||||
|
||||
transform.deselect()
|
||||
transform.wrapInlineAtRange(selection, properties)
|
||||
@@ -437,8 +436,21 @@ Transforms.wrapInline = (transform, properties) => {
|
||||
}
|
||||
|
||||
else if (selection.startOffset == 0) {
|
||||
const text = previous ? document.getNextText(previous.key) : document.getFirstText()
|
||||
after = selection.moveToRangeOf(text)
|
||||
// Find the inline that has been inserted.
|
||||
// We want to handle multiple wrap, so we need to take the highest parent
|
||||
const inline = document.getAncestors(startKey)
|
||||
.find(parent => (
|
||||
parent.kind == 'inline' &&
|
||||
parent.getOffset(startKey) == 0
|
||||
))
|
||||
|
||||
const start = inline ? document.getPreviousText(inline.getFirstText().key) : document.getFirstText()
|
||||
const end = document.getNextText(inline ? inline.getLastText().key : start.key)
|
||||
|
||||
// Move selection to wrap around the inline
|
||||
after = selection
|
||||
.moveAnchorToEndOf(start)
|
||||
.moveFocusToStartOf(end)
|
||||
}
|
||||
|
||||
else if (selection.startKey == selection.endKey) {
|
||||
|
@@ -19,15 +19,15 @@ export default function (state) {
|
||||
.wrapInline('outer')
|
||||
.apply()
|
||||
|
||||
const updated = next.document.getTexts().get(1)
|
||||
const anchor = next.document.getTexts().get(0)
|
||||
const focus = next.document.getTexts().get(4)
|
||||
|
||||
// TODO: seems wrong.
|
||||
assert.deepEqual(
|
||||
next.selection.toJS(),
|
||||
range.merge({
|
||||
anchorKey: updated.key,
|
||||
anchorOffset: 0,
|
||||
focusKey: updated.key,
|
||||
anchorKey: anchor.key,
|
||||
anchorOffset: anchor.length,
|
||||
focusKey: focus.key,
|
||||
focusOffset: 0
|
||||
}).toJS()
|
||||
)
|
||||
|
@@ -0,0 +1,30 @@
|
||||
|
||||
import assert from 'assert'
|
||||
|
||||
export default function (state) {
|
||||
const { selection } = state
|
||||
const range = selection.merge({
|
||||
anchorKey: 'b',
|
||||
anchorOffset: 0,
|
||||
focusKey: 'b',
|
||||
focusOffset: 4
|
||||
})
|
||||
|
||||
const next = state
|
||||
.transform()
|
||||
.select(range)
|
||||
.wrapInline('hashtag')
|
||||
.apply()
|
||||
|
||||
assert.deepEqual(
|
||||
next.selection.toJS(),
|
||||
range.merge({
|
||||
anchorKey: '4',
|
||||
anchorOffset: 0,
|
||||
focusKey: '5',
|
||||
focusOffset: 0
|
||||
}).toJS()
|
||||
)
|
||||
|
||||
return next
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
|
||||
nodes:
|
||||
- kind: block
|
||||
type: paragraph
|
||||
key: a
|
||||
nodes:
|
||||
- kind: text
|
||||
key: b
|
||||
text: word
|
@@ -0,0 +1,18 @@
|
||||
|
||||
nodes:
|
||||
- kind: block
|
||||
key: a
|
||||
type: paragraph
|
||||
nodes:
|
||||
- kind: text
|
||||
key: c
|
||||
text: ""
|
||||
- kind: inline
|
||||
type: hashtag
|
||||
nodes:
|
||||
- kind: text
|
||||
key: b
|
||||
text: word
|
||||
- kind: text
|
||||
key: d
|
||||
text: ""
|
Reference in New Issue
Block a user