1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-02-24 09:13:24 +01:00
slate/lib/utils/convert-characters-to-ranges.js
2016-06-15 20:00:41 -07:00

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
}, [])
}