@theia/output 1.71.0-next.49 → 1.71.0-next.57

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.
@@ -0,0 +1,26 @@
1
+ export interface AnsiState {
2
+ foreground?: string;
3
+ background?: string;
4
+ bold?: boolean;
5
+ italic?: boolean;
6
+ underline?: boolean;
7
+ }
8
+ export interface AnsiSegment {
9
+ start: number;
10
+ end: number;
11
+ cssClasses: string;
12
+ }
13
+ export interface AnsiParseResult {
14
+ strippedText: string;
15
+ segments: AnsiSegment[];
16
+ state: AnsiState;
17
+ }
18
+ /**
19
+ * Parse ANSI escape codes from text, strip them, and return decoration segments.
20
+ *
21
+ * @param text The raw text potentially containing ANSI escape codes
22
+ * @param initialState The ANSI state carried over from a previous parse call
23
+ * @returns The stripped text, decoration segments, and the final ANSI state
24
+ */
25
+ export declare function parseAnsi(text: string, initialState?: AnsiState): AnsiParseResult;
26
+ //# sourceMappingURL=output-ansi-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-ansi-parser.d.ts","sourceRoot":"","sources":["../../src/browser/output-ansi-parser.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,SAAS;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,SAAS,CAAC;CACpB;AA4DD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,GAAE,SAAc,GAAG,eAAe,CA4CrF"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2025 TypeFox and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.parseAnsi = parseAnsi;
19
+ /**
20
+ * Lightweight ANSI escape code parser for the Output view.
21
+ *
22
+ * Parses ANSI SGR (Select Graphic Rendition) sequences from text,
23
+ * strips them, and returns decoration segments with CSS class names
24
+ * matching the existing `ansi.css` classes from `@theia/core`.
25
+ */
26
+ const FOREGROUND_COLORS = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'];
27
+ // Matches ANSI escape sequences: ESC[ ... m (SGR) and other CSI sequences
28
+ const ANSI_ESCAPE_RE = /\x1b\[[0-9;]*m/g;
29
+ function getCssClasses(state) {
30
+ const classes = [];
31
+ if (state.foreground) {
32
+ classes.push(state.foreground);
33
+ }
34
+ if (state.background) {
35
+ classes.push(state.background);
36
+ }
37
+ if (state.bold) {
38
+ classes.push('ansi-bold');
39
+ }
40
+ if (state.italic) {
41
+ classes.push('ansi-italic');
42
+ }
43
+ if (state.underline) {
44
+ classes.push('ansi-underline');
45
+ }
46
+ return classes.join(' ');
47
+ }
48
+ function applyAnsiCode(code, state) {
49
+ if (code === 0) {
50
+ // Reset all
51
+ state.foreground = undefined;
52
+ state.background = undefined;
53
+ state.bold = undefined;
54
+ state.italic = undefined;
55
+ state.underline = undefined;
56
+ }
57
+ else if (code === 1) {
58
+ state.bold = true;
59
+ }
60
+ else if (code === 3) {
61
+ state.italic = true;
62
+ }
63
+ else if (code === 4) {
64
+ state.underline = true;
65
+ }
66
+ else if (code === 22) {
67
+ state.bold = undefined;
68
+ }
69
+ else if (code === 23) {
70
+ state.italic = undefined;
71
+ }
72
+ else if (code === 24) {
73
+ state.underline = undefined;
74
+ }
75
+ else if (code >= 30 && code <= 37) {
76
+ state.foreground = `ansi-${FOREGROUND_COLORS[code - 30]}-fg`;
77
+ }
78
+ else if (code === 39) {
79
+ state.foreground = undefined;
80
+ }
81
+ else if (code >= 40 && code <= 47) {
82
+ state.background = `ansi-${FOREGROUND_COLORS[code - 40]}-bg`;
83
+ }
84
+ else if (code === 49) {
85
+ state.background = undefined;
86
+ }
87
+ else if (code >= 90 && code <= 97) {
88
+ state.foreground = `ansi-bright-${FOREGROUND_COLORS[code - 90]}-fg`;
89
+ }
90
+ else if (code >= 100 && code <= 107) {
91
+ state.background = `ansi-bright-${FOREGROUND_COLORS[code - 100]}-bg`;
92
+ }
93
+ }
94
+ /**
95
+ * Parse ANSI escape codes from text, strip them, and return decoration segments.
96
+ *
97
+ * @param text The raw text potentially containing ANSI escape codes
98
+ * @param initialState The ANSI state carried over from a previous parse call
99
+ * @returns The stripped text, decoration segments, and the final ANSI state
100
+ */
101
+ function parseAnsi(text, initialState = {}) {
102
+ const state = { ...initialState };
103
+ const segments = [];
104
+ let strippedText = '';
105
+ let lastIndex = 0;
106
+ let currentSegmentStart = 0;
107
+ let currentClasses = getCssClasses(state);
108
+ ANSI_ESCAPE_RE.lastIndex = 0;
109
+ let match;
110
+ while ((match = ANSI_ESCAPE_RE.exec(text) ?? undefined) !== undefined) {
111
+ // Append text before this escape sequence
112
+ const textBefore = text.substring(lastIndex, match.index);
113
+ strippedText += textBefore;
114
+ // If we had an active style and there's text, the segment continues
115
+ // Now process the escape sequence to potentially change state
116
+ const escapeContent = match[0].slice(2, -1); // Strip ESC[ and m
117
+ const codes = escapeContent.length === 0 ? [0] : escapeContent.split(';').map(Number);
118
+ // Before changing state, close current segment if there's styled text
119
+ const newOffset = strippedText.length;
120
+ if (currentClasses && newOffset > currentSegmentStart) {
121
+ segments.push({ start: currentSegmentStart, end: newOffset, cssClasses: currentClasses });
122
+ }
123
+ for (const code of codes) {
124
+ applyAnsiCode(code, state);
125
+ }
126
+ currentClasses = getCssClasses(state);
127
+ currentSegmentStart = newOffset;
128
+ lastIndex = match.index + match[0].length;
129
+ }
130
+ // Append remaining text after last escape sequence
131
+ strippedText += text.substring(lastIndex);
132
+ // Close final segment if there's styled text remaining
133
+ if (currentClasses && strippedText.length > currentSegmentStart) {
134
+ segments.push({ start: currentSegmentStart, end: strippedText.length, cssClasses: currentClasses });
135
+ }
136
+ return { strippedText, segments, state };
137
+ }
138
+ //# sourceMappingURL=output-ansi-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-ansi-parser.js","sourceRoot":"","sources":["../../src/browser/output-ansi-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=output-ansi-parser.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-ansi-parser.spec.d.ts","sourceRoot":"","sources":["../../src/browser/output-ansi-parser.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2025 TypeFox and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const chai_1 = require("chai");
19
+ const output_ansi_parser_1 = require("./output-ansi-parser");
20
+ describe('Output ANSI Parser', () => {
21
+ it('should return plain text unchanged', () => {
22
+ const result = (0, output_ansi_parser_1.parseAnsi)('hello world');
23
+ (0, chai_1.expect)(result.strippedText).to.equal('hello world');
24
+ (0, chai_1.expect)(result.segments).to.be.empty;
25
+ });
26
+ it('should strip ANSI codes and return stripped text', () => {
27
+ const result = (0, output_ansi_parser_1.parseAnsi)('\x1b[31mhello\x1b[0m world');
28
+ (0, chai_1.expect)(result.strippedText).to.equal('hello world');
29
+ });
30
+ it('should produce a segment for foreground color', () => {
31
+ const result = (0, output_ansi_parser_1.parseAnsi)('\x1b[31mred text\x1b[0m');
32
+ (0, chai_1.expect)(result.strippedText).to.equal('red text');
33
+ (0, chai_1.expect)(result.segments).to.have.length(1);
34
+ (0, chai_1.expect)(result.segments[0]).to.deep.equal({
35
+ start: 0,
36
+ end: 8,
37
+ cssClasses: 'ansi-red-fg'
38
+ });
39
+ });
40
+ it('should handle multiple colors', () => {
41
+ const result = (0, output_ansi_parser_1.parseAnsi)('\x1b[31mred\x1b[32mgreen\x1b[0m');
42
+ (0, chai_1.expect)(result.strippedText).to.equal('redgreen');
43
+ (0, chai_1.expect)(result.segments).to.have.length(2);
44
+ (0, chai_1.expect)(result.segments[0]).to.deep.equal({ start: 0, end: 3, cssClasses: 'ansi-red-fg' });
45
+ (0, chai_1.expect)(result.segments[1]).to.deep.equal({ start: 3, end: 8, cssClasses: 'ansi-green-fg' });
46
+ });
47
+ it('should handle bright foreground colors', () => {
48
+ const result = (0, output_ansi_parser_1.parseAnsi)('\x1b[91mbright red\x1b[0m');
49
+ (0, chai_1.expect)(result.strippedText).to.equal('bright red');
50
+ (0, chai_1.expect)(result.segments).to.have.length(1);
51
+ (0, chai_1.expect)(result.segments[0].cssClasses).to.equal('ansi-bright-red-fg');
52
+ });
53
+ it('should handle background colors', () => {
54
+ const result = (0, output_ansi_parser_1.parseAnsi)('\x1b[41mred bg\x1b[0m');
55
+ (0, chai_1.expect)(result.strippedText).to.equal('red bg');
56
+ (0, chai_1.expect)(result.segments).to.have.length(1);
57
+ (0, chai_1.expect)(result.segments[0].cssClasses).to.equal('ansi-red-bg');
58
+ });
59
+ it('should handle combined foreground and background', () => {
60
+ const result = (0, output_ansi_parser_1.parseAnsi)('\x1b[31;42mred on green\x1b[0m');
61
+ (0, chai_1.expect)(result.strippedText).to.equal('red on green');
62
+ (0, chai_1.expect)(result.segments).to.have.length(1);
63
+ (0, chai_1.expect)(result.segments[0].cssClasses).to.equal('ansi-red-fg ansi-green-bg');
64
+ });
65
+ it('should handle bold, italic, and underline', () => {
66
+ const result = (0, output_ansi_parser_1.parseAnsi)('\x1b[1mbold\x1b[0m \x1b[3mitalic\x1b[0m \x1b[4munderline\x1b[0m');
67
+ (0, chai_1.expect)(result.strippedText).to.equal('bold italic underline');
68
+ (0, chai_1.expect)(result.segments).to.have.length(3);
69
+ (0, chai_1.expect)(result.segments[0].cssClasses).to.equal('ansi-bold');
70
+ (0, chai_1.expect)(result.segments[1].cssClasses).to.equal('ansi-italic');
71
+ (0, chai_1.expect)(result.segments[2].cssClasses).to.equal('ansi-underline');
72
+ });
73
+ it('should handle combined styles with color', () => {
74
+ const result = (0, output_ansi_parser_1.parseAnsi)('\x1b[1;31mbold red\x1b[0m');
75
+ (0, chai_1.expect)(result.strippedText).to.equal('bold red');
76
+ (0, chai_1.expect)(result.segments).to.have.length(1);
77
+ (0, chai_1.expect)(result.segments[0].cssClasses).to.equal('ansi-red-fg ansi-bold');
78
+ });
79
+ it('should handle empty escape sequence as reset', () => {
80
+ const result = (0, output_ansi_parser_1.parseAnsi)('\x1b[31mred\x1b[mnormal');
81
+ (0, chai_1.expect)(result.strippedText).to.equal('rednormal');
82
+ (0, chai_1.expect)(result.segments).to.have.length(1);
83
+ (0, chai_1.expect)(result.segments[0]).to.deep.equal({ start: 0, end: 3, cssClasses: 'ansi-red-fg' });
84
+ });
85
+ it('should preserve state across calls', () => {
86
+ const result1 = (0, output_ansi_parser_1.parseAnsi)('\x1b[31m');
87
+ (0, chai_1.expect)(result1.strippedText).to.equal('');
88
+ (0, chai_1.expect)(result1.segments).to.be.empty;
89
+ (0, chai_1.expect)(result1.state.foreground).to.equal('ansi-red-fg');
90
+ const result2 = (0, output_ansi_parser_1.parseAnsi)('red text\x1b[0m', result1.state);
91
+ (0, chai_1.expect)(result2.strippedText).to.equal('red text');
92
+ (0, chai_1.expect)(result2.segments).to.have.length(1);
93
+ (0, chai_1.expect)(result2.segments[0]).to.deep.equal({ start: 0, end: 8, cssClasses: 'ansi-red-fg' });
94
+ });
95
+ it('should handle text with no escape codes after initial state', () => {
96
+ const result = (0, output_ansi_parser_1.parseAnsi)('still red', { foreground: 'ansi-red-fg' });
97
+ (0, chai_1.expect)(result.strippedText).to.equal('still red');
98
+ (0, chai_1.expect)(result.segments).to.have.length(1);
99
+ (0, chai_1.expect)(result.segments[0]).to.deep.equal({ start: 0, end: 9, cssClasses: 'ansi-red-fg' });
100
+ });
101
+ it('should handle reset of individual attributes', () => {
102
+ const result = (0, output_ansi_parser_1.parseAnsi)('\x1b[1;31mbold red\x1b[22mnot bold red\x1b[0m');
103
+ (0, chai_1.expect)(result.strippedText).to.equal('bold rednot bold red');
104
+ (0, chai_1.expect)(result.segments).to.have.length(2);
105
+ (0, chai_1.expect)(result.segments[0].cssClasses).to.equal('ansi-red-fg ansi-bold');
106
+ (0, chai_1.expect)(result.segments[1].cssClasses).to.equal('ansi-red-fg');
107
+ });
108
+ it('should handle text with newlines', () => {
109
+ const result = (0, output_ansi_parser_1.parseAnsi)('\x1b[32mline1\nline2\x1b[0m');
110
+ (0, chai_1.expect)(result.strippedText).to.equal('line1\nline2');
111
+ (0, chai_1.expect)(result.segments).to.have.length(1);
112
+ (0, chai_1.expect)(result.segments[0]).to.deep.equal({ start: 0, end: 11, cssClasses: 'ansi-green-fg' });
113
+ });
114
+ it('should handle text without any ANSI codes', () => {
115
+ const result = (0, output_ansi_parser_1.parseAnsi)('plain text\nwith newlines');
116
+ (0, chai_1.expect)(result.strippedText).to.equal('plain text\nwith newlines');
117
+ (0, chai_1.expect)(result.segments).to.be.empty;
118
+ });
119
+ it('should handle default foreground reset (code 39)', () => {
120
+ const result = (0, output_ansi_parser_1.parseAnsi)('\x1b[31mred\x1b[39mdefault');
121
+ (0, chai_1.expect)(result.strippedText).to.equal('reddefault');
122
+ (0, chai_1.expect)(result.segments).to.have.length(1);
123
+ (0, chai_1.expect)(result.segments[0]).to.deep.equal({ start: 0, end: 3, cssClasses: 'ansi-red-fg' });
124
+ });
125
+ it('should handle all standard foreground colors', () => {
126
+ const colors = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'];
127
+ for (let i = 0; i < colors.length; i++) {
128
+ const result = (0, output_ansi_parser_1.parseAnsi)(`\x1b[${30 + i}mx\x1b[0m`);
129
+ (0, chai_1.expect)(result.segments[0].cssClasses).to.equal(`ansi-${colors[i]}-fg`);
130
+ }
131
+ });
132
+ it('should handle all bright foreground colors', () => {
133
+ const colors = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'];
134
+ for (let i = 0; i < colors.length; i++) {
135
+ const result = (0, output_ansi_parser_1.parseAnsi)(`\x1b[${90 + i}mx\x1b[0m`);
136
+ (0, chai_1.expect)(result.segments[0].cssClasses).to.equal(`ansi-bright-${colors[i]}-fg`);
137
+ }
138
+ });
139
+ });
140
+ //# sourceMappingURL=output-ansi-parser.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-ansi-parser.spec.js","sourceRoot":"","sources":["../../src/browser/output-ansi-parser.spec.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ import { OutputPreferences } from '../common/output-preferences';
9
9
  import { IReference } from '@theia/monaco-editor-core/esm/vs/base/common/lifecycle';
10
10
  import * as monaco from '@theia/monaco-editor-core';
11
11
  import PQueue from 'p-queue';
12
+ import { AnsiState, AnsiSegment } from './output-ansi-parser';
12
13
  export declare class OutputChannelManager implements Disposable, ResourceResolver {
13
14
  protected readonly textModelService: MonacoTextModelService;
14
15
  protected readonly preferences: OutputPreferences;
@@ -88,6 +89,7 @@ export declare class OutputChannel implements Disposable {
88
89
  protected visible: boolean;
89
90
  protected _maxLineNumber: number;
90
91
  protected decorationIds: Set<string>;
92
+ protected ansiState: AnsiState;
91
93
  readonly onVisibilityChange: Event<{
92
94
  isVisible: boolean;
93
95
  preserveFocus?: boolean;
@@ -119,6 +121,11 @@ export declare class OutputChannel implements Disposable {
119
121
  severity: OutputChannelSeverity;
120
122
  appendEol?: boolean;
121
123
  }): Promise<void>;
124
+ /**
125
+ * Compute the Monaco Range for an ANSI segment within the stripped text,
126
+ * given the insertion position in the editor model.
127
+ */
128
+ protected computeSegmentRange(strippedText: string, segment: AnsiSegment, insertPosition: monaco.Position): monaco.Range;
122
129
  protected ensureMaxChannelHistory(textModel: monaco.editor.ITextModel): void;
123
130
  protected get maxLineNumber(): number;
124
131
  protected set maxLineNumber(maxLineNumber: number);
@@ -1 +1 @@
1
- {"version":3,"file":"output-channel.d.ts","sourceRoot":"","sources":["../../src/browser/output-channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output-channel.d.ts","sourceRoot":"","sources":["../../src/browser/output-channel.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,7 @@ const output_resource_1 = require("../browser/output-resource");
26
26
  const output_preferences_1 = require("../common/output-preferences");
27
27
  const monaco = tslib_1.__importStar(require("@theia/monaco-editor-core"));
28
28
  const p_queue_1 = tslib_1.__importDefault(require("p-queue"));
29
+ const output_ansi_parser_1 = require("./output-ansi-parser");
29
30
  let OutputChannelManager = class OutputChannelManager {
30
31
  constructor() {
31
32
  this.channels = new Map();
@@ -189,6 +190,7 @@ class OutputChannel {
189
190
  this.disposed = false;
190
191
  this.visible = true;
191
192
  this.decorationIds = new Set();
193
+ this.ansiState = {};
192
194
  this.onVisibilityChange = this.visibilityChangeEmitter.event;
193
195
  this.onContentChange = this.contentChangeEmitter.event;
194
196
  this.onDisposed = this.disposedEmitter.event;
@@ -234,6 +236,7 @@ class OutputChannel {
234
236
  const textModel = (await this.resource.editorModelRef.promise).object.textEditorModel;
235
237
  textModel.deltaDecorations(Array.from(this.decorationIds), []);
236
238
  this.decorationIds.clear();
239
+ this.ansiState = {};
237
240
  textModel.setValue('');
238
241
  this.contentChangeEmitter.fire();
239
242
  });
@@ -258,14 +261,19 @@ class OutputChannel {
258
261
  const lastLineMaxColumn = textModel.getLineMaxColumn(lastLine);
259
262
  const position = new monaco.Position(lastLine, lastLineMaxColumn);
260
263
  const range = new monaco.Range(position.lineNumber, position.column, position.lineNumber, position.column);
264
+ // Parse and strip ANSI escape codes, preserving state across calls
265
+ const { strippedText, segments, state } = (0, output_ansi_parser_1.parseAnsi)(content, this.ansiState);
266
+ this.ansiState = state;
267
+ const textToInsert = appendEol ? `${strippedText}${textModel.getEOL()}` : strippedText;
261
268
  const edits = [{
262
269
  range,
263
- text: !!appendEol ? `${content}${textModel.getEOL()}` : content,
270
+ text: textToInsert,
264
271
  forceMoveMarkers: true
265
272
  }];
266
273
  // We do not use `pushEditOperations` as we do not need undo/redo support. VS Code uses `applyEdits` too.
267
274
  // https://github.com/microsoft/vscode/blob/dc348340fd1a6c583cb63a1e7e6b4fd657e01e01/src/vs/workbench/services/output/common/outputChannelModel.ts#L108-L115
268
275
  textModel.applyEdits(edits);
276
+ // Apply severity decorations (error/warning) for the entire appended range
269
277
  if (severity !== OutputChannelSeverity.Info) {
270
278
  const inlineClassName = severity === OutputChannelSeverity.Error ? 'theia-output-error' : 'theia-output-warning';
271
279
  let endLineNumber = textModel.getLineCount();
@@ -284,9 +292,56 @@ class OutputChannel {
284
292
  this.decorationIds.add(decorationId);
285
293
  }
286
294
  }
295
+ // Apply ANSI color decorations for individual segments
296
+ if (segments.length > 0) {
297
+ const ansiDecorations = segments.map(segment => ({
298
+ range: this.computeSegmentRange(strippedText, segment, position),
299
+ options: { inlineClassName: segment.cssClasses }
300
+ }));
301
+ for (const decorationId of textModel.deltaDecorations([], ansiDecorations)) {
302
+ this.decorationIds.add(decorationId);
303
+ }
304
+ }
287
305
  this.ensureMaxChannelHistory(textModel);
288
306
  this.contentChangeEmitter.fire();
289
307
  }
308
+ /**
309
+ * Compute the Monaco Range for an ANSI segment within the stripped text,
310
+ * given the insertion position in the editor model.
311
+ */
312
+ computeSegmentRange(strippedText, segment, insertPosition) {
313
+ let startLine = insertPosition.lineNumber;
314
+ let startColumn = insertPosition.column;
315
+ // Walk through stripped text to find start position
316
+ for (let i = 0; i < segment.start; i++) {
317
+ if (strippedText[i] === '\n') {
318
+ startLine++;
319
+ startColumn = 1;
320
+ }
321
+ else if (strippedText[i] === '\r') {
322
+ // Skip \r, handled with \n
323
+ }
324
+ else {
325
+ startColumn++;
326
+ }
327
+ }
328
+ let endLine = startLine;
329
+ let endColumn = startColumn;
330
+ // Walk from start to end of segment
331
+ for (let i = segment.start; i < segment.end; i++) {
332
+ if (strippedText[i] === '\n') {
333
+ endLine++;
334
+ endColumn = 1;
335
+ }
336
+ else if (strippedText[i] === '\r') {
337
+ // Skip \r
338
+ }
339
+ else {
340
+ endColumn++;
341
+ }
342
+ }
343
+ return new monaco.Range(startLine, startColumn, endLine, endColumn);
344
+ }
290
345
  ensureMaxChannelHistory(textModel) {
291
346
  this.contentChangeEmitter.fire();
292
347
  const linesToRemove = textModel.getLineCount() - this.maxLineNumber - 1; // -1 as the last line is usually empty -> `appendLine`.
@@ -1 +1 @@
1
- {"version":3,"file":"output-channel.js","sourceRoot":"","sources":["../../src/browser/output-channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output-channel.js","sourceRoot":"","sources":["../../src/browser/output-channel.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@theia/output",
3
- "version": "1.71.0-next.49+ff8893f59",
3
+ "version": "1.71.0-next.57+1fc9a8239",
4
4
  "description": "Theia - Output Extension",
5
5
  "dependencies": {
6
- "@theia/core": "1.71.0-next.49+ff8893f59",
7
- "@theia/editor": "1.71.0-next.49+ff8893f59",
8
- "@theia/monaco": "1.71.0-next.49+ff8893f59",
6
+ "@theia/core": "1.71.0-next.57+1fc9a8239",
7
+ "@theia/editor": "1.71.0-next.57+1fc9a8239",
8
+ "@theia/monaco": "1.71.0-next.57+1fc9a8239",
9
9
  "@theia/monaco-editor-core": "1.108.201",
10
10
  "p-queue": "^8.1.1",
11
11
  "tslib": "^2.6.2"
@@ -49,5 +49,5 @@
49
49
  "nyc": {
50
50
  "extends": "../../configs/nyc.json"
51
51
  },
52
- "gitHead": "ff8893f5957f8e505176ecd8c3ef10d722d47172"
52
+ "gitHead": "1fc9a8239357c913ab79f1922b6e87aecd79cfdb"
53
53
  }
@@ -0,0 +1,158 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2025 TypeFox and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { expect } from 'chai';
18
+ import { parseAnsi } from './output-ansi-parser';
19
+
20
+ describe('Output ANSI Parser', () => {
21
+
22
+ it('should return plain text unchanged', () => {
23
+ const result = parseAnsi('hello world');
24
+ expect(result.strippedText).to.equal('hello world');
25
+ expect(result.segments).to.be.empty;
26
+ });
27
+
28
+ it('should strip ANSI codes and return stripped text', () => {
29
+ const result = parseAnsi('\x1b[31mhello\x1b[0m world');
30
+ expect(result.strippedText).to.equal('hello world');
31
+ });
32
+
33
+ it('should produce a segment for foreground color', () => {
34
+ const result = parseAnsi('\x1b[31mred text\x1b[0m');
35
+ expect(result.strippedText).to.equal('red text');
36
+ expect(result.segments).to.have.length(1);
37
+ expect(result.segments[0]).to.deep.equal({
38
+ start: 0,
39
+ end: 8,
40
+ cssClasses: 'ansi-red-fg'
41
+ });
42
+ });
43
+
44
+ it('should handle multiple colors', () => {
45
+ const result = parseAnsi('\x1b[31mred\x1b[32mgreen\x1b[0m');
46
+ expect(result.strippedText).to.equal('redgreen');
47
+ expect(result.segments).to.have.length(2);
48
+ expect(result.segments[0]).to.deep.equal({ start: 0, end: 3, cssClasses: 'ansi-red-fg' });
49
+ expect(result.segments[1]).to.deep.equal({ start: 3, end: 8, cssClasses: 'ansi-green-fg' });
50
+ });
51
+
52
+ it('should handle bright foreground colors', () => {
53
+ const result = parseAnsi('\x1b[91mbright red\x1b[0m');
54
+ expect(result.strippedText).to.equal('bright red');
55
+ expect(result.segments).to.have.length(1);
56
+ expect(result.segments[0].cssClasses).to.equal('ansi-bright-red-fg');
57
+ });
58
+
59
+ it('should handle background colors', () => {
60
+ const result = parseAnsi('\x1b[41mred bg\x1b[0m');
61
+ expect(result.strippedText).to.equal('red bg');
62
+ expect(result.segments).to.have.length(1);
63
+ expect(result.segments[0].cssClasses).to.equal('ansi-red-bg');
64
+ });
65
+
66
+ it('should handle combined foreground and background', () => {
67
+ const result = parseAnsi('\x1b[31;42mred on green\x1b[0m');
68
+ expect(result.strippedText).to.equal('red on green');
69
+ expect(result.segments).to.have.length(1);
70
+ expect(result.segments[0].cssClasses).to.equal('ansi-red-fg ansi-green-bg');
71
+ });
72
+
73
+ it('should handle bold, italic, and underline', () => {
74
+ const result = parseAnsi('\x1b[1mbold\x1b[0m \x1b[3mitalic\x1b[0m \x1b[4munderline\x1b[0m');
75
+ expect(result.strippedText).to.equal('bold italic underline');
76
+ expect(result.segments).to.have.length(3);
77
+ expect(result.segments[0].cssClasses).to.equal('ansi-bold');
78
+ expect(result.segments[1].cssClasses).to.equal('ansi-italic');
79
+ expect(result.segments[2].cssClasses).to.equal('ansi-underline');
80
+ });
81
+
82
+ it('should handle combined styles with color', () => {
83
+ const result = parseAnsi('\x1b[1;31mbold red\x1b[0m');
84
+ expect(result.strippedText).to.equal('bold red');
85
+ expect(result.segments).to.have.length(1);
86
+ expect(result.segments[0].cssClasses).to.equal('ansi-red-fg ansi-bold');
87
+ });
88
+
89
+ it('should handle empty escape sequence as reset', () => {
90
+ const result = parseAnsi('\x1b[31mred\x1b[mnormal');
91
+ expect(result.strippedText).to.equal('rednormal');
92
+ expect(result.segments).to.have.length(1);
93
+ expect(result.segments[0]).to.deep.equal({ start: 0, end: 3, cssClasses: 'ansi-red-fg' });
94
+ });
95
+
96
+ it('should preserve state across calls', () => {
97
+ const result1 = parseAnsi('\x1b[31m');
98
+ expect(result1.strippedText).to.equal('');
99
+ expect(result1.segments).to.be.empty;
100
+ expect(result1.state.foreground).to.equal('ansi-red-fg');
101
+
102
+ const result2 = parseAnsi('red text\x1b[0m', result1.state);
103
+ expect(result2.strippedText).to.equal('red text');
104
+ expect(result2.segments).to.have.length(1);
105
+ expect(result2.segments[0]).to.deep.equal({ start: 0, end: 8, cssClasses: 'ansi-red-fg' });
106
+ });
107
+
108
+ it('should handle text with no escape codes after initial state', () => {
109
+ const result = parseAnsi('still red', { foreground: 'ansi-red-fg' });
110
+ expect(result.strippedText).to.equal('still red');
111
+ expect(result.segments).to.have.length(1);
112
+ expect(result.segments[0]).to.deep.equal({ start: 0, end: 9, cssClasses: 'ansi-red-fg' });
113
+ });
114
+
115
+ it('should handle reset of individual attributes', () => {
116
+ const result = parseAnsi('\x1b[1;31mbold red\x1b[22mnot bold red\x1b[0m');
117
+ expect(result.strippedText).to.equal('bold rednot bold red');
118
+ expect(result.segments).to.have.length(2);
119
+ expect(result.segments[0].cssClasses).to.equal('ansi-red-fg ansi-bold');
120
+ expect(result.segments[1].cssClasses).to.equal('ansi-red-fg');
121
+ });
122
+
123
+ it('should handle text with newlines', () => {
124
+ const result = parseAnsi('\x1b[32mline1\nline2\x1b[0m');
125
+ expect(result.strippedText).to.equal('line1\nline2');
126
+ expect(result.segments).to.have.length(1);
127
+ expect(result.segments[0]).to.deep.equal({ start: 0, end: 11, cssClasses: 'ansi-green-fg' });
128
+ });
129
+
130
+ it('should handle text without any ANSI codes', () => {
131
+ const result = parseAnsi('plain text\nwith newlines');
132
+ expect(result.strippedText).to.equal('plain text\nwith newlines');
133
+ expect(result.segments).to.be.empty;
134
+ });
135
+
136
+ it('should handle default foreground reset (code 39)', () => {
137
+ const result = parseAnsi('\x1b[31mred\x1b[39mdefault');
138
+ expect(result.strippedText).to.equal('reddefault');
139
+ expect(result.segments).to.have.length(1);
140
+ expect(result.segments[0]).to.deep.equal({ start: 0, end: 3, cssClasses: 'ansi-red-fg' });
141
+ });
142
+
143
+ it('should handle all standard foreground colors', () => {
144
+ const colors = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'];
145
+ for (let i = 0; i < colors.length; i++) {
146
+ const result = parseAnsi(`\x1b[${30 + i}mx\x1b[0m`);
147
+ expect(result.segments[0].cssClasses).to.equal(`ansi-${colors[i]}-fg`);
148
+ }
149
+ });
150
+
151
+ it('should handle all bright foreground colors', () => {
152
+ const colors = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'];
153
+ for (let i = 0; i < colors.length; i++) {
154
+ const result = parseAnsi(`\x1b[${90 + i}mx\x1b[0m`);
155
+ expect(result.segments[0].cssClasses).to.equal(`ansi-bright-${colors[i]}-fg`);
156
+ }
157
+ });
158
+ });
@@ -0,0 +1,156 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2025 TypeFox and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ /**
18
+ * Lightweight ANSI escape code parser for the Output view.
19
+ *
20
+ * Parses ANSI SGR (Select Graphic Rendition) sequences from text,
21
+ * strips them, and returns decoration segments with CSS class names
22
+ * matching the existing `ansi.css` classes from `@theia/core`.
23
+ */
24
+
25
+ const FOREGROUND_COLORS = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'] as const;
26
+
27
+ export interface AnsiState {
28
+ foreground?: string;
29
+ background?: string;
30
+ bold?: boolean;
31
+ italic?: boolean;
32
+ underline?: boolean;
33
+ }
34
+
35
+ export interface AnsiSegment {
36
+ start: number;
37
+ end: number;
38
+ cssClasses: string;
39
+ }
40
+
41
+ export interface AnsiParseResult {
42
+ strippedText: string;
43
+ segments: AnsiSegment[];
44
+ state: AnsiState;
45
+ }
46
+
47
+ // Matches ANSI escape sequences: ESC[ ... m (SGR) and other CSI sequences
48
+ const ANSI_ESCAPE_RE = /\x1b\[[0-9;]*m/g;
49
+
50
+ function getCssClasses(state: AnsiState): string {
51
+ const classes: string[] = [];
52
+ if (state.foreground) {
53
+ classes.push(state.foreground);
54
+ }
55
+ if (state.background) {
56
+ classes.push(state.background);
57
+ }
58
+ if (state.bold) {
59
+ classes.push('ansi-bold');
60
+ }
61
+ if (state.italic) {
62
+ classes.push('ansi-italic');
63
+ }
64
+ if (state.underline) {
65
+ classes.push('ansi-underline');
66
+ }
67
+ return classes.join(' ');
68
+ }
69
+
70
+ function applyAnsiCode(code: number, state: AnsiState): void {
71
+ if (code === 0) {
72
+ // Reset all
73
+ state.foreground = undefined;
74
+ state.background = undefined;
75
+ state.bold = undefined;
76
+ state.italic = undefined;
77
+ state.underline = undefined;
78
+ } else if (code === 1) {
79
+ state.bold = true;
80
+ } else if (code === 3) {
81
+ state.italic = true;
82
+ } else if (code === 4) {
83
+ state.underline = true;
84
+ } else if (code === 22) {
85
+ state.bold = undefined;
86
+ } else if (code === 23) {
87
+ state.italic = undefined;
88
+ } else if (code === 24) {
89
+ state.underline = undefined;
90
+ } else if (code >= 30 && code <= 37) {
91
+ state.foreground = `ansi-${FOREGROUND_COLORS[code - 30]}-fg`;
92
+ } else if (code === 39) {
93
+ state.foreground = undefined;
94
+ } else if (code >= 40 && code <= 47) {
95
+ state.background = `ansi-${FOREGROUND_COLORS[code - 40]}-bg`;
96
+ } else if (code === 49) {
97
+ state.background = undefined;
98
+ } else if (code >= 90 && code <= 97) {
99
+ state.foreground = `ansi-bright-${FOREGROUND_COLORS[code - 90]}-fg`;
100
+ } else if (code >= 100 && code <= 107) {
101
+ state.background = `ansi-bright-${FOREGROUND_COLORS[code - 100]}-bg`;
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Parse ANSI escape codes from text, strip them, and return decoration segments.
107
+ *
108
+ * @param text The raw text potentially containing ANSI escape codes
109
+ * @param initialState The ANSI state carried over from a previous parse call
110
+ * @returns The stripped text, decoration segments, and the final ANSI state
111
+ */
112
+ export function parseAnsi(text: string, initialState: AnsiState = {}): AnsiParseResult {
113
+ const state: AnsiState = { ...initialState };
114
+ const segments: AnsiSegment[] = [];
115
+ let strippedText = '';
116
+ let lastIndex = 0;
117
+ let currentSegmentStart = 0;
118
+ let currentClasses = getCssClasses(state);
119
+
120
+ ANSI_ESCAPE_RE.lastIndex = 0;
121
+ let match: RegExpExecArray | undefined;
122
+ while ((match = ANSI_ESCAPE_RE.exec(text) ?? undefined) !== undefined) {
123
+ // Append text before this escape sequence
124
+ const textBefore = text.substring(lastIndex, match.index);
125
+ strippedText += textBefore;
126
+
127
+ // If we had an active style and there's text, the segment continues
128
+ // Now process the escape sequence to potentially change state
129
+ const escapeContent = match[0].slice(2, -1); // Strip ESC[ and m
130
+ const codes = escapeContent.length === 0 ? [0] : escapeContent.split(';').map(Number);
131
+
132
+ // Before changing state, close current segment if there's styled text
133
+ const newOffset = strippedText.length;
134
+ if (currentClasses && newOffset > currentSegmentStart) {
135
+ segments.push({ start: currentSegmentStart, end: newOffset, cssClasses: currentClasses });
136
+ }
137
+
138
+ for (const code of codes) {
139
+ applyAnsiCode(code, state);
140
+ }
141
+
142
+ currentClasses = getCssClasses(state);
143
+ currentSegmentStart = newOffset;
144
+ lastIndex = match.index + match[0].length;
145
+ }
146
+
147
+ // Append remaining text after last escape sequence
148
+ strippedText += text.substring(lastIndex);
149
+
150
+ // Close final segment if there's styled text remaining
151
+ if (currentClasses && strippedText.length > currentSegmentStart) {
152
+ segments.push({ start: currentSegmentStart, end: strippedText.length, cssClasses: currentClasses });
153
+ }
154
+
155
+ return { strippedText, segments, state };
156
+ }
@@ -27,6 +27,7 @@ import { OutputPreferences } from '../common/output-preferences';
27
27
  import { IReference } from '@theia/monaco-editor-core/esm/vs/base/common/lifecycle';
28
28
  import * as monaco from '@theia/monaco-editor-core';
29
29
  import PQueue from 'p-queue';
30
+ import { parseAnsi, AnsiState, AnsiSegment } from './output-ansi-parser';
30
31
 
31
32
  @injectable()
32
33
  export class OutputChannelManager implements Disposable, ResourceResolver {
@@ -213,6 +214,7 @@ export class OutputChannel implements Disposable {
213
214
  protected visible = true;
214
215
  protected _maxLineNumber: number;
215
216
  protected decorationIds = new Set<string>();
217
+ protected ansiState: AnsiState = {};
216
218
 
217
219
  readonly onVisibilityChange: Event<{ isVisible: boolean, preserveFocus?: boolean }> = this.visibilityChangeEmitter.event;
218
220
  readonly onContentChange: Event<void> = this.contentChangeEmitter.event;
@@ -267,6 +269,7 @@ export class OutputChannel implements Disposable {
267
269
  const textModel = (await this.resource.editorModelRef.promise).object.textEditorModel;
268
270
  textModel.deltaDecorations(Array.from(this.decorationIds), []);
269
271
  this.decorationIds.clear();
272
+ this.ansiState = {};
270
273
  textModel.setValue('');
271
274
  this.contentChangeEmitter.fire();
272
275
  });
@@ -295,14 +298,22 @@ export class OutputChannel implements Disposable {
295
298
  const lastLineMaxColumn = textModel.getLineMaxColumn(lastLine);
296
299
  const position = new monaco.Position(lastLine, lastLineMaxColumn);
297
300
  const range = new monaco.Range(position.lineNumber, position.column, position.lineNumber, position.column);
301
+
302
+ // Parse and strip ANSI escape codes, preserving state across calls
303
+ const { strippedText, segments, state } = parseAnsi(content, this.ansiState);
304
+ this.ansiState = state;
305
+
306
+ const textToInsert = appendEol ? `${strippedText}${textModel.getEOL()}` : strippedText;
298
307
  const edits = [{
299
308
  range,
300
- text: !!appendEol ? `${content}${textModel.getEOL()}` : content,
309
+ text: textToInsert,
301
310
  forceMoveMarkers: true
302
311
  }];
303
312
  // We do not use `pushEditOperations` as we do not need undo/redo support. VS Code uses `applyEdits` too.
304
313
  // https://github.com/microsoft/vscode/blob/dc348340fd1a6c583cb63a1e7e6b4fd657e01e01/src/vs/workbench/services/output/common/outputChannelModel.ts#L108-L115
305
314
  textModel.applyEdits(edits);
315
+
316
+ // Apply severity decorations (error/warning) for the entire appended range
306
317
  if (severity !== OutputChannelSeverity.Info) {
307
318
  const inlineClassName = severity === OutputChannelSeverity.Error ? 'theia-output-error' : 'theia-output-warning';
308
319
  let endLineNumber = textModel.getLineCount();
@@ -321,10 +332,56 @@ export class OutputChannel implements Disposable {
321
332
  this.decorationIds.add(decorationId);
322
333
  }
323
334
  }
335
+
336
+ // Apply ANSI color decorations for individual segments
337
+ if (segments.length > 0) {
338
+ const ansiDecorations = segments.map(segment => ({
339
+ range: this.computeSegmentRange(strippedText, segment, position),
340
+ options: { inlineClassName: segment.cssClasses }
341
+ }));
342
+ for (const decorationId of textModel.deltaDecorations([], ansiDecorations)) {
343
+ this.decorationIds.add(decorationId);
344
+ }
345
+ }
346
+
324
347
  this.ensureMaxChannelHistory(textModel);
325
348
  this.contentChangeEmitter.fire();
326
349
  }
327
350
 
351
+ /**
352
+ * Compute the Monaco Range for an ANSI segment within the stripped text,
353
+ * given the insertion position in the editor model.
354
+ */
355
+ protected computeSegmentRange(strippedText: string, segment: AnsiSegment, insertPosition: monaco.Position): monaco.Range {
356
+ let startLine = insertPosition.lineNumber;
357
+ let startColumn = insertPosition.column;
358
+ // Walk through stripped text to find start position
359
+ for (let i = 0; i < segment.start; i++) {
360
+ if (strippedText[i] === '\n') {
361
+ startLine++;
362
+ startColumn = 1;
363
+ } else if (strippedText[i] === '\r') {
364
+ // Skip \r, handled with \n
365
+ } else {
366
+ startColumn++;
367
+ }
368
+ }
369
+ let endLine = startLine;
370
+ let endColumn = startColumn;
371
+ // Walk from start to end of segment
372
+ for (let i = segment.start; i < segment.end; i++) {
373
+ if (strippedText[i] === '\n') {
374
+ endLine++;
375
+ endColumn = 1;
376
+ } else if (strippedText[i] === '\r') {
377
+ // Skip \r
378
+ } else {
379
+ endColumn++;
380
+ }
381
+ }
382
+ return new monaco.Range(startLine, startColumn, endLine, endColumn);
383
+ }
384
+
328
385
  protected ensureMaxChannelHistory(textModel: monaco.editor.ITextModel): void {
329
386
  this.contentChangeEmitter.fire();
330
387
  const linesToRemove = textModel.getLineCount() - this.maxLineNumber - 1; // -1 as the last line is usually empty -> `appendLine`.
@@ -30,3 +30,146 @@
30
30
  width: 170px;
31
31
  margin-right: 4px;
32
32
  }
33
+
34
+ /* ANSI text styling decorations */
35
+ .theia-output .ansi-bold {
36
+ font-weight: bold;
37
+ }
38
+
39
+ .theia-output .ansi-italic {
40
+ font-style: italic;
41
+ }
42
+
43
+ .theia-output .ansi-underline {
44
+ text-decoration: underline;
45
+ }
46
+
47
+ /* ANSI foreground color decorations - scoped to .theia-output to override Monaco's .mtk1 */
48
+ .theia-output .ansi-black-fg {
49
+ color: var(--theia-terminal-ansiBlack);
50
+ }
51
+
52
+ .theia-output .ansi-red-fg {
53
+ color: var(--theia-terminal-ansiRed);
54
+ }
55
+
56
+ .theia-output .ansi-green-fg {
57
+ color: var(--theia-terminal-ansiGreen);
58
+ }
59
+
60
+ .theia-output .ansi-yellow-fg {
61
+ color: var(--theia-terminal-ansiYellow);
62
+ }
63
+
64
+ .theia-output .ansi-blue-fg {
65
+ color: var(--theia-terminal-ansiBlue);
66
+ }
67
+
68
+ .theia-output .ansi-magenta-fg {
69
+ color: var(--theia-terminal-ansiMagenta);
70
+ }
71
+
72
+ .theia-output .ansi-cyan-fg {
73
+ color: var(--theia-terminal-ansiCyan);
74
+ }
75
+
76
+ .theia-output .ansi-white-fg {
77
+ color: var(--theia-terminal-ansiWhite);
78
+ }
79
+
80
+ .theia-output .ansi-bright-black-fg {
81
+ color: var(--theia-terminal-ansiBrightBlack);
82
+ }
83
+
84
+ .theia-output .ansi-bright-red-fg {
85
+ color: var(--theia-terminal-ansiBrightRed);
86
+ }
87
+
88
+ .theia-output .ansi-bright-green-fg {
89
+ color: var(--theia-terminal-ansiBrightGreen);
90
+ }
91
+
92
+ .theia-output .ansi-bright-yellow-fg {
93
+ color: var(--theia-terminal-ansiBrightYellow);
94
+ }
95
+
96
+ .theia-output .ansi-bright-blue-fg {
97
+ color: var(--theia-terminal-ansiBrightBlue);
98
+ }
99
+
100
+ .theia-output .ansi-bright-magenta-fg {
101
+ color: var(--theia-terminal-ansiBrightMagenta);
102
+ }
103
+
104
+ .theia-output .ansi-bright-cyan-fg {
105
+ color: var(--theia-terminal-ansiBrightCyan);
106
+ }
107
+
108
+ .theia-output .ansi-bright-white-fg {
109
+ color: var(--theia-terminal-ansiBrightWhite);
110
+ }
111
+
112
+ /* ANSI background color decorations */
113
+ .theia-output .ansi-black-bg {
114
+ background-color: var(--theia-terminal-ansiBlack);
115
+ }
116
+
117
+ .theia-output .ansi-red-bg {
118
+ background-color: var(--theia-terminal-ansiRed);
119
+ }
120
+
121
+ .theia-output .ansi-green-bg {
122
+ background-color: var(--theia-terminal-ansiGreen);
123
+ }
124
+
125
+ .theia-output .ansi-yellow-bg {
126
+ background-color: var(--theia-terminal-ansiYellow);
127
+ }
128
+
129
+ .theia-output .ansi-blue-bg {
130
+ background-color: var(--theia-terminal-ansiBlue);
131
+ }
132
+
133
+ .theia-output .ansi-magenta-bg {
134
+ background-color: var(--theia-terminal-ansiMagenta);
135
+ }
136
+
137
+ .theia-output .ansi-cyan-bg {
138
+ background-color: var(--theia-terminal-ansiCyan);
139
+ }
140
+
141
+ .theia-output .ansi-white-bg {
142
+ background-color: var(--theia-terminal-ansiWhite);
143
+ }
144
+
145
+ .theia-output .ansi-bright-black-bg {
146
+ background-color: var(--theia-terminal-ansiBrightBlack);
147
+ }
148
+
149
+ .theia-output .ansi-bright-red-bg {
150
+ background-color: var(--theia-terminal-ansiBrightRed);
151
+ }
152
+
153
+ .theia-output .ansi-bright-green-bg {
154
+ background-color: var(--theia-terminal-ansiBrightGreen);
155
+ }
156
+
157
+ .theia-output .ansi-bright-yellow-bg {
158
+ background-color: var(--theia-terminal-ansiBrightYellow);
159
+ }
160
+
161
+ .theia-output .ansi-bright-blue-bg {
162
+ background-color: var(--theia-terminal-ansiBrightBlue);
163
+ }
164
+
165
+ .theia-output .ansi-bright-magenta-bg {
166
+ background-color: var(--theia-terminal-ansiBrightMagenta);
167
+ }
168
+
169
+ .theia-output .ansi-bright-cyan-bg {
170
+ background-color: var(--theia-terminal-ansiBrightCyan);
171
+ }
172
+
173
+ .theia-output .ansi-bright-white-bg {
174
+ background-color: var(--theia-terminal-ansiBrightWhite);
175
+ }