mirror of
https://github.com/ianstormtaylor/slate.git
synced 2025-02-24 09:13:24 +01:00
normalize more transforms
This commit is contained in:
parent
54a46484e3
commit
229cfd3e4e
@ -250,7 +250,7 @@ class Text extends new Record(DEFAULTS) {
|
||||
removeMark(index, length, mark) {
|
||||
const characters = this.characters.map((char, i) => {
|
||||
if (i < index) return char
|
||||
if (i > index + length) return char
|
||||
if (i >= index + length) return char
|
||||
let { marks } = char
|
||||
marks = marks.remove(mark)
|
||||
char = char.merge({ marks })
|
||||
@ -289,7 +289,7 @@ class Text extends new Record(DEFAULTS) {
|
||||
updateMark(index, length, mark, properties) {
|
||||
const characters = this.characters.map((char, i) => {
|
||||
if (i < index) return char
|
||||
if (i > index + length) return char
|
||||
if (i >= index + length) return char
|
||||
let { marks } = char
|
||||
const j = marks.indexOf(mark)
|
||||
let m = marks.get(j)
|
||||
|
@ -545,37 +545,25 @@ export function insertTextAtRange(transform, range, text, marks) {
|
||||
*/
|
||||
|
||||
export function removeMarkAtRange(transform, range, mark) {
|
||||
let { state } = transform
|
||||
mark = Normalize.mark(mark)
|
||||
let { document } = state
|
||||
|
||||
// When the range is collapsed, do nothing.
|
||||
if (range.isCollapsed) return transform
|
||||
|
||||
// Otherwise, find each of the text nodes within the range.
|
||||
let texts = document.getTextsAtRange(range)
|
||||
const { state } = transform
|
||||
const { document } = state
|
||||
const texts = document.getTextsAtRange(range)
|
||||
const { startKey, startOffset, endKey, endOffset } = range
|
||||
|
||||
// Apply the mark to each of the text nodes's matching characters.
|
||||
texts = texts.map((text) => {
|
||||
let characters = text.characters.map((char, i) => {
|
||||
if (!isInRange(i, text, range)) return char
|
||||
let { marks } = char
|
||||
marks = mark
|
||||
? marks.remove(mark)
|
||||
: marks.clear()
|
||||
return char.merge({ marks })
|
||||
})
|
||||
|
||||
return text.merge({ characters })
|
||||
})
|
||||
|
||||
// Update each of the text nodes.
|
||||
texts.forEach((text) => {
|
||||
document = document.updateDescendant(text)
|
||||
const { key } = text
|
||||
let index = 0
|
||||
let length = text.length
|
||||
|
||||
if (key == startKey) index = startOffset
|
||||
if (key == endKey) length = endOffset
|
||||
if (key == startKey && key == endKey) length = endOffset - startOffset
|
||||
|
||||
transform.removeMarkByKey(key, index, length, mark)
|
||||
})
|
||||
|
||||
state = state.merge({ document })
|
||||
transform.state = state
|
||||
return transform
|
||||
}
|
||||
|
||||
@ -806,25 +794,27 @@ export function splitTextAtRange(transform, range) {
|
||||
*
|
||||
* @param {Transform} transform
|
||||
* @param {Selection} range
|
||||
* @param {Mark or String} mark (optional)
|
||||
* @param {Mixed} mark
|
||||
* @return {Transform}
|
||||
*/
|
||||
|
||||
export function toggleMarkAtRange(transform, range, mark) {
|
||||
let { state } = transform
|
||||
mark = Normalize.mark(mark)
|
||||
let { document } = state
|
||||
|
||||
// When the range is collapsed, do nothing.
|
||||
if (range.isCollapsed) return transform
|
||||
|
||||
// Check if the mark exists in the range already.
|
||||
mark = Normalize.mark(mark)
|
||||
|
||||
const { state } = transform
|
||||
const { document } = state
|
||||
const marks = document.getMarksAtRange(range)
|
||||
const exists = marks.some(m => m.equals(mark))
|
||||
|
||||
return exists
|
||||
? removeMarkAtRange(transform, range, mark)
|
||||
: addMarkAtRange(transform, range, mark)
|
||||
if (exists) {
|
||||
transform.removeMarkAtRange(range, mark)
|
||||
} else {
|
||||
transform.addMarkAtRange(range, mark)
|
||||
}
|
||||
|
||||
return transform
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1125,15 +1115,16 @@ export function wrapInlineAtRange(transform, range, properties) {
|
||||
*/
|
||||
|
||||
export function wrapTextAtRange(transform, range, prefix, suffix = prefix) {
|
||||
let { state } = transform
|
||||
// Insert text at the starting edge.
|
||||
const { state } = transform
|
||||
const { startKey, endKey } = range
|
||||
const start = range.collapseToStart()
|
||||
transform = insertTextAtRange(transform, start, prefix)
|
||||
|
||||
// Determine the new ending edge, and insert text there.
|
||||
let end = range.collapseToEnd()
|
||||
if (startKey == endKey) end = end.moveForward(prefix.length)
|
||||
transform = insertTextAtRange(transform, end, suffix)
|
||||
|
||||
if (startKey == endKey) {
|
||||
end = end.moveForward(prefix.length)
|
||||
}
|
||||
|
||||
transform.insertTextAtRange(start, prefix)
|
||||
transform.insertTextAtRange(end, suffix)
|
||||
return transform
|
||||
}
|
||||
|
@ -14,6 +14,7 @@ import Normalize from '../utils/normalize'
|
||||
|
||||
export function addMarkByKey(transform, key, index, length, mark) {
|
||||
mark = Normalize.mark(mark)
|
||||
|
||||
let { state } = transform
|
||||
let { document } = state
|
||||
let node = document.assertDescendant(key)
|
||||
@ -155,6 +156,8 @@ export function moveNodeByKey(transform, key, newKey, newIndex) {
|
||||
*/
|
||||
|
||||
export function removeMarkByKey(transform, key, index, length, mark) {
|
||||
mark = Normalize.mark(mark)
|
||||
|
||||
let { state } = transform
|
||||
let { document } = state
|
||||
let node = document.assertDescendant(key)
|
||||
@ -251,7 +254,9 @@ export function removeTextByKey(transform, key, index, length) {
|
||||
*/
|
||||
|
||||
export function setMarkByKey(transform, key, index, length, mark, properties) {
|
||||
mark = Normalize.mark(mark)
|
||||
properties = Normalize.markProperties(properties)
|
||||
|
||||
let { state } = transform
|
||||
let { document } = state
|
||||
let node = document.assertDescendant(key)
|
||||
@ -285,6 +290,7 @@ export function setMarkByKey(transform, key, index, length, mark, properties) {
|
||||
|
||||
export function setNodeByKey(transform, key, properties) {
|
||||
properties = Normalize.nodeProperties(properties)
|
||||
|
||||
let { state } = transform
|
||||
let { document } = state
|
||||
let node = document.assertDescendant(key)
|
||||
|
Loading…
x
Reference in New Issue
Block a user