Fallback to default_ansi_colors when running headless terminal

This commit is contained in:
Simon Lamon
2022-10-09 17:16:06 +00:00
parent a4c62792df
commit f8a5d3a91e
2 changed files with 32 additions and 6 deletions
@@ -74,7 +74,7 @@ describe('xterm-addon-serialize', () => {
terminal = new Terminal({ cols: 10, rows: 2, allowProposedApi: true }); terminal = new Terminal({ cols: 10, rows: 2, allowProposedApi: true });
terminal.loadAddon(serializeAddon); terminal.loadAddon(serializeAddon);
(terminal as any)._core._themeService = new ThemeService(new OptionsService({})); (terminal as any)._core._themeService = new ThemeService((terminal as any)._core.optionsService);
(terminal as any)._core._selectionService = new TestSelectionService((terminal as any)._core._bufferService); (terminal as any)._core._selectionService = new TestSelectionService((terminal as any)._core._bufferService);
}); });
@@ -205,5 +205,25 @@ describe('xterm-addon-serialize', () => {
}); });
assert.equal((output.match(/color: #ffffff; background-color: #000000; font-family: courier-new, courier, monospace; font-size: 15px;/g) || []).length, 1, output); assert.equal((output.match(/color: #ffffff; background-color: #000000; font-family: courier-new, courier, monospace; font-size: 15px;/g) || []).length, 1, output);
}); });
it('cells with custom color styling', async () => {
terminal.options.theme.black = '#ffa500';
terminal.options.theme = { ... terminal.options.theme };
await writeP(terminal, ' ' + sgr('38;5;0') + 'terminal' + sgr('39') + ' ');
const output = serializeAddon.serializeAsHTML();
assert.equal((output.match(/<span style='color: #ffa500;'>terminal<\/span>/g) || []).length, 1, output);
});
it('cells with color styling - xterm headless', async () => {
// a headless terminal doesn't have a themeservice
(terminal as any)._core._themeService = undefined;
await writeP(terminal, ' ' + sgr('38;5;46') + 'terminal' + sgr('39') + ' ');
const output = serializeAddon.serializeAsHTML();
assert.equal((output.match(/<span style='color: #00ff00;'>terminal<\/span>/g) || []).length, 1, output);
});
}); });
}); });
@@ -7,7 +7,8 @@
import { Terminal, ITerminalAddon, IBuffer, IBufferCell, IBufferRange } from 'xterm'; import { Terminal, ITerminalAddon, IBuffer, IBufferCell, IBufferRange } from 'xterm';
import { IColorSet } from 'browser/Types'; import { IColorSet } from 'browser/Types';
import { IAttributeData } from 'common/Types'; import { IAttributeData, IColor } from 'common/Types';
import { DEFAULT_ANSI_COLORS } from 'browser/services/ThemeService';
function constrain(value: number, low: number, high: number): number { function constrain(value: number, low: number, high: number): number {
return Math.max(low, Math.min(value, high)); return Math.max(low, Math.min(value, high));
@@ -534,7 +535,7 @@ export class HTMLSerializeHandler extends BaseSerializeHandler {
private _htmlContent = ''; private _htmlContent = '';
private _colors: IColorSet; private _ansiColors: Readonly<IColor[]>;
constructor( constructor(
buffer: IBuffer, buffer: IBuffer,
@@ -543,8 +544,13 @@ export class HTMLSerializeHandler extends BaseSerializeHandler {
) { ) {
super(buffer); super(buffer);
// https://github.com/xtermjs/xterm.js/issues/3601 // For xterm headless: fallback to ansi colors
this._colors = (_terminal as any)._core._themeService.colors; if ((_terminal as any)._core._themeService) {
this._ansiColors = (_terminal as any)._core._themeService.colors.ansi;
}
else {
this._ansiColors = DEFAULT_ANSI_COLORS;
}
} }
private _padStart(target: string, targetLength: number, padString: string): string { private _padStart(target: string, targetLength: number, padString: string): string {
@@ -600,7 +606,7 @@ export class HTMLSerializeHandler extends BaseSerializeHandler {
return rgb.map(x => this._padStart(x.toString(16), 2, '0')).join(''); return rgb.map(x => this._padStart(x.toString(16), 2, '0')).join('');
} }
if (isFg ? cell.isFgPalette() : cell.isBgPalette()) { if (isFg ? cell.isFgPalette() : cell.isBgPalette()) {
return this._colors.ansi[color].css; return this._ansiColors[color].css;
} }
return undefined; return undefined;
} }