@20minutes/draft-convert
Version:
Extensibly serialize & deserialize Draft.js ContentState
33 lines (32 loc) • 1.25 kB
JavaScript
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import invariant from 'tiny-invariant';
import splitReactElement from './splitReactElement.mjs';
function hasChildren(element) {
return /*#__PURE__*/ React.isValidElement(element) && React.Children.count(element.props.children) > 0;
}
export default function getElementHTML(element, text = null) {
if (element === undefined || element === null) {
return element;
}
if (typeof element === 'string') {
return element;
}
if (/*#__PURE__*/ React.isValidElement(element)) {
if (hasChildren(element)) {
return ReactDOMServer.renderToStaticMarkup(element);
}
const tags = splitReactElement(element);
if (text !== null && typeof tags === 'object') {
const { start, end } = tags;
return start + text + end;
}
return tags;
}
invariant(Object.hasOwn(element, 'start') && Object.hasOwn(element, 'end'), 'convertToHTML: received conversion data without either an HTML string, ReactElement or an object with start/end tags');
if (text !== null) {
const { start, end } = element;
return start + text + end;
}
return element;
}