Skip to content

Commit

Permalink
refactor: use currying to build HTML serializer
Browse files Browse the repository at this point in the history
  • Loading branch information
angeloashmore committed Oct 12, 2021
1 parent 542b4d9 commit b7ba08a
Showing 1 changed file with 53 additions and 55 deletions.
108 changes: 53 additions & 55 deletions src/asHTML.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<string> | undefined | null,
_type: Parameters<HTMLFunctionSerializer>[0],
node: Parameters<HTMLFunctionSerializer>[1],
content: Parameters<HTMLFunctionSerializer>[2],
children: Parameters<HTMLFunctionSerializer>[3],
_key: Parameters<HTMLFunctionSerializer>[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<string> => {
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
Expand All @@ -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<string> | null,
htmlSerializer?: HTMLFunctionSerializer | HTMLMapSerializer | null,
): string {
): string => {
let serializer: RichTextFunctionSerializer<string>;
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("");
}
};

0 comments on commit b7ba08a

Please sign in to comment.