mirror of
https://github.com/ianstormtaylor/slate.git
synced 2025-08-27 17:09:53 +02:00
Add method createFromRanges to Text
This commit is contained in:
@@ -16,7 +16,8 @@ A text node in a Slate [`Document`](./document.md). Text nodes are always the bo
|
|||||||
- [`text`](#text)
|
- [`text`](#text)
|
||||||
- [Static Methods](#static-methods)
|
- [Static Methods](#static-methods)
|
||||||
- [`Text.create`](#textcreate)
|
- [`Text.create`](#textcreate)
|
||||||
|
- [`Text.createFromString`](#textcreatefromstring)
|
||||||
|
- [`Text.createFromRanges`](#textcreatefromranges)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -61,3 +62,13 @@ A concatenated string of all of the characters in the text node.
|
|||||||
`Text.create(properties: Object) => Text`
|
`Text.create(properties: Object) => Text`
|
||||||
|
|
||||||
Create a text from a plain Javascript object of `properties`.
|
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
69
src/models/range.js
Normal 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
|
@@ -1,20 +1,11 @@
|
|||||||
|
|
||||||
import Character from './character'
|
import Character from './character'
|
||||||
import Mark from './mark'
|
import Mark from './mark'
|
||||||
|
import Range from './range'
|
||||||
import memoize from '../utils/memoize'
|
import memoize from '../utils/memoize'
|
||||||
import uid from '../utils/uid'
|
import uid from '../utils/uid'
|
||||||
import { List, Record, Set } from 'immutable'
|
import { List, Record, Set } from 'immutable'
|
||||||
|
|
||||||
/**
|
|
||||||
* Range.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Range = new Record({
|
|
||||||
kind: 'range',
|
|
||||||
marks: new Set(),
|
|
||||||
text: ''
|
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default properties.
|
* Default properties.
|
||||||
*/
|
*/
|
||||||
@@ -47,19 +38,30 @@ class Text extends new Record(DEFAULTS) {
|
|||||||
/**
|
/**
|
||||||
* Create a new `Text` from a string
|
* Create a new `Text` from a string
|
||||||
*
|
*
|
||||||
* @param {String} content
|
* @param {String} text
|
||||||
* @param {Set<Mark>} marks (optional)
|
* @param {Set<Mark>} marks (optional)
|
||||||
* @return {Text}
|
* @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({
|
return Text.create({
|
||||||
characters: Character.createList(
|
characters: ranges.reduce((characters, range) => {
|
||||||
content.split('')
|
range = Range.create(range)
|
||||||
.map(c => {
|
return characters.concat(range.getCharacters())
|
||||||
return { text: c, marks }
|
}, Character.createList())
|
||||||
})
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user