348 lines
15 KiB
JavaScript
348 lines
15 KiB
JavaScript
"use strict";
|
|
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
|
|
// See LICENSE in the project root for license information.
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.Terminal = void 0;
|
|
const ITerminalProvider_1 = require("./ITerminalProvider");
|
|
const Colorize_1 = require("./Colorize");
|
|
const AnsiEscape_1 = require("./AnsiEscape");
|
|
/**
|
|
* Colors used with {@link ILegacyColorableSequence}.
|
|
*/
|
|
var ColorValue;
|
|
(function (ColorValue) {
|
|
ColorValue[ColorValue["Black"] = 0] = "Black";
|
|
ColorValue[ColorValue["Red"] = 1] = "Red";
|
|
ColorValue[ColorValue["Green"] = 2] = "Green";
|
|
ColorValue[ColorValue["Yellow"] = 3] = "Yellow";
|
|
ColorValue[ColorValue["Blue"] = 4] = "Blue";
|
|
ColorValue[ColorValue["Magenta"] = 5] = "Magenta";
|
|
ColorValue[ColorValue["Cyan"] = 6] = "Cyan";
|
|
ColorValue[ColorValue["White"] = 7] = "White";
|
|
ColorValue[ColorValue["Gray"] = 8] = "Gray";
|
|
})(ColorValue || (ColorValue = {}));
|
|
/**
|
|
* Text styles used with {@link ILegacyColorableSequence}.
|
|
*/
|
|
var TextAttribute;
|
|
(function (TextAttribute) {
|
|
TextAttribute[TextAttribute["Bold"] = 0] = "Bold";
|
|
TextAttribute[TextAttribute["Dim"] = 1] = "Dim";
|
|
TextAttribute[TextAttribute["Underline"] = 2] = "Underline";
|
|
TextAttribute[TextAttribute["Blink"] = 3] = "Blink";
|
|
TextAttribute[TextAttribute["InvertColor"] = 4] = "InvertColor";
|
|
TextAttribute[TextAttribute["Hidden"] = 5] = "Hidden";
|
|
})(TextAttribute || (TextAttribute = {}));
|
|
/**
|
|
* This class facilitates writing to a console.
|
|
*
|
|
* @beta
|
|
*/
|
|
class Terminal {
|
|
constructor(provider) {
|
|
this._providers = new Set();
|
|
this._providers.add(provider);
|
|
}
|
|
/**
|
|
* {@inheritdoc ITerminal.registerProvider}
|
|
*/
|
|
registerProvider(provider) {
|
|
this._providers.add(provider);
|
|
}
|
|
/**
|
|
* {@inheritdoc ITerminal.unregisterProvider}
|
|
*/
|
|
unregisterProvider(provider) {
|
|
if (this._providers.has(provider)) {
|
|
this._providers.delete(provider);
|
|
}
|
|
}
|
|
/**
|
|
* {@inheritdoc ITerminal.write}
|
|
*/
|
|
write(...messageParts) {
|
|
const { parts } = this._normalizeWriteParameters(messageParts);
|
|
this._writeSegmentsToProviders(parts, ITerminalProvider_1.TerminalProviderSeverity.log, false);
|
|
}
|
|
/**
|
|
* {@inheritdoc ITerminal.writeLine}
|
|
*/
|
|
writeLine(...messageParts) {
|
|
const { parts } = this._normalizeWriteParameters(messageParts);
|
|
this._writeSegmentsToProviders(parts, ITerminalProvider_1.TerminalProviderSeverity.log, true);
|
|
}
|
|
/**
|
|
* {@inheritdoc ITerminal.writeWarning}
|
|
*/
|
|
writeWarning(...messageParts) {
|
|
const { parts, options: { doNotOverrideSgrCodes } } = this._normalizeWriteParameters(messageParts);
|
|
this._writeSegmentsToProviders(doNotOverrideSgrCodes
|
|
? parts
|
|
: parts.map((part) => Colorize_1.Colorize.yellow(AnsiEscape_1.AnsiEscape.removeCodes(part))), ITerminalProvider_1.TerminalProviderSeverity.warning, false);
|
|
}
|
|
/**
|
|
* {@inheritdoc ITerminal.writeWarningLine}
|
|
*/
|
|
writeWarningLine(...messageParts) {
|
|
const { parts, options: { doNotOverrideSgrCodes } } = this._normalizeWriteParameters(messageParts);
|
|
this._writeSegmentsToProviders(doNotOverrideSgrCodes
|
|
? parts
|
|
: parts.map((part) => Colorize_1.Colorize.yellow(AnsiEscape_1.AnsiEscape.removeCodes(part))), ITerminalProvider_1.TerminalProviderSeverity.warning, true);
|
|
}
|
|
/**
|
|
* {@inheritdoc ITerminal.writeError}
|
|
*/
|
|
writeError(...messageParts) {
|
|
const { parts, options: { doNotOverrideSgrCodes } } = this._normalizeWriteParameters(messageParts);
|
|
this._writeSegmentsToProviders(doNotOverrideSgrCodes ? parts : parts.map((part) => Colorize_1.Colorize.red(AnsiEscape_1.AnsiEscape.removeCodes(part))), ITerminalProvider_1.TerminalProviderSeverity.error, false);
|
|
}
|
|
/**
|
|
* {@inheritdoc ITerminal.writeErrorLine}
|
|
*/
|
|
writeErrorLine(...messageParts) {
|
|
const { parts, options: { doNotOverrideSgrCodes } } = this._normalizeWriteParameters(messageParts);
|
|
this._writeSegmentsToProviders(doNotOverrideSgrCodes ? parts : parts.map((part) => Colorize_1.Colorize.red(AnsiEscape_1.AnsiEscape.removeCodes(part))), ITerminalProvider_1.TerminalProviderSeverity.error, true);
|
|
}
|
|
/**
|
|
* {@inheritdoc ITerminal.writeVerbose}
|
|
*/
|
|
writeVerbose(...messageParts) {
|
|
const { parts } = this._normalizeWriteParameters(messageParts);
|
|
this._writeSegmentsToProviders(parts, ITerminalProvider_1.TerminalProviderSeverity.verbose, false);
|
|
}
|
|
/**
|
|
* {@inheritdoc ITerminal.writeVerboseLine}
|
|
*/
|
|
writeVerboseLine(...messageParts) {
|
|
const { parts } = this._normalizeWriteParameters(messageParts);
|
|
this._writeSegmentsToProviders(parts, ITerminalProvider_1.TerminalProviderSeverity.verbose, true);
|
|
}
|
|
/**
|
|
* {@inheritdoc ITerminal.writeDebug}
|
|
*/
|
|
writeDebug(...messageParts) {
|
|
const { parts } = this._normalizeWriteParameters(messageParts);
|
|
this._writeSegmentsToProviders(parts, ITerminalProvider_1.TerminalProviderSeverity.debug, false);
|
|
}
|
|
/**
|
|
* {@inheritdoc ITerminal.writeDebugLine}
|
|
*/
|
|
writeDebugLine(...messageParts) {
|
|
const { parts } = this._normalizeWriteParameters(messageParts);
|
|
this._writeSegmentsToProviders(parts, ITerminalProvider_1.TerminalProviderSeverity.debug, true);
|
|
}
|
|
_writeSegmentsToProviders(segments, severity, followedByEol) {
|
|
const linesSegments = [[]];
|
|
let currentLineSegments = linesSegments[0];
|
|
for (const segment of segments) {
|
|
if (typeof segment === 'string') {
|
|
currentLineSegments.push(segment);
|
|
}
|
|
else {
|
|
if (segment.isEol) {
|
|
linesSegments.push([]);
|
|
currentLineSegments = linesSegments[linesSegments.length - 1];
|
|
}
|
|
else {
|
|
currentLineSegments.push(this._serializeLegacyColorableSequence(segment));
|
|
}
|
|
}
|
|
}
|
|
const lines = [];
|
|
for (const lineSegments of linesSegments) {
|
|
lines.push(lineSegments.join(''));
|
|
}
|
|
if (followedByEol) {
|
|
lines.push('');
|
|
}
|
|
let linesWithoutColor;
|
|
const concatenatedLinesWithColorByNewlineChar = new Map();
|
|
const concatenatedLinesWithoutColorByNewlineChar = new Map();
|
|
for (const provider of this._providers) {
|
|
let textToWrite;
|
|
const eol = provider.eolCharacter;
|
|
if (provider.supportsColor) {
|
|
textToWrite = concatenatedLinesWithColorByNewlineChar.get(eol);
|
|
if (!textToWrite) {
|
|
textToWrite = lines.join(eol);
|
|
concatenatedLinesWithColorByNewlineChar.set(eol, textToWrite);
|
|
}
|
|
}
|
|
else {
|
|
textToWrite = concatenatedLinesWithoutColorByNewlineChar.get(eol);
|
|
if (!textToWrite) {
|
|
if (!linesWithoutColor) {
|
|
linesWithoutColor = [];
|
|
for (const line of lines) {
|
|
linesWithoutColor.push(AnsiEscape_1.AnsiEscape.removeCodes(line));
|
|
}
|
|
}
|
|
textToWrite = linesWithoutColor.join(eol);
|
|
concatenatedLinesWithoutColorByNewlineChar.set(eol, textToWrite);
|
|
}
|
|
}
|
|
provider.write(textToWrite, severity);
|
|
}
|
|
}
|
|
_serializeLegacyColorableSequence(segment) {
|
|
const startColorCodes = [];
|
|
const endColorCodes = [];
|
|
switch (segment.foregroundColor) {
|
|
case ColorValue.Black: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.BlackForeground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultForeground);
|
|
break;
|
|
}
|
|
case ColorValue.Red: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.RedForeground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultForeground);
|
|
break;
|
|
}
|
|
case ColorValue.Green: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.GreenForeground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultForeground);
|
|
break;
|
|
}
|
|
case ColorValue.Yellow: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.YellowForeground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultForeground);
|
|
break;
|
|
}
|
|
case ColorValue.Blue: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.BlueForeground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultForeground);
|
|
break;
|
|
}
|
|
case ColorValue.Magenta: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.MagentaForeground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultForeground);
|
|
break;
|
|
}
|
|
case ColorValue.Cyan: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.CyanForeground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultForeground);
|
|
break;
|
|
}
|
|
case ColorValue.White: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.WhiteForeground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultForeground);
|
|
break;
|
|
}
|
|
case ColorValue.Gray: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.GrayForeground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultForeground);
|
|
break;
|
|
}
|
|
}
|
|
switch (segment.backgroundColor) {
|
|
case ColorValue.Black: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.BlackBackground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultBackground);
|
|
break;
|
|
}
|
|
case ColorValue.Red: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.RedBackground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultBackground);
|
|
break;
|
|
}
|
|
case ColorValue.Green: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.GreenBackground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultBackground);
|
|
break;
|
|
}
|
|
case ColorValue.Yellow: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.YellowBackground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultBackground);
|
|
break;
|
|
}
|
|
case ColorValue.Blue: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.BlueBackground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultBackground);
|
|
break;
|
|
}
|
|
case ColorValue.Magenta: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.MagentaBackground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultBackground);
|
|
break;
|
|
}
|
|
case ColorValue.Cyan: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.CyanBackground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultBackground);
|
|
break;
|
|
}
|
|
case ColorValue.White: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.WhiteBackground);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.DefaultBackground);
|
|
break;
|
|
}
|
|
case ColorValue.Gray: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.GrayBackground);
|
|
endColorCodes.push(49);
|
|
break;
|
|
}
|
|
}
|
|
if (segment.textAttributes) {
|
|
for (const textAttribute of segment.textAttributes) {
|
|
switch (textAttribute) {
|
|
case TextAttribute.Bold: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.Bold);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.NormalColorOrIntensity);
|
|
break;
|
|
}
|
|
case TextAttribute.Dim: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.Dim);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.NormalColorOrIntensity);
|
|
break;
|
|
}
|
|
case TextAttribute.Underline: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.Underline);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.UnderlineOff);
|
|
break;
|
|
}
|
|
case TextAttribute.Blink: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.Blink);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.BlinkOff);
|
|
break;
|
|
}
|
|
case TextAttribute.InvertColor: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.InvertColor);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.InvertColorOff);
|
|
break;
|
|
}
|
|
case TextAttribute.Hidden: {
|
|
startColorCodes.push(Colorize_1.SgrParameterAttribute.Hidden);
|
|
endColorCodes.push(Colorize_1.SgrParameterAttribute.HiddenOff);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
const resultSegments = [];
|
|
for (let j = 0; j < startColorCodes.length; j++) {
|
|
const code = startColorCodes[j];
|
|
resultSegments.push(AnsiEscape_1.AnsiEscape.getEscapeSequenceForAnsiCode(code));
|
|
}
|
|
resultSegments.push(segment.text);
|
|
for (let j = endColorCodes.length - 1; j >= 0; j--) {
|
|
const code = endColorCodes[j];
|
|
resultSegments.push(AnsiEscape_1.AnsiEscape.getEscapeSequenceForAnsiCode(code));
|
|
}
|
|
return resultSegments.join('');
|
|
}
|
|
_normalizeWriteParameters(parameters) {
|
|
if (parameters.length === 0) {
|
|
return { parts: [], options: {} };
|
|
}
|
|
else {
|
|
const lastParameter = parameters[parameters.length - 1];
|
|
if (typeof lastParameter === 'string') {
|
|
return { parts: parameters, options: {} };
|
|
}
|
|
else {
|
|
return { parts: parameters.slice(0, -1), options: lastParameter };
|
|
}
|
|
}
|
|
}
|
|
}
|
|
exports.Terminal = Terminal;
|
|
//# sourceMappingURL=Terminal.js.map
|