Skip to content

Commit 848fbfa

Browse files
committed
More human-friendly for external text expanded editors
1 parent 0dc515e commit 848fbfa

File tree

4 files changed

+58
-26
lines changed

4 files changed

+58
-26
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
- Support for opened files without active workspaces
66

7+
### Changed
8+
- Made text expansion editor's title human-friendly
9+
710
### Fixed
811

912
- Sometimes leading newlines would be inserted when switching back to a file with running sessions

src/extension/providers/JudgeViewProvider.ts

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,9 +1428,15 @@ export default class extends BaseViewProvider<typeof ProviderMessageSchema, Webv
14281428
if (!testcase) {
14291429
return;
14301430
}
1431-
const stdout = ReadonlyStringProvider.createUri(`OUTPUT:\n\n${testcase.stdout.data}`);
1431+
const stdout = ReadonlyStringProvider.createUri(
1432+
`OUTPUT:\n\n${testcase.stdout.data}`,
1433+
`Output`,
1434+
testcase.uuid
1435+
);
14321436
const acStdout = ReadonlyStringProvider.createUri(
1433-
`ACCEPTED OUTPUT:\n\n${testcase.acceptedStdout.data}`
1437+
`ACCEPTED OUTPUT:\n\n${testcase.acceptedStdout.data}`,
1438+
`Accepted Output`,
1439+
testcase.uuid
14341440
);
14351441

14361442
vscode.commands.executeCommand("vscode.diff", stdout, acStdout, `Diff: Testcase ${uuid}`);
@@ -1442,29 +1448,38 @@ export default class extends BaseViewProvider<typeof ProviderMessageSchema, Webv
14421448
return;
14431449
}
14441450

1451+
const titleByStdio: Record<Stdio, string> = {
1452+
STDIN: "Input",
1453+
STDERR: "Error",
1454+
STDOUT: "Output",
1455+
ACCEPTED_STDOUT: "Accepted Output",
1456+
INTERACTOR_SECRET: "Interactor Secret",
1457+
};
1458+
const title = `${titleByStdio[stdio]}: ${testcase.uuid}`;
1459+
14451460
switch (stdio) {
14461461
case "STDIN":
1447-
void openInNewEditor(testcase.stdin.data);
1462+
void openInNewEditor(testcase.stdin.data, title, testcase.uuid);
14481463
break;
14491464
case "STDERR":
14501465
if (testcase.status === "CE") {
1451-
void openInTerminalTab(testcase.stderr.data, "Compilation Error");
1466+
void openInTerminalTab(testcase.stderr.data, title);
14521467
} else {
1453-
void openInNewEditor(testcase.stderr.data);
1468+
void openInNewEditor(testcase.stderr.data, title, testcase.uuid);
14541469
}
14551470
break;
14561471
case "STDOUT":
14571472
if (testcase.status === "CE") {
1458-
void openInTerminalTab(testcase.stdout.data, "Compilation Output");
1473+
void openInTerminalTab(testcase.stdout.data, title);
14591474
} else {
1460-
void openInNewEditor(testcase.stdout.data);
1475+
void openInNewEditor(testcase.stdout.data, title, testcase.uuid);
14611476
}
14621477
break;
14631478
case "ACCEPTED_STDOUT":
1464-
void openInNewEditor(testcase.acceptedStdout.data);
1479+
void openInNewEditor(testcase.acceptedStdout.data, title, testcase.uuid);
14651480
break;
14661481
case "INTERACTOR_SECRET":
1467-
void openInNewEditor(testcase.interactorSecret.data);
1482+
void openInNewEditor(testcase.interactorSecret.data, title, testcase.uuid);
14681483
break;
14691484
}
14701485
}

src/extension/providers/StressViewProvider.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -587,22 +587,23 @@ export default class extends BaseViewProvider<typeof ProviderMessageSchema, Webv
587587
const ctx = this._currentContext;
588588
if (!ctx) return;
589589
const state = ctx.state.find((s) => s.state === id);
590-
591590
if (!state) {
592591
return;
593592
}
593+
594+
const title = `${this._currentFile}: ${id}`;
594595
switch (stdio) {
595596
case "STDIN":
596-
void openInNewEditor(state.stdin.data);
597+
void openInNewEditor(state.stdin.data, title, id);
597598
break;
598599
case "STDOUT":
599-
void openInNewEditor(state.stdout.data);
600+
void openInNewEditor(state.stdout.data, title, id);
600601
break;
601602
case "STDERR":
602603
if (state.status === "CE") {
603-
void openInTerminalTab(state.stderr.data, "Compilation Error");
604+
void openInTerminalTab(state.stderr.data, title);
604605
} else {
605-
void openInNewEditor(state.stderr.data);
606+
void openInNewEditor(state.stderr.data, title, id);
606607
}
607608
break;
608609
}

src/extension/utils/vscode.ts

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -190,32 +190,45 @@ export async function getDefaultBuildTaskName() {
190190
export class ReadonlyStringProvider implements vscode.TextDocumentContentProvider {
191191
static SCHEME = "fastolympiccoding";
192192
private static _contents = new Map<string, string>();
193-
private static _nextId = 0;
194193

195-
static createUri(content: string): vscode.Uri {
196-
const id = (this._nextId++).toString();
194+
private static _buildId(uuid: string, title: string): string {
195+
return `${uuid}:${title}`;
196+
}
197+
198+
static createUri(content: string, title: string, uuid: string): vscode.Uri {
199+
const id = this._buildId(uuid, title);
197200
this._contents.set(id, content);
198-
return vscode.Uri.parse(`${this.SCHEME}:/data-${id}`);
201+
return vscode.Uri.from({
202+
scheme: this.SCHEME,
203+
path: `${title}`,
204+
query: `id=${encodeURIComponent(id)}`,
205+
});
199206
}
200207

201208
static cleanup(uri: vscode.Uri): void {
202209
if (uri.scheme === this.SCHEME) {
203-
const id = uri.path.replace(/^\/data-/, "");
204-
this._contents.delete(id);
210+
const id = new URLSearchParams(uri.query).get("id");
211+
if (id) {
212+
this._contents.delete(id);
213+
}
205214
}
206215
}
207216

208217
provideTextDocumentContent(uri: vscode.Uri): vscode.ProviderResult<string> {
209-
const id = uri.path.replace(/^\/data-/, "");
210-
return ReadonlyStringProvider._contents.get(id);
218+
const id = new URLSearchParams(uri.query).get("id");
219+
return id ? ReadonlyStringProvider._contents.get(id) : undefined;
211220
}
212221
}
213222

214223
/**
215224
* Opens content in a read-only text document.
216225
*/
217-
export async function openInNewEditor(content: string): Promise<void> {
218-
const uri = ReadonlyStringProvider.createUri(content);
226+
export async function openInNewEditor(
227+
content: string,
228+
textType: string,
229+
uuid: string
230+
): Promise<void> {
231+
const uri = ReadonlyStringProvider.createUri(content, textType, uuid);
219232
const document = await vscode.workspace.openTextDocument(uri);
220233
vscode.window.showTextDocument(document);
221234
}
@@ -224,10 +237,10 @@ export async function openInNewEditor(content: string): Promise<void> {
224237
* Opens content in a read-only terminal tab (using VS Code's native terminal).
225238
* This supports ANSI colors and native clickable file links.
226239
*/
227-
export function openInTerminalTab(content: string, title: string = "Output") {
240+
export function openInTerminalTab(content: string, name: string) {
228241
const pty = new ReadonlyTerminal(content);
229242
const terminal = vscode.window.createTerminal({
230-
name: title,
243+
name,
231244
pty,
232245
location: vscode.TerminalLocation.Editor,
233246
});

0 commit comments

Comments
 (0)