contentful-rich-text-html-parser
Version:
Convert any HTML to the Contentful Rich Text format
79 lines • 4.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.htmlStringToDocument = void 0;
const converters_js_1 = require("./converters.js");
const parseHtml_js_1 = require("./parseHtml.js");
const processConvertedNodesFromTopLevel_js_1 = require("./processConvertedNodesFromTopLevel.js");
const utils_js_1 = require("./utils.js");
const DEFAULT_TAG_CONVERTERS = {
h1: converters_js_1.convertTagToBlock,
h2: converters_js_1.convertTagToBlock,
h3: converters_js_1.convertTagToBlock,
h4: converters_js_1.convertTagToBlock,
h5: converters_js_1.convertTagToBlock,
h6: converters_js_1.convertTagToBlock,
hr: converters_js_1.convertTagToBlock,
li: converters_js_1.convertTagToBlock,
ol: converters_js_1.convertTagToBlock,
p: converters_js_1.convertTagToBlock,
blockquote: converters_js_1.convertTagToBlock,
table: converters_js_1.convertTagToBlock,
td: converters_js_1.convertTagToBlock,
th: converters_js_1.convertTagToBlock,
tr: converters_js_1.convertTagToBlock,
ul: converters_js_1.convertTagToBlock,
b: converters_js_1.convertTagToMark,
strong: converters_js_1.convertTagToMark,
pre: converters_js_1.convertTagToMark,
i: converters_js_1.convertTagToMark,
em: converters_js_1.convertTagToMark,
sub: converters_js_1.convertTagToMark,
sup: converters_js_1.convertTagToMark,
u: converters_js_1.convertTagToMark,
a: converters_js_1.convertTagToHyperlink,
};
const mapHtmlNodeToRichTextNode = (node, marks, options) => {
var _a;
const { convertText, convertTag, defaultTagConverter } = options;
const mapChildren = (node, mark) => {
const newMarks = mark ? (0, utils_js_1.getAsList)(mark) : [];
const allMarks = newMarks.concat(marks);
if (node.type === "element") {
return node.children.flatMap((child) => mapHtmlNodeToRichTextNode(child, allMarks, options));
}
return (0, utils_js_1.getAsList)(mapHtmlNodeToRichTextNode(node, allMarks, options));
};
const next = mapChildren;
if (node.type === "text") {
return convertText(node, marks);
}
const tagConverter = (_a = convertTag[node.tagName]) !== null && _a !== void 0 ? _a : defaultTagConverter;
const convertedNode = tagConverter(node, next);
return convertedNode;
};
const htmlStringToDocument = (htmlString, options = {}) => {
var _a, _b, _c, _d, _e, _f, _g, _h;
const optionsWithDefaults = {
convertTag: Object.assign(Object.assign({}, DEFAULT_TAG_CONVERTERS), options.convertTag),
defaultTagConverter: (_a = options.defaultTagConverter) !== null && _a !== void 0 ? _a : converters_js_1.convertTagToChildren,
convertText: (_b = options.convertText) !== null && _b !== void 0 ? _b : converters_js_1.convertTextNodeToText,
parserOptions: {
handleWhitespaceNodes: (_d = (_c = options === null || options === void 0 ? void 0 : options.parserOptions) === null || _c === void 0 ? void 0 : _c.handleWhitespaceNodes) !== null && _d !== void 0 ? _d : "preserve",
},
postProcessing: {
handleTopLevelInlines: (_f = (_e = options === null || options === void 0 ? void 0 : options.postProcessing) === null || _e === void 0 ? void 0 : _e.handleTopLevelInlines) !== null && _f !== void 0 ? _f : "preserve",
handleTopLevelText: (_h = (_g = options === null || options === void 0 ? void 0 : options.postProcessing) === null || _g === void 0 ? void 0 : _g.handleTopLevelText) !== null && _h !== void 0 ? _h : "preserve",
},
};
const parserOptions = {
ignoreWhiteSpace: optionsWithDefaults.parserOptions.handleWhitespaceNodes == "remove",
};
const parsedHtml = (0, parseHtml_js_1.parseHtml)(htmlString, parserOptions);
const richTextNodes = parsedHtml.flatMap((node) => mapHtmlNodeToRichTextNode(node, [], optionsWithDefaults));
const processedRichTextNodes = richTextNodes
.map((node) => (0, processConvertedNodesFromTopLevel_js_1.processConvertedNodesFromTopLevel)(node, optionsWithDefaults))
.filter(utils_js_1.isNotNull);
return (0, utils_js_1.createDocumentNode)(processedRichTextNodes);
};
exports.htmlStringToDocument = htmlStringToDocument;
//# sourceMappingURL=htmlStringToDocument.js.map