@prismicio/client
Version:
The official JavaScript + TypeScript client library for Prismic
81 lines (80 loc) • 4.59 kB
JavaScript
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