tformula 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 +255 -0
- package/README.zh-CN.md +221 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +121 -0
- package/dist/cli.js.map +1 -0
- package/dist/detect.d.ts +47 -0
- package/dist/detect.js +342 -0
- package/dist/detect.js.map +1 -0
- package/dist/formula-cache.d.ts +18 -0
- package/dist/formula-cache.js +238 -0
- package/dist/formula-cache.js.map +1 -0
- package/dist/geometry.d.ts +26 -0
- package/dist/geometry.js +47 -0
- package/dist/geometry.js.map +1 -0
- package/dist/kitty.d.ts +15 -0
- package/dist/kitty.js +61 -0
- package/dist/kitty.js.map +1 -0
- package/dist/math-renderer.d.ts +18 -0
- package/dist/math-renderer.js +204 -0
- package/dist/math-renderer.js.map +1 -0
- package/dist/output-checkpoints.d.ts +15 -0
- package/dist/output-checkpoints.js +36 -0
- package/dist/output-checkpoints.js.map +1 -0
- package/dist/probe.d.ts +30 -0
- package/dist/probe.js +97 -0
- package/dist/probe.js.map +1 -0
- package/dist/proxy.d.ts +2 -0
- package/dist/proxy.js +150 -0
- package/dist/proxy.js.map +1 -0
- package/dist/screen.d.ts +25 -0
- package/dist/screen.js +397 -0
- package/dist/screen.js.map +1 -0
- package/dist/types.d.ts +47 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +66 -0
package/dist/proxy.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import process from "node:process";
|
|
2
|
+
import { chmodSync } from "node:fs";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import * as pty from "node-pty";
|
|
6
|
+
import { FormulaScreen } from "./screen.js";
|
|
7
|
+
import { OutputCheckpointSplitter } from "./output-checkpoints.js";
|
|
8
|
+
import { parseTerminalResponses } from "./probe.js";
|
|
9
|
+
function ensureNodePtyHelper() {
|
|
10
|
+
if (process.platform !== "darwin")
|
|
11
|
+
return;
|
|
12
|
+
try {
|
|
13
|
+
const entry = createRequire(import.meta.url).resolve("node-pty");
|
|
14
|
+
const packageRoot = dirname(dirname(entry));
|
|
15
|
+
chmodSync(join(packageRoot, "prebuilds", `darwin-${process.arch}`, "spawn-helper"), 0o755);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// Standard npm installs already preserve this executable bit. The fallback
|
|
19
|
+
// is only needed for package managers that suppress dependency scripts.
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function runProxy(options, initialCapabilities, pendingInput = "") {
|
|
23
|
+
const cols = Math.max(2, process.stdout.columns ?? 80);
|
|
24
|
+
const rows = Math.max(2, process.stdout.rows ?? 24);
|
|
25
|
+
let capabilities = initialCapabilities;
|
|
26
|
+
let child;
|
|
27
|
+
let probeCapture = "";
|
|
28
|
+
let probeTimer;
|
|
29
|
+
let exiting = false;
|
|
30
|
+
let outputQueue = Promise.resolve();
|
|
31
|
+
const debug = (message) => {
|
|
32
|
+
if (options.debug)
|
|
33
|
+
process.stderr.write(`\r\n[tformula] ${message}\r\n`);
|
|
34
|
+
};
|
|
35
|
+
const writeOuter = (data) => {
|
|
36
|
+
process.stdout.write(data);
|
|
37
|
+
};
|
|
38
|
+
const screen = options.renderMath
|
|
39
|
+
? new FormulaScreen({ cols, rows, capabilities, scale: options.scale, writeOuter, debug })
|
|
40
|
+
: undefined;
|
|
41
|
+
const outputSplitter = new OutputCheckpointSplitter(Math.max(2, Math.floor(rows / 3)));
|
|
42
|
+
const finishProbe = () => {
|
|
43
|
+
probeTimer = undefined;
|
|
44
|
+
const captured = probeCapture;
|
|
45
|
+
probeCapture = "";
|
|
46
|
+
if (!captured)
|
|
47
|
+
return;
|
|
48
|
+
const parsed = parseTerminalResponses(captured);
|
|
49
|
+
const nextCell = options.cellOverride
|
|
50
|
+
? { ...options.cellOverride, source: "override" }
|
|
51
|
+
: parsed.cell
|
|
52
|
+
? { ...parsed.cell, source: "cell-query" }
|
|
53
|
+
: parsed.windowPixels
|
|
54
|
+
? {
|
|
55
|
+
width: parsed.windowPixels.width / Math.max(1, process.stdout.columns ?? cols),
|
|
56
|
+
height: parsed.windowPixels.height / Math.max(1, process.stdout.rows ?? rows),
|
|
57
|
+
source: "window-query"
|
|
58
|
+
}
|
|
59
|
+
: capabilities.cell;
|
|
60
|
+
capabilities = {
|
|
61
|
+
...capabilities,
|
|
62
|
+
cell: nextCell,
|
|
63
|
+
windowPixels: parsed.windowPixels ?? capabilities.windowPixels,
|
|
64
|
+
foreground: parsed.foreground ?? capabilities.foreground,
|
|
65
|
+
background: parsed.background ?? capabilities.background
|
|
66
|
+
};
|
|
67
|
+
screen?.updateCapabilities(capabilities);
|
|
68
|
+
if (parsed.residual)
|
|
69
|
+
child.write(parsed.residual);
|
|
70
|
+
debug(`cell ${nextCell.width.toFixed(2)}x${nextCell.height.toFixed(2)}px (${nextCell.source})`);
|
|
71
|
+
};
|
|
72
|
+
const requestProbe = () => {
|
|
73
|
+
if (!process.stdin.isTTY || options.cellOverride)
|
|
74
|
+
return;
|
|
75
|
+
if (probeTimer) {
|
|
76
|
+
clearTimeout(probeTimer);
|
|
77
|
+
finishProbe();
|
|
78
|
+
}
|
|
79
|
+
probeCapture = "";
|
|
80
|
+
writeOuter("\x1b[16t\x1b[14t\x1b]10;?\x1b\\\x1b]11;?\x1b\\");
|
|
81
|
+
probeTimer = setTimeout(finishProbe, 160);
|
|
82
|
+
};
|
|
83
|
+
ensureNodePtyHelper();
|
|
84
|
+
child = pty.spawn(options.command, options.args, {
|
|
85
|
+
name: process.env.TERM || "xterm-256color",
|
|
86
|
+
cols,
|
|
87
|
+
rows,
|
|
88
|
+
cwd: options.cwd,
|
|
89
|
+
env: { ...process.env, TFORMULA_ACTIVE: "1" }
|
|
90
|
+
});
|
|
91
|
+
const previousRaw = process.stdin.isRaw;
|
|
92
|
+
if (process.stdin.isTTY && typeof process.stdin.setRawMode === "function")
|
|
93
|
+
process.stdin.setRawMode(true);
|
|
94
|
+
process.stdin.resume();
|
|
95
|
+
process.stdin.on("data", (chunk) => {
|
|
96
|
+
const data = Buffer.isBuffer(chunk) ? chunk.toString("utf8") : chunk;
|
|
97
|
+
if (probeTimer)
|
|
98
|
+
probeCapture += data;
|
|
99
|
+
else
|
|
100
|
+
child.write(data);
|
|
101
|
+
});
|
|
102
|
+
child.onData((data) => {
|
|
103
|
+
if (!screen) {
|
|
104
|
+
writeOuter(data);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
for (const slice of outputSplitter.push(data)) {
|
|
108
|
+
outputQueue = outputQueue.then(async () => {
|
|
109
|
+
writeOuter(slice.data);
|
|
110
|
+
await screen.write(slice.data);
|
|
111
|
+
if (slice.checkpoint)
|
|
112
|
+
await screen.flushScan();
|
|
113
|
+
}).catch((error) => {
|
|
114
|
+
debug(`output checkpoint failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
const onResize = () => {
|
|
119
|
+
const nextCols = Math.max(2, process.stdout.columns ?? 80);
|
|
120
|
+
const nextRows = Math.max(2, process.stdout.rows ?? 24);
|
|
121
|
+
outputSplitter.setLineInterval(Math.max(2, Math.floor(nextRows / 3)));
|
|
122
|
+
child.resize(nextCols, nextRows);
|
|
123
|
+
screen?.resize(nextCols, nextRows);
|
|
124
|
+
requestProbe();
|
|
125
|
+
};
|
|
126
|
+
process.on("SIGWINCH", onResize);
|
|
127
|
+
if (pendingInput)
|
|
128
|
+
child.write(pendingInput);
|
|
129
|
+
debug(`started ${options.command}; math=${Boolean(screen && capabilities.kittyGraphics)}; cell=${capabilities.cell.width.toFixed(2)}x${capabilities.cell.height.toFixed(2)}px`);
|
|
130
|
+
return await new Promise((resolve) => {
|
|
131
|
+
child.onExit(({ exitCode, signal }) => {
|
|
132
|
+
if (exiting)
|
|
133
|
+
return;
|
|
134
|
+
exiting = true;
|
|
135
|
+
void outputQueue.finally(async () => {
|
|
136
|
+
await screen?.flushScan();
|
|
137
|
+
if (probeTimer)
|
|
138
|
+
clearTimeout(probeTimer);
|
|
139
|
+
process.off("SIGWINCH", onResize);
|
|
140
|
+
screen?.dispose();
|
|
141
|
+
process.stdin.pause();
|
|
142
|
+
if (process.stdin.isTTY && typeof process.stdin.setRawMode === "function" && !previousRaw) {
|
|
143
|
+
process.stdin.setRawMode(false);
|
|
144
|
+
}
|
|
145
|
+
resolve(signal ? 128 + signal : exitCode);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/screen.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Terminal as XtermTerminal } from "@xterm/headless";
|
|
2
|
+
import { MathRenderer } from "./math-renderer.js";
|
|
3
|
+
import type { TerminalCapabilities } from "./types.js";
|
|
4
|
+
export declare class FormulaScreen {
|
|
5
|
+
#private;
|
|
6
|
+
readonly terminal: XtermTerminal;
|
|
7
|
+
constructor(options: {
|
|
8
|
+
cols: number;
|
|
9
|
+
rows: number;
|
|
10
|
+
capabilities: TerminalCapabilities;
|
|
11
|
+
scale: number;
|
|
12
|
+
writeOuter: (data: string | Uint8Array) => void;
|
|
13
|
+
debug?: (message: string) => void;
|
|
14
|
+
renderer?: MathRenderer;
|
|
15
|
+
});
|
|
16
|
+
write(data: string): Promise<void>;
|
|
17
|
+
/** Complete a scan before more PTY rows are allowed to scroll the viewport. */
|
|
18
|
+
flushScan(): Promise<void>;
|
|
19
|
+
resize(cols: number, rows: number): void;
|
|
20
|
+
updateCapabilities(capabilities: TerminalCapabilities): void;
|
|
21
|
+
setScale(scale: number): void;
|
|
22
|
+
scheduleScan(delayMs?: number): void;
|
|
23
|
+
resetPlacements(): void;
|
|
24
|
+
dispose(): void;
|
|
25
|
+
}
|
package/dist/screen.js
ADDED
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { detectFormulaRegions } from "./detect.js";
|
|
4
|
+
import { MathRenderer } from "./math-renderer.js";
|
|
5
|
+
import { cursorPosition, kittyDeleteByZIndex, kittyDeleteImage, kittyDeletePlacement, kittyDeleteRange, kittyPlaceImage, kittyTransmitImage, synchronizedOutput, TFORMULA_IMAGE_ID_MAX, TFORMULA_IMAGE_ID_MIN } from "./kitty.js";
|
|
6
|
+
const { Terminal } = createRequire(import.meta.url)("@xterm/headless");
|
|
7
|
+
function rgbHex(value) {
|
|
8
|
+
return `#${value.toString(16).padStart(6, "0").slice(-6)}`;
|
|
9
|
+
}
|
|
10
|
+
export class FormulaScreen {
|
|
11
|
+
terminal;
|
|
12
|
+
#renderer;
|
|
13
|
+
#placed = new Map();
|
|
14
|
+
#terminalImages = new Map();
|
|
15
|
+
#writeOuter;
|
|
16
|
+
#debug;
|
|
17
|
+
#capabilities;
|
|
18
|
+
#scale;
|
|
19
|
+
#imageId = TFORMULA_IMAGE_ID_MIN;
|
|
20
|
+
#placementId = 1;
|
|
21
|
+
#scanTimer;
|
|
22
|
+
#scanVersion = 0;
|
|
23
|
+
#layoutVersion = 0;
|
|
24
|
+
#scanning = false;
|
|
25
|
+
#rescanRequested = false;
|
|
26
|
+
#scanWaiters = [];
|
|
27
|
+
#disposed = false;
|
|
28
|
+
#controlTail = "";
|
|
29
|
+
constructor(options) {
|
|
30
|
+
this.terminal = new Terminal({
|
|
31
|
+
cols: options.cols,
|
|
32
|
+
rows: options.rows,
|
|
33
|
+
scrollback: 10_000,
|
|
34
|
+
allowProposedApi: true
|
|
35
|
+
});
|
|
36
|
+
this.#capabilities = options.capabilities;
|
|
37
|
+
this.#scale = options.scale;
|
|
38
|
+
this.#renderer = options.renderer ?? new MathRenderer();
|
|
39
|
+
this.#writeOuter = options.writeOuter;
|
|
40
|
+
this.#debug = options.debug ?? (() => undefined);
|
|
41
|
+
this.terminal.buffer.onBufferChange(() => {
|
|
42
|
+
// The alternate buffer is cleared when entering or leaving it. The
|
|
43
|
+
// normal buffer and its scrollback are restored, not cleared, so their
|
|
44
|
+
// placements must remain tracked to avoid placing duplicates on return.
|
|
45
|
+
this.#invalidateBufferPlacements("alternate", false);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
write(data) {
|
|
49
|
+
const controls = this.#controlTail + data;
|
|
50
|
+
if (/\x1bc|\x1b\[(?:[0-9;]*)3J/u.test(controls)) {
|
|
51
|
+
// RIS and ED 3 clear scrollback as well as the live screen.
|
|
52
|
+
this.resetPlacements();
|
|
53
|
+
this.#debug("terminal reset invalidated all formula placements");
|
|
54
|
+
}
|
|
55
|
+
else if (/\x1b\[(?:[0-9;]*)2J/u.test(controls)) {
|
|
56
|
+
// Kitty images are cleared by ED 2/3 and RIS independently of xterm's
|
|
57
|
+
// text buffer. ED 2 only affects the live viewport; scrollback images
|
|
58
|
+
// continue to be owned and scrolled by the terminal.
|
|
59
|
+
this.#invalidateVisiblePlacements(false);
|
|
60
|
+
this.#debug("terminal clear invalidated visible formula placements");
|
|
61
|
+
}
|
|
62
|
+
this.#controlTail = this.#incompleteControlSuffix(controls);
|
|
63
|
+
return new Promise((resolve) => {
|
|
64
|
+
this.terminal.write(data, () => {
|
|
65
|
+
this.scheduleScan();
|
|
66
|
+
resolve();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/** Complete a scan before more PTY rows are allowed to scroll the viewport. */
|
|
71
|
+
async flushScan() {
|
|
72
|
+
while (!this.#disposed) {
|
|
73
|
+
if (this.#scanTimer)
|
|
74
|
+
clearTimeout(this.#scanTimer);
|
|
75
|
+
this.#scanTimer = undefined;
|
|
76
|
+
if (this.#scanning) {
|
|
77
|
+
await new Promise((resolve) => this.#scanWaiters.push(resolve));
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
await this.#scan();
|
|
81
|
+
}
|
|
82
|
+
if (!this.#scanning && !this.#scanTimer && !this.#rescanRequested)
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
resize(cols, rows) {
|
|
87
|
+
this.terminal.resize(Math.max(2, cols), Math.max(2, rows));
|
|
88
|
+
// Kitty placements are cell-based and resize with the terminal. Keep them
|
|
89
|
+
// until the next scan selectively replaces formulas still in the live
|
|
90
|
+
// viewport; off-screen scrollback cannot be reconstructed later.
|
|
91
|
+
this.#layoutVersion += 1;
|
|
92
|
+
// Font zoom can move a formula through the viewport in a fraction of the
|
|
93
|
+
// normal debounce interval. Scan promptly; transactional replacement
|
|
94
|
+
// prevents rapid resize events from destroying the previous placement.
|
|
95
|
+
this.scheduleScan(16);
|
|
96
|
+
}
|
|
97
|
+
updateCapabilities(capabilities) {
|
|
98
|
+
const dimensionsChanged = capabilities.cell.width !== this.#capabilities.cell.width
|
|
99
|
+
|| capabilities.cell.height !== this.#capabilities.cell.height;
|
|
100
|
+
const colorsChanged = capabilities.foreground !== this.#capabilities.foreground
|
|
101
|
+
|| capabilities.background !== this.#capabilities.background;
|
|
102
|
+
this.#capabilities = capabilities;
|
|
103
|
+
if (dimensionsChanged || colorsChanged) {
|
|
104
|
+
this.#layoutVersion += 1;
|
|
105
|
+
this.scheduleScan(16);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
setScale(scale) {
|
|
109
|
+
this.#scale = scale;
|
|
110
|
+
this.#layoutVersion += 1;
|
|
111
|
+
this.scheduleScan();
|
|
112
|
+
}
|
|
113
|
+
scheduleScan(delayMs = 110) {
|
|
114
|
+
if (this.#disposed)
|
|
115
|
+
return;
|
|
116
|
+
this.#scanVersion += 1;
|
|
117
|
+
// Coalesce bursts without postponing forever. Agent status bars and
|
|
118
|
+
// spinners can write more frequently than the scan delay.
|
|
119
|
+
if (this.#scanTimer)
|
|
120
|
+
return;
|
|
121
|
+
this.#scanTimer = setTimeout(() => {
|
|
122
|
+
this.#scanTimer = undefined;
|
|
123
|
+
void this.#scan();
|
|
124
|
+
}, delayMs);
|
|
125
|
+
}
|
|
126
|
+
resetPlacements() {
|
|
127
|
+
this.#layoutVersion += 1;
|
|
128
|
+
if (this.#capabilities.kittyGraphics) {
|
|
129
|
+
const imageIds = new Set(Array.from(this.#terminalImages.values(), (image) => image.imageId));
|
|
130
|
+
const commands = [
|
|
131
|
+
// Range deletion also catches an image transmitted by an interrupted
|
|
132
|
+
// scan before it could be entered into #placed. Older terminals can
|
|
133
|
+
// ignore this command and fall back to the ID and z-index deletions.
|
|
134
|
+
kittyDeleteRange(),
|
|
135
|
+
...Array.from(imageIds, (imageId) => kittyDeleteImage(imageId)),
|
|
136
|
+
// Also remove any placement that an earlier interrupted scan may have
|
|
137
|
+
// transmitted before it could be recorded in #placed.
|
|
138
|
+
kittyDeleteByZIndex()
|
|
139
|
+
];
|
|
140
|
+
this.#writeOuter(synchronizedOutput(commands.join("")));
|
|
141
|
+
}
|
|
142
|
+
for (const placement of this.#placed.values())
|
|
143
|
+
this.#releasePlacement(placement);
|
|
144
|
+
this.#placed.clear();
|
|
145
|
+
this.#terminalImages.clear();
|
|
146
|
+
}
|
|
147
|
+
#placementIsVisible(placement) {
|
|
148
|
+
const buffer = this.terminal.buffer.active;
|
|
149
|
+
const viewportStart = buffer.viewportY;
|
|
150
|
+
const viewportEnd = viewportStart + this.terminal.rows - 1;
|
|
151
|
+
if (placement.startMarker || placement.endMarker) {
|
|
152
|
+
const start = placement.startMarker?.line ?? placement.endMarker?.line ?? -1;
|
|
153
|
+
const end = placement.endMarker?.line ?? placement.startMarker?.line ?? -1;
|
|
154
|
+
return placement.bufferType === buffer.type
|
|
155
|
+
&& start >= 0
|
|
156
|
+
&& end >= viewportStart
|
|
157
|
+
&& start <= viewportEnd;
|
|
158
|
+
}
|
|
159
|
+
return placement.bufferType === buffer.type
|
|
160
|
+
&& placement.absoluteEndRow >= viewportStart
|
|
161
|
+
&& placement.absoluteStartRow <= viewportEnd;
|
|
162
|
+
}
|
|
163
|
+
#invalidateVisiblePlacements(deleteImages) {
|
|
164
|
+
this.#layoutVersion += 1;
|
|
165
|
+
const placements = [];
|
|
166
|
+
for (const [anchor, placement] of this.#placed) {
|
|
167
|
+
if (!this.#placementIsVisible(placement))
|
|
168
|
+
continue;
|
|
169
|
+
if (deleteImages)
|
|
170
|
+
placements.push(placement);
|
|
171
|
+
this.#releasePlacement(placement);
|
|
172
|
+
this.#placed.delete(anchor);
|
|
173
|
+
}
|
|
174
|
+
if (placements.length > 0 && this.#capabilities.kittyGraphics) {
|
|
175
|
+
this.#writeOuter(synchronizedOutput(placements.map((placement) => kittyDeletePlacement(placement.imageId, placement.placementId)).join("")));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
#invalidateBufferPlacements(bufferType, deleteImages) {
|
|
179
|
+
this.#layoutVersion += 1;
|
|
180
|
+
const placements = [];
|
|
181
|
+
for (const [anchor, placement] of this.#placed) {
|
|
182
|
+
if (placement.bufferType !== bufferType)
|
|
183
|
+
continue;
|
|
184
|
+
if (deleteImages)
|
|
185
|
+
placements.push(placement);
|
|
186
|
+
this.#releasePlacement(placement);
|
|
187
|
+
this.#placed.delete(anchor);
|
|
188
|
+
}
|
|
189
|
+
if (placements.length > 0 && this.#capabilities.kittyGraphics) {
|
|
190
|
+
this.#writeOuter(synchronizedOutput(placements.map((placement) => kittyDeletePlacement(placement.imageId, placement.placementId)).join("")));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
#releasePlacement(placement) {
|
|
194
|
+
const image = this.#terminalImages.get(placement.imageKey);
|
|
195
|
+
if (image)
|
|
196
|
+
image.placements = Math.max(0, image.placements - 1);
|
|
197
|
+
placement.startMarker?.dispose();
|
|
198
|
+
if (placement.endMarker !== placement.startMarker)
|
|
199
|
+
placement.endMarker?.dispose();
|
|
200
|
+
}
|
|
201
|
+
#markersForRegion(region) {
|
|
202
|
+
const buffer = this.terminal.buffer.active;
|
|
203
|
+
if (buffer.type !== "normal")
|
|
204
|
+
return {};
|
|
205
|
+
const cursorAbsoluteRow = buffer.baseY + buffer.cursorY;
|
|
206
|
+
const startAbsoluteRow = buffer.viewportY + region.startRow;
|
|
207
|
+
const endAbsoluteRow = buffer.viewportY + region.endRow;
|
|
208
|
+
return {
|
|
209
|
+
startMarker: this.terminal.registerMarker(startAbsoluteRow - cursorAbsoluteRow),
|
|
210
|
+
endMarker: this.terminal.registerMarker(endAbsoluteRow - cursorAbsoluteRow)
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
#nextImageId() {
|
|
214
|
+
const imageId = this.#imageId++;
|
|
215
|
+
if (this.#imageId > TFORMULA_IMAGE_ID_MAX)
|
|
216
|
+
this.#imageId = TFORMULA_IMAGE_ID_MIN;
|
|
217
|
+
return imageId;
|
|
218
|
+
}
|
|
219
|
+
#nextPlacementId() {
|
|
220
|
+
const placementId = this.#placementId++;
|
|
221
|
+
if (this.#placementId > 2_147_483_647)
|
|
222
|
+
this.#placementId = 1;
|
|
223
|
+
return placementId;
|
|
224
|
+
}
|
|
225
|
+
dispose() {
|
|
226
|
+
this.#disposed = true;
|
|
227
|
+
if (this.#scanTimer)
|
|
228
|
+
clearTimeout(this.#scanTimer);
|
|
229
|
+
this.#scanTimer = undefined;
|
|
230
|
+
for (const resolve of this.#scanWaiters.splice(0))
|
|
231
|
+
resolve();
|
|
232
|
+
this.resetPlacements();
|
|
233
|
+
this.terminal.dispose();
|
|
234
|
+
}
|
|
235
|
+
#visibleLines() {
|
|
236
|
+
const buffer = this.terminal.buffer.active;
|
|
237
|
+
return Array.from({ length: this.terminal.rows }, (_, row) => buffer.getLine(buffer.viewportY + row)?.translateToString(true) ?? "");
|
|
238
|
+
}
|
|
239
|
+
#incompleteControlSuffix(data) {
|
|
240
|
+
const escapeIndex = data.lastIndexOf("\x1b");
|
|
241
|
+
if (escapeIndex < 0)
|
|
242
|
+
return "";
|
|
243
|
+
const suffix = data.slice(escapeIndex);
|
|
244
|
+
if (suffix === "\x1b")
|
|
245
|
+
return suffix;
|
|
246
|
+
if (!suffix.startsWith("\x1b["))
|
|
247
|
+
return "";
|
|
248
|
+
// A CSI sequence is incomplete until its final byte in the 0x40-0x7e
|
|
249
|
+
// range arrives. Keep only that suffix for split PTY writes.
|
|
250
|
+
return /[\x40-\x7e]/u.test(suffix.slice(2)) ? "" : suffix.slice(-32);
|
|
251
|
+
}
|
|
252
|
+
#regionColors(region) {
|
|
253
|
+
const buffer = this.terminal.buffer.active;
|
|
254
|
+
const line = buffer.getLine(buffer.viewportY + region.startRow);
|
|
255
|
+
const cell = line?.getCell(Math.min(region.startCol, this.terminal.cols - 1));
|
|
256
|
+
if (!cell)
|
|
257
|
+
return this.#capabilities;
|
|
258
|
+
let foreground = cell.isFgRGB() ? rgbHex(cell.getFgColor()) : this.#capabilities.foreground;
|
|
259
|
+
let background = cell.isBgRGB() ? rgbHex(cell.getBgColor()) : this.#capabilities.background;
|
|
260
|
+
if (cell.isInverse())
|
|
261
|
+
[foreground, background] = [background, foreground];
|
|
262
|
+
return { foreground, background };
|
|
263
|
+
}
|
|
264
|
+
#anchor(region, columns, rows) {
|
|
265
|
+
const buffer = this.terminal.buffer.active;
|
|
266
|
+
return `${buffer.type}:${buffer.viewportY + region.startRow}:${region.startCol}:${columns}:${rows}`;
|
|
267
|
+
}
|
|
268
|
+
#regionStillVisible(region, viewportY) {
|
|
269
|
+
const buffer = this.terminal.buffer.active;
|
|
270
|
+
if (buffer.viewportY !== viewportY)
|
|
271
|
+
return false;
|
|
272
|
+
return detectFormulaRegions(this.#visibleLines()).some((candidate) => candidate.startRow === region.startRow
|
|
273
|
+
&& candidate.endRow === region.endRow
|
|
274
|
+
&& candidate.startCol === region.startCol
|
|
275
|
+
&& candidate.endCol === region.endCol
|
|
276
|
+
&& candidate.latex === region.latex
|
|
277
|
+
&& candidate.display === region.display
|
|
278
|
+
&& candidate.compact === region.compact);
|
|
279
|
+
}
|
|
280
|
+
async #scan() {
|
|
281
|
+
if (this.#disposed || !this.#capabilities.kittyGraphics || this.terminal.modes.originMode)
|
|
282
|
+
return;
|
|
283
|
+
if (this.#scanning) {
|
|
284
|
+
this.#rescanRequested = true;
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
this.#scanning = true;
|
|
288
|
+
const version = this.#scanVersion;
|
|
289
|
+
const layoutVersion = this.#layoutVersion;
|
|
290
|
+
const viewportY = this.terminal.buffer.active.viewportY;
|
|
291
|
+
try {
|
|
292
|
+
const regions = detectFormulaRegions(this.#visibleLines());
|
|
293
|
+
const prepared = regions.map((region) => {
|
|
294
|
+
const rows = region.endRow - region.startRow + 1;
|
|
295
|
+
const columns = rows > 1 && !region.compact
|
|
296
|
+
? this.terminal.cols
|
|
297
|
+
: Math.max(1, Math.min(this.terminal.cols - region.startCol, region.endCol - region.startCol));
|
|
298
|
+
const anchor = this.#anchor(region, columns, rows);
|
|
299
|
+
return { region, rows, columns, anchor };
|
|
300
|
+
});
|
|
301
|
+
const desiredAnchors = new Set(prepared.map(({ anchor }) => anchor));
|
|
302
|
+
for (const { region, rows, columns, anchor } of prepared) {
|
|
303
|
+
if (this.#disposed || layoutVersion !== this.#layoutVersion)
|
|
304
|
+
break;
|
|
305
|
+
if (version !== this.#scanVersion && !this.#regionStillVisible(region, viewportY))
|
|
306
|
+
continue;
|
|
307
|
+
const colors = this.#regionColors(region);
|
|
308
|
+
const fingerprint = createHash("sha1").update(JSON.stringify({
|
|
309
|
+
latex: region.latex,
|
|
310
|
+
display: region.display,
|
|
311
|
+
compact: region.compact,
|
|
312
|
+
colors,
|
|
313
|
+
cell: this.#capabilities.cell,
|
|
314
|
+
scale: this.#scale
|
|
315
|
+
})).digest("hex");
|
|
316
|
+
const existing = this.#placed.get(anchor);
|
|
317
|
+
if (existing?.fingerprint === fingerprint)
|
|
318
|
+
continue;
|
|
319
|
+
try {
|
|
320
|
+
const rendered = await this.#renderer.render(region, columns, rows, this.#capabilities, this.#scale, colors.foreground, colors.background);
|
|
321
|
+
if (this.#disposed || layoutVersion !== this.#layoutVersion)
|
|
322
|
+
break;
|
|
323
|
+
// Unrelated output (for example a spinner in the status bar) should
|
|
324
|
+
// not starve formulas that are unchanged at their screen location.
|
|
325
|
+
if (version !== this.#scanVersion && !this.#regionStillVisible(region, viewportY))
|
|
326
|
+
continue;
|
|
327
|
+
const buffer = this.terminal.buffer.active;
|
|
328
|
+
// CUP cannot reproduce xterm's pending-wrap state exactly.
|
|
329
|
+
if (buffer.cursorX >= this.terminal.cols) {
|
|
330
|
+
this.#rescanRequested = true;
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
let image = this.#terminalImages.get(rendered.cacheKey);
|
|
334
|
+
let transmission = "";
|
|
335
|
+
if (!image) {
|
|
336
|
+
image = { imageId: this.#nextImageId(), placements: 0 };
|
|
337
|
+
this.#terminalImages.set(rendered.cacheKey, image);
|
|
338
|
+
transmission = kittyTransmitImage(rendered.png, image.imageId);
|
|
339
|
+
}
|
|
340
|
+
const placementId = this.#nextPlacementId();
|
|
341
|
+
const placement = [
|
|
342
|
+
existing ? kittyDeletePlacement(existing.imageId, existing.placementId) : "",
|
|
343
|
+
cursorPosition(region.startRow + 1, region.startCol + 1),
|
|
344
|
+
transmission,
|
|
345
|
+
kittyPlaceImage(image.imageId, placementId, columns, rows),
|
|
346
|
+
cursorPosition(buffer.cursorY + 1, buffer.cursorX + 1)
|
|
347
|
+
].join("");
|
|
348
|
+
this.#writeOuter(synchronizedOutput(placement));
|
|
349
|
+
if (existing) {
|
|
350
|
+
this.#releasePlacement(existing);
|
|
351
|
+
this.#placed.delete(anchor);
|
|
352
|
+
}
|
|
353
|
+
image.placements += 1;
|
|
354
|
+
const markers = this.#markersForRegion(region);
|
|
355
|
+
this.#placed.set(anchor, {
|
|
356
|
+
imageId: image.imageId,
|
|
357
|
+
placementId,
|
|
358
|
+
imageKey: rendered.cacheKey,
|
|
359
|
+
fingerprint,
|
|
360
|
+
bufferType: buffer.type,
|
|
361
|
+
absoluteStartRow: buffer.viewportY + region.startRow,
|
|
362
|
+
absoluteEndRow: buffer.viewportY + region.endRow,
|
|
363
|
+
...markers
|
|
364
|
+
});
|
|
365
|
+
this.#debug(`rendered ${region.confidence} formula at ${anchor} (${rendered.widthPx}x${rendered.heightPx}px)`);
|
|
366
|
+
}
|
|
367
|
+
catch (error) {
|
|
368
|
+
this.#debug(`formula render skipped: ${error instanceof Error ? error.message : String(error)}`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
// Stale placement deletion is deliberately transactional as well. A
|
|
372
|
+
// resize can invalidate an in-flight scan; deleting before all current
|
|
373
|
+
// formulas are prepared would permanently lose an image that has just
|
|
374
|
+
// moved into scrollback. Markers keep this visibility check valid after
|
|
375
|
+
// normal-buffer reflow.
|
|
376
|
+
if (layoutVersion === this.#layoutVersion && version === this.#scanVersion) {
|
|
377
|
+
for (const [anchor, placement] of this.#placed) {
|
|
378
|
+
if (desiredAnchors.has(anchor) || !this.#placementIsVisible(placement))
|
|
379
|
+
continue;
|
|
380
|
+
this.#writeOuter(kittyDeletePlacement(placement.imageId, placement.placementId));
|
|
381
|
+
this.#releasePlacement(placement);
|
|
382
|
+
this.#placed.delete(anchor);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
finally {
|
|
387
|
+
this.#scanning = false;
|
|
388
|
+
for (const resolve of this.#scanWaiters.splice(0))
|
|
389
|
+
resolve();
|
|
390
|
+
if (!this.#disposed && (this.#rescanRequested || version !== this.#scanVersion)) {
|
|
391
|
+
this.#rescanRequested = false;
|
|
392
|
+
this.scheduleScan(140);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=screen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screen.js","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface CellMetrics {
|
|
2
|
+
width: number;
|
|
3
|
+
height: number;
|
|
4
|
+
source: "cell-query" | "window-query" | "override" | "fallback";
|
|
5
|
+
}
|
|
6
|
+
export interface TerminalCapabilities {
|
|
7
|
+
kittyGraphics: boolean;
|
|
8
|
+
foreground: string;
|
|
9
|
+
background: string;
|
|
10
|
+
cell: CellMetrics;
|
|
11
|
+
windowPixels?: {
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface FormulaRegion {
|
|
17
|
+
startRow: number;
|
|
18
|
+
endRow: number;
|
|
19
|
+
startCol: number;
|
|
20
|
+
endCol: number;
|
|
21
|
+
latex: string;
|
|
22
|
+
display: boolean;
|
|
23
|
+
confidence: "explicit" | "inferred";
|
|
24
|
+
/** Use the detected region width even when the formula spans several rows. */
|
|
25
|
+
compact?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface RenderedFormula {
|
|
28
|
+
png: Uint8Array;
|
|
29
|
+
/** Content-addressed key for this exact terminal-ready PNG variant. */
|
|
30
|
+
cacheKey: string;
|
|
31
|
+
columns: number;
|
|
32
|
+
rows: number;
|
|
33
|
+
widthPx: number;
|
|
34
|
+
heightPx: number;
|
|
35
|
+
}
|
|
36
|
+
export interface CliOptions {
|
|
37
|
+
command: string;
|
|
38
|
+
args: string[];
|
|
39
|
+
cwd: string;
|
|
40
|
+
renderMath: boolean;
|
|
41
|
+
debug: boolean;
|
|
42
|
+
scale: number;
|
|
43
|
+
cellOverride?: {
|
|
44
|
+
width: number;
|
|
45
|
+
height: number;
|
|
46
|
+
};
|
|
47
|
+
}
|
package/dist/types.js
ADDED