From 5d1d2a849236aba7d928a1e27a45f132abca3582 Mon Sep 17 00:00:00 2001 From: lihbr Date: Fri, 25 Jun 2021 18:59:49 +0200 Subject: [PATCH] refactor: extract serializer helpers into a dedicated file --- package.json | 4 +- src/asHtml.ts | 86 ++++-------------------------------- src/lib/serializerHelpers.ts | 79 +++++++++++++++++++++++++++++++++ yarn.lock | 18 ++++---- 4 files changed, 98 insertions(+), 89 deletions(-) create mode 100644 src/lib/serializerHelpers.ts diff --git a/package.json b/package.json index d340535..2a680b4 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ "test": "yarn lint && yarn unit" }, "dependencies": { - "@prismicio/richtext": "^2.0.0-alpha.0", - "@prismicio/types": "~0.0.10", + "@prismicio/richtext": "^2.0.0-alpha.1", + "@prismicio/types": "~0.0.11", "escape-html": "^1.0.3" }, "devDependencies": { diff --git a/src/asHtml.ts b/src/asHtml.ts index 2e77877..d1bb4b5 100644 --- a/src/asHtml.ts +++ b/src/asHtml.ts @@ -4,92 +4,22 @@ import { composeSerializers, wrapMapSerializer } from "@prismicio/richtext"; +import { RichTextField } from "@prismicio/types"; import { - LinkType, - RichTextField, - RTBlockNode, - RTEmbedNode, - RTImageNode, - RTInlineNode, - RTLinkNode, - RTPreformattedNode -} from "@prismicio/types"; + serializeStandardTag, + serializePreFormatted, + serializeImage, + serializeEmbed, + serializeHyperlink, + serializeSpan +} from "./lib/serializerHelpers"; import { HTMLSerializerFunction, HTMLSerializerMap, LinkResolverFunction } from "./types"; -import escapeHtml from "escape-html"; -import { asLink } from "./asLink"; - -function label(node: RTBlockNode | RTInlineNode) { - return "data" in node && "label" in node.data - ? ` class="${node.data.label}"` - : ""; -} - -function serializeStandardTag( - tag: string, - node: RTBlockNode | RTInlineNode, - children: string[] -) { - return `<${tag}${label(node)}>${children.join("")}`; -} - -function serializePreFormatted(node: RTPreformattedNode) { - return `${escapeHtml(node.text)}`; -} - -// TODO: Check link behavior with image + maybe rewrap with paragraph -function serializeImage( - _linkResolver: LinkResolverFunction, - node: RTImageNode -) { - return `${node.alt}`; -} - -function serializeEmbed(node: RTEmbedNode) { - return `
${ - node.oembed.html - }
`; -} - -function serializeHyperlink( - linkResolver: LinkResolverFunction, - node: RTLinkNode, - children: string[] -) { - switch (node.data.link_type) { - case LinkType.Web: { - return `${children.join("")}`; - } - - case LinkType.Document: { - return `${children.join("")}`; - } - - case LinkType.Media: { - return `${children.join( - "" - )}`; - } - } -} - -function serializeSpan(content?: string) { - return content ? escapeHtml(content).replace(/\n/g, "
") : ""; -} - function defaultHTMLSerializer( linkResolver: LinkResolverFunction, _type: Parameters[0], diff --git a/src/lib/serializerHelpers.ts b/src/lib/serializerHelpers.ts new file mode 100644 index 0000000..b77e346 --- /dev/null +++ b/src/lib/serializerHelpers.ts @@ -0,0 +1,79 @@ +import escapeHtml from "escape-html"; +import { + RTBlockNode, + RTInlineNode, + RTPreformattedNode, + RTImageNode, + RTEmbedNode, + RTLinkNode, + LinkType +} from "@prismicio/types"; + +import { asLink } from "../asLink"; +import { LinkResolverFunction } from "../types"; + +export const getLabel = (node: RTBlockNode | RTInlineNode): string => { + return "data" in node && "label" in node.data + ? ` class="${node.data.label}"` + : ""; +}; + +export const serializeStandardTag = ( + tag: string, + node: RTBlockNode | RTInlineNode, + children: string[] +): string => { + return `<${tag}${getLabel(node)}>${children.join("")}`; +}; + +export const serializePreFormatted = (node: RTPreformattedNode): string => { + return `${escapeHtml(node.text)}`; +}; + +// TODO: Check link behavior with image + maybe rewrap with paragraph +export const serializeImage = ( + _linkResolver: LinkResolverFunction, + node: RTImageNode +): string => { + return `${node.alt}`; +}; + +export const serializeEmbed = (node: RTEmbedNode): string => { + return `
${ + node.oembed.html + }
`; +}; + +export const serializeHyperlink = ( + linkResolver: LinkResolverFunction, + node: RTLinkNode, + children: string[] +): string => { + switch (node.data.link_type) { + case LinkType.Web: { + return `${children.join("")}`; + } + + case LinkType.Document: { + return `${children.join("")}`; + } + + case LinkType.Media: { + return `${children.join( + "" + )}`; + } + } +}; + +export const serializeSpan = (content?: string): string => { + return content ? escapeHtml(content).replace(/\n/g, "
") : ""; +}; diff --git a/yarn.lock b/yarn.lock index 9b635bb..ff5fc0a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -267,17 +267,17 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@prismicio/richtext@^2.0.0-alpha.0": - version "2.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@prismicio/richtext/-/richtext-2.0.0-alpha.0.tgz#2f64af8a4893b1333f3836867d8531b8d90941db" - integrity sha512-hscYpg7vpLyduybiAK+8kNZPJaQ9sgyqJxO9vOoHXULdIAZYc3wGgZxKl+/JbhPia+1wtdirG7JIpWnZ1w4xPw== +"@prismicio/richtext@^2.0.0-alpha.1": + version "2.0.0-alpha.1" + resolved "https://registry.yarnpkg.com/@prismicio/richtext/-/richtext-2.0.0-alpha.1.tgz#29756f4dc78bbcedf16714cca1f61ec9dd1a9e69" + integrity sha512-tTSxp8XySM9j5CkMyWywl9R74PsqYi8vJ8LiZy3PR9NysE28TVSBn3Glgn+3YBwBLIV1VkwbKLPWEHf0oZ3Pyg== dependencies: - "@prismicio/types" "^0.0.10" + "@prismicio/types" "^0.0.11" -"@prismicio/types@^0.0.10", "@prismicio/types@~0.0.10": - version "0.0.10" - resolved "https://registry.yarnpkg.com/@prismicio/types/-/types-0.0.10.tgz#b3b93a460393c650d8a0ce95ea8620f1e08f49da" - integrity sha512-B55j/YEZbhYWjpli70+RbuX0NHFRlqM6q0tQHw7Dr4ovGqHNnTJqGH8zVFuKqlmH5SLk/7jGSi7fcWconS94Tw== +"@prismicio/types@^0.0.11", "@prismicio/types@~0.0.11": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@prismicio/types/-/types-0.0.11.tgz#97d73ef5abed5ce9623bf7c8fcacf4f9bac8d9a3" + integrity sha512-QsGW0quZ2NJDaDl+XvUhiafo7xUWOCKkJlvWwNaG1vWXB73b5cj0dk0UAPmoVOY3xx65JXTGKhBBkNKna8DhfA== "@rollup/plugin-alias@^3.1.2": version "3.1.2"