1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-07-31 20:40:19 +02:00

Add method createFromRanges to Text

This commit is contained in:
Samy Pessé
2016-11-09 10:26:33 +01:00
parent 49f6331075
commit 4d33991358
3 changed files with 101 additions and 19 deletions

View File

@@ -16,7 +16,8 @@ A text node in a Slate [`Document`](./document.md). Text nodes are always the bo
- [`text`](#text)
- [Static Methods](#static-methods)
- [`Text.create`](#textcreate)
- [`Text.createFromString`](#textcreatefromstring)
- [`Text.createFromRanges`](#textcreatefromranges)
## Properties
@@ -61,3 +62,13 @@ A concatenated string of all of the characters in the text node.
`Text.create(properties: Object) => Text`
Create a text from a plain Javascript object of `properties`.
### `Text.createFromRanges`
`Text.createFromRanges(ranges: List<Range>) => Text`
Create a text from a list of text ranges.
### `Text.createFromString`
`Text.createFromString(text: String, marks: Set) => Text`
Create a text from a plain `String` and a set of marks.

69
src/models/range.js Normal file
View File

@@ -0,0 +1,69 @@
import Character from './character'
import Mark from './mark'
import { Record, Set } from 'immutable'
/**
* Default properties.
*/
const DEFAULTS = {
marks: new Set(),
text: ''
}
/**
* Range.
*/
class Range extends new Record(DEFAULTS) {
/**
* Create a new `Range` with `properties`.
*
* @param {Object} properties
* @return {Range}
*/
static create(properties = {}) {
if (properties instanceof Range) return properties
properties.text = properties.text
properties.marks = Mark.createSet(properties.marks)
return new Range(properties)
}
/**
* Get the node's kind.
*
* @return {String} kind
*/
get kind() {
return 'range'
}
/**
* Return range as a list of characters
*
* @return {List<Character>} characters
*/
getCharacters() {
const { marks } = this
return Character.createList(this.text
.split('')
.map((char) => {
return Character.create({
text: char,
marks
})
}))
}
}
/**
* Export.
*/
export default Range

View File

@@ -1,20 +1,11 @@
import Character from './character'
import Mark from './mark'
import Range from './range'
import memoize from '../utils/memoize'
import uid from '../utils/uid'
import { List, Record, Set } from 'immutable'
/**
* Range.
*/
const Range = new Record({
kind: 'range',
marks: new Set(),
text: ''
})
/**
* Default properties.
*/
@@ -47,19 +38,30 @@ class Text extends new Record(DEFAULTS) {
/**
* Create a new `Text` from a string
*
* @param {String} content
* @param {String} text
* @param {Set<Mark>} marks (optional)
* @return {Text}
*/
static createFromString(content, marks = Set()) {
static createFromString(text, marks = Set()) {
return Text.createFromRanges([
Range.create({ text, marks })
])
}
/**
* Create a new `Text` from a list of ranges
*
* @param {List<Range> | Array<Range>} ranges
* @return {Text}
*/
static createFromRanges(ranges) {
return Text.create({
characters: Character.createList(
content.split('')
.map(c => {
return { text: c, marks }
})
)
characters: ranges.reduce((characters, range) => {
range = Range.create(range)
return characters.concat(range.getCharacters())
}, Character.createList())
})
}