From 2e8ddd8ed2bb69b49695bda1676f11df0fd29d68 Mon Sep 17 00:00:00 2001 From: Emma Date: Thu, 29 Feb 2024 01:38:30 -0700 Subject: [PATCH] tcmd: token uuids, fixes a few issues with poppables --- app/globals.css | 2 +- app/page.tsx | 2 +- bun.lockb | Bin 145214 -> 160846 bytes components/tcmd/index.tsx | 47 ++++++++++++++++++-------- lib/poppables/components/poppable.tsx | 2 ++ lib/tcmd/index.ts | 6 ++-- lib/tcmd/tokenizeBlock.ts | 3 ++ lib/tcmd/tokenizeInline.ts | 9 +++-- lib/tcmd/tokenizeLine.ts | 43 ++++++++++++++++++++--- lib/tcmd/tokenizeParagraph.ts | 2 ++ package.json | 1 + tailwind.config.ts | 1 - test.md | 2 ++ types.d.ts | 4 +++ 14 files changed, 96 insertions(+), 28 deletions(-) diff --git a/app/globals.css b/app/globals.css index 361f316..8998ba2 100644 --- a/app/globals.css +++ b/app/globals.css @@ -42,6 +42,6 @@ } .poppable { - @apply card bg-mixed-300 p-2 rounded-lg transition-opacity data-[visible=true]:z-10 data-[visible=true]:opacity-100 data-[visible=false]:opacity-0 -z-10 max-w-[400px] absolute + @apply card dark:bg-mixed-300 bg-primary-600 p-2 rounded-lg transition-opacity data-[visible=true]:z-10 data-[visible=true]:opacity-100 data-[visible=false]:opacity-0 -z-10 max-w-[400px] absolute } } diff --git a/app/page.tsx b/app/page.tsx index 83360dc..793017d 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -13,7 +13,7 @@ import { Suspense } from "react"; export default function Home() { return ( <> -
+

Tabletop Commander

How does it work?

diff --git a/bun.lockb b/bun.lockb index ac17f92e2dff068fb27bbc43b368532a8f60701a..8384bf0b920c02938d4a191273738d28326cb584 100755 GIT binary patch delta 43492 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 delta 34421 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 diff --git a/components/tcmd/index.tsx b/components/tcmd/index.tsx index 00b370b..2f5476c 100644 --- a/components/tcmd/index.tsx +++ b/components/tcmd/index.tsx @@ -3,10 +3,11 @@ import { Accordion, AccordionContent } from "@/lib/accordion"; import { Poppable } from "@/lib/poppables/components/poppable"; import { createElements } from "@/lib/tcmd"; -import { tokenizeInline } from "@/lib/tcmd/tokenizeInline"; import Link from "next/link"; import React, { FC, Fragment, ReactNode, use, useMemo } from "react"; +import { sanitize } from "isomorphic-dompurify"; + export const TCMD: FC<{ body: Promise }> = ({ body }) => { const text = use(body); const elements = useMemo(() => createElements(text), [text]); @@ -15,9 +16,8 @@ export const TCMD: FC<{ body: Promise }> = ({ body }) => { //
{JSON.stringify(elements,null,2)}
//
- {elements.map((e, i) => ( - {renderBlock(e)} - ))} + {elements.map((e, i) => {renderBlock(e)} + )}
); }; @@ -26,7 +26,7 @@ const renderBlock = (block: BlockChildren): ReactNode => { switch (block.type) { case "block": return block.children.map((e, i) => ( - {renderBlock(e)} + {renderBlock(e)} )); case "grid": return ( @@ -37,7 +37,7 @@ const renderBlock = (block: BlockChildren): ReactNode => { className="grid grid-cols-dynamic gap-x-8 gap-y-6 mb-6" > {block.children.map((c, i) => ( -
+
{renderBlock(c)}
))} @@ -47,7 +47,7 @@ const renderBlock = (block: BlockChildren): ReactNode => { return (
{block.children.map((e, i) => ( - + {renderBlock(e)} ))} @@ -60,7 +60,7 @@ const renderBlock = (block: BlockChildren): ReactNode => { > {block.children.map((e, i) => ( - + {renderBlock(e)} ))} @@ -80,7 +80,7 @@ const renderParagraph = (p: ParagraphToken) => { return (
{p.content.map((e, i) => ( - + {renderToken(e)} ))} @@ -88,7 +88,7 @@ const renderParagraph = (p: ParagraphToken) => { ); case "code": return ( -
+        
           {p.content.map((c) => c.line.toString()).join("\n\n")}
         
); @@ -143,7 +143,7 @@ const renderToken = (t: Token) => { return (
{t.lines.map((e, i) => ( - + {renderInlineToken(e.line)} ))} @@ -159,7 +159,7 @@ const renderToken = (t: Token) => { case "list1": return
  • {renderInlineToken(t.line)}
  • ; case "list2": - return
  • {renderInlineToken(t.line)}
  • ; + return
  • {renderInlineToken(t.line)}
  • ; default: return (
    @@ -174,7 +174,7 @@ const renderInlineToken = (l: Line) => { if (typeof l === "string") return l; return l.map((token) => ( - + {(() => { switch (token.type) { case "text": @@ -183,13 +183,30 @@ const renderInlineToken = (l: Line) => { return {token.content}; case "anchor": return ( - + {token.content} ); - case "image": + case "image": { + token.data.src = token.data.src as string; + if (token.data.src.startsWith(" +
    + ); + } // eslint-disable-next-line @next/next/no-img-element return {token.content}; + } case "popover": return ( { @@ -43,6 +42,7 @@ const tokenize = (body: string) => { closed: false, metadata: {}, type: "block", + uuid: crypto.randomUUID(), }; blockTokens.push(openBT); } @@ -66,6 +66,7 @@ const tokenize = (body: string) => { line: paragraph, raw: paragraph, type: "text", + uuid: crypto.randomUUID(), }); } @@ -78,6 +79,7 @@ const tokenize = (body: string) => { content: [], metadata: {}, type: "p", + uuid: crypto.randomUUID(), }; openBT.children.push(openP); paragraphTokens.push(openP); diff --git a/lib/tcmd/tokenizeBlock.ts b/lib/tcmd/tokenizeBlock.ts index 33bd3d2..6975abd 100644 --- a/lib/tcmd/tokenizeBlock.ts +++ b/lib/tcmd/tokenizeBlock.ts @@ -26,6 +26,7 @@ const blockTokens: { }, children: [], closed: false, + uuid: crypto.randomUUID(), }; }, }, @@ -38,6 +39,7 @@ const blockTokens: { metadata: {}, children: [], closed: false, + uuid: crypto.randomUUID(), }; }, }, @@ -51,6 +53,7 @@ const blockTokens: { metadata: { title }, children: [], closed: false, + uuid: crypto.randomUUID(), }; }, }, diff --git a/lib/tcmd/tokenizeInline.ts b/lib/tcmd/tokenizeInline.ts index a55e0c8..73cca93 100644 --- a/lib/tcmd/tokenizeInline.ts +++ b/lib/tcmd/tokenizeInline.ts @@ -1,7 +1,6 @@ import { zipArrays } from "../zip"; -export const tokenizeInline = (line: string, recursive?: boolean) => { - if (recursive) console.log("recursive call"); +export const tokenizeInline = (line: string) => { line = line.trim(); const originalLine = line; const insertMarker = "\u{03A9}"; @@ -43,6 +42,7 @@ export const tokenizeInline = (line: string, recursive?: boolean) => { line.split(new RegExp(insertMarker + "{2,}")).map((t): InlineToken => ({ content: t, type: "text", + uuid: crypto.randomUUID(), })), tokens, ).filter((t) => t.content); @@ -69,6 +69,7 @@ export const inlineTokens: { type: "bold", end, start, + uuid: crypto.randomUUID(), }); }, replace(l) { @@ -87,6 +88,7 @@ export const inlineTokens: { }, start, end, + uuid: crypto.randomUUID(), }); }, replace(l) { @@ -106,6 +108,7 @@ export const inlineTokens: { data: { src, }, + uuid: crypto.randomUUID(), }); }, replace(l) { @@ -116,7 +119,6 @@ export const inlineTokens: { rx: /\^\[(.*?)\]<<(.*?)>>/gm, create(content, start, end, tokens) { const [_, text, popover] = content; - // tokenizeInline("", true); tokens.push({ content: text, end, @@ -125,6 +127,7 @@ export const inlineTokens: { data: { popover: tokenizeInline(popover), }, + uuid: crypto.randomUUID(), }); }, replace(l) { diff --git a/lib/tcmd/tokenizeLine.ts b/lib/tcmd/tokenizeLine.ts index 6288a08..af73f7e 100644 --- a/lib/tcmd/tokenizeLine.ts +++ b/lib/tcmd/tokenizeLine.ts @@ -26,6 +26,7 @@ export const tokenizeLine = ( line: tokenizeInline(line), type: "text", raw: line, + uuid: crypto.randomUUID(), }; }; @@ -33,28 +34,53 @@ export const singleLineTokens: SingleLineCfg[] = [ { rx: /^#\s/, create(line) { - return ({ type: "h1", line, raw: line, cfg: this }); + return ({ + type: "h1", + line, + raw: line, + cfg: this, + uuid: crypto.randomUUID(), + }); }, replaceRx: /^#\s/, }, { rx: /^##\s/, create(line) { - return ({ type: "h2", line, raw: line, cfg: this }); + return ({ + type: "h2", + line, + raw: line, + cfg: this, + uuid: crypto.randomUUID(), + }); }, replaceRx: /^##\s/, }, { rx: /^###\s/, create(line) { - return ({ type: "h3", line, raw: line, cfg: this }); + return ({ + type: "h3", + line, + raw: line, + cfg: this, + uuid: crypto.randomUUID(), + }); }, replaceRx: /^###\s/, }, { rx: /^-\s/, create(line) { - return ({ type: "list1", line, raw: line, mends: true, cfg: this }); + return ({ + type: "list1", + line, + raw: line, + mends: true, + cfg: this, + uuid: crypto.randomUUID(), + }); }, replaceRx: /^-\s/, shouldMendNextLine: true, @@ -62,7 +88,14 @@ export const singleLineTokens: SingleLineCfg[] = [ { rx: /^[\t\s]{2}-\s/, create(line) { - return ({ type: "list2", line, raw: line, mends: true, cfg: this }); + return ({ + type: "list2", + line, + raw: line, + mends: true, + cfg: this, + uuid: crypto.randomUUID(), + }); }, replaceRx: /^[\t\s]{2}-\s/, shouldMendNextLine: true, diff --git a/lib/tcmd/tokenizeParagraph.ts b/lib/tcmd/tokenizeParagraph.ts index d567e32..01c1537 100644 --- a/lib/tcmd/tokenizeParagraph.ts +++ b/lib/tcmd/tokenizeParagraph.ts @@ -34,8 +34,10 @@ const blockTokens: { line: line.replace(/```.*?\n/g, "").replace(/\n```/, ""), type: "text", raw: line, + uuid: crypto.randomUUID(), }], allowsInline: false, + uuid: crypto.randomUUID(), }; }, }, diff --git a/package.json b/package.json index 93df53d..439a382 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@heroicons/react": "^2.1.1", + "isomorphic-dompurify": "^2.4.0", "next": "14.1.0", "react": "^18", "react-dom": "^18" diff --git a/tailwind.config.ts b/tailwind.config.ts index 1a868f0..5f31dae 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -7,7 +7,6 @@ const config: Config = { "./lib/**/*.{js,ts,jsx,tsx,mdx}", "./app/**/*.{js,ts,jsx,tsx,mdx}", ], - theme: { extend: { backgroundImage: { diff --git a/test.md b/test.md index 1dc5259..8f24cdb 100644 --- a/test.md +++ b/test.md @@ -85,6 +85,8 @@ this is the test of a single accordion ![Goofy](https://yt3.ggpht.com/a/AATXAJwbIW0TwEhqdT2ZPeSB1AtdtWD2ZXam80oijg=s900-c-k-c0xffffffff-no-rj-mo) +![svg test]() + [/accordion] ]] diff --git a/types.d.ts b/types.d.ts index 21f524b..922c0ec 100644 --- a/types.d.ts +++ b/types.d.ts @@ -2,6 +2,7 @@ type InlineToken = { type: "text" | "bold" | "anchor" | "image" | "popover"; content: string; data?: any; + uuid: string; }; type InlineTokenInsert = { @@ -29,6 +30,7 @@ type SingleLineToken = { raw: string; mends?: boolean; cfg?: SingleLineCfg; + uuid: string; }; type Token = SingleLineToken | MultilineToken; @@ -47,6 +49,7 @@ type BlockToken = { children: BlockChildren[]; parent?: string; closed: boolean; + uuid: string; }; type BlockChildren = ParagraphToken | BlockToken | SingleLineToken; @@ -57,4 +60,5 @@ type ParagraphToken = { type: "p" | "code"; metadata: any; closed: boolean; + uuid: string; };