1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-04-21 13:51:59 +02:00

fix selection methods resolution of isBackward, closes #512

This commit is contained in:
Ian Storm Taylor 2016-12-09 16:12:17 -08:00
parent 9dde2e56f1
commit 36bd59b839
2 changed files with 83 additions and 256 deletions

View File

@ -597,9 +597,17 @@ class Selection extends new Record(DEFAULTS) {
*/
moveStartOffset(n = 1) {
return this.isBackward
? this.merge({ focusOffset: this.focusOffset + n })
: this.merge({ anchorOffset: this.anchorOffset + n })
if (this.isBackward) {
return this.merge({
focusOffset: this.focusOffset + n,
isBackward: null
})
} else {
return this.merge({
anchorOffset: this.anchorOffset + n,
isBackward: null
})
}
}
/**
@ -610,9 +618,17 @@ class Selection extends new Record(DEFAULTS) {
*/
moveEndOffset(n = 1) {
return this.isBackward
? this.merge({ anchorOffset: this.anchorOffset + n })
: this.merge({ focusOffset: this.focusOffset + n })
if (this.isBackward) {
return this.merge({
anchorOffset: this.anchorOffset + n,
isBackward: null
})
} else {
return this.merge({
focusOffset: this.focusOffset + n,
isBackward: null
})
}
}
/**
@ -623,9 +639,19 @@ class Selection extends new Record(DEFAULTS) {
*/
moveStartTo(key, offset = 0) {
return this.isBackward
? this.merge({ focusKey: key, focusOffset: offset })
: this.merge({ anchorKey: key, anchorOffset: offset })
if (this.isBackward) {
return this.merge({
focusKey: key,
focusOffset: offset,
isBackward: null
})
} else {
return this.merge({
anchorKey: key,
anchorOffset: offset,
isBackward: null
})
}
}
/**
@ -636,9 +662,19 @@ class Selection extends new Record(DEFAULTS) {
*/
moveEndTo(key, offset = 0) {
return this.isBackward
? this.merge({ anchorKey: key, anchorOffset: offset })
: this.merge({ focusKey: key, focusOffset: offset })
if (this.isBackward) {
return this.merge({
anchorKey: key,
anchorOffset: offset,
isBackward: null
})
} else {
return this.merge({
focusKey: key,
focusOffset: offset,
isBackward: null
})
}
}
/**

View File

@ -1,82 +1,26 @@
/**
* Blur the selection.
*
* @param {Transform} transform
* Auto-generate many transforms based on the `Selection` methods.
*/
export function blur(transform) {
const { state } = transform
const { selection } = state
const sel = selection.blur()
transform.setSelectionOperation(sel)
}
/**
* Move the focus point to the anchor point.
*
* @param {Transform} transform
*/
export function collapseToAnchor(transform) {
const { state } = transform
const { selection } = state
const sel = selection.collapseToAnchor()
transform.setSelectionOperation(sel)
}
/**
* Move the start point to the end point.
*
* @param {Transform} transform
*/
export function collapseToEnd(transform) {
const { state } = transform
const { selection } = state
const sel = selection.collapseToEnd()
transform.setSelectionOperation(sel)
}
/**
* Move the anchor point to the focus point.
*
* @param {Transform} transform
*/
export function collapseToFocus(transform) {
const { state } = transform
const { selection } = state
const sel = selection.collapseToFocus()
transform.setSelectionOperation(sel)
}
/**
* Move the end point to the start point.
*
* @param {Transform} transform
*/
export function collapseToStart(transform) {
const { state } = transform
const { selection } = state
const sel = selection.collapseToStart()
transform.setSelectionOperation(sel)
}
/**
* Move to the end of a `node`.
*
* @param {Transform} transform
* @param {Node} node
*/
export function collapseToEndOf(transform, node) {
const { state } = transform
const { selection } = state
const sel = selection.collapseToEndOf(node)
transform.setSelectionOperation(sel)
}
export const blur = generate('blur')
export const collapseToAnchor = generate('collapseToAnchor')
export const collapseToEnd = generate('collapseToEnd')
export const collapseToFocus = generate('collapseToFocus')
export const collapseToStart = generate('collapseToStart')
export const collapseToEndOf = generate('collapseToEndOf')
export const collapseToStartOf = generate('collapseToStartOf')
export const extendBackward = generate('extendBackward')
export const extendForward = generate('extendForward')
export const extendToEndOf = generate('extendToEndOf')
export const extendToStartOf = generate('extendToStartOf')
export const focus = generate('focus')
export const moveBackward = generate('moveBackward')
export const moveForward = generate('moveForward')
export const moveToOffsets = generate('moveToOffsets')
export const moveToRangeOf = generate('moveToRangeOf')
export const moveStartOffset = generate('moveStartOffset')
export const moveEndOffset = generate('moveEndOffset')
/**
* Move the selection to the end of the next block.
@ -150,20 +94,6 @@ export function collapseToEndOfPreviousText(transform) {
transform.setSelectionOperation(sel)
}
/**
* Move to the start of a `node`.
*
* @param {Transform} transform
* @param {Node} node
*/
export function collapseToStartOf(transform, node) {
const { state } = transform
const { selection } = state
const sel = selection.collapseToStartOf(node)
transform.setSelectionOperation(sel)
}
/**
* Move the selection to the start of the next block.
*
@ -236,103 +166,6 @@ export function collapseToStartOfPreviousText(transform) {
transform.setSelectionOperation(sel)
}
/**
* Extend the focus point backward `n` characters.
*
* @param {Transform} transform
* @param {Number} n (optional)
*/
export function extendBackward(transform, n) {
const { state } = transform
const { document, selection } = state
const sel = selection.extendBackward(n).normalize(document)
transform.setSelectionOperation(sel)
}
/**
* Extend the focus point forward `n` characters.
*
* @param {Transform} transform
* @param {Number} n (optional)
*/
export function extendForward(transform, n) {
const { state } = transform
const { document, selection } = state
const sel = selection.extendForward(n).normalize(document)
transform.setSelectionOperation(sel)
}
/**
* Extend the focus point to the end of a `node`.
*
* @param {Transform} transform
* @param {Node} node
*/
export function extendToEndOf(transform, node) {
const { state } = transform
const { document, selection } = state
const sel = selection.extendToEndOf(node).normalize(document)
transform.setSelectionOperation(sel)
}
/**
* Extend the focus point to the start of a `node`.
*
* @param {Transform} transform
* @param {Node} node
*/
export function extendToStartOf(transform, node) {
const { state } = transform
const { document, selection } = state
const sel = selection.extendToStartOf(node).normalize(document)
transform.setSelectionOperation(sel)
}
/**
* Focus the selection.
*
* @param {Transform} transform
*/
export function focus(transform) {
const { state } = transform
const { selection } = state
const sel = selection.focus()
transform.setSelectionOperation(sel)
}
/**
* Move the selection backward `n` characters.
*
* @param {Transform} transform
* @param {Number} n (optional)
*/
export function moveBackward(transform, n) {
const { state } = transform
const { document, selection } = state
const sel = selection.moveBackward(n).normalize(document)
transform.setSelectionOperation(sel)
}
/**
* Move the selection forward `n` characters.
*
* @param {Transform} transform
* @param {Number} n (optional)
*/
export function moveForward(transform, n) {
const { state } = transform
const { document, selection } = state
const sel = selection.moveForward(n).normalize(document)
transform.setSelectionOperation(sel)
}
/**
* Move the selection to a specific anchor and focus point.
*
@ -344,64 +177,6 @@ export function moveTo(transform, properties) {
transform.setSelectionOperation(properties)
}
/**
* Move the selection to `anchor` and `focus` offsets.
*
* @param {Transform} transform
* @param {Number} anchor
* @param {Number} focus (optional)
*/
export function moveToOffsets(transform, anchor, _focus) {
const { state } = transform
const { selection } = state
const sel = selection.moveToOffsets(anchor, _focus)
transform.setSelectionOperation(sel)
}
/**
* Move to the entire range of `start` and `end` nodes.
*
* @param {Transform} transform
* @param {Node} start
* @param {Node} end (optional)
*/
export function moveToRangeOf(transform, start, end) {
const { state } = transform
const { document, selection } = state
const sel = selection.moveToRangeOf(start, end).normalize(document)
transform.setSelectionOperation(sel)
}
/**
* Move the start offset by `n`.
*
* @param {Transform} transform
* @param {Number} n
*/
export function moveStartOffset(transform, n) {
const { state } = transform
const { document, selection } = state
const sel = selection.moveStartOffset(n).normalize(document)
transform.setSelectionOperation(sel)
}
/**
* Move the end offset by `n`.
*
* @param {Transform} transform
* @param {Number} n
*/
export function moveEndOffset(transform, n) {
const { state } = transform
const { document, selection } = state
const sel = selection.moveEndOffset(n).normalize(document)
transform.setSelectionOperation(sel)
}
/**
* Unset the selection's marks.
*
@ -440,3 +215,19 @@ export function unsetSelection(transform) {
isBackward: false
})
}
/**
* Generate a selection transform for `method`.
*
* @param {String} method
* @return {Function}
*/
function generate(method) {
return (transform, ...args) => {
const { state } = transform
const { document, selection } = state
const sel = selection[method](...args).normalize(document)
transform.setSelectionOperation(sel)
}
}