@theia/output 1.71.0-next.8 → 1.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/browser/output-ansi-parser.d.ts +26 -0
- package/lib/browser/output-ansi-parser.d.ts.map +1 -0
- package/lib/browser/output-ansi-parser.js +138 -0
- package/lib/browser/output-ansi-parser.js.map +1 -0
- package/lib/browser/output-ansi-parser.spec.d.ts +2 -0
- package/lib/browser/output-ansi-parser.spec.d.ts.map +1 -0
- package/lib/browser/output-ansi-parser.spec.js +140 -0
- package/lib/browser/output-ansi-parser.spec.js.map +1 -0
- package/lib/browser/output-channel.d.ts +7 -0
- package/lib/browser/output-channel.d.ts.map +1 -1
- package/lib/browser/output-channel.js +56 -1
- package/lib/browser/output-channel.js.map +1 -1
- package/package.json +7 -7
- package/src/browser/output-ansi-parser.spec.ts +158 -0
- package/src/browser/output-ansi-parser.ts +156 -0
- package/src/browser/output-channel.ts +58 -1
- package/src/browser/style/output.css +143 -0
|
@@ -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 @@
|
|
|
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":"AAiBA,OAAO,GAAG,MAAM,4BAA4B,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qDAAqD,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,wDAAwD,CAAC;AACpF,OAAO,KAAK,MAAM,MAAM,2BAA2B,CAAC;AACpD,OAAO,MAAM,MAAM,SAAS,CAAC;
|
|
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:
|
|
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,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/output",
|
|
3
|
-
"version": "1.71.0
|
|
3
|
+
"version": "1.71.0",
|
|
4
4
|
"description": "Theia - Output Extension",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/core": "1.71.0
|
|
7
|
-
"@theia/editor": "1.71.0
|
|
8
|
-
"@theia/monaco": "1.71.0
|
|
6
|
+
"@theia/core": "1.71.0",
|
|
7
|
+
"@theia/editor": "1.71.0",
|
|
8
|
+
"@theia/monaco": "1.71.0",
|
|
9
9
|
"@theia/monaco-editor-core": "1.108.201",
|
|
10
|
-
"p-queue": "^8.
|
|
10
|
+
"p-queue": "^8.1.1",
|
|
11
11
|
"tslib": "^2.6.2"
|
|
12
12
|
},
|
|
13
13
|
"publishConfig": {
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
"watch": "theiaext watch"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@theia/ext-scripts": "1.
|
|
47
|
+
"@theia/ext-scripts": "1.71.0"
|
|
48
48
|
},
|
|
49
49
|
"nyc": {
|
|
50
50
|
"extends": "../../configs/nyc.json"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "d8a596fc99f0a8e68b466828ed162569d79e3a71"
|
|
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:
|
|
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
|
+
}
|