@tooee/renderers 0.1.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/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @tooee/renderers
2
+
3
+ Content renderers (markdown, code, image, table) for Tooee.
4
+
5
+ Part of the [Tooee](https://github.com/gingerhendrix/tooee) monorepo. See the main repo for documentation.
@@ -0,0 +1,14 @@
1
+ interface CodeViewProps {
2
+ content: string;
3
+ language?: string;
4
+ showLineNumbers?: boolean;
5
+ cursor?: number;
6
+ selectionStart?: number;
7
+ selectionEnd?: number;
8
+ matchingLines?: Set<number>;
9
+ currentMatchLine?: number;
10
+ toggledLines?: Set<number>;
11
+ }
12
+ export declare function CodeView({ content, language, showLineNumbers, cursor, selectionStart, selectionEnd, matchingLines, currentMatchLine, toggledLines, }: CodeViewProps): import("react").ReactNode;
13
+ export {};
14
+ //# sourceMappingURL=CodeView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeView.d.ts","sourceRoot":"","sources":["../src/CodeView.tsx"],"names":[],"mappings":"AAIA,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC3B;AAED,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,QAAQ,EACR,eAAsB,EACtB,MAAM,EACN,cAAc,EACd,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,YAAY,GACb,EAAE,aAAa,6BA0Ff"}
@@ -0,0 +1,69 @@
1
+ import { jsx as _jsx } from "@opentui/react/jsx-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ import { useTheme } from "@tooee/themes";
4
+ export function CodeView({ content, language, showLineNumbers = true, cursor, selectionStart, selectionEnd, matchingLines, currentMatchLine, toggledLines, }) {
5
+ const { syntax, theme } = useTheme();
6
+ const lineNumRef = useRef(null);
7
+ useEffect(() => {
8
+ const ref = lineNumRef.current;
9
+ if (!ref)
10
+ return;
11
+ ref.clearAllLineColors();
12
+ ref.clearAllLineSigns();
13
+ // Search matches
14
+ if (matchingLines) {
15
+ for (const line of matchingLines) {
16
+ ref.setLineSign(line, {
17
+ after: "●",
18
+ afterColor: line === currentMatchLine ? theme.primary : theme.warning,
19
+ });
20
+ }
21
+ }
22
+ // Selection range
23
+ if (selectionStart != null && selectionEnd != null) {
24
+ for (let i = selectionStart; i <= selectionEnd; i++) {
25
+ ref.setLineColor(i, { content: theme.selection, gutter: theme.selection });
26
+ }
27
+ }
28
+ if (toggledLines) {
29
+ for (const line of toggledLines) {
30
+ const isSelected = selectionStart != null && selectionEnd != null && line >= selectionStart && line <= selectionEnd;
31
+ if (line === cursor || isSelected)
32
+ continue;
33
+ ref.setLineColor(line, {
34
+ content: theme.backgroundPanel,
35
+ gutter: theme.backgroundPanel,
36
+ });
37
+ }
38
+ }
39
+ // Cursor line (overwrites selection color on cursor line)
40
+ if (cursor != null) {
41
+ ref.setLineColor(cursor, { content: theme.cursorLine, gutter: theme.cursorLine });
42
+ ref.setLineSign(cursor, {
43
+ before: "▸",
44
+ beforeColor: theme.primary,
45
+ // Preserve search match sign if present
46
+ ...(matchingLines?.has(cursor)
47
+ ? {
48
+ after: "●",
49
+ afterColor: cursor === currentMatchLine ? theme.primary : theme.warning,
50
+ }
51
+ : {}),
52
+ });
53
+ }
54
+ }, [
55
+ content,
56
+ cursor,
57
+ selectionStart,
58
+ selectionEnd,
59
+ matchingLines,
60
+ currentMatchLine,
61
+ toggledLines,
62
+ theme,
63
+ ]);
64
+ const codeElement = _jsx("code", { content: content, filetype: language, syntaxStyle: syntax });
65
+ return (_jsx("box", { style: {
66
+ flexDirection: "column",
67
+ }, children: showLineNumbers ? (_jsx("line-number", { ref: lineNumRef, fg: theme.textMuted, bg: theme.backgroundElement, paddingRight: 1, showLineNumbers: true, children: codeElement }, theme.textMuted + theme.backgroundElement)) : (codeElement) }));
68
+ }
69
+ //# sourceMappingURL=CodeView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeView.js","sourceRoot":"","sources":["../src/CodeView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface CommandPaletteEntry {
2
+ id: string;
3
+ title: string;
4
+ hotkey?: string;
5
+ category?: string;
6
+ icon?: string;
7
+ }
8
+ interface CommandPaletteProps {
9
+ commands: CommandPaletteEntry[];
10
+ onSelect: (commandId: string) => void;
11
+ onClose: () => void;
12
+ }
13
+ export declare function CommandPalette({ commands, onSelect, onClose }: CommandPaletteProps): import("react").ReactNode;
14
+ export {};
15
+ //# sourceMappingURL=CommandPalette.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandPalette.d.ts","sourceRoot":"","sources":["../src/CommandPalette.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,mBAAmB,EAAE,CAAA;IAC/B,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AA2BD,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,mBAAmB,6BA6FlF"}
@@ -0,0 +1,73 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ import { useState, useMemo, useCallback } from "react";
3
+ import { useKeyboard } from "@opentui/react";
4
+ import { useTheme } from "@tooee/themes";
5
+ function fuzzyMatch(query, text) {
6
+ const lowerQuery = query.toLowerCase();
7
+ const lowerText = text.toLowerCase();
8
+ let qi = 0;
9
+ let score = 0;
10
+ let lastMatchIndex = -2;
11
+ for (let ti = 0; ti < lowerText.length && qi < lowerQuery.length; ti++) {
12
+ if (lowerText[ti] === lowerQuery[qi]) {
13
+ // Start of string bonus
14
+ if (ti === 0)
15
+ score += 3;
16
+ // Word boundary bonus (after space, hyphen, dot, slash)
17
+ else if (" -./".includes(lowerText[ti - 1]))
18
+ score += 2;
19
+ // Consecutive bonus
20
+ else if (ti === lastMatchIndex + 1)
21
+ score += 1;
22
+ lastMatchIndex = ti;
23
+ qi++;
24
+ }
25
+ }
26
+ return qi === lowerQuery.length ? score : null;
27
+ }
28
+ export function CommandPalette({ commands, onSelect, onClose }) {
29
+ const { theme } = useTheme();
30
+ const [filter, setFilter] = useState("");
31
+ const [activeIndex, setActiveIndex] = useState(0);
32
+ const filtered = useMemo(() => {
33
+ if (!filter)
34
+ return commands;
35
+ const results = [];
36
+ for (const entry of commands) {
37
+ const score = fuzzyMatch(filter, entry.title);
38
+ if (score !== null)
39
+ results.push({ entry, score });
40
+ }
41
+ results.sort((a, b) => b.score - a.score);
42
+ return results.map((r) => r.entry);
43
+ }, [commands, filter]);
44
+ const handleSelect = useCallback(() => {
45
+ const item = filtered[activeIndex];
46
+ if (item) {
47
+ onSelect(item.id);
48
+ }
49
+ }, [filtered, activeIndex, onSelect]);
50
+ useKeyboard((key) => {
51
+ if (key.name === "escape") {
52
+ key.preventDefault();
53
+ onClose();
54
+ }
55
+ else if (key.name === "return") {
56
+ key.preventDefault();
57
+ handleSelect();
58
+ }
59
+ else if (key.name === "up") {
60
+ key.preventDefault();
61
+ setActiveIndex((i) => Math.max(0, i - 1));
62
+ }
63
+ else if (key.name === "down") {
64
+ key.preventDefault();
65
+ setActiveIndex((i) => Math.min(filtered.length - 1, i + 1));
66
+ }
67
+ });
68
+ return (_jsxs("box", { position: "absolute", left: "20%", right: "20%", top: 2, maxHeight: "60%", flexDirection: "column", backgroundColor: theme.backgroundPanel, border: true, borderColor: theme.border, children: [_jsxs("box", { flexDirection: "row", paddingLeft: 1, paddingRight: 1, height: 1, children: [_jsx("text", { content: ":", fg: theme.accent }), _jsx("input", { focused: true, placeholder: "Filter commands...", onInput: (value) => {
69
+ setFilter(value);
70
+ setActiveIndex(0);
71
+ }, backgroundColor: "transparent", focusedBackgroundColor: "transparent", textColor: theme.text, placeholderColor: theme.textMuted, cursorColor: theme.accent, style: { flexGrow: 1 } }), _jsx("text", { content: ` ${filtered.length}`, fg: theme.textMuted })] }), _jsx("box", { height: 1, width: "100%", backgroundColor: theme.border }), _jsx("scrollbox", { focused: false, style: { flexGrow: 1 }, children: filtered.map((entry, i) => (_jsxs("box", { flexDirection: "row", paddingLeft: 1, paddingRight: 1, height: 1, backgroundColor: i === activeIndex ? theme.backgroundElement : undefined, children: [_jsx("text", { content: entry.title, fg: theme.text, style: { flexGrow: 1 } }), entry.hotkey && _jsx("text", { content: entry.hotkey, fg: theme.textMuted }), entry.category && _jsx("text", { content: ` ${entry.category}`, fg: theme.textMuted })] }, entry.id))) })] }));
72
+ }
73
+ //# sourceMappingURL=CommandPalette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandPalette.js","sourceRoot":"","sources":["../src/CommandPalette.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ interface ImageViewProps {
2
+ /** File path to the image */
3
+ src: string;
4
+ /** Maximum width in characters (defaults to terminal width) */
5
+ maxWidth?: number;
6
+ /** Maximum height in characters (defaults to terminal height) */
7
+ maxHeight?: number;
8
+ }
9
+ /**
10
+ * Renders an image in the terminal using half-block characters.
11
+ * Each character cell displays two vertical pixels using foreground (top) and background (bottom) colors.
12
+ */
13
+ export declare function ImageView({ src, maxWidth, maxHeight }: ImageViewProps): import("react").ReactNode;
14
+ export {};
15
+ //# sourceMappingURL=ImageView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageView.d.ts","sourceRoot":"","sources":["../src/ImageView.tsx"],"names":[],"mappings":"AAKA,UAAU,cAAc;IACtB,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAaD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,cAAc,6BAgGrE"}
@@ -0,0 +1,115 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { Jimp } from "jimp";
4
+ import { useTerminalDimensions } from "@opentui/react";
5
+ import { useTheme } from "@tooee/themes";
6
+ /**
7
+ * Renders an image in the terminal using half-block characters.
8
+ * Each character cell displays two vertical pixels using foreground (top) and background (bottom) colors.
9
+ */
10
+ export function ImageView({ src, maxWidth, maxHeight }) {
11
+ const { theme } = useTheme();
12
+ const { width: termWidth, height: termHeight } = useTerminalDimensions();
13
+ const [rows, setRows] = useState(null);
14
+ const [error, setError] = useState(null);
15
+ const [imageInfo, setImageInfo] = useState(null);
16
+ const effectiveMaxWidth = maxWidth ?? termWidth - 2;
17
+ const effectiveMaxHeight = maxHeight ?? (termHeight - 4) * 2; // *2 because each char = 2 pixels
18
+ useEffect(() => {
19
+ let cancelled = false;
20
+ async function loadImage() {
21
+ try {
22
+ const image = await Jimp.read(src);
23
+ if (cancelled)
24
+ return;
25
+ const originalWidth = image.width;
26
+ const originalHeight = image.height;
27
+ // Calculate scale to fit within bounds while preserving aspect ratio
28
+ // Terminal characters are roughly 2:1 (height:width), so we need to account for this
29
+ const _charAspectRatio = 2; // Each character is roughly 2x as tall as it is wide
30
+ const adjustedMaxHeight = effectiveMaxHeight;
31
+ const scaleX = effectiveMaxWidth / originalWidth;
32
+ const scaleY = adjustedMaxHeight / originalHeight;
33
+ const scale = Math.min(scaleX, scaleY, 1); // Don't upscale
34
+ const newWidth = Math.floor(originalWidth * scale);
35
+ const newHeight = Math.floor(originalHeight * scale);
36
+ // Resize image
37
+ if (newWidth !== originalWidth || newHeight !== originalHeight) {
38
+ image.resize({ w: newWidth, h: newHeight });
39
+ }
40
+ // Convert to half-block characters
41
+ const pixelRows = convertToHalfBlocks(image);
42
+ if (!cancelled) {
43
+ setImageInfo({ width: newWidth, height: Math.ceil(newHeight / 2) });
44
+ setRows(pixelRows);
45
+ setError(null);
46
+ }
47
+ }
48
+ catch (err) {
49
+ if (!cancelled) {
50
+ setError(err instanceof Error ? err.message : "Failed to load image");
51
+ setRows(null);
52
+ }
53
+ }
54
+ }
55
+ loadImage();
56
+ return () => {
57
+ cancelled = true;
58
+ };
59
+ }, [src, effectiveMaxWidth, effectiveMaxHeight]);
60
+ if (error) {
61
+ return (_jsx("box", { style: { flexDirection: "column", padding: 1 }, children: _jsx("text", { content: `Error loading image: ${error}`, fg: theme.error }) }));
62
+ }
63
+ if (!rows) {
64
+ return (_jsx("box", { style: { padding: 1 }, children: _jsx("text", { content: "Loading image...", fg: theme.textMuted }) }));
65
+ }
66
+ return (_jsxs("box", { style: { flexDirection: "column" }, children: [rows.map((row) => (_jsx("text", { height: 1, children: row.cells.map((cell, i) => (_jsx("span", { fg: cell.fg, bg: cell.bg, children: cell.char }, i))) }, row.key))), imageInfo && (_jsx("text", { content: `${imageInfo.width}×${imageInfo.height * 2} pixels`, fg: theme.textMuted, style: { marginTop: 1 } }))] }));
67
+ }
68
+ /**
69
+ * Convert an image to half-block characters.
70
+ * Uses ▀ (upper half block) where top pixel is fg, bottom pixel is bg.
71
+ */
72
+ function convertToHalfBlocks(image) {
73
+ const width = image.width;
74
+ const height = image.height;
75
+ const rows = [];
76
+ // Process two rows at a time (top and bottom of each character cell)
77
+ for (let y = 0; y < height; y += 2) {
78
+ const cells = [];
79
+ for (let x = 0; x < width; x++) {
80
+ const topColor = getPixelColor(image, x, y);
81
+ const bottomColor = y + 1 < height ? getPixelColor(image, x, y + 1) : topColor;
82
+ cells.push({
83
+ char: "▀",
84
+ fg: topColor,
85
+ bg: bottomColor,
86
+ });
87
+ }
88
+ rows.push({ key: y, cells });
89
+ }
90
+ return rows;
91
+ }
92
+ function getPixelColor(image, x, y) {
93
+ const pixel = image.getPixelColor(x, y);
94
+ // Jimp returns RGBA as a single integer: 0xRRGGBBAA
95
+ const r = (pixel >> 24) & 0xff;
96
+ const g = (pixel >> 16) & 0xff;
97
+ const b = (pixel >> 8) & 0xff;
98
+ const a = pixel & 0xff;
99
+ // Handle transparency by blending with a dark background
100
+ if (a < 255) {
101
+ const alpha = a / 255;
102
+ const bgR = 0x1a;
103
+ const bgG = 0x1b;
104
+ const bgB = 0x26;
105
+ const blendedR = Math.round(r * alpha + bgR * (1 - alpha));
106
+ const blendedG = Math.round(g * alpha + bgG * (1 - alpha));
107
+ const blendedB = Math.round(b * alpha + bgB * (1 - alpha));
108
+ return rgbToHex(blendedR, blendedG, blendedB);
109
+ }
110
+ return rgbToHex(r, g, b);
111
+ }
112
+ function rgbToHex(r, g, b) {
113
+ return `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
114
+ }
115
+ //# sourceMappingURL=ImageView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageView.js","sourceRoot":"","sources":["../src/ImageView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ReactNode } from "react";
2
+ interface MarkdownViewProps {
3
+ content: string;
4
+ activeBlock?: number;
5
+ selectedBlocks?: {
6
+ start: number;
7
+ end: number;
8
+ };
9
+ matchingBlocks?: Set<number>;
10
+ currentMatchBlock?: number;
11
+ toggledBlocks?: Set<number>;
12
+ }
13
+ export declare function MarkdownView({ content, activeBlock, selectedBlocks, matchingBlocks, currentMatchBlock, toggledBlocks, }: MarkdownViewProps): ReactNode;
14
+ export {};
15
+ //# sourceMappingURL=MarkdownView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownView.d.ts","sourceRoot":"","sources":["../src/MarkdownView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtC,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/C,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC5B;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,aAAa,GACd,EAAE,iBAAiB,aAsCnB"}
@@ -0,0 +1,219 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "@opentui/react/jsx-runtime";
2
+ import { marked } from "marked";
3
+ import { useTheme } from "@tooee/themes";
4
+ import { Table } from "./Table.jsx";
5
+ export function MarkdownView({ content, activeBlock, selectedBlocks, matchingBlocks, currentMatchBlock, toggledBlocks, }) {
6
+ const { theme, syntax } = useTheme();
7
+ const tokens = marked.lexer(content);
8
+ const blocks = tokens.filter((t) => t.type !== "space");
9
+ return (_jsx("box", { style: { flexDirection: "column" }, children: blocks.map((token, index) => {
10
+ const { accent: accentColor, background: bgColor } = getBlockStyle(index, theme, activeBlock, selectedBlocks, matchingBlocks, currentMatchBlock, toggledBlocks);
11
+ const blockContent = (_jsx(TokenRenderer, { token: token, theme: theme, syntax: syntax }, index));
12
+ if (accentColor) {
13
+ return (_jsxs("box", { style: { flexDirection: "row" }, backgroundColor: bgColor ?? undefined, children: [_jsx("text", { content: "\u258E", fg: accentColor }), _jsx("box", { style: { flexGrow: 1, flexDirection: "column" }, children: blockContent })] }, index));
14
+ }
15
+ return _jsx("box", { children: blockContent }, index);
16
+ }) }));
17
+ }
18
+ function getBlockStyle(index, theme, activeBlock, selectedBlocks, matchingBlocks, currentMatchBlock, toggledBlocks) {
19
+ // Priority: cursor > toggled > current match > match > selection
20
+ if (activeBlock === index)
21
+ return { accent: theme.primary, background: theme.backgroundElement };
22
+ if (toggledBlocks?.has(index))
23
+ return { accent: theme.secondary, background: theme.backgroundPanel };
24
+ if (currentMatchBlock === index)
25
+ return { accent: theme.accent, background: null };
26
+ if (matchingBlocks?.has(index))
27
+ return { accent: theme.warning, background: null };
28
+ if (selectedBlocks && index >= selectedBlocks.start && index <= selectedBlocks.end) {
29
+ return { accent: theme.secondary, background: theme.backgroundPanel };
30
+ }
31
+ return { accent: null, background: null };
32
+ }
33
+ function TokenRenderer({ token, theme, syntax, }) {
34
+ switch (token.type) {
35
+ case "heading":
36
+ return _jsx(HeadingRenderer, { token: token, theme: theme });
37
+ case "paragraph":
38
+ return _jsx(ParagraphRenderer, { token: token, theme: theme });
39
+ case "code":
40
+ return _jsx(CodeBlockRenderer, { token: token, theme: theme, syntax: syntax });
41
+ case "blockquote":
42
+ return _jsx(BlockquoteRenderer, { token: token, theme: theme });
43
+ case "list":
44
+ return _jsx(ListRenderer, { token: token, theme: theme });
45
+ case "table":
46
+ return _jsx(MarkdownTableRenderer, { token: token });
47
+ case "hr":
48
+ return _jsx(HorizontalRule, { theme: theme });
49
+ case "space":
50
+ return null;
51
+ case "html":
52
+ return null;
53
+ default:
54
+ if ("text" in token && typeof token.text === "string") {
55
+ return (_jsx("text", { content: token.text, style: {
56
+ fg: theme.markdownText,
57
+ marginBottom: 1,
58
+ marginTop: 0,
59
+ marginLeft: 1,
60
+ marginRight: 1,
61
+ } }));
62
+ }
63
+ return null;
64
+ }
65
+ }
66
+ function HeadingRenderer({ token, theme }) {
67
+ const headingColors = {
68
+ 1: theme.markdownHeading,
69
+ 2: theme.secondary,
70
+ 3: theme.accent,
71
+ 4: theme.text,
72
+ 5: theme.textMuted,
73
+ 6: theme.textMuted,
74
+ };
75
+ const prefixes = {
76
+ 1: "# ",
77
+ 2: "## ",
78
+ 3: "### ",
79
+ 4: "#### ",
80
+ 5: "##### ",
81
+ 6: "###### ",
82
+ };
83
+ const headingText = getPlainText(token.tokens || []);
84
+ return (_jsx("box", { style: { marginTop: 1, marginBottom: 1 }, children: _jsxs("text", { style: { fg: headingColors[token.depth] || theme.text }, children: [_jsx("span", { fg: theme.textMuted, children: prefixes[token.depth] }), _jsx("strong", { children: headingText })] }) }));
85
+ }
86
+ function ParagraphRenderer({ token, theme }) {
87
+ return (_jsx("box", { style: { marginBottom: 1, marginLeft: 1, marginRight: 1 }, children: _jsx("text", { style: { fg: theme.markdownText }, children: _jsx(InlineTokens, { tokens: token.tokens || [], theme: theme }) }) }));
88
+ }
89
+ function CodeBlockRenderer({ token, theme, syntax, }) {
90
+ return (_jsx("box", { style: {
91
+ marginTop: 0,
92
+ marginBottom: 1,
93
+ marginLeft: 1,
94
+ marginRight: 1,
95
+ border: true,
96
+ borderColor: theme.border,
97
+ backgroundColor: theme.backgroundElement,
98
+ flexDirection: "column",
99
+ }, children: _jsx("code", { content: token.text, filetype: token.lang, syntaxStyle: syntax }) }));
100
+ }
101
+ function BlockquoteRenderer({ token, theme }) {
102
+ const quoteText = token.tokens
103
+ ? token.tokens
104
+ .map((t) => {
105
+ const innerTokens = "tokens" in t ? t.tokens : undefined;
106
+ const textContent = "text" in t ? t.text : "";
107
+ return getPlainText(innerTokens || []) || textContent || "";
108
+ })
109
+ .join("\n")
110
+ : "";
111
+ return (_jsxs("box", { style: { marginTop: 0, marginBottom: 1, marginLeft: 1, marginRight: 1, paddingLeft: 2 }, children: [_jsx("text", { style: { fg: theme.markdownBlockQuote }, content: "\u2502 " }), _jsx("text", { style: { fg: theme.textMuted }, content: quoteText })] }));
112
+ }
113
+ function ListRenderer({ token, theme }) {
114
+ return (_jsx("box", { style: { marginBottom: 1, marginLeft: 3, marginRight: 1, flexDirection: "column" }, children: token.items.map((item, index) => (_jsx(ListItemRenderer, { item: item, ordered: token.ordered, index: index + (token.start || 1), theme: theme }, index))) }));
115
+ }
116
+ function ListItemRenderer({ item, ordered, index, theme, }) {
117
+ const bullet = ordered ? `${index}. ` : "- ";
118
+ const itemContent = item.tokens || [];
119
+ return (_jsxs("box", { style: { flexDirection: "row" }, children: [_jsx("text", { style: { fg: theme.markdownListItem }, content: bullet }), _jsx("box", { style: { flexShrink: 1, flexDirection: "column" }, children: itemContent.map((token, idx) => {
120
+ if (token.type === "text" && "tokens" in token && token.tokens) {
121
+ return (_jsx("text", { style: { fg: theme.markdownText }, children: _jsx(InlineTokens, { tokens: token.tokens, theme: theme }) }, idx));
122
+ }
123
+ if (token.type === "paragraph" && token.tokens) {
124
+ return (_jsx("text", { style: { fg: theme.markdownText }, children: _jsx(InlineTokens, { tokens: token.tokens, theme: theme }) }, idx));
125
+ }
126
+ if ("text" in token && typeof token.text === "string") {
127
+ return _jsx("text", { style: { fg: theme.markdownText }, content: token.text }, idx);
128
+ }
129
+ return null;
130
+ }) })] }));
131
+ }
132
+ function MarkdownTableRenderer({ token }) {
133
+ const seen = new Map();
134
+ const columns = token.header.map((cell, index) => {
135
+ const header = getPlainText(cell.tokens);
136
+ const trimmed = header.trim();
137
+ const base = trimmed || `column_${index + 1}`;
138
+ const count = seen.get(base) ?? 0;
139
+ seen.set(base, count + 1);
140
+ const key = count === 0 ? base : `${base}_${count + 1}`;
141
+ return {
142
+ key,
143
+ header: trimmed || undefined,
144
+ };
145
+ });
146
+ const rows = token.rows.map((row) => {
147
+ const record = {};
148
+ row.forEach((cell, index) => {
149
+ const column = columns[index];
150
+ if (column) {
151
+ record[column.key] = getPlainText(cell.tokens);
152
+ }
153
+ });
154
+ return record;
155
+ });
156
+ return _jsx(Table, { columns: columns, rows: rows });
157
+ }
158
+ function HorizontalRule({ theme }) {
159
+ return (_jsx("box", { style: { marginTop: 0, marginBottom: 1, marginLeft: 1, marginRight: 1 }, children: _jsx("text", { style: { fg: theme.markdownHorizontalRule }, content: "─".repeat(40) }) }));
160
+ }
161
+ function getPlainText(tokens) {
162
+ return tokens
163
+ .map((token) => {
164
+ if (token.type === "text")
165
+ return token.text;
166
+ if (token.type === "codespan")
167
+ return token.text;
168
+ if ("tokens" in token && token.tokens)
169
+ return getPlainText(token.tokens);
170
+ if ("text" in token)
171
+ return token.text;
172
+ return "";
173
+ })
174
+ .join("");
175
+ }
176
+ function InlineTokens({ tokens, theme }) {
177
+ const result = [];
178
+ for (let i = 0; i < tokens.length; i++) {
179
+ const token = tokens[i];
180
+ if (!token)
181
+ continue;
182
+ const key = i;
183
+ switch (token.type) {
184
+ case "text":
185
+ result.push(token.text);
186
+ break;
187
+ case "strong":
188
+ result.push(_jsx("strong", { children: getPlainText(token.tokens || []) }, key));
189
+ break;
190
+ case "em":
191
+ result.push(_jsx("em", { children: getPlainText(token.tokens || []) }, key));
192
+ break;
193
+ case "codespan":
194
+ result.push(_jsx("span", { fg: theme.markdownCode, bg: theme.backgroundPanel, children: ` ${token.text} ` }, key));
195
+ break;
196
+ case "link": {
197
+ const linkToken = token;
198
+ result.push(_jsx("u", { children: _jsx("a", { href: linkToken.href, fg: theme.markdownLink, children: getPlainText(linkToken.tokens || []) }) }, key));
199
+ break;
200
+ }
201
+ case "br":
202
+ result.push("\n");
203
+ break;
204
+ case "escape":
205
+ result.push(token.text);
206
+ break;
207
+ case "space":
208
+ result.push(" ");
209
+ break;
210
+ default:
211
+ if ("text" in token && typeof token.text === "string") {
212
+ result.push(token.text);
213
+ }
214
+ break;
215
+ }
216
+ }
217
+ return _jsx(_Fragment, { children: result });
218
+ }
219
+ //# sourceMappingURL=MarkdownView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownView.js","sourceRoot":"","sources":["../src/MarkdownView.tsx"],"names":[],"mappings":"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"}