@dr-ishaan/rehype-perfect-code-blocks 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,74 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.3.0] — 2026-06-20
9
+
10
+ ### Summary
11
+
12
+ Minor release implementing P2 items: Mermaid diagram rendering, CSV/TSV table rendering, ASCII art preservation, Retro CRT preset, accessibility improvements (line numbers + diff aria-labels), and exported CLASSES constant. No breaking changes.
13
+
14
+ ### Features
15
+
16
+ #### Mermaid diagram rendering (`mermaid: true`)
17
+
18
+ Render ```` ```mermaid ```` blocks as SVG diagrams via mermaid.js (build-time, optional peer dep):
19
+
20
+ ```js
21
+ perfectCode({ mermaid: true })
22
+ ```
23
+
24
+ #### CSV/TSV table rendering (`csvTables: true`)
25
+
26
+ Render ```` ```csv ```` / ```` ```tsv ```` blocks as styled HTML tables:
27
+
28
+ ```js
29
+ perfectCode({ csvTables: true })
30
+ ```
31
+
32
+ First row becomes `<thead>`, remaining rows in `<tbody>` with alternating row colors.
33
+
34
+ #### ASCII art preservation
35
+
36
+ Disables ligatures (`font-variant-ligatures: none`, `font-feature-settings: "liga" 0`) for `text`, `plaintext`, `txt`, `ascii`, `plain` languages so ASCII art alignment is maintained. Configurable via `asciiArtLangs` option.
37
+
38
+ #### Retro CRT preset (`preset: 'retro'`)
39
+
40
+ Green-on-black monospace with CRT scanline effect — for historical computing content:
41
+
42
+ ```js
43
+ perfectCode({ preset: 'retro' })
44
+ ```
45
+
46
+ Features: `#00ff41` text glow, repeating scanline gradient overlay, `Courier New` font, zero border radius, green traffic-light dots.
47
+
48
+ #### Accessibility improvements
49
+
50
+ - **Line numbers**: `aria-label="Line N"` on each `.pcb__ln` span (screen readers announce line numbers)
51
+ - **Diff lines**: `aria-label="Added line"` / `aria-label="Removed line"` on diff line spans (WCAG 1.3.1)
52
+
53
+ #### Exported CLASSES constant
54
+
55
+ ```ts
56
+ import { CLASSES } from '@dr-ishaan/rehype-perfect-code-blocks';
57
+ // CLASSES.COPY_BUTTON = 'pcb__copy'
58
+ // CLASSES.LINE_HIGHLIGHT = 'pcb__line--hl'
59
+ // CLASSES.PRESET_RETRO = 'pcb--retro'
60
+ // ... 40+ class name constants
61
+ ```
62
+
63
+ ### New exports
64
+
65
+ - `CLASSES` — object with 40+ CSS class name constants
66
+ - `isMermaidLanguage(lang)`, `isCsvLanguage(lang)` — language detection
67
+ - `parseCsv(text, delimiter)`, `buildCsvTable(text, delimiter)` — CSV parsing
68
+ - `renderMermaid(source)` — Mermaid SVG rendering
69
+
70
+ ### Verification
71
+
72
+ - All 1254 pre-existing tests pass (no regressions).
73
+ - New `test-v2-p2.mjs` adds 36 regression tests.
74
+ - Total: 1290/1290 tests passing.
75
+
8
76
  ## [2.2.0] — 2026-06-20
9
77
 
10
78
  ### Summary
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Exported CSS class name constants (v2.3.0).
3
+ *
4
+ * Use these in your code for programmatic class targeting:
5
+ *
6
+ * ```ts
7
+ * import { CLASSES } from '@dr-ishaan/rehype-perfect-code-blocks';
8
+ *
9
+ * document.querySelector(`.${CLASSES.COPY_BUTTON}`).addEventListener(...)
10
+ * ```
11
+ */
12
+ export declare const CLASSES: {
13
+ readonly CONTAINER: "pcb";
14
+ readonly HEADER_BAR: "pcb__bar";
15
+ readonly TITLE: "pcb__title";
16
+ readonly DOTS: "pcb__dots";
17
+ readonly LANGUAGE_BADGE: "pcb__lang";
18
+ readonly COPY_BUTTON: "pcb__copy";
19
+ readonly COPY_LABEL: "pcb__copy-label";
20
+ readonly COPY_DONE: "pcb__copy--done";
21
+ readonly BODY: "pcb__body";
22
+ readonly LINE: "pcb__line";
23
+ readonly LINE_NUMBER: "pcb__ln";
24
+ readonly CODE: "pcb__code";
25
+ readonly LINE_HIGHLIGHT: "pcb__line--hl";
26
+ readonly LINE_ADD: "pcb__line--add";
27
+ readonly LINE_DEL: "pcb__line--del";
28
+ readonly LINE_FOCUS: "pcb__line--focus";
29
+ readonly LINE_ERROR: "pcb__line--error";
30
+ readonly LINE_WARNING: "pcb__line--warning";
31
+ readonly LINE_INFO: "pcb__line--info";
32
+ readonly WORD: "pcb__word";
33
+ readonly WORD_DIFF: "pcb__word-diff";
34
+ readonly WORD_DIFF_ADD: "pcb__word-diff--add";
35
+ readonly WORD_DIFF_DEL: "pcb__word-diff--del";
36
+ readonly CAPTION: "pcb__caption";
37
+ readonly ATTRIBUTION: "pcb__attribution";
38
+ readonly ANNOTATION: "pcb__ann";
39
+ readonly PRESET_TERMINAL: "pcb--terminal";
40
+ readonly PRESET_MINIMAL: "pcb--minimal";
41
+ readonly PRESET_RETRO: "pcb--retro";
42
+ readonly WRAP: "pcb--wrap";
43
+ readonly COLLAPSE: "pcb--collapse";
44
+ readonly COPY_ON_HOVER: "pcb--copy-on-hover";
45
+ readonly SPLIT_DIFF: "pcb--split-diff";
46
+ readonly ANNOTATIONS: "pcb--annotations";
47
+ readonly TABLE: "pcb__table";
48
+ readonly TABLE_HEADER: "pcb__th";
49
+ readonly TABLE_ROW: "pcb__tr";
50
+ readonly TABLE_CELL: "pcb__td";
51
+ readonly MATH: "pcb__math";
52
+ readonly MATH_KATEX: "pcb__math--katex";
53
+ readonly MATH_FALLBACK: "pcb__math--fallback";
54
+ readonly SR_LIVE: "pcb__sr-live";
55
+ readonly SR_ONLY: "pcb__sr-only";
56
+ };
57
+ export type ClassName = keyof typeof CLASSES;
58
+ //# sourceMappingURL=classes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classes.d.ts","sourceRoot":"","sources":["../src/classes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDV,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,OAAO,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Exported CSS class name constants (v2.3.0).
3
+ *
4
+ * Use these in your code for programmatic class targeting:
5
+ *
6
+ * ```ts
7
+ * import { CLASSES } from '@dr-ishaan/rehype-perfect-code-blocks';
8
+ *
9
+ * document.querySelector(`.${CLASSES.COPY_BUTTON}`).addEventListener(...)
10
+ * ```
11
+ */
12
+ export const CLASSES = {
13
+ CONTAINER: 'pcb',
14
+ HEADER_BAR: 'pcb__bar',
15
+ TITLE: 'pcb__title',
16
+ DOTS: 'pcb__dots',
17
+ LANGUAGE_BADGE: 'pcb__lang',
18
+ COPY_BUTTON: 'pcb__copy',
19
+ COPY_LABEL: 'pcb__copy-label',
20
+ COPY_DONE: 'pcb__copy--done',
21
+ BODY: 'pcb__body',
22
+ LINE: 'pcb__line',
23
+ LINE_NUMBER: 'pcb__ln',
24
+ CODE: 'pcb__code',
25
+ LINE_HIGHLIGHT: 'pcb__line--hl',
26
+ LINE_ADD: 'pcb__line--add',
27
+ LINE_DEL: 'pcb__line--del',
28
+ LINE_FOCUS: 'pcb__line--focus',
29
+ LINE_ERROR: 'pcb__line--error',
30
+ LINE_WARNING: 'pcb__line--warning',
31
+ LINE_INFO: 'pcb__line--info',
32
+ WORD: 'pcb__word',
33
+ WORD_DIFF: 'pcb__word-diff',
34
+ WORD_DIFF_ADD: 'pcb__word-diff--add',
35
+ WORD_DIFF_DEL: 'pcb__word-diff--del',
36
+ CAPTION: 'pcb__caption',
37
+ ATTRIBUTION: 'pcb__attribution',
38
+ ANNOTATION: 'pcb__ann',
39
+ // Preset modifiers
40
+ PRESET_TERMINAL: 'pcb--terminal',
41
+ PRESET_MINIMAL: 'pcb--minimal',
42
+ PRESET_RETRO: 'pcb--retro',
43
+ // Feature modifiers
44
+ WRAP: 'pcb--wrap',
45
+ COLLAPSE: 'pcb--collapse',
46
+ COPY_ON_HOVER: 'pcb--copy-on-hover',
47
+ SPLIT_DIFF: 'pcb--split-diff',
48
+ ANNOTATIONS: 'pcb--annotations',
49
+ // Table classes
50
+ TABLE: 'pcb__table',
51
+ TABLE_HEADER: 'pcb__th',
52
+ TABLE_ROW: 'pcb__tr',
53
+ TABLE_CELL: 'pcb__td',
54
+ // Math
55
+ MATH: 'pcb__math',
56
+ MATH_KATEX: 'pcb__math--katex',
57
+ MATH_FALLBACK: 'pcb__math--fallback',
58
+ // Screen reader
59
+ SR_LIVE: 'pcb__sr-live',
60
+ SR_ONLY: 'pcb__sr-only',
61
+ };
62
+ //# sourceMappingURL=classes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classes.js","sourceRoot":"","sources":["../src/classes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,SAAS,EAAE,KAAK;IAChB,UAAU,EAAE,UAAU;IACtB,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,WAAW;IACjB,cAAc,EAAE,WAAW;IAC3B,WAAW,EAAE,WAAW;IACxB,UAAU,EAAE,iBAAiB;IAC7B,SAAS,EAAE,iBAAiB;IAC5B,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,SAAS;IACtB,IAAI,EAAE,WAAW;IACjB,cAAc,EAAE,eAAe;IAC/B,QAAQ,EAAE,gBAAgB;IAC1B,QAAQ,EAAE,gBAAgB;IAC1B,UAAU,EAAE,kBAAkB;IAC9B,UAAU,EAAE,kBAAkB;IAC9B,YAAY,EAAE,oBAAoB;IAClC,SAAS,EAAE,iBAAiB;IAC5B,IAAI,EAAE,WAAW;IACjB,SAAS,EAAE,gBAAgB;IAC3B,aAAa,EAAE,qBAAqB;IACpC,aAAa,EAAE,qBAAqB;IACpC,OAAO,EAAE,cAAc;IACvB,WAAW,EAAE,kBAAkB;IAC/B,UAAU,EAAE,UAAU;IACtB,mBAAmB;IACnB,eAAe,EAAE,eAAe;IAChC,cAAc,EAAE,cAAc;IAC9B,YAAY,EAAE,YAAY;IAC1B,oBAAoB;IACpB,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,eAAe;IACzB,aAAa,EAAE,oBAAoB;IACnC,UAAU,EAAE,iBAAiB;IAC7B,WAAW,EAAE,kBAAkB;IAC/B,gBAAgB;IAChB,KAAK,EAAE,YAAY;IACnB,YAAY,EAAE,SAAS;IACvB,SAAS,EAAE,SAAS;IACpB,UAAU,EAAE,SAAS;IACrB,OAAO;IACP,IAAI,EAAE,WAAW;IACjB,UAAU,EAAE,kBAAkB;IAC9B,aAAa,EAAE,qBAAqB;IACpC,gBAAgB;IAChB,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE,cAAc;CACf,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Diagram & table rendering (v2.3.0).
3
+ *
4
+ * - Mermaid: render ```mermaid blocks as SVG diagrams
5
+ * - CSV/TSV: render ```csv / ```tsv blocks as HTML tables
6
+ *
7
+ * Both are build-time (server-side) — no client JS needed.
8
+ * `mermaid` is an optional peer dependency.
9
+ */
10
+ import type { Element } from 'hast';
11
+ /** Languages that trigger Mermaid rendering. */
12
+ export declare const MERMAID_LANGS: Set<string>;
13
+ /** Languages that trigger CSV/TSV table rendering. */
14
+ export declare const CSV_LANGS: Set<string>;
15
+ export declare const TSV_LANGS: Set<string>;
16
+ export declare function isMermaidLanguage(lang: string): boolean;
17
+ export declare function isCsvLanguage(lang: string): boolean;
18
+ /**
19
+ * Render a Mermaid diagram to SVG.
20
+ * Falls back to a `<pre>` with the source if mermaid is not installed.
21
+ */
22
+ export declare function renderMermaid(source: string): Promise<{
23
+ svg: string | null;
24
+ isError: boolean;
25
+ }>;
26
+ /**
27
+ * Parse CSV/TSV text into rows of cells.
28
+ */
29
+ export declare function parseCsv(text: string, delimiter?: ',' | '\t'): string[][];
30
+ /**
31
+ * Build a HAST element tree for a CSV/TSV table.
32
+ * First row is the header (in `<thead>`), remaining rows in `<tbody>`.
33
+ */
34
+ export declare function buildCsvTable(text: string, delimiter?: ',' | '\t'): Element;
35
+ /** ASCII art language defaults — disable ligatures for alignment. */
36
+ export declare const DEFAULT_ASCII_ART_LANGS: string[];
37
+ /**
38
+ * Check if a language should be treated as ASCII art (ligatures disabled).
39
+ */
40
+ export declare function isAsciiArtLang(lang: string, asciiArtLangs: string[]): boolean;
41
+ //# sourceMappingURL=diagrams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagrams.d.ts","sourceRoot":"","sources":["../src/diagrams.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAkB,MAAM,MAAM,CAAC;AAEpD,gDAAgD;AAChD,eAAO,MAAM,aAAa,aAA8B,CAAC;AAEzD,sDAAsD;AACtD,eAAO,MAAM,SAAS,aAAmB,CAAC;AAC1C,eAAO,MAAM,SAAS,aAAmB,CAAC;AAE1C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAcrG;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,GAAG,GAAG,IAAU,GAAG,MAAM,EAAE,EAAE,CAO9E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,GAAG,GAAG,IAAU,GAAG,OAAO,CAkDhF;AAED,qEAAqE;AACrE,eAAO,MAAM,uBAAuB,UAAiD,CAAC;AAEtF;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAG7E"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Diagram & table rendering (v2.3.0).
3
+ *
4
+ * - Mermaid: render ```mermaid blocks as SVG diagrams
5
+ * - CSV/TSV: render ```csv / ```tsv blocks as HTML tables
6
+ *
7
+ * Both are build-time (server-side) — no client JS needed.
8
+ * `mermaid` is an optional peer dependency.
9
+ */
10
+ /** Languages that trigger Mermaid rendering. */
11
+ export const MERMAID_LANGS = new Set(['mermaid', 'mmd']);
12
+ /** Languages that trigger CSV/TSV table rendering. */
13
+ export const CSV_LANGS = new Set(['csv']);
14
+ export const TSV_LANGS = new Set(['tsv']);
15
+ export function isMermaidLanguage(lang) {
16
+ return MERMAID_LANGS.has(lang.toLowerCase());
17
+ }
18
+ export function isCsvLanguage(lang) {
19
+ return CSV_LANGS.has(lang.toLowerCase()) || TSV_LANGS.has(lang.toLowerCase());
20
+ }
21
+ /**
22
+ * Render a Mermaid diagram to SVG.
23
+ * Falls back to a `<pre>` with the source if mermaid is not installed.
24
+ */
25
+ export async function renderMermaid(source) {
26
+ try {
27
+ const mermaid = await import('mermaid');
28
+ // mermaid v10+ uses mermaid.default.render()
29
+ const m = mermaid.default ?? mermaid;
30
+ if (typeof m.render === 'function') {
31
+ const id = 'pcb-mermaid-' + Math.random().toString(36).slice(2, 10);
32
+ const svg = await m.render(id, source.trim());
33
+ return { svg, isError: false };
34
+ }
35
+ }
36
+ catch {
37
+ // mermaid not installed or rendering failed
38
+ }
39
+ return { svg: null, isError: true };
40
+ }
41
+ /**
42
+ * Parse CSV/TSV text into rows of cells.
43
+ */
44
+ export function parseCsv(text, delimiter = ',') {
45
+ const rows = [];
46
+ for (const line of text.split('\n')) {
47
+ if (line.trim() === '')
48
+ continue;
49
+ rows.push(line.split(delimiter).map((cell) => cell.trim()));
50
+ }
51
+ return rows;
52
+ }
53
+ /**
54
+ * Build a HAST element tree for a CSV/TSV table.
55
+ * First row is the header (in `<thead>`), remaining rows in `<tbody>`.
56
+ */
57
+ export function buildCsvTable(text, delimiter = ',') {
58
+ const rows = parseCsv(text, delimiter);
59
+ const children = [];
60
+ if (rows.length > 0) {
61
+ // Header
62
+ const headerCells = rows[0].map((cell) => ({
63
+ type: 'element',
64
+ tagName: 'th',
65
+ properties: { className: ['pcb__th'] },
66
+ children: [{ type: 'text', value: cell }],
67
+ }));
68
+ children.push({
69
+ type: 'element',
70
+ tagName: 'thead',
71
+ properties: {},
72
+ children: [{
73
+ type: 'element',
74
+ tagName: 'tr',
75
+ properties: { className: ['pcb__tr'] },
76
+ children: headerCells,
77
+ }],
78
+ });
79
+ // Body
80
+ const bodyRows = rows.slice(1).map((row) => ({
81
+ type: 'element',
82
+ tagName: 'tr',
83
+ properties: { className: ['pcb__tr'] },
84
+ children: row.map((cell) => ({
85
+ type: 'element',
86
+ tagName: 'td',
87
+ properties: { className: ['pcb__td'] },
88
+ children: [{ type: 'text', value: cell }],
89
+ })),
90
+ }));
91
+ children.push({
92
+ type: 'element',
93
+ tagName: 'tbody',
94
+ properties: {},
95
+ children: bodyRows,
96
+ });
97
+ }
98
+ return {
99
+ type: 'element',
100
+ tagName: 'table',
101
+ properties: { className: ['pcb__table'] },
102
+ children,
103
+ };
104
+ }
105
+ /** ASCII art language defaults — disable ligatures for alignment. */
106
+ export const DEFAULT_ASCII_ART_LANGS = ['text', 'plaintext', 'txt', 'ascii', 'plain'];
107
+ /**
108
+ * Check if a language should be treated as ASCII art (ligatures disabled).
109
+ */
110
+ export function isAsciiArtLang(lang, asciiArtLangs) {
111
+ const set = new Set(asciiArtLangs.map((l) => l.toLowerCase()));
112
+ return set.has(lang.toLowerCase());
113
+ }
114
+ //# sourceMappingURL=diagrams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagrams.js","sourceRoot":"","sources":["../src/diagrams.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -27,6 +27,8 @@ import type { DesignTokens } from './tokens.js';
27
27
  import { resolveMathOptions, isMathLanguage, renderMath } from './math.js';
28
28
  import type { MathOptions, ResolvedMathOptions } from './math.js';
29
29
  import { runDevWarnings, warnUnknownLanguage } from './dev-warnings.js';
30
+ import { isMermaidLanguage, isCsvLanguage, buildCsvTable, parseCsv, renderMermaid } from './diagrams.js';
31
+ import { CLASSES } from './classes.js';
30
32
  import type { PerfectCodeOptions } from './types.js';
31
33
  export { remarkPreserveCodeMeta };
32
34
  export { disposeHighlighter, runHighlighterTask };
@@ -34,6 +36,8 @@ export { wordDiff, hasChanges };
34
36
  export { generateTokenStyles, applyScopeToCss, generateDarkModeSelector, generateLightModeSelector };
35
37
  export { resolveMathOptions, isMathLanguage, renderMath };
36
38
  export { runDevWarnings, warnUnknownLanguage };
39
+ export { isMermaidLanguage, isCsvLanguage, buildCsvTable, parseCsv, renderMermaid };
40
+ export { CLASSES };
37
41
  export type { DiffToken, DesignTokens, MathOptions, ResolvedMathOptions };
38
42
  export declare const rehypePerfectCodeBlocks: Plugin<[PerfectCodeOptions?], Root>;
39
43
  export default rehypePerfectCodeBlocks;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,EAAuB,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,CAAC;AACrG,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;AAE1E,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAmBrE,CAAC;AAEJ,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,EAAuB,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,CAAC;AACrG,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,CAAC;AACnB,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;AAE1E,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAmBrE,CAAC;AAEJ,eAAe,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -23,12 +23,16 @@ import { wordDiff, hasChanges } from './word-diff.js';
23
23
  import { generateTokenStyles, applyScopeToCss, generateDarkModeSelector, generateLightModeSelector } from './tokens.js';
24
24
  import { resolveMathOptions, isMathLanguage, renderMath } from './math.js';
25
25
  import { runDevWarnings, warnUnknownLanguage } from './dev-warnings.js';
26
+ import { isMermaidLanguage, isCsvLanguage, buildCsvTable, parseCsv, renderMermaid } from './diagrams.js';
27
+ import { CLASSES } from './classes.js';
26
28
  export { remarkPreserveCodeMeta };
27
29
  export { disposeHighlighter, runHighlighterTask };
28
30
  export { wordDiff, hasChanges };
29
31
  export { generateTokenStyles, applyScopeToCss, generateDarkModeSelector, generateLightModeSelector };
30
32
  export { resolveMathOptions, isMathLanguage, renderMath };
31
33
  export { runDevWarnings, warnUnknownLanguage };
34
+ export { isMermaidLanguage, isCsvLanguage, buildCsvTable, parseCsv, renderMermaid };
35
+ export { CLASSES };
32
36
  export const rehypePerfectCodeBlocks = (options = {}) => {
33
37
  const engine = options.engine ?? 'auto';
34
38
  const opts = options;
@@ -162,6 +166,10 @@ function resolveDefaults(opts) {
162
166
  diffMode: opts.diffMode ?? 'unified',
163
167
  annotations: opts.annotations ?? false,
164
168
  attribution: opts.attribution ?? false,
169
+ // v2.3.0: P2
170
+ mermaid: opts.mermaid ?? false,
171
+ csvTables: opts.csvTables ?? false,
172
+ asciiArtLangs: opts.asciiArtLangs ?? ['text', 'plaintext', 'txt', 'ascii', 'plain'],
165
173
  inline: opts.inline ?? false,
166
174
  };
167
175
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,EAAE,uBAAuB,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExH,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,CAAC;AACrG,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,CAAC;AAGnB,MAAM,CAAC,MAAM,uBAAuB,GAClC,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE;IACf,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC;IAErB,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE;QACpB,8EAA8E;QAC9E,2EAA2E;QAC3E,0EAA0E;QAC1E,0BAA0B;QAC1B,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5C,MAAM,mBAAmB,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC;QACD,2DAA2D;QAE3D,2CAA2C;QAC3C,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC;AACJ,CAAC,CAAC;AAEJ,eAAe,uBAAuB,CAAC;AAEvC;;;;GAIG;AACH,SAAS,eAAe,CAAC,IAAwB;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IACnC,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC;IACvC,IAAI,eAAe,GAAG,MAAM,CAAC;IAC7B,IAAI,mBAAmB,GAAG,SAAS,CAAC;IACpC,IAAI,kBAAkB,GAAqC,IAAI,CAAC;IAEhE,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAClE,kBAAkB,GAAG;YACnB,UAAU,EAAE,QAAQ;YACpB,gBAAgB,EAAE,IAAI;YACtB,QAAQ,EAAE,SAAS;YACnB,WAAW,EAAE,SAAS;YACtB,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,SAAS;YACpB,GAAG,cAAc;SAClB,CAAC;QACF,eAAe,GAAG,kBAAkB,CAAC,KAAK,IAAI,MAAM,CAAC;QACrD,mBAAmB,GAAG,kBAAkB,CAAC,SAAS,IAAI,SAAS,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,kBAAkB,GAAG,cAAc,IAAI,IAAI,CAAC;QAC5C,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC;QACjD,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,IAAI,SAAS,CAAC;IAC9D,CAAC;IAED,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;QACrC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;QACvC,UAAU,EAAE,kBAAkB;QAC9B,eAAe;QACf,mBAAmB;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,MAAM;QACvC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM;QACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,CAAC;QAC5C,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;QACjC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;QAChC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;QACzB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;QACrC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;QACxB,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI;QACzC,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI;QAC3C,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,QAAQ;QAC7C,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,KAAK;QAC5C,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,KAAK;QACxC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM;QAC7B,KAAK,EAAE;YACL,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE;YACrD,KAAK,EAAE,EAAE;YACT,YAAY,EAAE,EAAE;YAChB,gBAAgB,EAAE,OAAO;YACzB,GAAG,SAAS;SACb;QACD,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,KAAK;QAC5C,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,KAAK;QACxC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;QACnC,uBAAuB,EAAE,IAAI,CAAC,uBAAuB,IAAI,KAAK;QAC9D,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,KAAK;QAC5C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,KAAK;QAChD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,KAAK;QACtC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;QACnC,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,EAAE;QAC3C,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI;YACnC;gBACE,SAAS,EAAE,eAAe;gBAC1B,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,eAAe,EAAE;aAC1D;SACF;QACD,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,KAAK;QACpC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,IAAI,EAAE;QACzE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,IAAI,EAAE;QACzE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;QAC/B,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;QAC1H,uBAAuB,EAAE,IAAI,CAAC,uBAAuB,IAAI,KAAK;QAC9D,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,EAAE;QACzC,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,EAAE;QAC3C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE;QAC7C,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC;QAC5B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI;QACjD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;QAC/C,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;QACvC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI;QACjD,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,IAAI,IAAI;QACrD,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE;QACvC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACrD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;QAC3C,sBAAsB,EAAE,IAAI,CAAC,sBAAsB,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;QACjE,uBAAuB,EAAE,IAAI,CAAC,uBAAuB,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;QACnE,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;QAC7C,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;QACjD,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO;QAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;QAChC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;QACvC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,MAAM;QAC3B,mCAAmC;QACnC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,QAAQ;QAC3C,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;QAChC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAK,SAAwD;QAChF,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAK,SAA0D;QACtF,KAAK,EAAE,IAAI,CAAC,KAAK,IAAK,SAA+B;QACrD,sBAAsB;QACtB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAK,SAAsD;QAC1E,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;QACxE,kBAAkB;QAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,SAAS;QACpC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,KAAK;QACtC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,KAAK;QACtC,aAAa;QACb,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;QAC9B,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK;QAClC,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;QACnF,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;KAC7B,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"shiki.d.ts","sourceRoot":"","sources":["../src/shiki.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAG1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAyFrD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAQ1E;AA4CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAYzC;AAgPD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CA8Wf"}
1
+ {"version":3,"file":"shiki.d.ts","sourceRoot":"","sources":["../src/shiki.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAG1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA0FrD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAQ1E;AA4CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAYzC;AAgPD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CA+bf"}
package/dist/shiki.js CHANGED
@@ -16,6 +16,7 @@ import { fromHtml } from 'hast-util-from-html';
16
16
  import { visit } from 'unist-util-visit';
17
17
  import { computeThemeAwareDefaults } from './color-utils.js';
18
18
  import { isMathLanguage, renderMath, resolveMathOptions, MATH_LANGS } from './math.js';
19
+ import { isMermaidLanguage, renderMermaid, isCsvLanguage, buildCsvTable } from './diagrams.js';
19
20
  import { transformerNotationDiff, transformerNotationFocus, transformerNotationHighlight, transformerNotationErrorLevel, transformerNotationWordHighlight, transformerMetaHighlight, transformerMetaWordHighlight, transformerRenderWhitespace, transformerRenderIndentGuides, transformerRemoveNotationEscape, } from '@shikijs/transformers';
20
21
  // Lazily resolve a `require` function for synchronous Shiki bundle lookups.
21
22
  // In Node.js ESM we use `createRequire(import.meta.url)`. In edge runtimes
@@ -386,6 +387,85 @@ export async function runShikiOnRawBlocks(tree, opts) {
386
387
  // Only process non-math targets with Shiki
387
388
  targets.splice(0, targets.length, ...codeTargets);
388
389
  }
390
+ // v2.3.0: Handle Mermaid diagram blocks — render as SVG instead of Shiki.
391
+ if (opts.mermaid) {
392
+ const mermaidTargets = [];
393
+ const remainingTargets = [];
394
+ for (const pre of targets) {
395
+ const code = pre.children.find((c) => c.type === 'element' && c.tagName === 'code');
396
+ if (!code) {
397
+ remainingTargets.push(pre);
398
+ continue;
399
+ }
400
+ const cls = code.properties?.className ?? [];
401
+ const langClass = cls.find((c) => c.startsWith('language-'));
402
+ const lang = langClass ? langClass.replace('language-', '') : '';
403
+ if (isMermaidLanguage(lang)) {
404
+ mermaidTargets.push(pre);
405
+ }
406
+ else {
407
+ remainingTargets.push(pre);
408
+ }
409
+ }
410
+ for (const pre of mermaidTargets) {
411
+ const code = pre.children.find((c) => c.type === 'element' && c.tagName === 'code');
412
+ if (!code)
413
+ continue;
414
+ const text = extractText(code).replace(/\r\n?/g, '\n').trim();
415
+ const { svg, isError } = await renderMermaid(text);
416
+ const mermaidDiv = {
417
+ type: 'element',
418
+ tagName: 'div',
419
+ properties: { className: ['pcb__mermaid', isError ? 'pcb__mermaid--error' : 'pcb__mermaid--rendered'] },
420
+ children: svg
421
+ ? [{ type: 'text', value: svg }]
422
+ : [{ type: 'element', tagName: 'pre', properties: {}, children: [{ type: 'text', value: text }] }],
423
+ };
424
+ Object.assign(pre, mermaidDiv);
425
+ }
426
+ targets.splice(0, targets.length, ...remainingTargets);
427
+ }
428
+ // v2.3.0: Handle CSV/TSV table blocks — render as HTML table instead of Shiki.
429
+ if (opts.csvTables) {
430
+ const csvTargets = [];
431
+ const remainingTargets = [];
432
+ for (const pre of targets) {
433
+ const code = pre.children.find((c) => c.type === 'element' && c.tagName === 'code');
434
+ if (!code) {
435
+ remainingTargets.push(pre);
436
+ continue;
437
+ }
438
+ const cls = code.properties?.className ?? [];
439
+ const langClass = cls.find((c) => c.startsWith('language-'));
440
+ const lang = langClass ? langClass.replace('language-', '') : '';
441
+ if (isCsvLanguage(lang)) {
442
+ csvTargets.push(pre);
443
+ }
444
+ else {
445
+ remainingTargets.push(pre);
446
+ }
447
+ }
448
+ for (const pre of csvTargets) {
449
+ const code = pre.children.find((c) => c.type === 'element' && c.tagName === 'code');
450
+ if (!code)
451
+ continue;
452
+ const text = extractText(code).replace(/\r\n?/g, '\n').trim();
453
+ const cls = code.properties?.className ?? [];
454
+ const langClass = cls.find((c) => c.startsWith('language-'));
455
+ const lang = langClass ? langClass.replace('language-', '') : 'csv';
456
+ const delimiter = lang.toLowerCase() === 'tsv' ? '\t' : ',';
457
+ const tableEl = buildCsvTable(text, delimiter);
458
+ // Replace the <pre> with the table wrapped in a div
459
+ const tableDiv = {
460
+ type: 'element',
461
+ tagName: 'div',
462
+ properties: { className: ['pcb__csv-table'] },
463
+ children: [tableEl],
464
+ };
465
+ Object.assign(pre, tableDiv);
466
+ }
467
+ targets.splice(0, targets.length, ...remainingTargets);
468
+ }
389
469
  if (targets.length === 0)
390
470
  return;
391
471
  // Build theme keys — supports single (string), dual ({light,dark}), and