From 2e7eaccde84df7e87b25b8e4fd23f934fc2729c7 Mon Sep 17 00:00:00 2001 From: Emma Date: Sat, 16 Mar 2024 02:12:20 -0600 Subject: [PATCH] lint: updates lint rules for no-unused-vars --- .eslintrc.json | 24 +- app/help/[article]/error.tsx | 1 - app/page.tsx | 2 - bun.lockb | Bin 160846 -> 166872 bytes lib/poppables/components/poppable-content.tsx | 6 +- lib/poppables/components/poppable.tsx | 9 +- lib/tcmd/TokenIdentifiers.tsx | 789 +++++++++--------- lib/tcmd/index.ts | 2 +- package.json | 7 +- types.d.ts | 28 + 10 files changed, 453 insertions(+), 415 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index bffb357..55f8beb 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,23 @@ { - "extends": "next/core-web-vitals" -} + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "next/core-web-vitals" + ], + "rules": { + "@typescript-eslint/no-unused-vars": [ + "error", + { + "args": "all", + "argsIgnorePattern": "^_", + "caughtErrors": "all", + "caughtErrorsIgnorePattern": "^_", + "destructuredArrayIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "ignoreRestSiblings": true + } + ] + } +} \ No newline at end of file diff --git a/app/help/[article]/error.tsx b/app/help/[article]/error.tsx index 9ecd2d8..e0df3d7 100644 --- a/app/help/[article]/error.tsx +++ b/app/help/[article]/error.tsx @@ -2,7 +2,6 @@ export default function Error({ error, - reset, }: { error: Error & { digest?: string }; reset: () => void; diff --git a/app/page.tsx b/app/page.tsx index ad5ded3..4540704 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,6 +1,4 @@ import { readMD } from "@/actions/readMD"; -import { TTCMD } from "@/components/ttcmd"; -import { readFile } from "fs/promises"; import { Suspense } from "react"; import { HomeClient } from "./client"; import { MDSkeletonLoader } from "@/components/loader"; diff --git a/bun.lockb b/bun.lockb index 173a35b7aeaf0d6163909a53dd0d481f6f9c29a6..04c620baeb4499ff6c3a282364f4acafe05ae3a9 100755 GIT binary patch delta 41282 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 delta 37234 zcmeHwd3;Rg_y620Lk1z1NF*VG*b@?x31NcTM`EcgmX^UFWRt~KI!Q}QS3K2+6s4;! zAFZ}(S8J=ZO6^;TQd_M>(U#x)eHXMJ`sug7&!_#T_vM}Qobznwoaa2topI;xm8G|y zv`vkuAG^B5@D5X^^lH|)#a#QX=<1gv>Q(N4YT~y~4(QOo(a&cut4HAQY_!o(7CZx-#hS+`(DZGQdK76%IV##0;SsTf#P35 zfBa#7c5b@X%Oatu{>mGosv2T@0(EO3FJH7#{XJLF9D8u%k1uFF#T2gzcQfAGUu5jng62 z3%sX*-eScRP z>4J`^M;8rE&tlV-(m{IpjI_+OY*%is8$1;{fw-|*JeGo>VBMl@P+IhjmSHKdRns;8 z8FDs!1w1Qm0;R(9s_S$Hc=|drM322Xpj5Co@<{`0==IY;S?^cvFeZQ7klDceP+cLj zp{-DiE?ierZ+MA8M-NLIGz^xe<+{hXK|9yd4GONUcbx6Y8x}soJ=Ouw(15z2oFpk> z@ISm(&=LuFrQj1#X4C~`4CJ_Tv(iVoEtTq8EHJ9T21*Nls-r75%$1upI@4lFsHb=I z0V=cp58&xZ#DF_@kj3&EgyhXhHVr(&s9>xs!=uG#0tD3TNl#Le#!^tu zn*B!k!Re#eou#qjFE)Eu_nbqURP6nxdhoh3$7ZH

q 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 A_W%F@ diff --git a/lib/poppables/components/poppable-content.tsx b/lib/poppables/components/poppable-content.tsx index e507caf..4b305e4 100644 --- a/lib/poppables/components/poppable-content.tsx +++ b/lib/poppables/components/poppable-content.tsx @@ -4,7 +4,6 @@ import { PropsWithChildren, SetStateAction, useCallback, - useEffect, useState, } from "react"; import { bulkRound } from "../../utils/bulkRound"; @@ -24,7 +23,7 @@ interface IProps { setHover: Dispatch>; } -type position = { top: number; left: number; width?: number }; +type position = { top: number; left: number; width?: number; }; export const PoppableContent: FC> = ( { @@ -35,7 +34,6 @@ export const PoppableContent: FC> = ( spacing = 10, setHover, isClosing, - isClosed, }, ) => { const [popRef, setPopRef] = useState(); @@ -52,7 +50,7 @@ export const PoppableContent: FC> = ( relHeight: number, popWidth: number, popHeight: number, - edge: edge, + _edge: edge, align: alignment, ): position => { const pos = { diff --git a/lib/poppables/components/poppable.tsx b/lib/poppables/components/poppable.tsx index e80fd62..8d78b86 100644 --- a/lib/poppables/components/poppable.tsx +++ b/lib/poppables/components/poppable.tsx @@ -1,13 +1,6 @@ "use client"; -import { - FC, - PropsWithChildren, - ReactNode, - useCallback, - useEffect, - useState, -} from "react"; +import { FC, PropsWithChildren, ReactNode, useCallback, useState } from "react"; import { PoppableContent } from "./poppable-content"; import { useDebounce } from "../../../hooks/useDebounce"; diff --git a/lib/tcmd/TokenIdentifiers.tsx b/lib/tcmd/TokenIdentifiers.tsx index 1e2848d..727f401 100644 --- a/lib/tcmd/TokenIdentifiers.tsx +++ b/lib/tcmd/TokenIdentifiers.tsx @@ -3,48 +3,14 @@ import Link from "next/link"; import { Fragment } from "react"; import { Poppable } from "../poppables/components/poppable"; import { Accordion, AccordionContent } from "../accordion"; -import { metadata } from "@/app/layout"; -type SearchFunction = (s: string, start: number, end: number) => { - start: number; - end: number; - text: string; - lastIndex: number; -}; - -type TokenIdentifier = { - rx: RegExp; - parse: (s: string) => Token; - search?: SearchFunction; -}; - -type TokenIdentifierMap = Map< - string, - TokenIdentifier ->; - -export const TokenRenderers = new Map< - string, - TokenRenderer ->(); - -type IdentifierRegistration = >( - type: string, - match: RegExp, - parseFunction: (s: string, rx: RegExp) => IdentifiedToken, - renderFunction: TokenRenderer, - openTagRx?: RegExp, - closeTagRx?: RegExp, -) => void; +export const TokenRenderers = new Map>(); export function buildIdentifierMap(): [ TokenIdentifierMap, IdentifierRegistration, ] { - const TokenIdentifiers = new Map< - string, - TokenIdentifier - >(); + const TokenIdentifiers = new Map>(); function registerIdentifier( type: string, @@ -79,7 +45,7 @@ export function buildIdentifierMap(): [ return { ...token, ...identifiedToken } as Token; }, - search: (openTagRx && closeTagRx) + search: openTagRx && closeTagRx ? (s, start, end) => { return search( s, @@ -120,8 +86,11 @@ export const buildOnlyDefaultElements = () => { /(? { const rx = /((?:\[\])+)\n+([\s\S]*)\n+\/\[\]/; - const [_, columns, content] = s.match(rx) || - ["", "..", "Unable to parse grid"]; + const [_, columns, content] = s.match(rx) || [ + "", + "..", + "Unable to parse grid", + ]; return { content, raw: s, @@ -133,7 +102,7 @@ export const buildOnlyDefaultElements = () => { }; }, (token) => { - const { content, children, metadata, uuid } = token; + const { children, metadata } = token; return (

{ } as React.CSSProperties} className="grid grid-cols-dynamic gap-x-8 gap-y-6 mb-6" > - {children?.map((c) => ( -
- {c.render(c)} -
- ))} + {children?.map((c) =>
{c.render(c)}
)}
); }, @@ -173,17 +138,14 @@ export const buildOnlyDefaultElements = () => { }; }, (token) => { - const { children, metadata, uuid } = token; + const { children, metadata } = token; return (
- {children?.map((e) => ( - - {e.render(e)} - - ))} + {children?.map((e) => {e.render(e)} + )}
); }, @@ -192,22 +154,26 @@ export const buildOnlyDefaultElements = () => { ); // fenced code block - registerIdentifier("code", /`{3}\n+((?:.|\n)*?)\n+`{3}/g, (s, rx) => { - return { - content: s.match(new RegExp(rx, ""))?.at(1) || - "Unable to parse code", - raw: s, - metadata: {}, - uuid: crypto.randomUUID(), - rendersContentOnly, - }; - }, (token) => { - return ( -
-      {token.content}
-      
- ); - }); + registerIdentifier( + "code", + /`{3}\n+((?:.|\n)*?)\n+`{3}/g, + (s, rx) => { + return { + content: s.match(new RegExp(rx, ""))?.at(1) || "Unable to parse code", + raw: s, + metadata: {}, + uuid: crypto.randomUUID(), + rendersContentOnly, + }; + }, + (token) => { + return ( +
+          {token.content}
+        
+ ); + }, + ); // list registerIdentifier( @@ -215,20 +181,18 @@ export const buildOnlyDefaultElements = () => { /^\s*-\s([\s\S]*?)\n\n/gm, (s, rx) => { return { - content: s.match(new RegExp(rx, ""))?.at(1) || - "Unable to parse list", + content: s.match(new RegExp(rx, ""))?.at(1) || "Unable to parse list", raw: s, metadata: { initialDepth: - s.replace("\n", "").split("-").at(0)?.length.toString() || - "1", + s.replace("\n", "").split("-").at(0)?.length.toString() || "1", }, uuid: crypto.randomUUID(), rendersChildrenOnly, }; }, (token) => { - const { children, metadata, uuid } = token; + const { children, metadata } = token; return ( <>
    { > {children?.map((c) => { return ( -
  • +
  • {c.children?.map((c: Token) => ( {c.render(c)} ))} @@ -264,19 +225,15 @@ export const buildOnlyDefaultElements = () => { raw: s, metadata: { initialDepth: - s.replace("\n", "").split("-").at(0)?.length.toString() || - "1", + s.replace("\n", "").split("-").at(0)?.length.toString() || "1", }, uuid: crypto.randomUUID(), }; }, (token) => { - const { children, metadata, uuid } = token; + const { children, metadata } = token; return ( -
  • +
  • {children?.map((c) => ( (c.render(c)) @@ -288,104 +245,120 @@ export const buildOnlyDefaultElements = () => { ); // heading - registerIdentifier("heading", /^#+\s(.*?)$/gm, (s, rx) => { - const content = s.match(new RegExp(rx, ""))?.at(1) || - "Unable to parse heading"; - return { - content: content, - raw: s, - metadata: { - strength: s.match(/#/g)?.length.toString() || "1", - id: generateId(content, usedIds), - }, - uuid: crypto.randomUUID(), - rendersContentOnly, - }; - }, (token) => { - return ( -
    { + const content = s.match(new RegExp(rx, ""))?.at(1) || + "Unable to parse heading"; + return { + content: content, + raw: s, + metadata: { + strength: s.match(/#/g)?.length.toString() || "1", + id: generateId(content, usedIds), + }, + uuid: crypto.randomUUID(), + rendersContentOnly, + }; + }, + (token) => { + return ( +
    - {token.content} -
    - ); - }); - - // image - registerIdentifier("image", /\!\[(.*?)\]\((.*?)\)/g, (s, rx) => { - const [_, title, src] = s.match(new RegExp(rx, ""))!; - - return { - // content: inline, - content: title.trim(), - raw: s, - metadata: { - src, - }, - uuid: crypto.randomUUID(), - rendersContentOnly, - }; - }, (token) => { - const { metadata } = token; - metadata.src = metadata.src as string; - if (metadata.src.startsWith(" + {token.content}
    ); - } - // eslint-disable-next-line @next/next/no-img-element - return {token.content}; - }); + }, + ); + + // image + registerIdentifier( + "image", + /\!\[(.*?)\]\((.*?)\)/g, + (s, rx) => { + const [_, title, src] = s.match(new RegExp(rx, ""))!; + + return { + // content: inline, + content: title.trim(), + raw: s, + metadata: { + src, + }, + uuid: crypto.randomUUID(), + rendersContentOnly, + }; + }, + (token) => { + const { metadata } = token; + metadata.src = metadata.src as string; + if (metadata.src.startsWith(" + + ); + } + // eslint-disable-next-line @next/next/no-img-element + return {token.content}; + }, + ); // anchor - registerIdentifier("anchor", /(? { - let preset, [_, title, href] = s.match(new RegExp(rx, ""))!; - const match = title.match(/`{3}(cta|button)?(.*)/); + registerIdentifier( + "anchor", + /(? { + let preset, + [_, title, href] = s.match(new RegExp(rx, ""))!; + const match = title.match(/`{3}(cta|button)?(.*)/); - if (match) { - [_, preset, title] = match; - } + if (match) { + [_, preset, title] = match; + } - const classes = { - button: "btn-primary inline-block", - cta: "btn-secondary inline-block uppercase", - }; - return { - content: title.trim(), - raw: s, - metadata: { - href, - classes: classes[preset as keyof typeof classes], - }, - uuid: crypto.randomUUID(), - rendersContentOnly, - }; - }, (token) => { - const { metadata } = token; - return ( - - {token.content} - - ); - }); + const classes = { + button: "btn-primary inline-block", + cta: "btn-secondary inline-block uppercase", + }; + return { + content: title.trim(), + raw: s, + metadata: { + href, + classes: classes[preset as keyof typeof classes], + }, + uuid: crypto.randomUUID(), + rendersContentOnly, + }; + }, + (token) => { + const { metadata } = token; + return ( + + {token.content} + + ); + }, + ); // inline-code registerIdentifier( @@ -411,70 +384,75 @@ export const buildOnlyDefaultElements = () => { ); // bold - registerIdentifier("bold", /\*{2}(.*?)\*{2}/g, (s, rx) => { - return { - content: s.match(new RegExp(rx, "i"))?.at(1) || - "Unable to parse bold", - raw: s, - metadata: {}, - uuid: crypto.randomUUID(), - rendersContentOnly, - }; - }, (token) => { - return ( - - {token.content} - - ); - }); + registerIdentifier( + "bold", + /\*{2}(.*?)\*{2}/g, + (s, rx) => { + return { + content: s.match(new RegExp(rx, "i"))?.at(1) || "Unable to parse bold", + raw: s, + metadata: {}, + uuid: crypto.randomUUID(), + rendersContentOnly, + }; + }, + (token) => { + return {token.content}; + }, + ); // italic - registerIdentifier("italic", /(? { - return { - content: s.match(new RegExp(rx, "i"))?.at(1) || - "Unable to parse italic", - raw: s, - metadata: {}, - uuid: crypto.randomUUID(), - rendersContentOnly, - }; - }, (token) => { - return ( - - {token.content} - - ); - }); + registerIdentifier( + "italic", + /(? { + return { + content: s.match(new RegExp(rx, "i"))?.at(1) || + "Unable to parse italic", + raw: s, + metadata: {}, + uuid: crypto.randomUUID(), + rendersContentOnly, + }; + }, + (token) => { + return {token.content}; + }, + ); // popover - registerIdentifier("popover", /\^\[(.*?)\]\<<(.*?)\>>/g, (s, rx) => { - const [_, title, content] = s.match(new RegExp(rx, ""))!; + registerIdentifier( + "popover", + /\^\[(.*?)\]\<<(.*?)\>>/g, + (s, rx) => { + const [_, title, content] = s.match(new RegExp(rx, ""))!; - return { - content, - raw: s, - metadata: { title }, - uuid: crypto.randomUUID(), - rendersContentOnly, - }; - }, (token) => { - const { children, metadata, uuid } = token; - return ( - ( - {c.render(c)} - )) || - token.content} - preferredAlign="centered" - preferredEdge="bottom" - className="cursor-pointer mx-2" - > - - {metadata.title} - - - ); - }); + return { + content, + raw: s, + metadata: { title }, + uuid: crypto.randomUUID(), + rendersContentOnly, + }; + }, + (token) => { + const { children, metadata, uuid } = token; + return ( + ( + {c.render(c)} + )) || token.content} + preferredAlign="centered" + preferredEdge="bottom" + className="cursor-pointer mx-2" + > + + {metadata.title} + + + ); + }, + ); registerIdentifier( "accordion", @@ -490,17 +468,13 @@ export const buildOnlyDefaultElements = () => { }; }, (token) => { - const { children, metadata, uuid } = token; + const { children, metadata } = token; return (
    - + - {children?.map((e, i) => ( - - {e.render(e)} - + {children?.map((e) => ( + {e.render(e)} ))} @@ -509,169 +483,193 @@ export const buildOnlyDefaultElements = () => { }, ); - registerIdentifier("p", /(?<=\n\n)([\s\S]*?)(?=\n\n)/g, (s) => { - return { - content: s.replace("\n", " "), - raw: s, - metadata: {}, - uuid: crypto.randomUUID(), - }; - }, (token) => { - const { children, uuid } = token; + registerIdentifier( + "p", + /(?<=\n\n)([\s\S]*?)(?=\n\n)/g, + (s) => { + return { + content: s.replace("\n", " "), + raw: s, + metadata: {}, + uuid: crypto.randomUUID(), + }; + }, + (token) => { + const { children } = token; - debugger; + debugger; - return ( -
    - {children?.map((e) => { - console.log(e); - return ( - - {e.render(e)} - - ); - })} -
    - ); - }); + return ( +
    + {children?.map((e) => { + console.log(e); + return {e.render(e)}; + })} +
    + ); + }, + ); - registerIdentifier("hr", /^-{3,}$/gm, (s, rx) => { - return { - content: s, - raw: s, - metadata: {}, - uuid: crypto.randomUUID(), - rendersContentOnly, - }; - }, (token) => { - return
    ; - }); + registerIdentifier( + "hr", + /^-{3,}$/gm, + (s) => { + return { + content: s, + raw: s, + metadata: {}, + uuid: crypto.randomUUID(), + rendersContentOnly, + }; + }, + () => { + return
    ; + }, + ); - registerIdentifier("comment", //g, (s, rx) => { - return { - content: "", - metadata: { comment: s }, - raw: "", - uuid: crypto.randomUUID(), - rendersContentOnly, - }; - }, (token) => { - return <>; - }); + registerIdentifier( + "comment", + //g, + (s) => { + return { + content: "", + metadata: { comment: s }, + raw: "", + uuid: crypto.randomUUID(), + rendersContentOnly, + }; + }, + () => { + return <>; + }, + ); - registerIdentifier("frontmatter", /^---([\s\S]*?)---/g, (s, rx) => { - return { - content: "", - metadata: { - frontmatterString: s.match(rx)?.at(0) || "", - }, - raw: "", - uuid: "frontmatter", - }; - }, (token) => { - return <>{token.raw}; - }); + registerIdentifier( + "frontmatter", + /^---([\s\S]*?)---/g, + (s, rx) => { + return { + content: "", + metadata: { + frontmatterString: s.match(rx)?.at(0) || "", + }, + raw: "", + uuid: "frontmatter", + }; + }, + (token) => { + return <>{token.raw}; + }, + ); - registerIdentifier("table", /^\|\s[\s\S]*?\|(?=(\n\n)|$)/g, (s, rx) => { - const rowSections = s.split(/^\|[|-\s]+\|$/gm).map((s) => - s.split("\n").filter((r) => !!r).map((r) => - r.split("|").map((c) => c.trim()).filter((c) => !!c) - ) - ); + registerIdentifier( + "table", + /^\|\s[\s\S]*?\|(?=(\n\n)|$)/g, + (s) => { + const rowSections = s.split(/^\|[|-\s]+\|$/gm).map((s) => + s + .split("\n") + .filter((r) => !!r) + .map((r) => + r + .split("|") + .map((c) => c.trim()) + .filter((c) => !!c) + ) + ); - let headerRows: string[][] = [], - bodyRows: string[][] = [], - footerRows: string[][] = []; + let headerRows: string[][] = [], + bodyRows: string[][] = [], + footerRows: string[][] = []; - switch (rowSections.length) { - case 1: - bodyRows = rowSections[0]; - break; - case 2: - headerRows = rowSections[0]; - bodyRows = rowSections[1]; - break; - case 3: - headerRows = rowSections[0]; - bodyRows = rowSections[1]; - footerRows = rowSections[3]; - break; - } + switch (rowSections.length) { + case 1: + bodyRows = rowSections[0]; + break; + case 2: + headerRows = rowSections[0]; + bodyRows = rowSections[1]; + break; + case 3: + headerRows = rowSections[0]; + bodyRows = rowSections[1]; + footerRows = rowSections[3]; + break; + } - const maxColumns = Math.max( - ...[...headerRows, ...bodyRows, ...footerRows].map((r) => r.length), - ); + const maxColumns = Math.max( + ...[...headerRows, ...bodyRows, ...footerRows].map((r) => r.length), + ); - return { - content: s, - raw: s, - metadata: { - headerRows: headerRows, - bodyRows: bodyRows, - footerRows: footerRows, - columns: maxColumns, - }, - uuid: crypto.randomUUID(), - }; - }, (t) => { - const { headerRows, bodyRows, footerRows, columns } = t.metadata; + return { + content: s, + raw: s, + metadata: { + headerRows: headerRows, + bodyRows: bodyRows, + footerRows: footerRows, + columns: maxColumns, + }, + uuid: crypto.randomUUID(), + }; + }, + (t) => { + const { headerRows, bodyRows, footerRows, columns } = t.metadata; - return ( - - {!!headerRows && ( - - {headerRows.map((r, i) => ( - - {r.concat(Array(columns - r.length).fill("")).map((c) => { - const child = t.children?.find((child) => child.raw === c); - return ( - - ); - })} - - ))} - - )} - {!!bodyRows && ( - - {bodyRows.map((r, i) => ( - - {r.concat(Array(columns - r.length).fill("")).map((c) => { - const child = t.children?.find((child) => child.raw === c); - return ( - - ); - })} - - ))} - - )} - {!!footerRows && ( - - {footerRows.map((r, i) => ( - - {r.concat(Array(columns - r.length).fill("")).map((c) => { - const child = t.children?.find((child) => child.raw === c); - return ( - - ); - })} - - ))} - - )} -
    - {child?.render(child) || - c} -
    - {child?.render(child) || - c} -
    - {child?.render(child) || - c} -
    - ); - }); + return ( + + {!!headerRows && ( + + {headerRows.map((r, i) => ( + + {r.concat(Array(columns - r.length).fill("")).map((c) => { + const child = t.children?.find((child) => child.raw === c); + return ( + + ); + })} + + ))} + + )} + {!!bodyRows && ( + + {bodyRows.map((r, i) => ( + + {r.concat(Array(columns - r.length).fill("")).map((c) => { + const child = t.children?.find((child) => child.raw === c); + return ( + + ); + })} + + ))} + + )} + {!!footerRows && ( + + {footerRows.map((r, i) => ( + + {r.concat(Array(columns - r.length).fill("")).map((c) => { + const child = t.children?.find((child) => child.raw === c); + return ( + + ); + })} + + ))} + + )} +
    + {child?.render(child) || c} +
    + {child?.render(child) || c} +
    + {child?.render(child) || c} +
    + ); + }, + ); return TokenIdentifiers; }; @@ -694,14 +692,16 @@ function findMatchingClosedParenthesis( const openingMatch = openRegex.exec(str); const closingMatch = closedRegex.exec(str); - if ((openingMatch && !closingMatch)) { + if (openingMatch && !closingMatch) { throw Error("Things have gone horribly wrong"); } // if ((!openingMatch && closingMatch) || (!openingMatch && !closingMatch)) break; if ( - openingMatch && closingMatch && openingMatch.index < closingMatch.index + openingMatch && + closingMatch && + openingMatch.index < closingMatch.index ) { openings++; lastOpeningSuccessIndex = openingMatch.index + openingMatch[0].length; @@ -758,10 +758,11 @@ function search( // Finds a unique id for things like headings function generateId(t: string, usedIds: string[]) { - let id = t.toLowerCase().replace(/[^a-z\s]/ig, "").trim().replaceAll( - " ", - "-", - ); + let id = t + .toLowerCase() + .replace(/[^a-z\s]/gi, "") + .trim() + .replaceAll(" ", "-"); let idNum = 1; while (usedIds.includes(id)) { id = id.replace(/-[0-9]+$/g, ""); diff --git a/lib/tcmd/index.ts b/lib/tcmd/index.ts index 7d6f869..7611be6 100644 --- a/lib/tcmd/index.ts +++ b/lib/tcmd/index.ts @@ -118,7 +118,7 @@ function isAcceptableChild(parentType: string, childType: string): boolean { return acceptableChildren ? acceptableChildren.includes(childType) : true; } -// Occasionally, some P blocks start exactly at the same point as another block (a side effect of needing to exclude preceding linebreaks from the regex while also having the only clear delineation being those linebreaks) so we just remove those P blocks so that when searching for a parent, it doesn't need to figure out if the P block is valid or not. This doesn't cause issues during rendering since each block handles its own container element +// Occasionally, some P blocks start exactly at the same point as another block (a side effect of needing to exclude preceding line-breaks from the regex while also having the only clear delineation being those line-breaks) so we just remove those P blocks so that when searching for a parent, it doesn't need to figure out if the P block is valid or not. This doesn't cause issues during rendering since each block handles its own container element function filterOverlappingPBlocks(blocks: TokenMarker[]): TokenMarker[] { return blocks.filter((block) => { if (block.type !== "p") { diff --git a/package.json b/package.json index 439a382..406ce02 100644 --- a/package.json +++ b/package.json @@ -16,14 +16,15 @@ "react-dom": "^18" }, "devDependencies": { - "typescript": "^5", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", "autoprefixer": "^10.0.1", + "eslint": "^8", + "eslint-config-next": "14.1.0", "postcss": "^8", "tailwindcss": "^3.3.0", - "eslint": "^8", - "eslint-config-next": "14.1.0" + "typescript": "^5", + "typescript-eslint": "^7.2.0" } } diff --git a/types.d.ts b/types.d.ts index 4a7c9fe..3e73d59 100644 --- a/types.d.ts +++ b/types.d.ts @@ -26,3 +26,31 @@ type TokenMarker> = { }; type FrontMatter = Record; + +type SearchFunction = ( + s: string, + start: number, + end: number, +) => { + start: number; + end: number; + text: string; + lastIndex: number; +}; + +type TokenIdentifier = { + rx: RegExp; + parse: (s: string) => Token; + search?: SearchFunction; +}; + +type TokenIdentifierMap = Map>; + +type IdentifierRegistration = >( + type: string, + match: RegExp, + parseFunction: (s: string, rx: RegExp) => IdentifiedToken, + renderFunction: TokenRenderer, + openTagRx?: RegExp, + closeTagRx?: RegExp, +) => void;