From b7ba08af7de99e0c1296dfaf23d8c23f008fceb3 Mon Sep 17 00:00:00 2001 From: Angelo Ashmore Date: Tue, 12 Oct 2021 12:04:11 -1000 Subject: [PATCH] refactor: use currying to build HTML serializer --- src/asHTML.ts | 108 +++++++++++++++++++++++++------------------------- 1 file changed, 53 insertions(+), 55 deletions(-) diff --git a/src/asHTML.ts b/src/asHTML.ts index 4325675..bb8fa79 100644 --- a/src/asHTML.ts +++ b/src/asHTML.ts @@ -22,60 +22,58 @@ import { } from "./types"; /** - * A default HTML serializer providing sensible and safe defaults for every node type + * Creates a default HTML serializer with a given Link Resolver providing + * sensible and safe defaults for every node type * * @internal */ -function defaultHTMLSerializer( +const createDefaultHTMLSerializer = ( linkResolver: LinkResolverFunction | undefined | null, - _type: Parameters[0], - node: Parameters[1], - content: Parameters[2], - children: Parameters[3], - _key: Parameters[4], -): string { - switch (node.type) { - case Element.heading1: - return serializeStandardTag("h1", node, children); - case Element.heading2: - return serializeStandardTag("h2", node, children); - case Element.heading3: - return serializeStandardTag("h3", node, children); - case Element.heading4: - return serializeStandardTag("h4", node, children); - case Element.heading5: - return serializeStandardTag("h5", node, children); - case Element.heading6: - return serializeStandardTag("h6", node, children); - case Element.paragraph: - return serializeStandardTag("p", node, children); - case Element.preformatted: - return serializePreFormatted(node); - case Element.strong: - return serializeStandardTag("strong", node, children); - case Element.em: - return serializeStandardTag("em", node, children); - case Element.listItem: - return serializeStandardTag("li", node, children); - case Element.oListItem: - return serializeStandardTag("li", node, children); - case Element.list: - return serializeStandardTag("ul", node, children); - case Element.oList: - return serializeStandardTag("ol", node, children); - case Element.image: - return serializeImage(linkResolver, node); - case Element.embed: - return serializeEmbed(node); - case Element.hyperlink: - return serializeHyperlink(linkResolver, node, children); - case Element.label: - return serializeStandardTag("span", node, children); - case Element.span: - default: - return serializeSpan(content); - } -} +): RichTextFunctionSerializer => { + return (_type, node, text, children, _key) => { + switch (node.type) { + case Element.heading1: + return serializeStandardTag("h1", node, children); + case Element.heading2: + return serializeStandardTag("h2", node, children); + case Element.heading3: + return serializeStandardTag("h3", node, children); + case Element.heading4: + return serializeStandardTag("h4", node, children); + case Element.heading5: + return serializeStandardTag("h5", node, children); + case Element.heading6: + return serializeStandardTag("h6", node, children); + case Element.paragraph: + return serializeStandardTag("p", node, children); + case Element.preformatted: + return serializePreFormatted(node); + case Element.strong: + return serializeStandardTag("strong", node, children); + case Element.em: + return serializeStandardTag("em", node, children); + case Element.listItem: + return serializeStandardTag("li", node, children); + case Element.oListItem: + return serializeStandardTag("li", node, children); + case Element.list: + return serializeStandardTag("ul", node, children); + case Element.oList: + return serializeStandardTag("ol", node, children); + case Element.image: + return serializeImage(linkResolver, node); + case Element.embed: + return serializeEmbed(node); + case Element.hyperlink: + return serializeHyperlink(linkResolver, node, children); + case Element.label: + return serializeStandardTag("span", node, children); + case Element.span: + default: + return serializeSpan(text); + } + }; +}; /** * Serializes a rich text or title field to an HTML string @@ -89,22 +87,22 @@ function defaultHTMLSerializer( * @returns HTML equivalent of the provided rich text or title field * @see Templating rich text and title fields from Prismic {@link https://prismic.io/docs/technologies/templating-rich-text-and-title-fields-javascript} */ -export function asHTML( +export const asHTML = ( richTextField: RichTextField, linkResolver?: LinkResolverFunction | null, htmlSerializer?: HTMLFunctionSerializer | HTMLMapSerializer | null, -): string { +): string => { let serializer: RichTextFunctionSerializer; if (htmlSerializer) { serializer = composeSerializers( typeof htmlSerializer === "object" ? wrapMapSerializer(htmlSerializer) : htmlSerializer, - defaultHTMLSerializer.bind(null, linkResolver), + createDefaultHTMLSerializer(linkResolver), ); } else { - serializer = defaultHTMLSerializer.bind(null, linkResolver); + serializer = createDefaultHTMLSerializer(linkResolver); } return serialize(richTextField, serializer).join(""); -} +};