2.6.0 • Published 7 years ago
@contentful/structured-text-html-serializer v2.6.0
structured-text-html-serializer
HTML serializer for the Structured Text document.
Installation
Using npm:
npm install @contentful/structured-text-html-serializerUsing yarn:
yarn add @contentful/structured-text-html-serializerUsage
import { documentToHtmlString } from '@contentful/structured-text-html-serializer';
const document = {
nodeType: 'document',
nodeClass: 'document',
content: [
{
nodeClass: 'block',
nodeType: 'paragraph',
content: [
{
nodeClass: 'text',
nodeType: 'text',
value: 'Hello world!',
marks: [],
},
],
},
]
};
documentToHtmlString(document); // -> <p>Hello world!</p>import { documentToHtmlString } from '@contentful/structured-text-html-serializer';
const document = {
nodeType: 'document',
nodeClass: 'document',
content: [
{
nodeClass: 'block',
nodeType: 'paragraph',
content: [
{
nodeClass: 'text',
nodeType: 'text',
value: 'Hello',
marks: [{ nodeType: 'bold' }]
},
{
nodeClass: 'text',
nodeType: 'text',
value: ' world!',
marks: [{ nodeType: 'italic' }]
},
],
},
]
};
documentToHtmlString(document); // -> <p><b>Hello</b><u> world!</u></p>You can also pass custom renderers for both marks and nodes as an optional parameter like so:
import { BLOCKS.PARAGRAPH, MARKS.BOLD } from '@contentful/structured-text-types';
import { documentToHtmlString } from '@contentful/structured-text-html-serializer';
const document = {
nodeType: 'document',
nodeClass: 'document',
content: [
{
nodeClass: 'block',
nodeType: 'paragraph',
content: [
{
nodeClass: 'text',
nodeType: 'text',
value: 'Hello',
marks: [{ nodeType: 'bold' }]
},
{
nodeClass: 'text',
nodeType: 'text',
value: ' world!',
marks: [{ nodeType: 'italic' }]
},
],
},
]
};
const options = {
renderMark: {
[MARKS.BOLD]: text => `<custom-bold>${text}<custom-bold>`
},
renderNode: {
[BLOCKS.PARAGRAPH]: (node, next) => `<custom-paragraph>${next(node.content)}</custom-paragraph>`
}
}
documentToHtmlString(document, options);
// -> <custom-paragraph><custom-bold>Hello</custom-bold><u> world!</u></custom-paragraph>Last, but not least, you can pass a custom rendering component for an embedded entry:
import { BLOCKS.EMBEDDED_ENTRY } from '@contentful/structured-text-types';
import { documentToHtmlString } from '@contentful/structured-text-html-serializer';
const document = {
nodeType: 'document',
nodeClass: 'document',
content: [
{
nodeClass: 'block',
nodeType: 'embedded-entry-block',
data: {
target: (...)Link<'Entry'>(...);
},
},
]
};
const options = {
renderNode: {
[BLOCKS.EMBEDDED_ENTRY]: (node) => `<custom-component>${customComponentRenderer(node)}</custom-component>`
}
}
documentToHtmlString(document, options);
// -> <custom-component>(...)Link<'Entry'>(...)</custom-component>The renderNode keys should be one of the following BLOCKS and INLINES properties as defined in @contentful/structured-text-types:
BLOCKSDOCUMENTPARAGRAPHHEADING_1HEADING_2HEADING_3HEADING_4HEADING_5HEADING_6UL_LISTOL_LISTLIST_ITEMQUOTEHREMBDEDDED_ENTRY
INLINESEMBEDDED_ENTRY(this is different from theBLOCKS.EMBEDDED_ENTRY)HYPERLINKENTRY_HYPERLINKASSET_HYPERLINK
The renderMark keys should be one of the following MARKS properties as defined in @contentful/structured-text-types:
BOLDITALICUNDERLINECODE