mirror of
https://github.com/ianstormtaylor/slate.git
synced 2025-08-20 06:01:24 +02:00
normalize more transforms
This commit is contained in:
@@ -250,7 +250,7 @@ class Text extends new Record(DEFAULTS) {
|
|||||||
removeMark(index, length, mark) {
|
removeMark(index, length, mark) {
|
||||||
const characters = this.characters.map((char, i) => {
|
const characters = this.characters.map((char, i) => {
|
||||||
if (i < index) return char
|
if (i < index) return char
|
||||||
if (i > index + length) return char
|
if (i >= index + length) return char
|
||||||
let { marks } = char
|
let { marks } = char
|
||||||
marks = marks.remove(mark)
|
marks = marks.remove(mark)
|
||||||
char = char.merge({ marks })
|
char = char.merge({ marks })
|
||||||
@@ -289,7 +289,7 @@ class Text extends new Record(DEFAULTS) {
|
|||||||
updateMark(index, length, mark, properties) {
|
updateMark(index, length, mark, properties) {
|
||||||
const characters = this.characters.map((char, i) => {
|
const characters = this.characters.map((char, i) => {
|
||||||
if (i < index) return char
|
if (i < index) return char
|
||||||
if (i > index + length) return char
|
if (i >= index + length) return char
|
||||||
let { marks } = char
|
let { marks } = char
|
||||||
const j = marks.indexOf(mark)
|
const j = marks.indexOf(mark)
|
||||||
let m = marks.get(j)
|
let m = marks.get(j)
|
||||||
|
@@ -545,37 +545,25 @@ export function insertTextAtRange(transform, range, text, marks) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
export function removeMarkAtRange(transform, range, mark) {
|
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
|
if (range.isCollapsed) return transform
|
||||||
|
|
||||||
// Otherwise, find each of the text nodes within the range.
|
const { state } = transform
|
||||||
let texts = document.getTextsAtRange(range)
|
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) => {
|
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
|
return transform
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -806,25 +794,27 @@ export function splitTextAtRange(transform, range) {
|
|||||||
*
|
*
|
||||||
* @param {Transform} transform
|
* @param {Transform} transform
|
||||||
* @param {Selection} range
|
* @param {Selection} range
|
||||||
* @param {Mark or String} mark (optional)
|
* @param {Mixed} mark
|
||||||
* @return {Transform}
|
* @return {Transform}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export function toggleMarkAtRange(transform, range, mark) {
|
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
|
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 marks = document.getMarksAtRange(range)
|
||||||
const exists = marks.some(m => m.equals(mark))
|
const exists = marks.some(m => m.equals(mark))
|
||||||
|
|
||||||
return exists
|
if (exists) {
|
||||||
? removeMarkAtRange(transform, range, mark)
|
transform.removeMarkAtRange(range, mark)
|
||||||
: addMarkAtRange(transform, 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) {
|
export function wrapTextAtRange(transform, range, prefix, suffix = prefix) {
|
||||||
let { state } = transform
|
const { state } = transform
|
||||||
// Insert text at the starting edge.
|
|
||||||
const { startKey, endKey } = range
|
const { startKey, endKey } = range
|
||||||
const start = range.collapseToStart()
|
const start = range.collapseToStart()
|
||||||
transform = insertTextAtRange(transform, start, prefix)
|
|
||||||
|
|
||||||
// Determine the new ending edge, and insert text there.
|
|
||||||
let end = range.collapseToEnd()
|
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
|
return transform
|
||||||
}
|
}
|
||||||
|
@@ -14,6 +14,7 @@ import Normalize from '../utils/normalize'
|
|||||||
|
|
||||||
export function addMarkByKey(transform, key, index, length, mark) {
|
export function addMarkByKey(transform, key, index, length, mark) {
|
||||||
mark = Normalize.mark(mark)
|
mark = Normalize.mark(mark)
|
||||||
|
|
||||||
let { state } = transform
|
let { state } = transform
|
||||||
let { document } = state
|
let { document } = state
|
||||||
let node = document.assertDescendant(key)
|
let node = document.assertDescendant(key)
|
||||||
@@ -155,6 +156,8 @@ export function moveNodeByKey(transform, key, newKey, newIndex) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
export function removeMarkByKey(transform, key, index, length, mark) {
|
export function removeMarkByKey(transform, key, index, length, mark) {
|
||||||
|
mark = Normalize.mark(mark)
|
||||||
|
|
||||||
let { state } = transform
|
let { state } = transform
|
||||||
let { document } = state
|
let { document } = state
|
||||||
let node = document.assertDescendant(key)
|
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) {
|
export function setMarkByKey(transform, key, index, length, mark, properties) {
|
||||||
|
mark = Normalize.mark(mark)
|
||||||
properties = Normalize.markProperties(properties)
|
properties = Normalize.markProperties(properties)
|
||||||
|
|
||||||
let { state } = transform
|
let { state } = transform
|
||||||
let { document } = state
|
let { document } = state
|
||||||
let node = document.assertDescendant(key)
|
let node = document.assertDescendant(key)
|
||||||
@@ -285,6 +290,7 @@ export function setMarkByKey(transform, key, index, length, mark, properties) {
|
|||||||
|
|
||||||
export function setNodeByKey(transform, key, properties) {
|
export function setNodeByKey(transform, key, properties) {
|
||||||
properties = Normalize.nodeProperties(properties)
|
properties = Normalize.nodeProperties(properties)
|
||||||
|
|
||||||
let { state } = transform
|
let { state } = transform
|
||||||
let { document } = state
|
let { document } = state
|
||||||
let node = document.assertDescendant(key)
|
let node = document.assertDescendant(key)
|
||||||
|
Reference in New Issue
Block a user