1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-04-19 12:51:59 +02:00

change to use lodash.uniqueId, add keygen override, add preserveKeys option to Raw serializer

This commit is contained in:
Ian Storm Taylor 2016-11-17 11:27:30 -08:00
parent cdd1b29561
commit 292dc159e1
11 changed files with 107 additions and 49 deletions

View File

@ -41,6 +41,7 @@ import Transforms from './transforms'
*/
import findDOMNode from './utils/find-dom-node'
import { setKeyGenerator } from './utils/generate-key'
/**
* Export.
@ -66,7 +67,8 @@ export {
State,
Text,
Transforms,
findDOMNode
findDOMNode,
setKeyGenerator
}
export default {
@ -87,5 +89,6 @@ export default {
State,
Text,
Transforms,
findDOMNode
findDOMNode,
setKeyGenerator
}

View File

@ -14,7 +14,7 @@ import Data from './data'
import Inline from './inline'
import Node from './node'
import Text from './text'
import uid from '../utils/uid'
import generateKey from '../utils/generate-key'
import { Map, List, Record } from 'immutable'
/**
@ -48,7 +48,7 @@ class Block extends new Record(DEFAULTS) {
if (properties instanceof Text) return properties
if (!properties.type) throw new Error('You must pass a block `type`.')
properties.key = properties.key || uid(4)
properties.key = properties.key || generateKey()
properties.data = Data.create(properties.data)
properties.isVoid = !!properties.isVoid
properties.nodes = Block.createList(properties.nodes)

View File

@ -12,7 +12,7 @@ import './inline'
import Block from './block'
import Node from './node'
import uid from '../utils/uid'
import generateKey from '../utils/generate-key'
import { OrderedMap, Record } from 'immutable'
/**
@ -40,7 +40,7 @@ class Document extends new Record(DEFAULTS) {
static create(properties = {}) {
if (properties instanceof Document) return properties
properties.key = properties.key || uid(4)
properties.key = properties.key || generateKey()
properties.nodes = Block.createList(properties.nodes)
return new Document(properties)

View File

@ -14,7 +14,7 @@ import Block from './block'
import Data from './data'
import Node from './node'
import Text from './text'
import uid from '../utils/uid'
import generateKey from '../utils/generate-key'
import { List, Map, Record } from 'immutable'
/**
@ -48,7 +48,7 @@ class Inline extends new Record(DEFAULTS) {
if (properties instanceof Text) return properties
if (!properties.type) throw new Error('You must pass an inline `type`.')
properties.key = properties.key || uid(4)
properties.key = properties.key || generateKey()
properties.data = Data.create(properties.data)
properties.isVoid = !!properties.isVoid
properties.nodes = Inline.createList(properties.nodes)

View File

@ -7,7 +7,7 @@ import Normalize from '../utils/normalize'
import direction from 'direction'
import isInRange from '../utils/is-in-range'
import memoize from '../utils/memoize'
import uid from '../utils/uid'
import generateKey from '../utils/generate-key'
import { List, Set } from 'immutable'
@ -1225,7 +1225,7 @@ const Node = {
*/
regenerateKey() {
return this.merge({ key: uid() })
return this.merge({ key: generateKey() })
},
/**
@ -1296,7 +1296,7 @@ const Node = {
const oneChars = characters.take(i)
const twoChars = characters.skip(i)
one = child.merge({ characters: oneChars })
two = child.merge({ characters: twoChars, key: uid() })
two = child.merge({ characters: twoChars }).regenerateKey()
}
else {
@ -1309,7 +1309,7 @@ const Node = {
const twoNodes = nodes.skipUntil(n => n.key == one.key).rest().unshift(two)
one = child.merge({ nodes: oneNodes })
two = child.merge({ nodes: twoNodes, key: uid() })
two = child.merge({ nodes: twoNodes }).regenerateKey()
}
child = base.getParent(child.key)
@ -1344,7 +1344,7 @@ const Node = {
const twoNodes = nodes.skip(count)
const one = node.merge({ nodes: oneNodes })
const two = node.merge({ nodes: twoNodes, key: uid() })
const two = node.merge({ nodes: twoNodes }).regenerateKey()
const nodeIndex = parent.nodes.indexOf(node)

View File

@ -3,7 +3,7 @@ import Character from './character'
import Mark from './mark'
import Range from './range'
import memoize from '../utils/memoize'
import uid from '../utils/uid'
import generateKey from '../utils/generate-key'
import { List, Record, Set } from 'immutable'
/**
@ -30,7 +30,7 @@ class Text extends new Record(DEFAULTS) {
static create(properties = {}) {
if (properties instanceof Text) return properties
properties.key = properties.key || uid(4)
properties.key = properties.key || generateKey()
properties.characters = Character.createList(properties.characters)
return new Text(properties)
}
@ -264,7 +264,7 @@ class Text extends new Record(DEFAULTS) {
*/
regenerateKey() {
return this.merge({ key: uid() })
return this.merge({ key: generateKey() })
}
/**

View File

@ -60,6 +60,7 @@ const Raw = {
deserializeDocument(object, options) {
return Document.create({
key: object.key,
nodes: Block.createList(object.nodes.map((node) => {
return Raw.deserializeNode(node, options)
}))
@ -210,6 +211,10 @@ const Raw = {
.map(node => Raw.serializeNode(node, options))
}
if (!options.preserveKeys) {
delete object.key
}
return options.terse
? Raw.tersifyBlock(object)
: object
@ -225,12 +230,17 @@ const Raw = {
serializeDocument(document, options = {}) {
const object = {
key: document.key,
kind: document.kind,
nodes: document.nodes
.toArray()
.map(node => Raw.serializeNode(node, options))
}
if (!options.preserveKeys) {
delete object.key
}
return options.terse
? Raw.tersifyDocument(object)
: object
@ -256,6 +266,10 @@ const Raw = {
.map(node => Raw.serializeNode(node, options))
}
if (!options.preserveKeys) {
delete object.key
}
return options.terse
? Raw.tersifyInline(object)
: object
@ -360,6 +374,10 @@ const Raw = {
.map(range => Raw.serializeRange(range, options))
}
if (!options.preserveKeys) {
delete object.key
}
return options.terse
? Raw.tersifyText(object)
: object
@ -376,6 +394,7 @@ const Raw = {
const ret = {}
ret.kind = object.kind
ret.type = object.type
if (object.key) ret.key = object.key
if (!object.isVoid) ret.nodes = object.nodes
if (object.isVoid) ret.isVoid = object.isVoid
if (!isEmpty(object.data)) ret.data = object.data
@ -390,9 +409,10 @@ const Raw = {
*/
tersifyDocument(object) {
return {
nodes: object.nodes
}
const ret = {}
ret.nodes = object.nodes
if (object.key) ret.key = object.key
return ret
},
/**
@ -406,6 +426,7 @@ const Raw = {
const ret = {}
ret.kind = object.kind
ret.type = object.type
if (object.key) ret.key = object.key
if (!object.isVoid) ret.nodes = object.nodes
if (object.isVoid) ret.isVoid = object.isVoid
if (!isEmpty(object.data)) ret.data = object.data
@ -459,17 +480,17 @@ const Raw = {
*/
tersifyText(object) {
const ret = {}
ret.kind = object.kind
if (object.key) ret.key = object.key
if (object.ranges.length == 1 && object.ranges[0].marks == null) {
return {
kind: object.kind,
text: object.ranges[0].text
}
ret.text = object.ranges[0].text
} else {
ret.ranges = object.ranges
}
return {
kind: object.kind,
ranges: object.ranges
}
return ret
},
/**
@ -552,6 +573,7 @@ const Raw = {
return {
kind: 'state',
document: {
key: object.key,
kind: 'document',
nodes: object.nodes
}

40
src/utils/generate-key.js Normal file
View File

@ -0,0 +1,40 @@
import uniqueId from 'lodash/uniqueId'
/**
* Default the generator function to Lodash's implementation, which just returns
* incrementing numbers as strings.
*
* @type {Function}
*/
let generate = uniqueId
/**
* Create a key.
*
* @return {String}
*/
function generateKey() {
return generate()
}
/**
* Set a different unique ID generating `function`.
*
* @param {Function} func
*/
function setKeyGenerator(func) {
generate = func
}
/**
* Export.
*/
export {
generateKey as default,
setKeyGenerator
}

View File

@ -1,18 +0,0 @@
import generate from 'uid'
/**
* Create a unique identifier.
*
* @return {String} uid
*/
function uid() {
return generate(10)
}
/**
* Export.
*/
export default uid

View File

@ -7,7 +7,7 @@
*/
function stripDynamic(json) {
const { key, cache, decorations, ...props } = json
const { key, ...props } = json
if (props.nodes) {
props.nodes = props.nodes.map(stripDynamic)

View File

@ -60,9 +60,6 @@ describe('serializers', () => {
})
})
describe('json', () => {
})
describe('plain', () => {
describe('deserialize()', () => {
const dir = resolve(__dirname, './fixtures/plain/deserialize')
@ -165,5 +162,19 @@ describe('serializers', () => {
})
}
})
describe('serialize({ preserveKeys: true })', () => {
it('should omit keys by default', () => {
const state = Plain.deserialize('string')
const serialized = Raw.serialize(state)
assert(typeof serialized.document.key === 'undefined')
})
it('should preserve keys', () => {
const state = Plain.deserialize('string')
const serialized = Raw.serialize(state, { preserveKeys: true })
assert(typeof serialized.document.key === 'string')
})
})
})
})