1
0
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:
Ian Storm Taylor 2016-08-16 23:42:40 -07:00
parent 54a46484e3
commit 229cfd3e4e
3 changed files with 41 additions and 44 deletions

View File

@ -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)

View File

@ -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
}

View File

@ -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)