Skip to content

Commit 6d5e85f

Browse files
Copilotkv9898
andcommitted
Fix math formula color detection with autoDetectColorScheme
- Add notification system to send actual theme kind from VS Code to LSP - Track active color theme kind in LSP ConfigurationManager - Send theme notifications on startup and when theme changes - Use actual theme kind instead of parsing theme name Co-authored-by: kv9898 <[email protected]>
1 parent 5452f21 commit 6d5e85f

File tree

4 files changed

+87
-3
lines changed

4 files changed

+87
-3
lines changed

apps/lsp/src/config.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ export class ConfigurationManager extends Disposable {
136136

137137
private _settings: Settings;
138138
private _logger: ILogger;
139+
private _activeColorThemeKind: "light" | "dark" = "dark";
139140

140141
constructor(
141142
private readonly connection_: Connection,
@@ -177,6 +178,13 @@ export class ConfigurationManager extends Disposable {
177178
}
178179
}
179180
};
181+
182+
// Fallback: try to detect theme from name if we haven't received an explicit notification yet
183+
// This is a best-effort approach for compatibility, but won't work with autoDetectColorScheme
184+
if (settings.workbench.colorTheme.includes("Light")) {
185+
this._activeColorThemeKind = "light";
186+
}
187+
180188
this._onDidChangeConfiguration.fire(this._settings);
181189
}
182190

@@ -202,6 +210,15 @@ export class ConfigurationManager extends Disposable {
202210
public getSettings(): Settings {
203211
return this._settings;
204212
}
213+
214+
public setActiveColorThemeKind(kind: "light" | "dark") {
215+
this._activeColorThemeKind = kind;
216+
this._onDidChangeConfiguration.fire(this._settings);
217+
}
218+
219+
public getActiveColorThemeKind(): "light" | "dark" {
220+
return this._activeColorThemeKind;
221+
}
205222
}
206223

207224
export function lsConfiguration(configManager: ConfigurationManager): LsConfiguration {
@@ -226,8 +243,7 @@ export function lsConfiguration(configManager: ConfigurationManager): LsConfigur
226243
}
227244
},
228245
get colorTheme(): "light" | "dark" {
229-
const settings = configManager.getSettings();
230-
return settings.workbench.colorTheme.includes("Light") ? "light" : "dark";
246+
return configManager.getActiveColorThemeKind();
231247
},
232248
get mathjaxScale(): number {
233249
return configManager.getSettings().quarto.mathjax.scale;

apps/lsp/src/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,12 @@ connection.onInitialized(async () => {
224224
logger.setConfigurationManager(configManager);
225225
}
226226

227+
// listen for color theme changes from the client
228+
connection.onNotification("quarto/didChangeActiveColorTheme", (params: { kind: "light" | "dark" }) => {
229+
logger.logNotification('didChangeActiveColorTheme');
230+
configManager.setActiveColorThemeKind(params.kind);
231+
});
232+
227233
// initialize connection to quarto
228234
const workspaceFolders = await connection.workspace.getWorkspaceFolders();
229235
const workspaceDir = workspaceFolders?.length
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// vite.config.ts
2+
import path from "path";
3+
import { defineConfig, normalizePath } from "file:///home/runner/work/quarto/quarto/node_modules/vite/dist/node/index.js";
4+
import { viteStaticCopy } from "file:///home/runner/work/quarto/quarto/node_modules/vite-plugin-static-copy/dist/index.js";
5+
var __vite_injected_original_dirname = "/home/runner/work/quarto/quarto/apps/vscode-editor";
6+
var vite_config_default = defineConfig((env) => {
7+
const dev = env.mode === "development";
8+
return {
9+
define: {
10+
"process.env.DEBUG": '""',
11+
"process.env.NODE_ENV": '"production"',
12+
"process.env.TERM": '""',
13+
"process.platform": '""'
14+
},
15+
plugins: [
16+
viteStaticCopy({
17+
targets: [
18+
{
19+
src: normalizePath(path.resolve(__vite_injected_original_dirname, "./dist/*")),
20+
dest: normalizePath(path.resolve(__vite_injected_original_dirname, "../vscode/assets/www/editor"))
21+
}
22+
]
23+
})
24+
],
25+
build: {
26+
watch: dev ? {} : null,
27+
lib: {
28+
entry: "src/index.tsx",
29+
formats: ["umd"],
30+
name: "QuartoVisualEditor",
31+
fileName: () => "index.js"
32+
},
33+
rollupOptions: {
34+
external: ["vscode-webview"]
35+
},
36+
sourcemap: dev ? "inline" : false
37+
}
38+
};
39+
});
40+
export {
41+
vite_config_default as default
42+
};
43+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvaG9tZS9ydW5uZXIvd29yay9xdWFydG8vcXVhcnRvL2FwcHMvdnNjb2RlLWVkaXRvclwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL2hvbWUvcnVubmVyL3dvcmsvcXVhcnRvL3F1YXJ0by9hcHBzL3ZzY29kZS1lZGl0b3Ivdml0ZS5jb25maWcudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL2hvbWUvcnVubmVyL3dvcmsvcXVhcnRvL3F1YXJ0by9hcHBzL3ZzY29kZS1lZGl0b3Ivdml0ZS5jb25maWcudHNcIjtpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgZGVmaW5lQ29uZmlnLCBub3JtYWxpemVQYXRoIH0gZnJvbSAndml0ZSdcbmltcG9ydCB7IHZpdGVTdGF0aWNDb3B5IH0gZnJvbSAndml0ZS1wbHVnaW4tc3RhdGljLWNvcHknXG5cblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKGVudiA9PiB7XG4gIFxuICBjb25zdCBkZXYgPSBlbnYubW9kZSA9PT0gXCJkZXZlbG9wbWVudFwiO1xuXG4gIHJldHVybiB7XG4gICAgZGVmaW5lOiB7XG4gICAgICAncHJvY2Vzcy5lbnYuREVCVUcnOiAnXCJcIicsXG4gICAgICAncHJvY2Vzcy5lbnYuTk9ERV9FTlYnOiAnXCJwcm9kdWN0aW9uXCInLFxuICAgICAgJ3Byb2Nlc3MuZW52LlRFUk0nOiAnXCJcIicsXG4gICAgICAncHJvY2Vzcy5wbGF0Zm9ybSc6ICdcIlwiJ1xuICAgIH0sXG4gICAgcGx1Z2luczogW1xuICAgICAgdml0ZVN0YXRpY0NvcHkoe1xuICAgICAgICB0YXJnZXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3JjOiBub3JtYWxpemVQYXRoKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL2Rpc3QvKicpKSxcbiAgICAgICAgICAgIGRlc3Q6IG5vcm1hbGl6ZVBhdGgocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uL3ZzY29kZS9hc3NldHMvd3d3L2VkaXRvcicpKVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSlcbiAgICBdLFxuICAgIGJ1aWxkOiB7XG4gICAgICB3YXRjaDogZGV2ID8ge30gOiBudWxsLFxuICAgICAgbGliOiB7XG4gICAgICAgIGVudHJ5OiAnc3JjL2luZGV4LnRzeCcsXG4gICAgICAgIGZvcm1hdHM6IFsndW1kJ10sXG4gICAgICAgIG5hbWU6IFwiUXVhcnRvVmlzdWFsRWRpdG9yXCIsXG4gICAgICAgIGZpbGVOYW1lOiAoKSA9PiAnaW5kZXguanMnIFxuICAgICAgfSxcbiAgICAgIHJvbGx1cE9wdGlvbnM6IHtcbiAgICAgICAgZXh0ZXJuYWw6IFsndnNjb2RlLXdlYnZpZXcnXSxcbiAgICAgIH0sXG4gICAgICBzb3VyY2VtYXA6IGRldiA/ICdpbmxpbmUnIDogZmFsc2VcbiAgICB9XG4gIH07XG4gXG59KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBd1UsT0FBTyxVQUFVO0FBQ3pWLFNBQVMsY0FBYyxxQkFBcUI7QUFDNUMsU0FBUyxzQkFBc0I7QUFGL0IsSUFBTSxtQ0FBbUM7QUFLekMsSUFBTyxzQkFBUSxhQUFhLFNBQU87QUFFakMsUUFBTSxNQUFNLElBQUksU0FBUztBQUV6QixTQUFPO0FBQUEsSUFDTCxRQUFRO0FBQUEsTUFDTixxQkFBcUI7QUFBQSxNQUNyQix3QkFBd0I7QUFBQSxNQUN4QixvQkFBb0I7QUFBQSxNQUNwQixvQkFBb0I7QUFBQSxJQUN0QjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsZUFBZTtBQUFBLFFBQ2IsU0FBUztBQUFBLFVBQ1A7QUFBQSxZQUNFLEtBQUssY0FBYyxLQUFLLFFBQVEsa0NBQVcsVUFBVSxDQUFDO0FBQUEsWUFDdEQsTUFBTSxjQUFjLEtBQUssUUFBUSxrQ0FBVyw2QkFBNkIsQ0FBQztBQUFBLFVBQzVFO0FBQUEsUUFDRjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUNBLE9BQU87QUFBQSxNQUNMLE9BQU8sTUFBTSxDQUFDLElBQUk7QUFBQSxNQUNsQixLQUFLO0FBQUEsUUFDSCxPQUFPO0FBQUEsUUFDUCxTQUFTLENBQUMsS0FBSztBQUFBLFFBQ2YsTUFBTTtBQUFBLFFBQ04sVUFBVSxNQUFNO0FBQUEsTUFDbEI7QUFBQSxNQUNBLGVBQWU7QUFBQSxRQUNiLFVBQVUsQ0FBQyxnQkFBZ0I7QUFBQSxNQUM3QjtBQUFBLE1BQ0EsV0FBVyxNQUFNLFdBQVc7QUFBQSxJQUM5QjtBQUFBLEVBQ0Y7QUFFRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=

apps/vscode/src/lsp/client.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ import {
2424
Definition,
2525
LogOutputChannel,
2626
Uri,
27-
Diagnostic
27+
Diagnostic,
28+
window,
29+
ColorThemeKind
2830
} from "vscode";
2931
import {
3032
LanguageClient,
@@ -151,12 +153,29 @@ export async function activateLsp(
151153
clientOptions
152154
);
153155

156+
// Helper to send current theme to LSP server
157+
const sendThemeNotification = () => {
158+
if (client) {
159+
const kind = window.activeColorTheme.kind === ColorThemeKind.Light ? "light" : "dark";
160+
client.sendNotification("quarto/didChangeActiveColorTheme", { kind });
161+
}
162+
};
163+
164+
// Listen for theme changes and notify the server
165+
context.subscriptions.push(
166+
window.onDidChangeActiveColorTheme(() => {
167+
sendThemeNotification();
168+
})
169+
);
170+
154171
// return once the server is running
155172
return new Promise<LanguageClient>((resolve, reject) => {
156173

157174
const handler = client.onDidChangeState(e => {
158175
if (e.newState === State.Running) {
159176
handler.dispose();
177+
// Send initial theme on startup
178+
sendThemeNotification();
160179
resolve(client);
161180
} else if (e.newState === State.Stopped) {
162181
reject(new Error("Failed to start Quarto LSP Server"));

0 commit comments

Comments
 (0)