"use client"; import { Accordion, AccordionContent } from "@/lib/accordion"; import { Poppable } from "@/lib/poppables/components/poppable"; import { createElements } from "@/lib/tcmd"; import Link from "next/link"; import React, { FC, Fragment, ReactNode, use, useMemo } from "react"; import { sanitize } from "isomorphic-dompurify"; import StaticGenerationSearchParamsBailoutProvider from "next/dist/client/components/static-generation-searchparams-bailout-provider"; export const TTCMD: FC<{ body: Promise }> = ({ body }) => { const text = use(body); const [elements, tabSpacing] = useMemo(() => createElements(text), [text]); const tada = useMemo( () => ( <>{renderer(elements.filter((e) => !e.parent).map((e) => e.token!))} ), [elements], ); return (
{/* {elements.map((e, i) => {render(e)})} */} {tada}
//
// {/*
{JSON.stringify(elements,null,2)}
*/} //
); }; function renderer(tokens: Token[]) { const usedIds: string[] = []; return tokens.map((t) => (
{render(t, usedIds)}
)); } function render(token: Token, usedIds: string[]) { switch (token.type) { case "heading": return (
{token.content}
); case "grid": return (
{token.children?.map((c, i) => (
{render(c, usedIds)}
))}
); case "code": return (
          {token.content}
        
); case "card": return (
{token.children?.map((e) => ( {render(e, usedIds)} ))}
); case "anchor": return ( {token.content} ); case "image": { token.metadata.src = token.metadata.src as string; if (token.metadata.src.startsWith(" ); } // eslint-disable-next-line @next/next/no-img-element return {token.content}; } case "inline-code": return ( {token.content} ); case "popover": return ( render(c, usedIds)) || token.content} preferredAlign="centered" preferredEdge="bottom" className="cursor-pointer mx-2" > {token.metadata.title} ); case "text": return {token.content}; case "p": return (
{token.children?.map((e, i) => ( {render(e, usedIds)} ))}
); case "accordion": return (
{token.children?.map((e, i) => ( {render(e, usedIds)} ))}
); case "bold": return ( {token.content} ); case "italic": return ( {token.content} ); case "list": const items = token.children || []; return ( <> ); case "list-item": // This probably doesn't need to exist, but I'm leaving it anyway return (
  • {token.children?.map((c) => render(c, usedIds))}
  • ); default: return (
    Block or paragraph missing implementation: {token.type}
    ); } } function generateId(t: string, usedIds: string[]) { let id = t.toLowerCase().replace(/[^a-z\s]/ig, "").trim().replaceAll( " ", "-", ); let idNum = 1; while (usedIds.includes(id)) { id = id.replace(/-[0-9]+$/g, ""); id += "-" + idNum; idNum++; } return id; }