1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-09-02 11:42:53 +02:00

remove unnecessary models

This commit is contained in:
Ian Storm Taylor
2016-06-15 20:00:41 -07:00
parent 1788139445
commit 56727704ee
15 changed files with 481 additions and 768 deletions

File diff suppressed because one or more lines are too long

View File

@@ -89,7 +89,6 @@ function renderNode(node) {
} }
} }
default: { default: {
debugger
throw new Error(`Unknown node type "${node.type}".`) throw new Error(`Unknown node type "${node.type}".`)
} }
} }

View File

@@ -2,7 +2,7 @@
import React from 'react' import React from 'react'
import ReactDOM from 'react-dom' import ReactDOM from 'react-dom'
import Text from './text' import Text from './text'
import TextNode from '../models/text-node' import TextModel from '../models/text'
import findSelection from '../utils/find-selection' import findSelection from '../utils/find-selection'
import keycode from 'keycode' import keycode from 'keycode'
@@ -159,7 +159,7 @@ class Content extends React.Component {
renderNode(node) { renderNode(node) {
const { renderMark, renderNode, state } = this.props const { renderMark, renderNode, state } = this.props
if (node instanceof TextNode) { if (node instanceof TextModel) {
return ( return (
<Text <Text
key={node.key} key={node.key}

View File

@@ -1,9 +1,19 @@
/**
* Components.
*/
import Editor from './components/editor' import Editor from './components/editor'
/**
* Models.
*/
import Character from './models/character'
import Node from './models/node' import Node from './models/node'
import NodeMap from './models/node-map'
import Selection from './models/selection' import Selection from './models/selection'
import State from './models/state' import State from './models/state'
import Text from './models/text'
/** /**
* Export. * Export.
@@ -11,8 +21,9 @@ import State from './models/state'
export default Editor export default Editor
export { export {
Character,
Node, Node,
NodeMap,
Selection, Selection,
State State,
Text
} }

View File

@@ -1,22 +0,0 @@
import Character from './character'
import { List } from 'immutable'
/**
* Character list.
*/
class CharacterList extends List {
static create(attrs = []) {
attrs = attrs.map(character => Character.create(character))
return new CharacterList(attrs)
}
}
/**
* Export.
*/
export default CharacterList

View File

@@ -1,14 +1,13 @@
import MarkList from './mark-list' import { List, Record } from 'immutable'
import { Record } from 'immutable'
/** /**
* Record. * Record.
*/ */
const CharacterRecord = new Record({ const CharacterRecord = new Record({
text: '', marks: new List(),
marks: new MarkList() text: ''
}) })
/** /**
@@ -17,13 +16,31 @@ const CharacterRecord = new Record({
class Character extends CharacterRecord { class Character extends CharacterRecord {
static create(attrs) { /**
* Create a character record from a Javascript `object`.
*
* @param {Object} object
* @return {Character} character
*/
static create(object) {
return new Character({ return new Character({
text: attrs.text, text: object.text,
marks: MarkList.create(attrs.marks) marks: new List(object.marks)
}) })
} }
/**
* Create a list of characters from a Javascript `array`.
*
* @param {Array} array
* @return {List} characters
*/
static createList(array) {
return new List(array.map(object => Character.create(object)))
}
} }
/** /**

View File

@@ -1,22 +0,0 @@
import Mark from './mark'
import { List } from 'immutable'
/**
* Mark list.
*/
class MarkList extends List {
static create(attrs = []) {
attrs = attrs.map(mark => Mark.create(mark))
return new MarkList(attrs)
}
}
/**
* Export.
*/
export default MarkList

View File

@@ -1,29 +0,0 @@
import { Map, Record } from 'immutable'
/**
* Record.
*/
const MarkRecord = new Record({
type: null,
})
/**
* Mark.
*/
class Mark extends MarkRecord {
static create(attrs) {
if (typeof attrs == 'string') attrs = { type: attrs }
return new Mark(attrs)
}
}
/**
* Export.
*/
export default Mark

View File

@@ -1,45 +0,0 @@
import Node from './node'
import TextNode from './text-node'
import { OrderedMap } from 'immutable'
/**
* Node map.
*/
class NodeMap extends OrderedMap {
static create(attrs) {
if (attrs instanceof Array) {
attrs = attrs.reduce((map, node) => {
map[node.key] = node.type == 'text'
? TextNode.create(node)
: Node.create(node)
return map
}, {})
}
return new NodeMap(attrs)
}
filterDeep(...args) {
const shallow = this.filter(...args)
const deep = shallow.map(node => node.children.filter(...args))
const all = shallow.reduce((map, node, key) => {
map = map.concat(node)
map = map.concat(deep.get(key))
return map
}, new NodeMap())
debugger
return all
}
}
/**
* Export.
*/
export default NodeMap

View File

@@ -1,6 +1,5 @@
import NodeMap from './node-map' import Text from './text'
import TextNode from './text-node'
import { Map, OrderedMap, Record } from 'immutable' import { Map, OrderedMap, Record } from 'immutable'
/** /**
@@ -8,10 +7,10 @@ import { Map, OrderedMap, Record } from 'immutable'
*/ */
const NodeRecord = new Record({ const NodeRecord = new Record({
key: null, children: new OrderedMap(),
type: null,
data: new Map(), data: new Map(),
children: new NodeMap(), key: null,
type: null
}) })
/** /**
@@ -20,19 +19,33 @@ const NodeRecord = new Record({
class Node extends NodeRecord { class Node extends NodeRecord {
static create(attrs) { /**
* Create a node record from a Javascript `object`.
*
* @param {Object} object
* @return {Node} node
*/
static create(object) {
return new Node({ return new Node({
key: attrs.key, key: object.key,
type: attrs.type, type: object.type,
data: new Map(attrs.data), data: new Map(object.data),
children: Node.createMap(attrs.children) children: Node.createMap(object.children)
}) })
} }
/**
* Create an ordered map of nodes from a Javascript `array` of nodes.
*
* @param {Array} array
* @return {OrderedMap} nodes
*/
static createMap(array) { static createMap(array) {
return new OrderedMap(array.reduce((map, node) => { return new OrderedMap(array.reduce((map, node) => {
map[node.key] = node.type == 'text' map[node.key] = node.type == 'text'
? TextNode.create(node) ? Text.create(node)
: Node.create(node) : Node.create(node)
return map return map
}, {})) }, {}))

View File

@@ -1,6 +1,5 @@
import Selection from './selection' import Selection from './selection'
import NodeMap from './node-map'
import Node from './node' import Node from './node'
import toCamel from 'to-camel-case' import toCamel from 'to-camel-case'
import { OrderedMap, Record } from 'immutable' import { OrderedMap, Record } from 'immutable'
@@ -10,7 +9,7 @@ import { OrderedMap, Record } from 'immutable'
*/ */
const StateRecord = new Record({ const StateRecord = new Record({
nodes: new NodeMap(), nodes: new OrderedMap(),
selection: new Selection() selection: new Selection()
}) })
@@ -28,7 +27,7 @@ class State extends StateRecord {
static create(attrs) { static create(attrs) {
return new State({ return new State({
nodes: NodeMap.create(attrs.nodes), nodes: Node.createMap(attrs.nodes),
selection: Selection.create(attrs.selection) selection: Selection.create(attrs.selection)
}) })
} }

View File

@@ -1,35 +0,0 @@
import CharacterList from './character-list'
import convertRangesToCharacters from '../utils/convert-ranges-to-characters'
import { Record } from 'immutable'
/**
* Record.
*/
const TextNodeRecord = new Record({
key: null,
characters: new CharacterList()
})
/**
* TextNode.
*/
class TextNode extends TextNodeRecord {
static create(attrs) {
const characters = convertRangesToCharacters(attrs.ranges)
return new TextNode({
key: attrs.key,
characters
})
}
}
/**
* Export.
*/
export default TextNode

41
lib/models/text.js Normal file
View File

@@ -0,0 +1,41 @@
import convertRangesToCharacters from '../utils/convert-ranges-to-characters'
import { List, Record } from 'immutable'
/**
* Record.
*/
const TextRecord = new Record({
characters: new List,
key: null
})
/**
* Text.
*/
class Text extends TextRecord {
/**
* Create a text record from a Javascript `object`.
*
* @param {Object} object
* @return {Node} node
*/
static create(attrs) {
const characters = convertRangesToCharacters(attrs.ranges)
return new Text({
key: attrs.key,
characters
})
}
}
/**
* Export.
*/
export default Text

View File

@@ -14,10 +14,10 @@ export default function convertCharactersToRanges(characters) {
.reduce((ranges, char, i) => { .reduce((ranges, char, i) => {
const previous = i == 0 ? null : characters.get(i - 1) const previous = i == 0 ? null : characters.get(i - 1)
const { text } = char const { text } = char
const marks = char.marks.toArray().map(mark => mark.type) const marks = char.marks.toArray()
if (previous) { if (previous) {
const previousMarks = previous.marks.toArray().map(mark => mark.type) const previousMarks = previous.marks.toArray()
const diff = xor(marks, previousMarks) const diff = xor(marks, previousMarks)
if (!diff.length) { if (!diff.length) {
const previousRange = ranges[ranges.length - 1] const previousRange = ranges[ranges.length - 1]

View File

@@ -1,5 +1,5 @@
import CharacterList from '../models/character-list' import Character from '../models/character'
/** /**
* Convert a `characters` list to `ranges`. * Convert a `characters` list to `ranges`.
@@ -9,7 +9,7 @@ import CharacterList from '../models/character-list'
*/ */
export default function convertRangesToCharacters(ranges) { export default function convertRangesToCharacters(ranges) {
return CharacterList.create(ranges.reduce((characters, range) => { return Character.createList(ranges.reduce((characters, range) => {
const chars = range.text const chars = range.text
.split('') .split('')
.map(char => { .map(char => {