mirror of
https://github.com/ianstormtaylor/slate.git
synced 2025-02-24 09:13:24 +01:00
34 lines
850 B
JavaScript
34 lines
850 B
JavaScript
|
|
import xor from 'lodash/xor'
|
|
|
|
/**
|
|
* Convert a `characters` list to `ranges`.
|
|
*
|
|
* @param {CharacterList} characters
|
|
* @return {Array} ranges
|
|
*/
|
|
|
|
export default function convertCharactersToRanges(characters) {
|
|
return characters
|
|
.toArray()
|
|
.reduce((ranges, char, i) => {
|
|
const previous = i == 0 ? null : characters.get(i - 1)
|
|
const { text } = char
|
|
const marks = char.marks.toArray()
|
|
|
|
if (previous) {
|
|
const previousMarks = previous.marks.toArray()
|
|
const diff = xor(marks, previousMarks)
|
|
if (!diff.length) {
|
|
const previousRange = ranges[ranges.length - 1]
|
|
previousRange.text += text
|
|
return ranges
|
|
}
|
|
}
|
|
|
|
const offset = ranges.map(range => range.text).join('').length
|
|
ranges.push({ text, marks, offset })
|
|
return ranges
|
|
}, [])
|
|
}
|