import Image from "@/components/Image" import Link from "@/components/TempDesignSystem/Link" import styles from "./jsontohtml.module.css" import type { EmbedByUid } from "@/types/components/jsontohtml" import { EmbedEnum } from "@/types/requests/utils/embeds" import type { Attributes } from "@/types/rte/attrs" import { RTEItemTypeEnum, RTETypeEnum } from "@/types/rte/enums" import type { RTEDefaultNode, RTENext, RTENode, RTERegularNode, } from "@/types/rte/node" import { RTEMarkType } from "@/types/rte/node" import type { RenderOptions } from "@/types/rte/option" function extractPossibleAttributes(attrs: Attributes | undefined) { if (!attrs) return {} const props: Record = {} if (attrs.id) { props.id = attrs.id } if (attrs.class) { props.className = attrs.class } else if (attrs["class-name"]) { props.className = attrs["class-name"] } else if (attrs.classname) { props.className = attrs.classname } else if (attrs?.style?.["text-align"]) { props.style = { textAlign: attrs?.style?.["text-align"], } } return props } export const renderOptions: RenderOptions = { [RTETypeEnum.a]: ( node: RTERegularNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { if (node.attrs.url) { const props = extractPossibleAttributes(node.attrs) return ( {next(node.children, embeds, fullRenderOptions)} ) } return null }, [RTETypeEnum.blockquote]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return (
{next(node.children, embeds, fullRenderOptions)}
) }, [RTETypeEnum.code]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return ( {next(node.children, embeds, fullRenderOptions)} ) }, [RTETypeEnum.embed]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) if (node.attrs.src) { props.src = node.attrs.src } if (node.attrs.url) { props.src = node.attrs.url } if (!props.src) { return null } return ( ) }, [RTETypeEnum.h1]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return (

{next(node.children, embeds, fullRenderOptions)}

) }, [RTETypeEnum.h2]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return (

{next(node.children, embeds, fullRenderOptions)}

) }, [RTETypeEnum.h3]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return (

{next(node.children, embeds, fullRenderOptions)}

) }, [RTETypeEnum.h4]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return (

{next(node.children, embeds, fullRenderOptions)}

) }, [RTETypeEnum.h5]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return (
{next(node.children, embeds, fullRenderOptions)}
) }, [RTETypeEnum.h6]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return (
{next(node.children, embeds, fullRenderOptions)}
) }, [RTETypeEnum.hr]: () => { return
}, [RTETypeEnum.li]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return (
  • {next(node.children, embeds, fullRenderOptions)}
  • ) }, [RTETypeEnum.ol]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return (
      {next(node.children, embeds, fullRenderOptions)}
    ) }, [RTETypeEnum.p]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return (

    {next(node.children, embeds, fullRenderOptions)}

    ) }, [RTETypeEnum.reference]: ( node: RTENode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { if ("attrs" in node) { const type = node.attrs.type if (type === RTEItemTypeEnum.asset) { const image = embeds?.[node?.attrs?.["asset-uid"]] if (image?.node.__typename === EmbedEnum.SysAsset) { const alt = image?.node?.title ?? node.attrs.alt const alignment = node.attrs?.style?.["text-align"] ? { alignSelf: node.attrs?.style?.["text-align"], } : {} return ( {alt} ) } } else { const props = extractPossibleAttributes(node.attrs) const href = node.attrs?.locale ? `/${node.attrs.locale}${node.attrs.href}` : node.attrs.href return ( {next(node.children, embeds, fullRenderOptions)} ) } } return null }, [RTETypeEnum.table]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return ( {next(node.children, embeds, fullRenderOptions)}
    ) }, [RTETypeEnum.thead]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return ( {next(node.children, embeds, fullRenderOptions)} ) }, [RTETypeEnum.tbody]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return ( {next(node.children, embeds, fullRenderOptions)} ) }, [RTETypeEnum.tfoot]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return ( {next(node.children, embeds, fullRenderOptions)} ) }, [RTETypeEnum.tr]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return ( {next(node.children, embeds, fullRenderOptions)} ) }, [RTETypeEnum.th]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return ( {next(node.children, embeds, fullRenderOptions)} ) }, [RTETypeEnum.td]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return ( {next(node.children, embeds, fullRenderOptions)} ) }, [RTETypeEnum.ul]: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { const props = extractPossibleAttributes(node.attrs) return ( ) }, /** TextNode wrappers */ [RTEMarkType.bold]: (children: React.ReactNode) => { return {children} }, [RTEMarkType.italic]: (children: React.ReactNode) => { return {children} }, [RTEMarkType.underline]: (children: React.ReactNode) => { return {children} }, [RTEMarkType.strikethrough]: (children: React.ReactNode) => { return {children} }, [RTEMarkType.inlineCode]: (children: React.ReactNode) => { return {children} }, [RTEMarkType.subscript]: (children: React.ReactNode) => { return {children} }, [RTEMarkType.superscript]: (children: React.ReactNode) => { return {children} }, [RTEMarkType.break]: (children: React.ReactNode) => { return ( <>
    {children} ) }, [RTEMarkType.classnameOrId]: ( children: React.ReactNode, className?: string, id?: string ) => { let props = { className, id, } if (!className) { delete props.className } if (!id) { delete props.id } return ( {children} ) }, /** * Contentstack can return something called `default` as seen here in their * own SDK (https://github.com/contentstack/contentstack-utils-javascript/blob/master/src/options/default-node-options.ts#L89) */ default: ( node: RTEDefaultNode, embeds: EmbedByUid, next: RTENext, fullRenderOptions: RenderOptions ) => { return next(node.children, embeds, fullRenderOptions) }, }