import { ContentState, convertFromHTML } from 'draft-js';
async function serverDOMBuilder(): Promise<(html: string) => HTMLBodyElement> {
const jsdom = await import('jsdom');
const { JSDOM } = jsdom;
const {
document: jsdomDocument,
HTMLElement,
HTMLAnchorElement,
Node,
} = new JSDOM(``).window;
global.HTMLElement = HTMLElement;
global.HTMLAnchorElement = HTMLAnchorElement;
global.Node = Node;
const doc = jsdomDocument.implementation.createHTMLDocument('foo');
return (html: string) => {
doc.documentElement.innerHTML = html;
return doc.getElementsByTagName('body')[0];
};
}
export async function stateFromHTML(html: string): Promise {
// if DOMBuilder is undefined convertFromHTML will use the browser dom,
// hence we set DOMBuilder to undefined when document exist
const DOMBuilder =
typeof document === 'undefined' ? await serverDOMBuilder() : undefined;
const blocksFromHTML = convertFromHTML(html, DOMBuilder);
return ContentState.createFromBlockArray(
blocksFromHTML.contentBlocks,
blocksFromHTML.entityMap,
);
}