diff --git a/lib/models/block.js b/lib/models/block.js index 4c797758b..1db463e8e 100644 --- a/lib/models/block.js +++ b/lib/models/block.js @@ -1,7 +1,10 @@ +import Data from './data' +import Inline from './inline' import Node from './node' +import Text from './text' import uid from 'uid' -import { Map, OrderedMap, Record } from 'immutable' +import Immutable, { Map, OrderedMap, Record } from 'immutable' /** * Default properties. @@ -28,8 +31,15 @@ class Block extends Record(DEFAULTS) { */ static create(properties = {}) { + if (properties instanceof Block) return properties + if (properties instanceof Inline) return properties + if (properties instanceof Text) return properties if (!properties.type) throw new Error('You must pass a block `type`.') + properties.key = uid(4) + properties.data = Data.create(properties.data) + properties.nodes = Block.createMap(properties.nodes) + let block = new Block(properties) return block.normalize() } @@ -42,9 +52,12 @@ class Block extends Record(DEFAULTS) { */ static createMap(elements = []) { - return elements.reduce((map, element) => { - return map.set(element.key, element) - }, new OrderedMap()) + if (OrderedMap.isOrderedMap(elements)) return elements + return elements + .map(Block.create) + .reduce((map, element) => { + return map.set(element.key, element) + }, new OrderedMap()) } /** diff --git a/lib/models/character.js b/lib/models/character.js index bae165305..1ecd86b5a 100644 --- a/lib/models/character.js +++ b/lib/models/character.js @@ -1,4 +1,5 @@ +import Mark from './mark' import { List, Record, Set } from 'immutable' /** @@ -24,6 +25,8 @@ class Character extends CharacterRecord { */ static create(properties = {}) { + if (properties instanceof Character) return properties + properties.marks = Mark.createSet(properties.marks) return new Character(properties) } @@ -35,7 +38,8 @@ class Character extends CharacterRecord { */ static createList(array = []) { - return new List(array) + if (List.isList(array)) return array + return new List(array.map(Character.create)) } } diff --git a/lib/models/document.js b/lib/models/document.js index 6e20b2407..427163dc8 100644 --- a/lib/models/document.js +++ b/lib/models/document.js @@ -1,4 +1,5 @@ +import Block from './block' import Node from './node' import { OrderedMap, Record } from 'immutable' @@ -24,6 +25,10 @@ class Document extends Record(DEFAULTS) { */ static create(properties = {}) { + if (properties instanceof Document) return properties + + properties.nodes = Block.createMap(properties.nodes) + let document = new Document(properties) return document.normalize() } diff --git a/lib/models/inline.js b/lib/models/inline.js index 20aafafd1..9c72639c8 100644 --- a/lib/models/inline.js +++ b/lib/models/inline.js @@ -1,7 +1,10 @@ +import Block from './block' +import Data from './data' import Node from './node' +import Text from './text' import uid from 'uid' -import { Map, OrderedMap, Record } from 'immutable' +import Immutable, { Map, OrderedMap, Record } from 'immutable' /** * Record. @@ -28,8 +31,15 @@ class Inline extends Record(DEFAULTS) { */ static create(properties = {}) { + if (properties instanceof Block) return properties + if (properties instanceof Inline) return properties + if (properties instanceof Text) return properties if (!properties.type) throw new Error('You must pass an inline `type`.') + properties.key = uid(4) + properties.data = Data.create(properties.data) + properties.nodes = Inline.createMap(properties.nodes) + let inline = new Inline(properties) return inline.normalize() } @@ -42,9 +52,12 @@ class Inline extends Record(DEFAULTS) { */ static createMap(elements = []) { - return elements.reduce((map, element) => { - return map.set(element.key, element) - }, new OrderedMap()) + if (OrderedMap.isOrderedMap(elements)) return elements + return elements + .map(Inline.create) + .reduce((map, element) => { + return map.set(element.key, element) + }, new OrderedMap()) } /** diff --git a/lib/models/mark.js b/lib/models/mark.js index adfda2d42..34b3f357a 100644 --- a/lib/models/mark.js +++ b/lib/models/mark.js @@ -1,20 +1,21 @@ +import Data from './data' import { Map, Record, Set } from 'immutable' /** * Record. */ -const MarkRecord = new Record({ +const DEFAULTS = { data: new Map(), type: null -}) +} /** * Mark. */ -class Mark extends MarkRecord { +class Mark extends Record(DEFAULTS) { /** * Create a new `Mark` with `properties`. @@ -24,7 +25,11 @@ class Mark extends MarkRecord { */ static create(properties = {}) { + if (properties instanceof Mark) return properties if (!properties.type) throw new Error('You must provide a `type` for the mark.') + + properties.data = Data.create(properties.data) + return new Mark(properties) } @@ -36,7 +41,8 @@ class Mark extends MarkRecord { */ static createSet(array = []) { - return new Set(array) + if (Set.isSet(array)) return array + return new Set(array.map(Mark.create)) } } diff --git a/lib/models/selection.js b/lib/models/selection.js index 1427c44cb..2728fa291 100644 --- a/lib/models/selection.js +++ b/lib/models/selection.js @@ -5,20 +5,20 @@ import { Record } from 'immutable' * Record. */ -const SelectionRecord = new Record({ +const DEFAULTS = { anchorKey: null, anchorOffset: 0, focusKey: null, focusOffset: 0, isBackward: false, isFocused: false -}) +} /** * Selection. */ -class Selection extends SelectionRecord { +class Selection extends Record(DEFAULTS) { /** * Create a new `Selection` with `properties`. @@ -28,6 +28,7 @@ class Selection extends SelectionRecord { */ static create(properties = {}) { + if (properties instanceof Selection) return properties return new Selection(properties) } diff --git a/lib/models/state.js b/lib/models/state.js index 46595d81c..9ad5cd5f4 100644 --- a/lib/models/state.js +++ b/lib/models/state.js @@ -59,6 +59,11 @@ class State extends Record(DEFAULTS) { */ static create(properties = {}) { + if (properties instanceof State) return properties + + properties.document = Document.create(properties.document) + properties.selection = Selection.create(properties.selection) + return new State(properties) } diff --git a/lib/models/text.js b/lib/models/text.js index 75811c48b..0ba88392d 100644 --- a/lib/models/text.js +++ b/lib/models/text.js @@ -1,4 +1,5 @@ +import Character from './character' import uid from 'uid' import { List, Record } from 'immutable' @@ -25,7 +26,11 @@ class Text extends Record(DEFAULTS) { */ static create(properties = {}) { + if (properties instanceof Text) return properties + properties.key = uid(4) + properties.characters = Character.createList(properties.characters) + return new Text(properties) }