1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-08-22 23:12:52 +02:00

fix html serializer called with invalid arguments

This commit is contained in:
Ian Storm Taylor
2016-08-11 12:56:19 -07:00
parent 35cee2ede6
commit 17bfdee659
4 changed files with 52 additions and 8 deletions

View File

@@ -9,6 +9,7 @@ import ReactDOMServer from 'react-dom/server'
import State from '../models/state' import State from '../models/state'
import Text from '../models/text' import Text from '../models/text'
import cheerio from 'cheerio' import cheerio from 'cheerio'
import typeOf from 'type-of'
import { Record } from 'immutable' import { Record } from 'immutable'
/** /**
@@ -133,11 +134,18 @@ class Html {
elements.forEach((element) => { elements.forEach((element) => {
const node = this.deserializeElement(element) const node = this.deserializeElement(element)
if (!node) return switch (typeOf(node)) {
if (Array.isArray(node)) { case 'array':
nodes = nodes.concat(node) nodes = nodes.concat(node)
} else { break
nodes.push(node) case 'object':
nodes.push(node)
break
case 'null':
case 'undefined':
return
default:
throw new Error(`A rule returned an invalid deserialized representation: "${node}".`)
} }
}) })
@@ -155,9 +163,17 @@ class Html {
let node let node
const next = (elements) => { const next = (elements) => {
return Array.isArray(elements) switch (typeOf(elements)) {
? this.deserializeElements(elements) case 'array':
: this.deserializeElement(elements) return this.deserializeElements(elements)
case 'object':
return this.deserializeElement(elements)
case 'null':
case 'undefined':
return
default:
throw new Error(`The \`next\` argument was called with invalid children: "${elements}".`)
}
} }
for (const rule of this.rules) { for (const rule of this.rules) {
@@ -246,6 +262,7 @@ class Html {
const ret = rule.serialize(node, children) const ret = rule.serialize(node, children)
if (ret) return addKey(ret) if (ret) return addKey(ret)
} }
throw new Error(`No serializer defined for node of type "${node.type}".`) throw new Error(`No serializer defined for node of type "${node.type}".`)
} }
@@ -266,6 +283,7 @@ class Html {
const ret = rule.serialize(mark, children) const ret = rule.serialize(mark, children)
if (ret) return addKey(ret) if (ret) return addKey(ret)
} }
throw new Error(`No serializer defined for mark of type "${mark.type}".`) throw new Error(`No serializer defined for mark of type "${mark.type}".`)
}, text) }, text)
} }

View File

@@ -0,0 +1,18 @@
export default {
rules: [
{
deserialize(el, next) {
switch (el.tagName) {
case 'p': {
return {
kind: 'block',
type: 'paragraph',
nodes: next(undefined)
}
}
}
}
}
]
}

View File

@@ -0,0 +1 @@
<p></p>

View File

@@ -0,0 +1,7 @@
nodes:
- type: paragraph
isVoid: false
data: {}
nodes:
- characters: []