diff --git a/docs/reference/models/text.md b/docs/reference/models/text.md index 00b64f909..04e680e17 100644 --- a/docs/reference/models/text.md +++ b/docs/reference/models/text.md @@ -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) => 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. diff --git a/src/models/range.js b/src/models/range.js new file mode 100644 index 000000000..e3a4e0365 --- /dev/null +++ b/src/models/range.js @@ -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} characters + */ + + getCharacters() { + const { marks } = this + + return Character.createList(this.text + .split('') + .map((char) => { + return Character.create({ + text: char, + marks + }) + })) + } +} + +/** + * Export. + */ + +export default Range diff --git a/src/models/text.js b/src/models/text.js index 9ccd69b00..aad02090b 100644 --- a/src/models/text.js +++ b/src/models/text.js @@ -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} 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 | Array} 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()) }) }