UNPKG

@prismicio/client

Version:

The official JavaScript + TypeScript client library for Prismic

81 lines (80 loc) 4.59 kB
import { serializeEmbed, serializeHyperlink, serializeImage, serializePreFormatted, serializeSpan, serializeStandardTag } from "../lib/serializerHelpers.js"; import { serialize } from "../richtext/serialize.js"; import { wrapMapSerializer } from "../richtext/wrapMapSerializer.js"; import { composeSerializers } from "../richtext/composeSerializers.js"; //#region src/helpers/asHTML.ts /** * Creates a HTML rich text serializer with a given link resolver and provide sensible and safe * defaults for every node type * * @internal */ const createHTMLRichTextSerializer = (linkResolver, serializer) => { const useSerializerOrDefault = (nodeSerializerOrShorthand, defaultWithShorthand) => { if (typeof nodeSerializerOrShorthand === "function") return ((payload) => { return nodeSerializerOrShorthand?.(payload) || defaultWithShorthand(payload); }); return defaultWithShorthand; }; return wrapMapSerializerWithStringChildren({ heading1: useSerializerOrDefault(serializer?.heading1, serializeStandardTag("h1", serializer?.heading1)), heading2: useSerializerOrDefault(serializer?.heading2, serializeStandardTag("h2", serializer?.heading2)), heading3: useSerializerOrDefault(serializer?.heading3, serializeStandardTag("h3", serializer?.heading3)), heading4: useSerializerOrDefault(serializer?.heading4, serializeStandardTag("h4", serializer?.heading4)), heading5: useSerializerOrDefault(serializer?.heading5, serializeStandardTag("h5", serializer?.heading5)), heading6: useSerializerOrDefault(serializer?.heading6, serializeStandardTag("h6", serializer?.heading6)), paragraph: useSerializerOrDefault(serializer?.paragraph, serializeStandardTag("p", serializer?.paragraph)), preformatted: useSerializerOrDefault(serializer?.preformatted, serializePreFormatted(serializer?.preformatted)), strong: useSerializerOrDefault(serializer?.strong, serializeStandardTag("strong", serializer?.strong)), em: useSerializerOrDefault(serializer?.em, serializeStandardTag("em", serializer?.em)), listItem: useSerializerOrDefault(serializer?.listItem, serializeStandardTag("li", serializer?.listItem)), oListItem: useSerializerOrDefault(serializer?.oListItem, serializeStandardTag("li", serializer?.oListItem)), list: useSerializerOrDefault(serializer?.list, serializeStandardTag("ul", serializer?.list)), oList: useSerializerOrDefault(serializer?.oList, serializeStandardTag("ol", serializer?.oList)), image: useSerializerOrDefault(serializer?.image, serializeImage(linkResolver, serializer?.image)), embed: useSerializerOrDefault(serializer?.embed, serializeEmbed(serializer?.embed)), hyperlink: useSerializerOrDefault(serializer?.hyperlink, serializeHyperlink(linkResolver, serializer?.hyperlink)), label: useSerializerOrDefault(serializer?.label, serializeStandardTag("span", serializer?.label)), span: useSerializerOrDefault(serializer?.span, serializeSpan()) }); }; /** * Wraps a map serializer into a regular function serializer. The given map serializer should accept * children as a string, not as an array of strings like `@prismicio/client/richtext`'s * `wrapMapSerializer`. * * @param mapSerializer - Map serializer to wrap * @returns A regular function serializer */ const wrapMapSerializerWithStringChildren = (mapSerializer) => { const modifiedMapSerializer = {}; for (const tag in mapSerializer) { const tagSerializer = mapSerializer[tag]; if (tagSerializer) modifiedMapSerializer[tag] = (payload) => { return tagSerializer({ ...payload, children: payload.children.join("") }); }; } return wrapMapSerializer(modifiedMapSerializer); }; const asHTML = (richTextField, ...configObjectOrTuple) => { if (richTextField) { const [configObjectOrLinkResolver, maybeSerializer] = configObjectOrTuple; let config; if (typeof configObjectOrLinkResolver === "function" || configObjectOrLinkResolver == null) config = { linkResolver: configObjectOrLinkResolver, serializer: maybeSerializer }; else config = { ...configObjectOrLinkResolver }; let serializer; if (config.serializer) if (typeof config.serializer === "function") serializer = composeSerializers((type, node, text, children, key) => config.serializer(type, node, text, children.join(""), key), createHTMLRichTextSerializer(config.linkResolver)); else serializer = createHTMLRichTextSerializer(config.linkResolver, config.serializer); else serializer = createHTMLRichTextSerializer(config.linkResolver); return serialize(richTextField, serializer).join(""); } else return null; }; //#endregion export { asHTML }; //# sourceMappingURL=asHTML.js.map