@nacelle/rich-text-dom-node-renderer
v1.0.5
Published
Convert Rich Text field to HTMLElement DOM nodes
Downloads
2
Readme
rich-text-dom-node-renderer
DOM nodes renderer for the Rich Text field type. To be used inside the browser, as it uses document.createElement
.
Installation
Using npm:
npm install rich-text-dom-node-renderer
Using yarn:
yarn add rich-text-dom-node-renderer
Usage
import { render } from 'rich-text-dom-node-renderer';
let nodes = render({
schema: 'rast',
document: {
type: 'root',
children: [
{
type: 'paragraph',
children: [
{
type: 'span',
value: 'Hello world!',
},
],
},
],
},
});
console.log(nodes.map((node) => node.outerHTML)); // -> ["<p>Hello world!</p>"]
nodes = render({
type: 'root',
children: [
{
type: 'paragraph',
content: [
{
type: 'span',
value: 'Hello',
marks: ['strong'],
},
{
type: 'span',
value: ' world!',
marks: ['underline'],
},
],
},
],
});
console.log(nodes.map((node) => node.outerHTML)); // -> ["<p><strong>Hello</strong><u> world!</u></p>"]
You can pass custom renderers for nodes and text as optional parameters like so:
import { render, renderRule } from 'rich-text-dom-node-renderer';
import { isHeading } from 'rich-text-utils';
const RichText = {
type: 'root',
children: [
{
type: 'heading',
level: 1,
content: [
{
type: 'span',
value: 'Hello world!',
},
],
},
],
};
const options = {
renderText: (text) => text.replace(/Hello/, 'Howdy'),
customRules: [
renderRule(
isHeading,
({ adapter: { renderNode }, node, children, key }) => {
return renderNode(`h${node.level + 1}`, { key }, children);
},
),
],
};
render(document, options);
// -> [<h2>Howdy world!</h2>]
Last, but not least, you can pass custom renderers for entryLink
, inlineEntry
, block
as optional parameters like so:
import { render } from 'rich-text-dom-node-renderer';
const graphqlResponse = {
value: {
schema: 'rast',
document: {
type: 'root',
children: [
{
type: 'paragraph',
children: [
{
type: 'span',
value: 'A ',
},
{
type: 'entryLink',
entry: '344312',
children: [
{
type: 'span',
value: 'record hyperlink',
},
],
},
{
type: 'span',
value: ' and an inline record: ',
},
{
type: 'inlineEntry',
entry: '344312',
},
],
},
{
type: 'block',
entry: '812394',
},
],
},
},
blocks: [
{
id: '812394',
image: { url: 'http://www.assets.com/1312/image.png' },
},
],
links: [{ id: '344312', title: 'Foo', slug: 'foo' }],
};
const options = {
renderBlock({ record, adapter: { renderNode } }) {
return renderNode('figure', {}, renderNode('img', { src: record.url }));
},
renderInlineRecord({ record, adapter: { renderNode } }) {
return renderNode('a', { href: `/blog/${record.slug}` }, record.title);
},
renderLinkToRecord({ record, children, adapter: { renderNode } }) {
return renderNode('a', { href: `/blog/${record.slug}` }, children);
},
};
render(document, options);
// -> [
// <p>A <a href="/blog/foo">record hyperlink</a> and an inline record: <a href="/blog/foo">Foo</a></p>,
// <figure><img src="http://www.assets.com/1312/image.png" /></figure>
// ]