forked from ianstormtaylor/slate
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocument.js
More file actions
130 lines (101 loc) · 2 KB
/
Copy pathdocument.js
File metadata and controls
130 lines (101 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/**
* Prevent circular dependencies.
*/
import './block'
import './inline'
/**
* Dependencies.
*/
import Data from './data'
import Block from './block'
import Node from './node'
import MODEL_TYPES from '../constants/model-types'
import generateKey from '../utils/generate-key'
import { List, Map, Record } from 'immutable'
/**
* Default properties.
*
* @type {Object}
*/
const DEFAULTS = {
data: new Map(),
key: null,
nodes: new List(),
}
/**
* Document.
*
* @type {Document}
*/
class Document extends new Record(DEFAULTS) {
/**
* Create a new `Document` with `properties`.
*
* @param {Object|Document} properties
* @return {Document}
*/
static create(properties = {}) {
if (Document.isDocument(properties)) return properties
properties.key = properties.key || generateKey()
properties.data = Data.create(properties.data)
properties.nodes = Block.createList(properties.nodes)
return new Document(properties)
}
/**
* Determines if the passed in paramter is a Slate Document or not
*
* @param {*} maybeDocument
* @return {Boolean}
*/
static isDocument(maybeDocument) {
return !!(maybeDocument && maybeDocument[MODEL_TYPES.DOCUMENT])
}
/**
* Get the node's kind.
*
* @return {String}
*/
get kind() {
return 'document'
}
/**
* Is the document empty?
*
* @return {Boolean}
*/
get isEmpty() {
return this.text == ''
}
/**
* Get the length of the concatenated text of the document.
*
* @return {Number}
*/
get length() {
return this.text.length
}
/**
* Get the concatenated text `string` of all child nodes.
*
* @return {String}
*/
get text() {
return this.getText()
}
}
/**
* Pseduo-symbol that shows this is a Slate Document
*/
Document.prototype[MODEL_TYPES.DOCUMENT] = true
/**
* Mix in `Node` methods.
*/
for (const method in Node) {
Document.prototype[method] = Node[method]
}
/**
* Export.
*
* @type {Document}
*/
export default Document