1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-08-26 16:44:22 +02:00

Allow null return values, which will skip serializing that node (#1699)

Sometimes, I have nodes that only make sense temporarily, so it
doesn't make sense to serialize them. Following the pattern in React,
explicitly returning `null` from a serialzation rule should result in
that node (and its children) not making it into the serialized document.
This commit is contained in:
Justin Weiss
2018-03-22 14:54:35 -07:00
committed by Ian Storm Taylor
parent 86af03dd30
commit dce7e2c439
2 changed files with 44 additions and 1 deletions

View File

@@ -325,7 +325,7 @@ class Html {
serialize = (value, options = {}) => {
const { document } = value
const elements = document.nodes.map(this.serializeNode)
const elements = document.nodes.map(this.serializeNode).filter(el => el)
if (options.render === false) return elements
const html = renderToStaticMarkup(<body>{elements}</body>)
@@ -351,6 +351,7 @@ class Html {
for (const rule of this.rules) {
if (!rule.serialize) continue
const ret = rule.serialize(node, children)
if (ret === null) return
if (ret) return addKey(ret)
}
@@ -372,6 +373,7 @@ class Html {
for (const rule of this.rules) {
if (!rule.serialize) continue
const ret = rule.serialize(mark, children)
if (ret === null) return
if (ret) return addKey(ret)
}

View File

@@ -0,0 +1,41 @@
/** @jsx h */
import React from 'react'
import h from '../helpers/h'
export const rules = [
{
serialize(obj, children) {
if (obj.object == 'block' && obj.type == 'paragraph') {
return React.createElement('p', {}, children)
}
if (obj.object == 'inline' && obj.type == 'link') {
return React.createElement('a', {}, children)
}
if (obj.object == 'inline' && obj.type == 'comment') {
return null
}
if (obj.object == 'block' && obj.type == 'quote') {
return null
}
},
},
]
export const input = (
<value>
<document>
<paragraph>
Something <comment>skipped</comment> Here
</paragraph>
<quote>Skipped</quote>
</document>
</value>
)
export const output = `
<p>Something Here</p>
`.trim()