@pierre/diffs 1.5.2 → 1.6.0-beta.1
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 +4 -3
- package/dist/components/CodeView.d.ts.map +1 -1
- package/dist/components/CodeView.js +6 -5
- package/dist/components/CodeView.js.map +1 -1
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +11 -6
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +12 -7
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/FileStream.d.ts +6 -4
- package/dist/components/FileStream.d.ts.map +1 -1
- package/dist/components/FileStream.js +49 -36
- package/dist/components/FileStream.js.map +1 -1
- package/dist/constants.d.ts +3 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/editor/editor.d.ts +2 -1
- package/dist/editor/editor.d.ts.map +1 -1
- package/dist/editor/editor.js +5 -1
- package/dist/editor/editor.js.map +1 -1
- package/dist/editor/tokenizer.d.ts +6 -4
- package/dist/editor/tokenizer.d.ts.map +1 -1
- package/dist/editor/tokenizer.js +25 -470
- package/dist/editor/tokenizer.js.map +1 -1
- package/dist/highlighter/DiffsEditorTokenizer.d.ts +16 -0
- package/dist/highlighter/DiffsEditorTokenizer.d.ts.map +1 -0
- package/dist/highlighter/DiffsEditorTokenizer.js +0 -0
- package/dist/highlighter/DiffsHighlighter.d.ts +41 -0
- package/dist/highlighter/DiffsHighlighter.d.ts.map +1 -0
- package/dist/highlighter/DiffsHighlighter.js +39 -0
- package/dist/highlighter/DiffsHighlighter.js.map +1 -0
- package/dist/highlighter/backends/highlights.d.ts +26 -0
- package/dist/highlighter/backends/highlights.d.ts.map +1 -0
- package/dist/highlighter/backends/highlights.js +71 -0
- package/dist/highlighter/backends/highlights.js.map +1 -0
- package/dist/highlighter/backends/shiki.d.ts +27 -0
- package/dist/highlighter/backends/shiki.d.ts.map +1 -0
- package/dist/highlighter/backends/shiki.js +107 -0
- package/dist/highlighter/backends/shiki.js.map +1 -0
- package/dist/highlighter/highlighterType.d.ts +13 -0
- package/dist/highlighter/highlighterType.d.ts.map +1 -0
- package/dist/highlighter/highlighterType.js +32 -0
- package/dist/highlighter/highlighterType.js.map +1 -0
- package/dist/highlighter/highlights-editor.d.ts +24 -0
- package/dist/highlighter/highlights-editor.d.ts.map +1 -0
- package/dist/highlighter/highlights-editor.js +166 -0
- package/dist/highlighter/highlights-editor.js.map +1 -0
- package/dist/highlighter/highlights-stream.d.ts +20 -0
- package/dist/highlighter/highlights-stream.d.ts.map +1 -0
- package/dist/highlighter/highlights-stream.js +93 -0
- package/dist/highlighter/highlights-stream.js.map +1 -0
- package/dist/highlighter/languages/areLanguagesAttached.d.ts +2 -1
- package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
- package/dist/highlighter/languages/areLanguagesAttached.js +4 -6
- package/dist/highlighter/languages/areLanguagesAttached.js.map +1 -1
- package/dist/highlighter/languages/attachResolvedLanguages.d.ts +6 -1
- package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/attachResolvedLanguages.js +6 -11
- package/dist/highlighter/languages/attachResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/constants.d.ts +1 -1
- package/dist/highlighter/languages/getResolvedLanguages.d.ts +1 -1
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
- package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
- package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/resolveLanguage.js +19 -16
- package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
- package/dist/highlighter/languages/resolveLanguages.d.ts +1 -1
- package/dist/highlighter/shared_highlighter.d.ts +23 -9
- package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
- package/dist/highlighter/shared_highlighter.js +59 -47
- package/dist/highlighter/shared_highlighter.js.map +1 -1
- package/dist/highlighter/shiki-editor.d.ts +25 -0
- package/dist/highlighter/shiki-editor.d.ts.map +1 -0
- package/dist/highlighter/shiki-editor.js +483 -0
- package/dist/highlighter/shiki-editor.js.map +1 -0
- package/dist/highlighter/shiki-stream.d.ts +20 -0
- package/dist/highlighter/shiki-stream.d.ts.map +1 -0
- package/dist/highlighter/shiki-stream.js +60 -0
- package/dist/highlighter/shiki-stream.js.map +1 -0
- package/dist/highlighter/stream-tokenizer.d.ts +40 -0
- package/dist/highlighter/stream-tokenizer.d.ts.map +1 -0
- package/dist/highlighter/stream-tokenizer.js +70 -0
- package/dist/highlighter/stream-tokenizer.js.map +1 -0
- package/dist/highlighter/themes/areThemesAttached.d.ts +3 -2
- package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
- package/dist/highlighter/themes/areThemesAttached.js +5 -4
- package/dist/highlighter/themes/areThemesAttached.js.map +1 -1
- package/dist/highlighter/themes/attachResolvedThemes.d.ts +5 -2
- package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/attachResolvedThemes.js +4 -16
- package/dist/highlighter/themes/attachResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts +3 -1
- package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/cleanUpResolvedThemes.js +8 -5
- package/dist/highlighter/themes/cleanUpResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/createCSSVariablesTheme.d.ts +7 -0
- package/dist/highlighter/themes/createCSSVariablesTheme.d.ts.map +1 -0
- package/dist/highlighter/themes/createCSSVariablesTheme.js +89 -0
- package/dist/highlighter/themes/createCSSVariablesTheme.js.map +1 -0
- package/dist/highlighter/themes/createCachedLoader.d.ts +5 -0
- package/dist/highlighter/themes/createCachedLoader.d.ts.map +1 -0
- package/dist/highlighter/themes/createCachedLoader.js +15 -0
- package/dist/highlighter/themes/createCachedLoader.js.map +1 -0
- package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts +3 -2
- package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/getResolvedOrResolveTheme.js +4 -4
- package/dist/highlighter/themes/getResolvedOrResolveTheme.js.map +1 -1
- package/dist/highlighter/themes/getResolvedThemes.d.ts +3 -2
- package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/getResolvedThemes.js +4 -3
- package/dist/highlighter/themes/getResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/hasResolvedThemes.d.ts +2 -2
- package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/hasResolvedThemes.js +4 -3
- package/dist/highlighter/themes/hasResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +3 -3
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
- package/dist/highlighter/themes/registerCustomTheme.d.ts +9 -4
- package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/registerCustomTheme.js +8 -16
- package/dist/highlighter/themes/registerCustomTheme.js.map +1 -1
- package/dist/highlighter/themes/resolveTheme.d.ts +3 -2
- package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/resolveTheme.js +4 -7
- package/dist/highlighter/themes/resolveTheme.js.map +1 -1
- package/dist/highlighter/themes/resolveThemes.d.ts +3 -2
- package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/resolveThemes.js +4 -7
- package/dist/highlighter/themes/resolveThemes.js.map +1 -1
- package/dist/highlighter/themes/themeResolver.d.ts +10 -4
- package/dist/highlighter/themes/themeResolver.d.ts.map +1 -1
- package/dist/highlighter/themes/themeResolver.js +141 -2
- package/dist/highlighter/themes/themeResolver.js.map +1 -1
- package/dist/highlighter/themes/types.d.ts +23 -0
- package/dist/highlighter/themes/types.d.ts.map +1 -0
- package/dist/highlighter/themes/types.js +0 -0
- package/dist/highlighter/tokenizer-types.d.ts +35 -0
- package/dist/highlighter/tokenizer-types.d.ts.map +1 -0
- package/dist/highlighter/tokenizer-types.js +0 -0
- package/dist/highlighter/types.d.ts +55 -0
- package/dist/highlighter/types.d.ts.map +1 -0
- package/dist/highlighter/types.js +0 -0
- package/dist/index.d.ts +14 -10
- package/dist/index.js +16 -18
- package/dist/managers/InteractionManager.d.ts.map +1 -1
- package/dist/managers/InteractionManager.js +2 -2
- package/dist/managers/InteractionManager.js.map +1 -1
- package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts +9 -1
- package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts.map +1 -1
- package/dist/react/CodeView.js +1 -1
- package/dist/react/index.d.ts +8 -3
- package/dist/renderers/DiffHunksRenderer.d.ts +2 -1
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +31 -22
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/FileRenderer.d.ts +2 -1
- package/dist/renderers/FileRenderer.d.ts.map +1 -1
- package/dist/renderers/FileRenderer.js +33 -24
- package/dist/renderers/FileRenderer.js.map +1 -1
- package/dist/shiki-stream/index.d.ts +3 -3
- package/dist/shiki-stream/index.js +1 -2
- package/dist/shiki-stream/stream.d.ts +4 -4
- package/dist/shiki-stream/stream.d.ts.map +1 -1
- package/dist/shiki-stream/stream.js +20 -9
- package/dist/shiki-stream/stream.js.map +1 -1
- package/dist/shiki-stream/types.d.ts +7 -38
- package/dist/shiki-stream/types.d.ts.map +1 -1
- package/dist/ssr/FileDiffReact.js +1 -1
- package/dist/ssr/index.d.ts +7 -2
- package/dist/ssr/renderHTML.js +2 -2
- package/dist/ssr/renderHTML.js.map +1 -1
- package/dist/style.js +1 -1
- package/dist/style.js.map +1 -1
- package/dist/types.d.ts +10 -11
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/createSpanNodeFromToken.d.ts +3 -2
- package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
- package/dist/utils/createSpanNodeFromToken.js +4 -5
- package/dist/utils/createSpanNodeFromToken.js.map +1 -1
- package/dist/utils/cssWrappers.d.ts.map +1 -1
- package/dist/utils/cssWrappers.js +12 -0
- package/dist/utils/cssWrappers.js.map +1 -1
- package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
- package/dist/utils/getHighlighterOptions.js +3 -2
- package/dist/utils/getHighlighterOptions.js.map +1 -1
- package/dist/utils/getHighlighterThemeStyles.d.ts +2 -1
- package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
- package/dist/utils/getHighlighterThemeStyles.js +13 -3
- package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
- package/dist/utils/getTokenOptions.d.ts +7 -0
- package/dist/utils/getTokenOptions.d.ts.map +1 -0
- package/dist/utils/getTokenOptions.js +16 -0
- package/dist/utils/getTokenOptions.js.map +1 -0
- package/dist/utils/hastToHtml.d.ts +10 -0
- package/dist/utils/hastToHtml.d.ts.map +1 -0
- package/dist/utils/hastToHtml.js +125 -0
- package/dist/utils/hastToHtml.js.map +1 -0
- package/dist/utils/parseDiffDecorations.d.ts +2 -1
- package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.d.ts +3 -2
- package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.js +33 -48
- package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
- package/dist/utils/renderFileWithHighlighter.d.ts +3 -2
- package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderFileWithHighlighter.js +10 -26
- package/dist/utils/renderFileWithHighlighter.js.map +1 -1
- package/dist/utils/renderTokenLines.d.ts +17 -0
- package/dist/utils/renderTokenLines.d.ts.map +1 -0
- package/dist/utils/renderTokenLines.js +246 -0
- package/dist/utils/renderTokenLines.js.map +1 -0
- package/dist/utils/resolvePreferredHighlighter.d.ts +13 -0
- package/dist/utils/resolvePreferredHighlighter.d.ts.map +1 -0
- package/dist/utils/resolvePreferredHighlighter.js +11 -0
- package/dist/utils/resolvePreferredHighlighter.js.map +1 -0
- package/dist/utils/setDeferredArrayItem.d.ts +5 -0
- package/dist/utils/setDeferredArrayItem.d.ts.map +1 -0
- package/dist/utils/setDeferredArrayItem.js +39 -0
- package/dist/utils/setDeferredArrayItem.js.map +1 -0
- package/dist/utils/tokenStyle.d.ts +7 -0
- package/dist/utils/tokenStyle.d.ts.map +1 -0
- package/dist/utils/tokenStyle.js +28 -0
- package/dist/utils/tokenStyle.js.map +1 -0
- package/dist/utils/tokensToHtml.d.ts +8 -0
- package/dist/utils/tokensToHtml.d.ts.map +1 -0
- package/dist/utils/tokensToHtml.js +45 -0
- package/dist/utils/tokensToHtml.js.map +1 -0
- package/dist/utils/wrapTokenFragments.js.map +1 -1
- package/dist/worker/WorkerPoolManager.d.ts +2 -2
- package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
- package/dist/worker/WorkerPoolManager.js +56 -46
- package/dist/worker/WorkerPoolManager.js.map +1 -1
- package/dist/worker/hastLinesTransport.d.ts +14 -0
- package/dist/worker/hastLinesTransport.d.ts.map +1 -0
- package/dist/worker/hastLinesTransport.js +156 -0
- package/dist/worker/hastLinesTransport.js.map +1 -0
- package/dist/worker/highlights-sAHlxqlf.js +317 -0
- package/dist/worker/highlights-sAHlxqlf.js.map +1 -0
- package/dist/worker/index.d.ts +1 -1
- package/dist/worker/shiki-Bx2JpdqZ.js +697 -0
- package/dist/worker/shiki-Bx2JpdqZ.js.map +1 -0
- package/dist/worker/stream-tokenizer-YZ6M1qSx.js +424 -0
- package/dist/worker/stream-tokenizer-YZ6M1qSx.js.map +1 -0
- package/dist/worker/types.d.ts +5 -3
- package/dist/worker/types.d.ts.map +1 -1
- package/dist/worker/worker-portable.js +41 -13337
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +672 -349
- package/dist/worker/worker.js.map +1 -1
- package/dist/worker/workerMessage.d.ts +24 -0
- package/dist/worker/workerMessage.d.ts.map +1 -0
- package/dist/worker/workerMessage.js +0 -0
- package/package.json +33 -29
- package/dist/highlighter/themes/constants.d.ts +0 -5
- package/dist/highlighter/themes/constants.d.ts.map +0 -1
- package/dist/highlighter/themes/constants.js +0 -6
- package/dist/highlighter/themes/constants.js.map +0 -1
- package/dist/highlighter/themes/themeResolution.d.ts +0 -7
- package/dist/highlighter/themes/themeResolution.d.ts.map +0 -1
- package/dist/highlighter/themes/themeResolution.js +0 -21
- package/dist/highlighter/themes/themeResolution.js.map +0 -1
- package/dist/shiki-stream/tokenizer.d.ts +0 -23
- package/dist/shiki-stream/tokenizer.d.ts.map +0 -1
- package/dist/shiki-stream/tokenizer.js +0 -72
- package/dist/shiki-stream/tokenizer.js.map +0 -1
- package/dist/utils/createTransformerWithState.d.ts +0 -12
- package/dist/utils/createTransformerWithState.d.ts.map +0 -1
- package/dist/utils/createTransformerWithState.js +0 -89
- package/dist/utils/createTransformerWithState.js.map +0 -1
- package/dist/worker/wasm-B9ZqxnKj.js +0 -8
- package/dist/worker/wasm-B9ZqxnKj.js.map +0 -1
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { n as DiffsHighlighter, r as createDiffsThemeResolver, t as BaseStreamTokenizer } from "./stream-tokenizer-YZ6M1qSx.js";
|
|
2
|
+
import { n as formatCSSVariablePrefix, r as appendItems } from "./worker.js";
|
|
3
|
+
import { LiveTokenizer, codeToTokens, isSupportedLanguage } from "@pierre/highlights";
|
|
4
|
+
//#region src/highlighter/highlights-editor.ts
|
|
5
|
+
var HighlightsEditorTokenizer = class {
|
|
6
|
+
options;
|
|
7
|
+
resolveOptions;
|
|
8
|
+
#tokenizer;
|
|
9
|
+
#version;
|
|
10
|
+
#disposed = false;
|
|
11
|
+
#returnedRange;
|
|
12
|
+
#paused = false;
|
|
13
|
+
#capturedLines;
|
|
14
|
+
#pendingDelivery;
|
|
15
|
+
constructor(options, resolveOptions) {
|
|
16
|
+
this.options = options;
|
|
17
|
+
this.resolveOptions = resolveOptions;
|
|
18
|
+
this.#version = options.textDocument.version;
|
|
19
|
+
this.#tokenizer = this.#createTokenizer();
|
|
20
|
+
}
|
|
21
|
+
#createTokenizer() {
|
|
22
|
+
return new LiveTokenizer({
|
|
23
|
+
...this.resolveOptions({
|
|
24
|
+
lang: this.options.textDocument.languageId,
|
|
25
|
+
theme: this.options.theme,
|
|
26
|
+
cssVariablePrefix: formatCSSVariablePrefix("token"),
|
|
27
|
+
tokenizeMaxLineLength: this.options.tokenizeMaxLineLength ?? 1e3
|
|
28
|
+
}),
|
|
29
|
+
code: this.options.textDocument.getText(),
|
|
30
|
+
renderRange: [0, 0],
|
|
31
|
+
onDeferTokenize: (lines) => this.#deliver(lines)
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
#deliver(lines) {
|
|
35
|
+
const captured = this.#capturedLines;
|
|
36
|
+
if (captured != null) {
|
|
37
|
+
for (const [line, tokens] of lines) captured.set(line, tokens);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const range = this.#returnedRange;
|
|
41
|
+
if (range != null) {
|
|
42
|
+
for (const line of lines.keys()) if (line >= range[0] && line < range[1]) lines.delete(line);
|
|
43
|
+
if (lines.size === 0) return;
|
|
44
|
+
}
|
|
45
|
+
this.options.onDeferTokenize(lines);
|
|
46
|
+
}
|
|
47
|
+
#queueDelivery(lines) {
|
|
48
|
+
const pending = this.#pendingDelivery;
|
|
49
|
+
if (pending != null) {
|
|
50
|
+
for (const [line, tokens] of lines) pending.set(line, tokens);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.#pendingDelivery = lines;
|
|
54
|
+
queueMicrotask(() => {
|
|
55
|
+
const batch = this.#pendingDelivery;
|
|
56
|
+
this.#pendingDelivery = void 0;
|
|
57
|
+
if (batch != null && batch.size > 0 && !this.#disposed) this.options.onDeferTokenize(batch);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
tokenize(change, renderRange, hostRealignsRows = false) {
|
|
61
|
+
const document = this.options.textDocument;
|
|
62
|
+
const start = Math.min(renderRange?.startingLine ?? 0, document.lineCount);
|
|
63
|
+
const end = Math.min(start + (renderRange?.totalLines ?? Infinity), document.lineCount);
|
|
64
|
+
const returnedStart = Math.max(start, change.startLine);
|
|
65
|
+
this.#paused = false;
|
|
66
|
+
let lines;
|
|
67
|
+
if (this.#version !== document.version) {
|
|
68
|
+
this.#pendingDelivery = void 0;
|
|
69
|
+
lines = this.#syncDocument(change, [start, end]).lines;
|
|
70
|
+
this.#version = document.version;
|
|
71
|
+
} else if (this.#tokenizer.lineCount !== document.lineCount) {
|
|
72
|
+
this.#pendingDelivery = void 0;
|
|
73
|
+
lines = this.#tokenizer.reset(document.getText(), { renderRange: [start, end] }).lines;
|
|
74
|
+
} else {
|
|
75
|
+
lines = /* @__PURE__ */ new Map();
|
|
76
|
+
this.#readLines(lines, returnedStart, end);
|
|
77
|
+
if (this.#pendingDelivery != null) for (const line of lines.keys()) this.#pendingDelivery.delete(line);
|
|
78
|
+
return lines;
|
|
79
|
+
}
|
|
80
|
+
if (change.lineDelta === 0 ? change.changedLineChanges?.some(([, , lineDelta]) => lineDelta !== 0) ?? false : !hostRealignsRows) this.#readLines(lines, returnedStart, end);
|
|
81
|
+
return lines;
|
|
82
|
+
}
|
|
83
|
+
#syncDocument(change, renderRange) {
|
|
84
|
+
const document = this.options.textDocument;
|
|
85
|
+
const options = { renderRange };
|
|
86
|
+
if (Math.abs(document.version - this.#version) === 1 && change.changes.length > 0 && this.#tokenizer.lineCount === change.previousLineCount) try {
|
|
87
|
+
const update = this.#tokenizer.applyEdits(change.changes.map(({ range, text }) => ({
|
|
88
|
+
range,
|
|
89
|
+
newText: text
|
|
90
|
+
})), options);
|
|
91
|
+
if (this.#tokenizer.lineCount === document.lineCount) return update;
|
|
92
|
+
} catch (error) {
|
|
93
|
+
if (!(error instanceof RangeError)) throw error;
|
|
94
|
+
}
|
|
95
|
+
return this.#tokenizer.reset(document.getText(), options);
|
|
96
|
+
}
|
|
97
|
+
#readLines(lines, from, to) {
|
|
98
|
+
this.#returnedRange = [from, to];
|
|
99
|
+
try {
|
|
100
|
+
this.#tokenizer.flush(to);
|
|
101
|
+
} finally {
|
|
102
|
+
this.#returnedRange = void 0;
|
|
103
|
+
}
|
|
104
|
+
for (let line = from; line < to; line++) {
|
|
105
|
+
if (lines.has(line)) continue;
|
|
106
|
+
const { tokens } = this.#tokenizer.getLineTokens(line);
|
|
107
|
+
lines.set(line, tokens.length === 0 ? [[
|
|
108
|
+
0,
|
|
109
|
+
"",
|
|
110
|
+
""
|
|
111
|
+
]] : tokens.map((token) => [
|
|
112
|
+
token.offset,
|
|
113
|
+
token.color ?? "",
|
|
114
|
+
token.content
|
|
115
|
+
]));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
setTheme(themeName) {
|
|
119
|
+
if (themeName === this.options.theme) return;
|
|
120
|
+
this.options.theme = themeName;
|
|
121
|
+
this.#tokenizer.dispose();
|
|
122
|
+
this.#pendingDelivery = void 0;
|
|
123
|
+
this.#paused = false;
|
|
124
|
+
this.#version = this.options.textDocument.version;
|
|
125
|
+
this.#tokenizer = this.#createTokenizer();
|
|
126
|
+
}
|
|
127
|
+
getStringCommentRegexpRangesInLine(lineIndex) {
|
|
128
|
+
const document = this.options.textDocument;
|
|
129
|
+
if (this.options.matchBrackets === false || lineIndex < 0 || lineIndex >= document.lineCount) return null;
|
|
130
|
+
const captured = /* @__PURE__ */ new Map();
|
|
131
|
+
this.#capturedLines = captured;
|
|
132
|
+
try {
|
|
133
|
+
if (this.#version !== document.version || this.#tokenizer.lineCount !== document.lineCount) {
|
|
134
|
+
this.#pendingDelivery = void 0;
|
|
135
|
+
this.#tokenizer.reset(document.getText(), { renderRange: [lineIndex, lineIndex + 1] });
|
|
136
|
+
this.#version = document.version;
|
|
137
|
+
}
|
|
138
|
+
this.#tokenizer.flush(lineIndex + 1);
|
|
139
|
+
} finally {
|
|
140
|
+
this.#capturedLines = void 0;
|
|
141
|
+
if (this.#paused) this.#tokenizer.pause();
|
|
142
|
+
}
|
|
143
|
+
if (captured.size > 0) this.#queueDelivery(captured);
|
|
144
|
+
return this.#tokenizer.getLineTokens(lineIndex).bracketIgnoredRanges;
|
|
145
|
+
}
|
|
146
|
+
prebuildStateStack() {}
|
|
147
|
+
stopBackgroundTokenize() {
|
|
148
|
+
this.pauseBackgroundTokenize();
|
|
149
|
+
}
|
|
150
|
+
pauseBackgroundTokenize() {
|
|
151
|
+
this.#paused = true;
|
|
152
|
+
this.#tokenizer.pause();
|
|
153
|
+
}
|
|
154
|
+
resumeBackgroundTokenize() {
|
|
155
|
+
this.#paused = false;
|
|
156
|
+
this.#tokenizer.resume();
|
|
157
|
+
}
|
|
158
|
+
dispose() {
|
|
159
|
+
this.#disposed = true;
|
|
160
|
+
this.#pendingDelivery = void 0;
|
|
161
|
+
this.#tokenizer.dispose();
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
//#endregion
|
|
165
|
+
//#region src/highlighter/highlights-stream.ts
|
|
166
|
+
const TRIM_LINE_COUNT = 1024;
|
|
167
|
+
const DOCUMENT_START = {
|
|
168
|
+
line: 0,
|
|
169
|
+
character: 0
|
|
170
|
+
};
|
|
171
|
+
/** Keeps the unfinished line editable so new chunks can recall provisional tokens. */
|
|
172
|
+
var HighlightsStreamTokenizer = class HighlightsStreamTokenizer extends BaseStreamTokenizer {
|
|
173
|
+
options;
|
|
174
|
+
#tokenizer;
|
|
175
|
+
#trimLineCount = TRIM_LINE_COUNT;
|
|
176
|
+
constructor(options) {
|
|
177
|
+
super();
|
|
178
|
+
this.options = options;
|
|
179
|
+
this.#tokenizer = new LiveTokenizer(options);
|
|
180
|
+
}
|
|
181
|
+
tokenizeChunk(chunk, stable) {
|
|
182
|
+
const lineBreaks = [...chunk.matchAll(/\r\n|\r|\n/g)];
|
|
183
|
+
const startLine = this.#tokenizer.lineCount - 1;
|
|
184
|
+
const position = {
|
|
185
|
+
line: startLine,
|
|
186
|
+
character: this.#tokenizer.getLineLength(startLine)
|
|
187
|
+
};
|
|
188
|
+
this.#tokenizer.applyEdits([{
|
|
189
|
+
range: {
|
|
190
|
+
start: position,
|
|
191
|
+
end: position
|
|
192
|
+
},
|
|
193
|
+
newText: chunk
|
|
194
|
+
}]);
|
|
195
|
+
const lastLine = this.#tokenizer.lineCount - 1;
|
|
196
|
+
let unstable = [];
|
|
197
|
+
for (let line = startLine; line <= lastLine; line++) {
|
|
198
|
+
const { tokens } = this.#tokenizer.getLineTokens(line);
|
|
199
|
+
for (const token of tokens) token.offset += this.stableOffset;
|
|
200
|
+
if (line < lastLine) {
|
|
201
|
+
appendItems(stable, tokens);
|
|
202
|
+
this.pushLineBreak(stable, this.#tokenizer.getLineLength(line), lineBreaks[line - startLine][0]);
|
|
203
|
+
} else unstable = tokens;
|
|
204
|
+
}
|
|
205
|
+
const tailLength = this.#tokenizer.getLineLength(lastLine);
|
|
206
|
+
if (lastLine > this.#trimLineCount) {
|
|
207
|
+
const text = this.#tokenizer.getText();
|
|
208
|
+
const { lineChanges } = this.#tokenizer.applyEdits([{
|
|
209
|
+
range: {
|
|
210
|
+
start: DOCUMENT_START,
|
|
211
|
+
end: {
|
|
212
|
+
line: lastLine - 1,
|
|
213
|
+
character: 0
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
newText: ""
|
|
217
|
+
}]);
|
|
218
|
+
if (lineChanges.every((change) => change.newEndLine <= 1)) this.#trimLineCount = TRIM_LINE_COUNT;
|
|
219
|
+
else {
|
|
220
|
+
const keptLength = this.#tokenizer.getText().length;
|
|
221
|
+
this.#tokenizer.applyEdits([{
|
|
222
|
+
range: {
|
|
223
|
+
start: DOCUMENT_START,
|
|
224
|
+
end: DOCUMENT_START
|
|
225
|
+
},
|
|
226
|
+
newText: text.slice(0, text.length - keptLength)
|
|
227
|
+
}]);
|
|
228
|
+
this.#trimLineCount = lastLine * 2;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
unstable,
|
|
233
|
+
tailLength
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
clone() {
|
|
237
|
+
this.assertActive();
|
|
238
|
+
const clone = new HighlightsStreamTokenizer(this.options);
|
|
239
|
+
clone.#tokenizer.reset(this.#tokenizer.getText());
|
|
240
|
+
this.copyStateTo(clone);
|
|
241
|
+
return clone;
|
|
242
|
+
}
|
|
243
|
+
resetSource() {
|
|
244
|
+
this.#tokenizer.reset("");
|
|
245
|
+
this.#trimLineCount = TRIM_LINE_COUNT;
|
|
246
|
+
}
|
|
247
|
+
releaseSource() {
|
|
248
|
+
this.#tokenizer.dispose();
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
//#endregion
|
|
252
|
+
//#region src/highlighter/backends/highlights.ts
|
|
253
|
+
/**
|
|
254
|
+
* Highlights uses bundled lexers. Unsupported and custom languages render as text.
|
|
255
|
+
*/
|
|
256
|
+
var HighlightsHighlighter = class extends DiffsHighlighter {
|
|
257
|
+
usedThemes = /* @__PURE__ */ new Map();
|
|
258
|
+
constructor() {
|
|
259
|
+
super("highlights", createDiffsThemeResolver("highlights"));
|
|
260
|
+
}
|
|
261
|
+
getTheme(name) {
|
|
262
|
+
this.assertNotDisposed();
|
|
263
|
+
const theme = this.themeResolver.getResolvedTheme(name) ?? this.usedThemes.get(name);
|
|
264
|
+
if (theme == null) throw new Error(`Theme "${name}" has not been resolved`);
|
|
265
|
+
this.usedThemes.set(name, theme);
|
|
266
|
+
return theme;
|
|
267
|
+
}
|
|
268
|
+
codeToTokens(code, options) {
|
|
269
|
+
this.assertNotDisposed();
|
|
270
|
+
return codeToTokens(code, this.resolveOptions(options));
|
|
271
|
+
}
|
|
272
|
+
createEditorTokenizer(options) {
|
|
273
|
+
this.assertNotDisposed();
|
|
274
|
+
return new HighlightsEditorTokenizer(options, (tokenizerOptions) => this.resolveOptions(tokenizerOptions));
|
|
275
|
+
}
|
|
276
|
+
createStreamTokenizer(options) {
|
|
277
|
+
return new HighlightsStreamTokenizer(this.resolveOptions(options));
|
|
278
|
+
}
|
|
279
|
+
loadLanguages() {
|
|
280
|
+
this.assertNotDisposed();
|
|
281
|
+
return Promise.resolve();
|
|
282
|
+
}
|
|
283
|
+
hasLoadedLanguages() {
|
|
284
|
+
return !this.disposed;
|
|
285
|
+
}
|
|
286
|
+
attachLanguages() {
|
|
287
|
+
this.assertNotDisposed();
|
|
288
|
+
}
|
|
289
|
+
releaseResources() {
|
|
290
|
+
this.usedThemes.clear();
|
|
291
|
+
}
|
|
292
|
+
resolveOptions({ theme, themes, ...options }) {
|
|
293
|
+
const lang = isSupportedLanguage(options.lang) ? options.lang : "text";
|
|
294
|
+
if (theme != null) return {
|
|
295
|
+
...options,
|
|
296
|
+
lang,
|
|
297
|
+
theme: this.getZedTheme(theme)
|
|
298
|
+
};
|
|
299
|
+
if (themes == null) throw new Error("A theme or themes option is required");
|
|
300
|
+
const resolved = {};
|
|
301
|
+
for (const [key, name] of Object.entries(themes)) resolved[key] = this.getZedTheme(name);
|
|
302
|
+
return {
|
|
303
|
+
...options,
|
|
304
|
+
lang,
|
|
305
|
+
themes: resolved
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
getZedTheme(name) {
|
|
309
|
+
const theme = this.getTheme(name);
|
|
310
|
+
if (theme.zed == null) throw new Error(`Theme "${name}" does not support Highlights`);
|
|
311
|
+
return theme.zed;
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
//#endregion
|
|
315
|
+
export { HighlightsHighlighter };
|
|
316
|
+
|
|
317
|
+
//# sourceMappingURL=highlights-sAHlxqlf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highlights-sAHlxqlf.js","names":[],"sources":["../../src/highlighter/highlights-editor.ts","../../src/highlighter/highlights-stream.ts","../../src/highlighter/backends/highlights.ts"],"sourcesContent":["import {\n type CodeToTokensOptions as HighlightsOptions,\n LiveTokenizer,\n type LiveTokenizerUpdate,\n} from '@pierre/highlights';\n\nimport type { TextDocumentChange } from '../editor/textDocument';\nimport type { HighlightedToken, RenderRange } from '../types';\nimport { formatCSSVariablePrefix } from '../utils/formatCSSVariablePrefix';\nimport type { DiffsEditorTokenizer } from './DiffsEditorTokenizer';\nimport type { DiffsEditorTokenizerOptions } from './tokenizer-types';\nimport type { CodeToTokensOptions } from './types';\n\nexport class HighlightsEditorTokenizer implements DiffsEditorTokenizer {\n #tokenizer: LiveTokenizer;\n #version: number;\n #disposed = false;\n // Delivering these lines through onDeferTokenize would patch them twice.\n #returnedRange: readonly [start: number, end: number] | undefined;\n // Flush, edit and reset resume the lexer; reads must restore this pause.\n #paused = false;\n // Defer callbacks during bracket matching to avoid re-entering the renderer.\n #capturedLines: Map<number, HighlightedToken[]> | undefined;\n #pendingDelivery: Map<number, HighlightedToken[]> | undefined;\n\n constructor(\n private readonly options: DiffsEditorTokenizerOptions,\n private readonly resolveOptions: (\n options: CodeToTokensOptions\n ) => HighlightsOptions\n ) {\n this.#version = options.textDocument.version;\n this.#tokenizer = this.#createTokenizer();\n }\n\n #createTokenizer(): LiveTokenizer {\n return new LiveTokenizer({\n ...this.resolveOptions({\n lang: this.options.textDocument.languageId,\n theme: this.options.theme,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeMaxLineLength: this.options.tokenizeMaxLineLength ?? 1000,\n }),\n code: this.options.textDocument.getText(),\n renderRange: [0, 0],\n onDeferTokenize: (lines) => this.#deliver(lines),\n });\n }\n\n #deliver(lines: Map<number, HighlightedToken[]>): void {\n const captured = this.#capturedLines;\n if (captured != null) {\n for (const [line, tokens] of lines) captured.set(line, tokens);\n return;\n }\n const range = this.#returnedRange;\n if (range != null) {\n for (const line of lines.keys()) {\n if (line >= range[0] && line < range[1]) lines.delete(line);\n }\n if (lines.size === 0) return;\n }\n this.options.onDeferTokenize(lines);\n }\n\n // Wait until bracket matching returns before patching rows. Edits, resets\n // and theme changes discard the batch because its tokens may be stale.\n #queueDelivery(lines: Map<number, HighlightedToken[]>): void {\n const pending = this.#pendingDelivery;\n if (pending != null) {\n for (const [line, tokens] of lines) pending.set(line, tokens);\n return;\n }\n this.#pendingDelivery = lines;\n queueMicrotask(() => {\n const batch = this.#pendingDelivery;\n this.#pendingDelivery = undefined;\n if (batch != null && batch.size > 0 && !this.#disposed)\n this.options.onDeferTokenize(batch);\n });\n }\n\n tokenize(\n change: TextDocumentChange,\n renderRange?: RenderRange,\n hostRealignsRows = false\n ): Map<number, HighlightedToken[]> {\n const document = this.options.textDocument;\n const start = Math.min(renderRange?.startingLine ?? 0, document.lineCount);\n const end = Math.min(\n start + (renderRange?.totalLines ?? Infinity),\n document.lineCount\n );\n const returnedStart = Math.max(start, change.startLine);\n // Edits, resets and flushes all resume the native background work.\n this.#paused = false;\n let lines: Map<number, HighlightedToken[]>;\n if (this.#version !== document.version) {\n this.#pendingDelivery = undefined;\n lines = this.#syncDocument(change, [start, end]).lines;\n this.#version = document.version;\n } else if (this.#tokenizer.lineCount !== document.lineCount) {\n this.#pendingDelivery = undefined;\n lines = this.#tokenizer.reset(document.getText(), {\n renderRange: [start, end],\n }).lines;\n } else {\n lines = new Map();\n this.#readLines(lines, returnedStart, end);\n if (this.#pendingDelivery != null) {\n for (const line of lines.keys()) this.#pendingDelivery.delete(line);\n }\n return lines;\n }\n // Balanced insert/delete batches shift rows without triggering host realignment.\n // Other structural edits need the suffix only when the host does not move rows.\n if (\n change.lineDelta === 0\n ? (change.changedLineChanges?.some(\n ([, , lineDelta]) => lineDelta !== 0\n ) ?? false)\n : !hostRealignsRows\n ) {\n this.#readLines(lines, returnedStart, end);\n }\n return lines;\n }\n\n // Reload the lexer document if edits were skipped or combined; applying\n // them to stale text can produce incorrect tokens or out-of-range reads.\n #syncDocument(\n change: TextDocumentChange,\n renderRange: readonly [start: number, end: number]\n ): LiveTokenizerUpdate {\n const document = this.options.textDocument;\n const options = { renderRange };\n if (\n Math.abs(document.version - this.#version) === 1 &&\n change.changes.length > 0 &&\n this.#tokenizer.lineCount === change.previousLineCount\n ) {\n try {\n const update = this.#tokenizer.applyEdits(\n change.changes.map(({ range, text }) => ({ range, newText: text })),\n options\n );\n if (this.#tokenizer.lineCount === document.lineCount) return update;\n } catch (error) {\n // Out-of-range edits require a reload; other errors must propagate.\n if (!(error instanceof RangeError)) throw error;\n }\n }\n return this.#tokenizer.reset(document.getText(), options);\n }\n\n // Flushing may complete lines outside [from, to); deliver those by callback.\n #readLines(\n lines: Map<number, HighlightedToken[]>,\n from: number,\n to: number\n ): void {\n this.#returnedRange = [from, to];\n try {\n this.#tokenizer.flush(to);\n } finally {\n this.#returnedRange = undefined;\n }\n for (let line = from; line < to; line++) {\n if (lines.has(line)) continue;\n const { tokens } = this.#tokenizer.getLineTokens(line);\n lines.set(\n line,\n tokens.length === 0\n ? [[0, '', '']]\n : tokens.map((token) => [\n token.offset,\n token.color ?? '',\n token.content,\n ])\n );\n }\n }\n\n setTheme(themeName: string): void {\n if (themeName === this.options.theme) return;\n this.options.theme = themeName;\n this.#tokenizer.dispose();\n this.#pendingDelivery = undefined;\n this.#paused = false;\n this.#version = this.options.textDocument.version;\n this.#tokenizer = this.#createTokenizer();\n }\n\n getStringCommentRegexpRangesInLine(\n lineIndex: number\n ): [number, number][] | null {\n const document = this.options.textDocument;\n if (\n this.options.matchBrackets === false ||\n lineIndex < 0 ||\n lineIndex >= document.lineCount\n )\n return null;\n // Reset and flush resume background work and invoke callbacks immediately.\n // Defer those callbacks and restore any pause before returning.\n const captured = new Map<number, HighlightedToken[]>();\n this.#capturedLines = captured;\n try {\n // Bracket matching can precede rendering. Record the reloaded version\n // so the next render does not apply the same edits again.\n if (\n this.#version !== document.version ||\n this.#tokenizer.lineCount !== document.lineCount\n ) {\n this.#pendingDelivery = undefined;\n this.#tokenizer.reset(document.getText(), {\n renderRange: [lineIndex, lineIndex + 1],\n });\n this.#version = document.version;\n }\n this.#tokenizer.flush(lineIndex + 1);\n } finally {\n this.#capturedLines = undefined;\n if (this.#paused) this.#tokenizer.pause();\n }\n if (captured.size > 0) this.#queueDelivery(captured);\n return this.#tokenizer.getLineTokens(lineIndex).bracketIgnoredRanges;\n }\n\n // Rendering calls this while background tokenization may be paused; do not resume it.\n prebuildStateStack(): void {}\n stopBackgroundTokenize(): void {\n this.pauseBackgroundTokenize();\n }\n pauseBackgroundTokenize(): void {\n this.#paused = true;\n this.#tokenizer.pause();\n }\n resumeBackgroundTokenize(): void {\n this.#paused = false;\n this.#tokenizer.resume();\n }\n dispose(): void {\n this.#disposed = true;\n this.#pendingDelivery = undefined;\n this.#tokenizer.dispose();\n }\n}\n","import { type CodeToTokensOptions, LiveTokenizer } from '@pierre/highlights';\n\nimport { appendItems } from '../utils/appendItems';\nimport { BaseStreamTokenizer } from './stream-tokenizer';\nimport type { ThemedToken } from './types';\n\n// Completed lines the tokenizer keeps before it tries to drop older ones.\nconst TRIM_LINE_COUNT = 1024;\nconst DOCUMENT_START = { line: 0, character: 0 };\n\n/** Keeps the unfinished line editable so new chunks can recall provisional tokens. */\nexport class HighlightsStreamTokenizer extends BaseStreamTokenizer {\n #tokenizer: LiveTokenizer;\n #trimLineCount = TRIM_LINE_COUNT;\n\n constructor(private readonly options: CodeToTokensOptions) {\n super();\n this.#tokenizer = new LiveTokenizer(options);\n }\n\n protected tokenizeChunk(\n chunk: string,\n stable: ThemedToken[]\n ): { unstable: ThemedToken[]; tailLength: number } {\n const lineBreaks = [...chunk.matchAll(/\\r\\n|\\r|\\n/g)];\n const startLine = this.#tokenizer.lineCount - 1;\n const position = {\n line: startLine,\n character: this.#tokenizer.getLineLength(startLine),\n };\n this.#tokenizer.applyEdits([\n { range: { start: position, end: position }, newText: chunk },\n ]);\n const lastLine = this.#tokenizer.lineCount - 1;\n let unstable: ThemedToken[] = [];\n for (let line = startLine; line <= lastLine; line++) {\n const { tokens } = this.#tokenizer.getLineTokens(line);\n for (const token of tokens) token.offset += this.stableOffset;\n if (line < lastLine) {\n appendItems(stable, tokens);\n this.pushLineBreak(\n stable,\n this.#tokenizer.getLineLength(line),\n lineBreaks[line - startLine][0]\n );\n } else {\n unstable = tokens;\n }\n }\n const tailLength = this.#tokenizer.getLineLength(lastLine);\n if (lastLine > this.#trimLineCount) {\n // Warning: keep the last completed line. Lexed from the initial state,\n // it must end in its old state, or the unfinished line would be lexed\n // from the wrong state; then restore the dropped lines.\n const text = this.#tokenizer.getText();\n const { lineChanges } = this.#tokenizer.applyEdits([\n {\n range: {\n start: DOCUMENT_START,\n end: { line: lastLine - 1, character: 0 },\n },\n newText: '',\n },\n ]);\n if (lineChanges.every((change) => change.newEndLine <= 1)) {\n this.#trimLineCount = TRIM_LINE_COUNT;\n } else {\n const keptLength = this.#tokenizer.getText().length;\n this.#tokenizer.applyEdits([\n {\n range: { start: DOCUMENT_START, end: DOCUMENT_START },\n newText: text.slice(0, text.length - keptLength),\n },\n ]);\n // Retry after the window doubles, such as inside a long comment.\n this.#trimLineCount = lastLine * 2;\n }\n }\n return { unstable, tailLength };\n }\n\n clone(): HighlightsStreamTokenizer {\n this.assertActive();\n const clone = new HighlightsStreamTokenizer(this.options);\n clone.#tokenizer.reset(this.#tokenizer.getText());\n this.copyStateTo(clone);\n return clone;\n }\n\n protected resetSource(): void {\n this.#tokenizer.reset('');\n this.#trimLineCount = TRIM_LINE_COUNT;\n }\n\n protected releaseSource(): void {\n this.#tokenizer.dispose();\n }\n}\n","import {\n codeToTokens,\n type CodeToTokensOptions as HighlightsOptions,\n isSupportedLanguage,\n type Theme,\n} from '@pierre/highlights';\n\nimport { DiffsHighlighter } from '../DiffsHighlighter';\nimport { HighlightsEditorTokenizer } from '../highlights-editor';\nimport { HighlightsStreamTokenizer } from '../highlights-stream';\nimport { createDiffsThemeResolver } from '../themes/themeResolver';\nimport type { DiffsTheme } from '../themes/types';\nimport type {\n DiffsEditorTokenizerOptions,\n DiffsStreamTokenizer,\n} from '../tokenizer-types';\nimport type { CodeToTokensOptions, TokensResult } from '../types';\n\n/**\n * Highlights uses bundled lexers. Unsupported and custom languages render as text.\n */\nexport class HighlightsHighlighter extends DiffsHighlighter {\n // Independent instances need their themes after the shared cache is cleared.\n private readonly usedThemes = new Map<string, DiffsTheme>();\n\n constructor() {\n super('highlights', createDiffsThemeResolver('highlights'));\n }\n\n getTheme(name: string): DiffsTheme {\n this.assertNotDisposed();\n const theme =\n this.themeResolver.getResolvedTheme(name) ?? this.usedThemes.get(name);\n if (theme == null) {\n throw new Error(`Theme \"${name}\" has not been resolved`);\n }\n this.usedThemes.set(name, theme);\n return theme;\n }\n\n codeToTokens(code: string, options: CodeToTokensOptions): TokensResult {\n this.assertNotDisposed();\n // Warning: use the library's shared Wasm instance. It replaces instances\n // above 8 MiB; a private instance keeps its peak memory.\n return codeToTokens(code, this.resolveOptions(options));\n }\n\n createEditorTokenizer(\n options: DiffsEditorTokenizerOptions\n ): HighlightsEditorTokenizer {\n this.assertNotDisposed();\n return new HighlightsEditorTokenizer(options, (tokenizerOptions) =>\n this.resolveOptions(tokenizerOptions)\n );\n }\n\n createStreamTokenizer(options: CodeToTokensOptions): DiffsStreamTokenizer {\n return new HighlightsStreamTokenizer(this.resolveOptions(options));\n }\n\n loadLanguages(): Promise<void> {\n this.assertNotDisposed();\n return Promise.resolve();\n }\n\n hasLoadedLanguages(): boolean {\n return !this.disposed;\n }\n\n attachLanguages(): void {\n this.assertNotDisposed();\n }\n\n protected releaseResources(): void {\n this.usedThemes.clear();\n }\n\n // Omit the unused theme key; callers may pass both keys with one undefined.\n private resolveOptions({\n theme,\n themes,\n ...options\n }: CodeToTokensOptions): HighlightsOptions {\n const lang = isSupportedLanguage(options.lang) ? options.lang : 'text';\n if (theme != null) {\n return { ...options, lang, theme: this.getZedTheme(theme) };\n }\n if (themes == null) {\n throw new Error('A theme or themes option is required');\n }\n const resolved: Record<string, Theme> = {};\n for (const [key, name] of Object.entries(themes)) {\n resolved[key] = this.getZedTheme(name);\n }\n return { ...options, lang, themes: resolved };\n }\n\n private getZedTheme(name: string): Theme {\n const theme = this.getTheme(name);\n if (theme.zed == null) {\n throw new Error(`Theme \"${name}\" does not support Highlights`);\n }\n return theme.zed;\n }\n}\n"],"mappings":"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"}
|
package/dist/worker/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { WorkerPoolTaskCanceledError, WorkerPoolTerminatedError, WorkerPoolWorkerError, isHandledWorkerPoolError, isWorkerPoolCancellation } from "./errors.js";
|
|
2
1
|
import { AllWorkerTasks, DiffRendererInstance, FileRendererInstance, InitializeSuccessResponse, InitializeWorkerRequest, InitializeWorkerTask, RegisterThemeSuccessResponse, RenderDiffRequest, RenderDiffSuccessResponse, RenderDiffTask, RenderErrorResponse, RenderFileRequest, RenderFileSuccessResponse, RenderFileTask, RenderSuccessResponse, RenderTaskCallbacks, ResolvedLanguage, SetRenderOptionsWorkerRequest, SetRenderOptionsWorkerTask, SubmitRequest, WorkerInitializationRenderOptions, WorkerPoolOptions, WorkerRenderingOptions, WorkerRequest, WorkerRequestId, WorkerResponse, WorkerStats } from "./types.js";
|
|
2
|
+
import { WorkerPoolTaskCanceledError, WorkerPoolTerminatedError, WorkerPoolWorkerError, isHandledWorkerPoolError, isWorkerPoolCancellation } from "./errors.js";
|
|
3
3
|
import { WorkerPoolManager } from "./WorkerPoolManager.js";
|
|
4
4
|
import { SetupWorkerPoolProps, getOrCreateWorkerPoolSingleton, terminateWorkerPoolSingleton } from "./getOrCreateWorkerPoolSingleton.js";
|
|
5
5
|
export { AllWorkerTasks, DiffRendererInstance, FileRendererInstance, InitializeSuccessResponse, InitializeWorkerRequest, InitializeWorkerTask, RegisterThemeSuccessResponse, RenderDiffRequest, RenderDiffSuccessResponse, RenderDiffTask, RenderErrorResponse, RenderFileRequest, RenderFileSuccessResponse, RenderFileTask, RenderSuccessResponse, RenderTaskCallbacks, ResolvedLanguage, SetRenderOptionsWorkerRequest, SetRenderOptionsWorkerTask, SetupWorkerPoolProps, SubmitRequest, WorkerInitializationRenderOptions, WorkerPoolManager, WorkerPoolOptions, WorkerPoolTaskCanceledError, WorkerPoolTerminatedError, WorkerPoolWorkerError, WorkerRenderingOptions, WorkerRequest, WorkerRequestId, WorkerResponse, WorkerStats, getOrCreateWorkerPoolSingleton, isHandledWorkerPoolError, isWorkerPoolCancellation, terminateWorkerPoolSingleton };
|