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:
parent
cdd1b29561
commit
292dc159e1
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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() })
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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
40
src/utils/generate-key.js
Normal 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
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
|
||||
import generate from 'uid'
|
||||
|
||||
/**
|
||||
* Create a unique identifier.
|
||||
*
|
||||
* @return {String} uid
|
||||
*/
|
||||
|
||||
function uid() {
|
||||
return generate(10)
|
||||
}
|
||||
|
||||
/**
|
||||
* Export.
|
||||
*/
|
||||
|
||||
export default uid
|
@ -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)
|
||||
|
@ -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')
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
Loading…
x
Reference in New Issue
Block a user