1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-02-25 01:33:37 +01:00
slate/lib/models/node.js
2016-06-15 19:46:53 -07:00

67 lines
1.2 KiB
JavaScript

import NodeMap from './node-map'
import TextNode from './text-node'
import { Map, OrderedMap, Record } from 'immutable'
/**
* Record.
*/
const NodeRecord = new Record({
key: null,
type: null,
data: new Map(),
children: new NodeMap(),
})
/**
* Node.
*/
class Node extends NodeRecord {
static create(attrs) {
return new Node({
key: attrs.key,
type: attrs.type,
data: new Map(attrs.data),
children: Node.createMap(attrs.children)
})
}
static createMap(array) {
return new OrderedMap(array.reduce((map, node) => {
map[node.key] = node.type == 'text'
? TextNode.create(node)
: Node.create(node)
return map
}, {}))
}
/**
* Recursively filter children nodes with `iterator`.
*
* @param {Function} iterator
* @return {OrderedMap} matches
*/
filterNodes(iterator) {
const shallow = this.children.filter(iterator)
const deep = this.children
.map(node => node instanceof Node ? node.filterNodes(iterator) : null)
.filter(node => node)
.reduce((all, map) => {
return all.concat(map)
}, shallow)
return deep
}
}
/**
* Export.
*/
export default Node