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:
@@ -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)
|
||||||
}
|
}
|
||||||
|
18
test/serializers/fixtures/html/deserialize/no-next/index.js
Normal file
18
test/serializers/fixtures/html/deserialize/no-next/index.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
export default {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
deserialize(el, next) {
|
||||||
|
switch (el.tagName) {
|
||||||
|
case 'p': {
|
||||||
|
return {
|
||||||
|
kind: 'block',
|
||||||
|
type: 'paragraph',
|
||||||
|
nodes: next(undefined)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@@ -0,0 +1 @@
|
|||||||
|
<p></p>
|
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
nodes:
|
||||||
|
- type: paragraph
|
||||||
|
isVoid: false
|
||||||
|
data: {}
|
||||||
|
nodes:
|
||||||
|
- characters: []
|
Reference in New Issue
Block a user