From 54ddc72e0a5d3d5f86d600b92cb11e2e58754d62 Mon Sep 17 00:00:00 2001 From: wallpants <47203170+wallpants@users.noreply.github.com> Date: Thu, 29 Jan 2026 12:36:34 -0600 Subject: [PATCH 1/2] docs(claude): generate CLAUDE.md --- CLAUDE.md | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..3b6732b --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,72 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Pantsdown is a Markdown to HTML converter that renders markdown similar to GitHub's styling. It was built specifically for [github-preview.nvim](https://github.com/wallpants/github-preview.nvim). Based on [Marked](https://github.com/markedjs/marked). + +## Commands + +```bash +# Type checking +bun run typecheck + +# Linting +bun run lint + +# Both typecheck and lint +bun run check + +# Run tests (uses bun:test with happy-dom) +bun test + +# Run a single test file +bun test tests/parse.test.ts + +# Update test snapshots +bun test --update-snapshots + +# Format code +bun run format + +# Build docs +bun run docs:build +``` + +## Architecture + +The parsing pipeline follows a classic compiler pattern: + +1. **Lexer** (`src/lexer.ts`) - Tokenizes markdown source into an array of tokens + - Uses `Tokenizer` for the actual token creation + - Processes block-level tokens first, then inline tokens + - Tracks source maps for line number references + - Collects footnotes separately + +2. **Tokenizer** (`src/tokenizer.ts`) - Creates tokens from markdown patterns + - Uses regex rules from `src/rules/block.ts` and `src/rules/inline.ts` + +3. **Parser** (`src/parser.ts`) - Converts tokens to HTML by dispatching to the Renderer + - Recursively processes nested tokens + +4. **Renderer** (`src/renderer.ts`) - Produces HTML output for each token type + - Uses highlight.js for syntax highlighting + - Uses github-slugger for heading anchors + - Handles special cases like mermaid diagrams and alerts + +Entry point: `Pantsdown` class in `src/pantsdown.ts` coordinates the pipeline. + +## Key Types + +All token types are defined in `src/types.ts`. The `Token` union type covers all possible markdown elements (headings, code blocks, lists, tables, footnotes, alerts, etc.). + +## Output + +`pantsdown.parse(markdown)` returns `{ html, javascript }`: +- `html`: The rendered HTML string +- `javascript`: A script for interactive features (task list checkboxes, copy buttons) + +## Styling + +CSS is in `src/css/styles.css`. Requires a parent element with classes `pantsdown light` or `pantsdown dark` (optionally with `high-contrast`). From e5a1bbb81cf704b0abe7100c246c50a7b59d4582 Mon Sep 17 00:00:00 2001 From: wallpants <47203170+wallpants@users.noreply.github.com> Date: Thu, 29 Jan 2026 13:10:54 -0600 Subject: [PATCH 2/2] feat(latex): add latex support --- bun.lockb | Bin 263271 -> 291400 bytes package.json | 24 +++++----- src/css/styles.css | 38 ++++++++++++++- src/lexer.ts | 22 +++++++-- src/parser.ts | 8 ++++ src/renderer.ts | 37 ++++++++++++++ src/rules/block.ts | 4 +- src/rules/inline.ts | 6 ++- src/tokenizer.ts | 32 +++++++++++++ src/types.ts | 15 +++++- tests/__snapshots__/parse.test.ts.snap | 64 ++++++++++++++++++++++++- tests/test.md | 41 ++++++++++++++++ 12 files changed, 269 insertions(+), 22 deletions(-) diff --git a/bun.lockb b/bun.lockb index 312154f246a0e92bc9f302681906daacbb08b9b3..e59bd8ab588d5cca624274a2e1ba36487d11566e 100755 GIT binary patch delta 76509 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 diff --git a/package.json b/package.json index a3549c4..99cc625 100644 --- a/package.json +++ b/package.json @@ -51,21 +51,23 @@ }, "dependencies": { "github-slugger": "^2.0.0", - "highlight.js": "^11.11.1" + "highlight.js": "^11.11.1", + "katex": "^0.16.28" }, "devDependencies": { - "@commitlint/config-conventional": "^19.6.0", - "@commitlint/cz-commitlint": "^19.6.1", - "@happy-dom/global-registrator": "^16.3.0", - "@types/bun": "^1.1.14", - "@typescript-eslint/eslint-plugin": "^8.19.0", - "@typescript-eslint/parser": "^8.19.0", + "@commitlint/config-conventional": "^19.8.1", + "@commitlint/cz-commitlint": "^19.8.1", + "@happy-dom/global-registrator": "^16.8.1", + "@types/bun": "^1.3.7", + "@types/katex": "^0.16.8", + "@typescript-eslint/eslint-plugin": "^8.54.0", + "@typescript-eslint/parser": "^8.54.0", "commitizen": "^4.3.1", - "commitlint": "^19.6.1", + "commitlint": "^19.8.1", "eslint": "^8.57.1", - "prettier": "^3.4.2", - "prettier-plugin-organize-imports": "^4.1.0", - "semantic-release": "^24.2.1", + "prettier": "^3.8.1", + "prettier-plugin-organize-imports": "^4.3.0", + "semantic-release": "^24.2.9", "typescript": "5.7.2" } } diff --git a/src/css/styles.css b/src/css/styles.css index 2bc2086..fd36c28 100644 --- a/src/css/styles.css +++ b/src/css/styles.css @@ -113,8 +113,9 @@ margin: 0; color: var(--color-fg-default); background-color: var(--color-canvas-default); - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, - sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji"; font-size: 16px; line-height: 1.5; word-wrap: break-word; @@ -1323,3 +1324,36 @@ /* .pantsdown.dark .hljs-tag { */ /* /1* purposely ignored *1/ */ /* } */ + +/* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* * +* KaTeX / LaTeX * +* * +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * +*/ + +.pantsdown .katex-block { + display: block; + margin: 16px 0; + text-align: center; + overflow-x: auto; + overflow-y: hidden; +} + +.pantsdown .katex-inline { + display: inline; +} + +.pantsdown .katex-error { + color: var(--color-danger-fg); + background-color: var(--color-canvas-subtle); + padding: 0.2em 0.4em; + border-radius: 6px; +} + +.pantsdown .katex-error code { + color: inherit; + background-color: transparent; + padding: 0; +} diff --git a/src/lexer.ts b/src/lexer.ts index dce4c76..fdd1348 100644 --- a/src/lexer.ts +++ b/src/lexer.ts @@ -111,6 +111,13 @@ export class Lexer { continue; } + // latexBlock + if ((token = this.tokenizer.latexBlock(src))) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // fences if ((token = this.tokenizer.fences(src))) { src = src.substring(token.raw.length); @@ -169,8 +176,8 @@ export class Lexer { lastToken.text += "\n" + token.raw; const lastInline = this.inlineQueue[this.inlineQueue.length - 1]; if (lastInline) lastInline.src = lastToken.text; - } else if (!this.links[token.tag]) { - this.links[token.tag] = { + } else { + this.links[token.tag] ??= { href: token.href, title: token.title, }; @@ -215,7 +222,7 @@ export class Lexer { if ((token = this.tokenizer.text(src))) { src = src.substring(token.raw.length); lastToken = tokens[tokens.length - 1]; - if (lastToken && lastToken.type === "text") { + if (lastToken?.type === "text") { lastToken.raw += "\n" + token.raw; lastToken.text += "\n" + token.text; this.inlineQueue.pop(); @@ -291,6 +298,13 @@ export class Lexer { } keepPrevChar = false; + // latexInline (before escape to handle \(...\) syntax) + if ((token = this.tokenizer.latexInline(src))) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // escape if ((token = this.tokenizer.escape(src))) { src = src.substring(token.raw.length); @@ -391,7 +405,7 @@ export class Lexer { } keepPrevChar = true; lastToken = tokens[tokens.length - 1]; - if (lastToken && lastToken.type === "text") { + if (lastToken?.type === "text") { lastToken.raw += token.raw; lastToken.text += token.text; } else { diff --git a/src/parser.ts b/src/parser.ts index 0acdca9..5c40ca7 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -184,6 +184,10 @@ export class Parser { out += top ? this.renderer.paragraph(body, textToken.sourceMap) : body; continue; } + case "latexBlock": { + out += this.renderer.latexBlock(token.text, token.sourceMap); + continue; + } default: { const errMsg = 'Token with "' + token.type + '" type was not found.'; @@ -253,6 +257,10 @@ export class Parser { out += this.renderer.text(token.text); break; } + case "latexInline": { + out += this.renderer.latexInline(token.text); + break; + } default: { const errMsg = 'Token with "' + token.type + '" type was not found.'; throw new Error(errMsg); diff --git a/src/renderer.ts b/src/renderer.ts index 74c3c31..ad39b86 100644 --- a/src/renderer.ts +++ b/src/renderer.ts @@ -1,5 +1,6 @@ import GithubSlugger from "github-slugger"; import hljs from "highlight.js"; +import katex from "katex"; import { type Pantsdown } from "./pantsdown.ts"; import { inline } from "./rules/inline.ts"; import { type HTMLAttrs, type SourceMap, type Tokens } from "./types.ts"; @@ -212,4 +213,40 @@ export class Renderer { text(text: string): string { return text; } + + latexBlock(latex: string, sourceMap: SourceMap): string { + try { + const rendered = katex.renderToString(latex, { + displayMode: true, + throwOnError: false, + output: "html", + trust: false, + }); + return injectHtmlAttributes( + `

${rendered}
\n`, + [], + sourceMap, + ); + } catch { + return injectHtmlAttributes( + `
${escape(latex)}
\n`, + [], + sourceMap, + ); + } + } + + latexInline(latex: string): string { + try { + const rendered = katex.renderToString(latex, { + displayMode: false, + throwOnError: false, + output: "html", + trust: false, + }); + return `${rendered}`; + } catch { + return `${escape(latex)}`; + } + } } diff --git a/src/rules/block.ts b/src/rules/block.ts index 55bc33c..056d0c0 100644 --- a/src/rules/block.ts +++ b/src/rules/block.ts @@ -16,7 +16,8 @@ type BlockRuleNames = | "bullet" | "listItemStart" | "footnote" - | "paragraph"; + | "paragraph" + | "latexBlock"; export const label = /(?!\s*\])(?:\\.|[^\[\]\\])+/; @@ -136,4 +137,5 @@ export const block: Record = { paragraph: block_paragraph, footnote: /^\[\^([^\]\n]+)\]:(?:[ \t]+|[\n]*?|$)([^\n]*?(?:\n|$)(?:[\n]*?[ ]{4,}[^\n]*)*)/, text: /^[^\n]+/, + latexBlock: /^(?:\$\$([^$]*(?:\$(?!\$)[^$]*)*)\$\$|\\\[([\s\S]*?)\\\])/, }; diff --git a/src/rules/inline.ts b/src/rules/inline.ts index 06aa1ac..d4ddde1 100644 --- a/src/rules/inline.ts +++ b/src/rules/inline.ts @@ -19,7 +19,8 @@ type InlineRuleNames = | "punctuation" | "blockSkip" | "footnoteRef" - | "backpedal"; + | "backpedal" + | "latexInline"; // list of unicode punctuation marks, plus any missing characters from CommonMark spec const punctuation = "\\p{P}\\p{S}"; @@ -112,7 +113,7 @@ const inline_backpedal = const inline_del = /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/; const inline_text = - /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\, "emStrong"> & { blockSkip: inline_blockSkip, backpedal: inline_backpedal, footnoteRef: /^\[\^([^\]\n]+)\]/, + latexInline: /^(?:\$(?!\$)([^\s$](?:[^$\n]*[^\s$])?)\$(?!\$)|\\\((.+?)\\\))/, }; diff --git a/src/tokenizer.ts b/src/tokenizer.ts index e04475c..1944384 100644 --- a/src/tokenizer.ts +++ b/src/tokenizer.ts @@ -716,6 +716,7 @@ export class Tokenizer { if (!nextChar || !prevChar || inline.punctuation.exec(prevChar)) { // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below) + // eslint-disable-next-line @typescript-eslint/no-misused-spread const lLength = [...match[0]].length - 1; let rDelim, rLength, @@ -736,6 +737,7 @@ export class Tokenizer { if (!rDelim) continue; // skip single * in __abc*abc__ + // eslint-disable-next-line @typescript-eslint/no-misused-spread rLength = [...rDelim].length; if (match[3] || match[4]) { @@ -757,6 +759,7 @@ export class Tokenizer { // Remove extra characters. *a*** -> *a* rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); // char length can be >1 for unicode characters; + // eslint-disable-next-line @typescript-eslint/no-misused-spread const lastCharLength = [...match[0]][0]!.length; const raw = src.slice(0, lLength + match.index + lastCharLength + rLength); @@ -920,4 +923,33 @@ export class Tokenizer { text, }; } + + latexBlock(src: string): Tokens["LatexBlock"] | undefined { + const cap = block.latexBlock.exec(src); + if (!cap) return undefined; + + // cap[1] is from $$...$$ syntax, cap[2] is from \[...\] syntax + const text = cap[1] ?? cap[2] ?? ""; + + return { + type: "latexBlock", + raw: cap[0], + text: text.trim(), + sourceMap: this.lexer.getSourceMap(cap[0]), + }; + } + + latexInline(src: string): Tokens["LatexInline"] | undefined { + const cap = inline.latexInline.exec(src); + if (!cap) return undefined; + + // cap[1] is from $...$ syntax, cap[2] is from \(...\) syntax + const text = cap[1] ?? cap[2] ?? ""; + + return { + type: "latexInline", + raw: cap[0], + text, + }; + } } diff --git a/src/types.ts b/src/types.ts index e558c9e..7931664 100644 --- a/src/types.ts +++ b/src/types.ts @@ -186,6 +186,17 @@ export interface Tokens extends Record { raw: string; items: Tokens["Footnote"][]; }; + LatexBlock: { + type: "latexBlock"; + raw: string; + text: string; + sourceMap: SourceMap; + }; + LatexInline: { + type: "latexInline"; + raw: string; + text: string; + }; } export type Token = @@ -214,7 +225,9 @@ export type Token = | Tokens["Alert"] | Tokens["Footnote"] | Tokens["FootnoteRef"] - | Tokens["Footnotes"]; + | Tokens["Footnotes"] + | Tokens["LatexBlock"] + | Tokens["LatexInline"]; export type Links = Record; diff --git a/tests/__snapshots__/parse.test.ts.snap b/tests/__snapshots__/parse.test.ts.snap index eea0fea..ac3287f 100644 --- a/tests/__snapshots__/parse.test.ts.snap +++ b/tests/__snapshots__/parse.test.ts.snap @@ -1,4 +1,4 @@ -// Bun Snapshot v1, https://goo.gl/fbAQLP +// Bun Snapshot v1, https://bun.sh/docs/test/snapshots exports[`pantsdown.parse(test.md) 1`] = ` { @@ -589,6 +589,68 @@ Underscores

Underscores


+

LaTeX / Math

+

Inline LaTeX

+

Inline math using dollar signs: and .

+

Inline math using parentheses: and .

+

Mixed with text: The quadratic formula is which solves .

+

Block LaTeX

+

Block math using double dollar signs:

+
+

Block math using square brackets:

+
+

A more complex equation:

+
+

Code vs LaTeX

+

Code spans should not be affected: $not latex$ and \\(also not latex\\).

+

A regular dollar amount like $100 should not be parsed as LaTeX because there's no closing $.

+
  1. diff --git a/tests/test.md b/tests/test.md index e863186..63574fc 100644 --- a/tests/test.md +++ b/tests/test.md @@ -619,3 +619,44 @@ Asterisks Underscores --- + +# LaTeX / Math + +## Inline LaTeX + +Inline math using dollar signs: $E = mc^2$ and $a^2 + b^2 = c^2$. + +Inline math using parentheses: \(F = ma\) and \(\sum\_{i=1}^n i = \frac{n(n+1)}{2}\). + +Mixed with text: The quadratic formula is $x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$ which solves $ax^2 + bx + c = 0$. + +## Block LaTeX + +Block math using double dollar signs: + +$$ +\int_0^\infty e^{-x^2} dx = \frac{\sqrt{\pi}}{2} +$$ + +Block math using square brackets: + +\[ +\nabla \times \vec{E} = -\frac{\partial \vec{B}}{\partial t} +\] + +A more complex equation: + +$$ +\begin{aligned} +\nabla \cdot \vec{E} &= \frac{\rho}{\epsilon_0} \\ +\nabla \cdot \vec{B} &= 0 +\end{aligned} +$$ + +## Code vs LaTeX + +Code spans should not be affected: `$not latex$` and `\(also not latex\)`. + +A regular dollar amount like $100 should not be parsed as LaTeX because there's no closing $. + +---