1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-08-29 18:09:49 +02:00

more fixes

This commit is contained in:
Ian Storm Taylor
2016-06-17 00:52:15 -07:00
parent cf9eaccf52
commit e7d94c3c35
2 changed files with 85 additions and 74 deletions

View File

@@ -20,10 +20,22 @@ const SelectionRecord = new Record({
class Selection extends SelectionRecord { class Selection extends SelectionRecord {
/**
* Create a new `Selection` from `attrs`.
*
* @return {Selection} selection
*/
static create(attrs) { static create(attrs) {
return new Selection(attrs) return new Selection(attrs)
} }
/**
* Get whether the selection is collapsed.
*
* @return {Boolean} isCollapsed
*/
get isCollapsed() { get isCollapsed() {
return ( return (
this.anchorKey === this.focusKey && this.anchorKey === this.focusKey &&
@@ -31,10 +43,38 @@ class Selection extends SelectionRecord {
) )
} }
/**
* Get whether the selection is expanded.
*
* Aliased as `isExtended` since browser implementations refer to it as both.
*
* @return {Boolean} isExpanded
*/
get isExpanded() {
return ! this.isCollapsed
}
get isExtended() {
return this.isExpanded
}
/**
* Get whether the selection is forward.
*
* @return {Boolean} isForward
*/
get isForward() { get isForward() {
return ! this.isBackward return ! this.isBackward
} }
/**
* Get the start key.
*
* @return {String} startKey
*/
get startKey() { get startKey() {
return this.isBackward return this.isBackward
? this.focusKey ? this.focusKey

View File

@@ -55,7 +55,7 @@ const SELECTION_LIKE_METHODS = [
class State extends StateRecord { class State extends StateRecord {
/** /**
* Create a new `state` from `attrs`. * Create a new `State` from `attrs`.
* *
* @return {State} state * @return {State} state
*/ */
@@ -68,119 +68,73 @@ class State extends StateRecord {
} }
/** /**
* Get whether the selection is collapsed. * Node-like getters.
*
* @return {Boolean} isCollapsed
*/
get isCollapsed() {
return this.selection.isCollapsed
}
/**
* Get the length of the concatenated text of all nodes.
*
* @return {Number} length
*/ */
get length() { get length() {
return this.text.length return this.text.length
} }
/**
* Get the concatenated text of all nodes.
*
* @return {String} text
*/
get text() { get text() {
return this.nodes return this.nodes
.map(node => node.text) .map(node => node.text)
.join('') .join('')
} }
get type() {
return 'state'
}
/** /**
* Get the anchor key. * Selection-like getters.
*
* @return {String} anchorKey
*/ */
get isCollapsed() {
return this.selection.isCollapsed
}
get isExpanded() {
return this.selection.isExpanded
}
get isExtended() {
return this.selection.isExtended
}
get anchorKey() { get anchorKey() {
return this.selection.anchorKey return this.selection.anchorKey
} }
/**
* Get the anchor offset.
*
* @return {String} anchorOffset
*/
get anchorOffset() { get anchorOffset() {
return this.selection.anchorOffset return this.selection.anchorOffset
} }
/**
* Get the focus key.
*
* @return {String} focusKey
*/
get focusKey() { get focusKey() {
return this.selection.focusKey return this.selection.focusKey
} }
/**
* Get the focus offset.
*
* @return {String} focusOffset
*/
get focusOffset() { get focusOffset() {
return this.selection.focusOffset return this.selection.focusOffset
} }
/**
* Get the start key.
*
* @return {String} startKey
*/
get startKey() { get startKey() {
return this.selection.startKey return this.selection.startKey
} }
/**
* Get the start offset.
*
* @return {String} startOffset
*/
get startOffset() { get startOffset() {
return this.selection.startOffset return this.selection.startOffset
} }
/**
* Get the end key.
*
* @return {String} endKey
*/
get endKey() { get endKey() {
return this.selection.endKey return this.selection.endKey
} }
/**
* Get the end offset.
*
* @return {String} endOffset
*/
get endOffset() { get endOffset() {
return this.selection.endOffset return this.selection.endOffset
} }
/** /**
* Get the anchor node. * Get the current anchor node.
* *
* @return {Node} node * @return {Node} node
*/ */
@@ -190,7 +144,7 @@ class State extends StateRecord {
} }
/** /**
* Get the focus node. * Get the current focus node.
* *
* @return {Node} node * @return {Node} node
*/ */
@@ -200,7 +154,7 @@ class State extends StateRecord {
} }
/** /**
* Get the start node. * Get the current start node.
* *
* @return {Node} node * @return {Node} node
*/ */
@@ -210,7 +164,7 @@ class State extends StateRecord {
} }
/** /**
* Get the end node. * Get the current end node.
* *
* @return {Node} node * @return {Node} node
*/ */
@@ -305,8 +259,26 @@ class State extends StateRecord {
// When already at the end of the content, there's nothing to do. // When already at the end of the content, there's nothing to do.
if (state.isAtEndOf(state)) return state if (state.isAtEndOf(state)) return state
// When at end of a node, merge forwards into the next node.
const { startNode } = state
if (state.isAtEndOf(startNode)) {
const { selection, startOffset } = state
const parent = state.getParentNode(startNode)
const next = state.getNextNode(parent).nodes.first()
const range = selection.merge({
anchorKey: startNode.key,
anchorOffset: startNode.length,
focusKey: next.key,
focusOffset: 0,
isBackward: false
})
state = state.removeRange(range)
return state
}
// Otherwise, remove one character ahead of the cursor. // Otherwise, remove one character ahead of the cursor.
const { startOffset, startNode } = state const { startOffset } = state
const endOffset = startOffset + 1 const endOffset = startOffset + 1
state = state.removeCharacters(startNode.key, startOffset, endOffset) state = state.removeCharacters(startNode.key, startOffset, endOffset)
return state return state
@@ -334,6 +306,7 @@ class State extends StateRecord {
removeCharacters(key, startOffset, endOffset) { removeCharacters(key, startOffset, endOffset) {
let state = this let state = this
let node = state.getNode(key) let node = state.getNode(key)
const characters = node.characters.filterNot((char, i) => { const characters = node.characters.filterNot((char, i) => {
return startOffset <= i && i < endOffset return startOffset <= i && i < endOffset
}) })
@@ -371,17 +344,15 @@ class State extends StateRecord {
splitRange(selection = this.selection) { splitRange(selection = this.selection) {
let state = this let state = this
// if there's an existing selection, remove it first // If there's an existing selection, remove it first.
if (!selection.isCollapsed) { if (!selection.isCollapsed) {
state = state.removeRange(selection) state = state.removeRange(selection)
selection = selection.moveToStart() selection = selection.moveToStart()
} }
// then split the node at the selection // Split the text node's characters.
const { startNode, startOffset } = state const { startNode, startOffset } = state
const parent = state.getParentNode(startNode) const parent = state.getParentNode(startNode)
// split the characters
const { characters , length } = startNode const { characters , length } = startNode
const firstCharacters = characters.take(startOffset) const firstCharacters = characters.take(startOffset)
const secondCharacters = characters.takeLast(length - startOffset) const secondCharacters = characters.takeLast(length - startOffset)