@wendongfly/myhi 1.0.2 → 1.0.3
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/dist/index.js +1 -1
- package/dist/lib/xterm/LICENSE +21 -0
- package/dist/lib/xterm/README.md +225 -0
- package/dist/lib/xterm/css/xterm.css +190 -0
- package/dist/lib/xterm/lib/xterm.js +2 -0
- package/dist/lib/xterm/lib/xterm.js.map +1 -0
- package/dist/lib/xterm/package.json +90 -0
- package/dist/lib/xterm/src/browser/AccessibilityManager.ts +301 -0
- package/dist/lib/xterm/src/browser/Clipboard.ts +99 -0
- package/dist/lib/xterm/src/browser/ColorContrastCache.ts +39 -0
- package/dist/lib/xterm/src/browser/ColorManager.ts +268 -0
- package/dist/lib/xterm/src/browser/Dom.ts +10 -0
- package/dist/lib/xterm/src/browser/Lifecycle.ts +30 -0
- package/dist/lib/xterm/src/browser/Linkifier.ts +356 -0
- package/dist/lib/xterm/src/browser/Linkifier2.ts +397 -0
- package/dist/lib/xterm/src/browser/LocalizableStrings.ts +10 -0
- package/dist/lib/xterm/src/browser/MouseZoneManager.ts +236 -0
- package/dist/lib/xterm/src/browser/RenderDebouncer.ts +82 -0
- package/dist/lib/xterm/src/browser/ScreenDprMonitor.ts +69 -0
- package/dist/lib/xterm/src/browser/Terminal.ts +1447 -0
- package/dist/lib/xterm/src/browser/TimeBasedDebouncer.ts +86 -0
- package/dist/lib/xterm/src/browser/Types.d.ts +317 -0
- package/dist/lib/xterm/src/browser/Viewport.ts +276 -0
- package/dist/lib/xterm/src/browser/decorations/BufferDecorationRenderer.ts +131 -0
- package/dist/lib/xterm/src/browser/decorations/ColorZoneStore.ts +117 -0
- package/dist/lib/xterm/src/browser/decorations/OverviewRulerRenderer.ts +228 -0
- package/dist/lib/xterm/src/browser/input/CompositionHelper.ts +237 -0
- package/dist/lib/xterm/src/browser/input/Mouse.ts +64 -0
- package/dist/lib/xterm/src/browser/input/MoveToCell.ts +249 -0
- package/dist/lib/xterm/src/browser/public/Terminal.ts +298 -0
- package/dist/lib/xterm/src/browser/renderer/BaseRenderLayer.ts +582 -0
- package/dist/lib/xterm/src/browser/renderer/CursorRenderLayer.ts +378 -0
- package/dist/lib/xterm/src/browser/renderer/CustomGlyphs.ts +632 -0
- package/dist/lib/xterm/src/browser/renderer/GridCache.ts +33 -0
- package/dist/lib/xterm/src/browser/renderer/LinkRenderLayer.ts +84 -0
- package/dist/lib/xterm/src/browser/renderer/Renderer.ts +219 -0
- package/dist/lib/xterm/src/browser/renderer/RendererUtils.ts +26 -0
- package/dist/lib/xterm/src/browser/renderer/SelectionRenderLayer.ts +131 -0
- package/dist/lib/xterm/src/browser/renderer/TextRenderLayer.ts +344 -0
- package/dist/lib/xterm/src/browser/renderer/Types.d.ts +109 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/BaseCharAtlas.ts +58 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/CharAtlasCache.ts +95 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/CharAtlasUtils.ts +54 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/Constants.ts +15 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/DynamicCharAtlas.ts +404 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/LRUMap.ts +136 -0
- package/dist/lib/xterm/src/browser/renderer/atlas/Types.d.ts +29 -0
- package/dist/lib/xterm/src/browser/renderer/dom/DomRenderer.ts +403 -0
- package/dist/lib/xterm/src/browser/renderer/dom/DomRendererRowFactory.ts +344 -0
- package/dist/lib/xterm/src/browser/selection/SelectionModel.ts +144 -0
- package/dist/lib/xterm/src/browser/selection/Types.d.ts +15 -0
- package/dist/lib/xterm/src/browser/services/CharSizeService.ts +87 -0
- package/dist/lib/xterm/src/browser/services/CharacterJoinerService.ts +339 -0
- package/dist/lib/xterm/src/browser/services/CoreBrowserService.ts +20 -0
- package/dist/lib/xterm/src/browser/services/MouseService.ts +36 -0
- package/dist/lib/xterm/src/browser/services/RenderService.ts +237 -0
- package/dist/lib/xterm/src/browser/services/SelectionService.ts +1027 -0
- package/dist/lib/xterm/src/browser/services/Services.ts +123 -0
- package/dist/lib/xterm/src/browser/services/SoundService.ts +63 -0
- package/dist/lib/xterm/src/common/CircularList.ts +239 -0
- package/dist/lib/xterm/src/common/Clone.ts +23 -0
- package/dist/lib/xterm/src/common/Color.ts +285 -0
- package/dist/lib/xterm/src/common/CoreTerminal.ts +300 -0
- package/dist/lib/xterm/src/common/EventEmitter.ts +69 -0
- package/dist/lib/xterm/src/common/InputHandler.ts +3230 -0
- package/dist/lib/xterm/src/common/Lifecycle.ts +68 -0
- package/dist/lib/xterm/src/common/Platform.ts +31 -0
- package/dist/lib/xterm/src/common/SortedList.ts +88 -0
- package/dist/lib/xterm/src/common/TypedArrayUtils.ts +50 -0
- package/dist/lib/xterm/src/common/Types.d.ts +489 -0
- package/dist/lib/xterm/src/common/WindowsMode.ts +27 -0
- package/dist/lib/xterm/src/common/buffer/AttributeData.ts +148 -0
- package/dist/lib/xterm/src/common/buffer/Buffer.ts +711 -0
- package/dist/lib/xterm/src/common/buffer/BufferLine.ts +441 -0
- package/dist/lib/xterm/src/common/buffer/BufferRange.ts +13 -0
- package/dist/lib/xterm/src/common/buffer/BufferReflow.ts +220 -0
- package/dist/lib/xterm/src/common/buffer/BufferSet.ts +131 -0
- package/dist/lib/xterm/src/common/buffer/CellData.ts +94 -0
- package/dist/lib/xterm/src/common/buffer/Constants.ts +139 -0
- package/dist/lib/xterm/src/common/buffer/Marker.ts +37 -0
- package/dist/lib/xterm/src/common/buffer/Types.d.ts +64 -0
- package/dist/lib/xterm/src/common/data/Charsets.ts +256 -0
- package/dist/lib/xterm/src/common/data/EscapeSequences.ts +153 -0
- package/dist/lib/xterm/src/common/input/Keyboard.ts +398 -0
- package/dist/lib/xterm/src/common/input/TextDecoder.ts +346 -0
- package/dist/lib/xterm/src/common/input/UnicodeV6.ts +133 -0
- package/dist/lib/xterm/src/common/input/WriteBuffer.ts +229 -0
- package/dist/lib/xterm/src/common/input/XParseColor.ts +80 -0
- package/dist/lib/xterm/src/common/parser/Constants.ts +58 -0
- package/dist/lib/xterm/src/common/parser/DcsParser.ts +192 -0
- package/dist/lib/xterm/src/common/parser/EscapeSequenceParser.ts +796 -0
- package/dist/lib/xterm/src/common/parser/OscParser.ts +238 -0
- package/dist/lib/xterm/src/common/parser/Params.ts +229 -0
- package/dist/lib/xterm/src/common/parser/Types.d.ts +274 -0
- package/dist/lib/xterm/src/common/public/AddonManager.ts +56 -0
- package/dist/lib/xterm/src/common/public/BufferApiView.ts +35 -0
- package/dist/lib/xterm/src/common/public/BufferLineApiView.ts +29 -0
- package/dist/lib/xterm/src/common/public/BufferNamespaceApi.ts +33 -0
- package/dist/lib/xterm/src/common/public/ParserApi.ts +37 -0
- package/dist/lib/xterm/src/common/public/UnicodeApi.ts +27 -0
- package/dist/lib/xterm/src/common/services/BufferService.ts +185 -0
- package/dist/lib/xterm/src/common/services/CharsetService.ts +34 -0
- package/dist/lib/xterm/src/common/services/CoreMouseService.ts +309 -0
- package/dist/lib/xterm/src/common/services/CoreService.ts +92 -0
- package/dist/lib/xterm/src/common/services/DecorationService.ts +139 -0
- package/dist/lib/xterm/src/common/services/DirtyRowService.ts +53 -0
- package/dist/lib/xterm/src/common/services/InstantiationService.ts +83 -0
- package/dist/lib/xterm/src/common/services/LogService.ts +88 -0
- package/dist/lib/xterm/src/common/services/OptionsService.ts +178 -0
- package/dist/lib/xterm/src/common/services/ServiceRegistry.ts +49 -0
- package/dist/lib/xterm/src/common/services/Services.ts +323 -0
- package/dist/lib/xterm/src/common/services/UnicodeService.ts +82 -0
- package/dist/lib/xterm/src/headless/Terminal.ts +170 -0
- package/dist/lib/xterm/src/headless/Types.d.ts +31 -0
- package/dist/lib/xterm/src/headless/public/Terminal.ts +216 -0
- package/dist/lib/xterm/typings/xterm.d.ts +1872 -0
- package/dist/lib/xterm-fit/LICENSE +19 -0
- package/dist/lib/xterm-fit/README.md +24 -0
- package/dist/lib/xterm-fit/lib/xterm-addon-fit.js +2 -0
- package/dist/lib/xterm-fit/lib/xterm-addon-fit.js.map +1 -0
- package/dist/lib/xterm-fit/out/FitAddon.js +58 -0
- package/dist/lib/xterm-fit/out/FitAddon.js.map +1 -0
- package/dist/lib/xterm-fit/out-test/FitAddon.api.js.map +1 -0
- package/dist/lib/xterm-fit/package.json +21 -0
- package/dist/lib/xterm-fit/src/FitAddon.ts +86 -0
- package/dist/lib/xterm-fit/typings/xterm-addon-fit.d.ts +55 -0
- package/dist/lib/xterm-links/LICENSE +19 -0
- package/dist/lib/xterm-links/README.md +21 -0
- package/dist/lib/xterm-links/lib/xterm-addon-web-links.js +2 -0
- package/dist/lib/xterm-links/lib/xterm-addon-web-links.js.map +1 -0
- package/dist/lib/xterm-links/package.json +26 -0
- package/dist/lib/xterm-links/src/WebLinkProvider.ts +145 -0
- package/dist/lib/xterm-links/src/WebLinksAddon.ts +77 -0
- package/dist/lib/xterm-links/typings/xterm-addon-web-links.d.ts +58 -0
- package/package.json +1 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { IEvent } from 'common/EventEmitter';
|
|
7
|
+
import { IRenderDimensions, IRenderer } from 'browser/renderer/Types';
|
|
8
|
+
import { IColorSet, IRenderDebouncer } from 'browser/Types';
|
|
9
|
+
import { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';
|
|
10
|
+
import { createDecorator } from 'common/services/ServiceRegistry';
|
|
11
|
+
import { IDisposable } from 'common/Types';
|
|
12
|
+
import { IDecorationOptions, IDecoration } from 'xterm';
|
|
13
|
+
import { IBufferService } from 'common/services/Services';
|
|
14
|
+
|
|
15
|
+
export const ICharSizeService = createDecorator<ICharSizeService>('CharSizeService');
|
|
16
|
+
export interface ICharSizeService {
|
|
17
|
+
serviceBrand: undefined;
|
|
18
|
+
|
|
19
|
+
readonly width: number;
|
|
20
|
+
readonly height: number;
|
|
21
|
+
readonly hasValidSize: boolean;
|
|
22
|
+
|
|
23
|
+
readonly onCharSizeChange: IEvent<void>;
|
|
24
|
+
|
|
25
|
+
measure(): void;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const ICoreBrowserService = createDecorator<ICoreBrowserService>('CoreBrowserService');
|
|
29
|
+
export interface ICoreBrowserService {
|
|
30
|
+
serviceBrand: undefined;
|
|
31
|
+
|
|
32
|
+
readonly isFocused: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const IMouseService = createDecorator<IMouseService>('MouseService');
|
|
36
|
+
export interface IMouseService {
|
|
37
|
+
serviceBrand: undefined;
|
|
38
|
+
|
|
39
|
+
getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;
|
|
40
|
+
getRawByteCoords(event: MouseEvent, element: HTMLElement, colCount: number, rowCount: number): { x: number, y: number } | undefined;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const IRenderService = createDecorator<IRenderService>('RenderService');
|
|
44
|
+
export interface IRenderService extends IDisposable {
|
|
45
|
+
serviceBrand: undefined;
|
|
46
|
+
|
|
47
|
+
onDimensionsChange: IEvent<IRenderDimensions>;
|
|
48
|
+
/**
|
|
49
|
+
* Fires when buffer changes are rendered. This does not fire when only cursor
|
|
50
|
+
* or selections are rendered.
|
|
51
|
+
*/
|
|
52
|
+
onRenderedViewportChange: IEvent<{ start: number, end: number }>;
|
|
53
|
+
/**
|
|
54
|
+
* Fires on render
|
|
55
|
+
*/
|
|
56
|
+
onRender: IEvent<{ start: number, end: number }>;
|
|
57
|
+
onRefreshRequest: IEvent<{ start: number, end: number }>;
|
|
58
|
+
|
|
59
|
+
dimensions: IRenderDimensions;
|
|
60
|
+
|
|
61
|
+
addRefreshCallback(callback: FrameRequestCallback): number;
|
|
62
|
+
|
|
63
|
+
refreshRows(start: number, end: number): void;
|
|
64
|
+
clearTextureAtlas(): void;
|
|
65
|
+
resize(cols: number, rows: number): void;
|
|
66
|
+
setRenderer(renderer: IRenderer): void;
|
|
67
|
+
setColors(colors: IColorSet): void;
|
|
68
|
+
onDevicePixelRatioChange(): void;
|
|
69
|
+
onResize(cols: number, rows: number): void;
|
|
70
|
+
// TODO: Is this useful when we have onResize?
|
|
71
|
+
onCharSizeChanged(): void;
|
|
72
|
+
onBlur(): void;
|
|
73
|
+
onFocus(): void;
|
|
74
|
+
onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;
|
|
75
|
+
onCursorMove(): void;
|
|
76
|
+
clear(): void;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export const ISelectionService = createDecorator<ISelectionService>('SelectionService');
|
|
80
|
+
export interface ISelectionService {
|
|
81
|
+
serviceBrand: undefined;
|
|
82
|
+
|
|
83
|
+
readonly selectionText: string;
|
|
84
|
+
readonly hasSelection: boolean;
|
|
85
|
+
readonly selectionStart: [number, number] | undefined;
|
|
86
|
+
readonly selectionEnd: [number, number] | undefined;
|
|
87
|
+
|
|
88
|
+
readonly onLinuxMouseSelection: IEvent<string>;
|
|
89
|
+
readonly onRequestRedraw: IEvent<ISelectionRequestRedrawEvent>;
|
|
90
|
+
readonly onRequestScrollLines: IEvent<ISelectionRequestScrollLinesEvent>;
|
|
91
|
+
readonly onSelectionChange: IEvent<void>;
|
|
92
|
+
|
|
93
|
+
disable(): void;
|
|
94
|
+
enable(): void;
|
|
95
|
+
reset(): void;
|
|
96
|
+
setSelection(row: number, col: number, length: number): void;
|
|
97
|
+
selectAll(): void;
|
|
98
|
+
selectLines(start: number, end: number): void;
|
|
99
|
+
clearSelection(): void;
|
|
100
|
+
rightClickSelect(event: MouseEvent): void;
|
|
101
|
+
shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;
|
|
102
|
+
shouldForceSelection(event: MouseEvent): boolean;
|
|
103
|
+
refresh(isLinuxMouseSelection?: boolean): void;
|
|
104
|
+
onMouseDown(event: MouseEvent): void;
|
|
105
|
+
isCellInSelection(x: number, y: number): boolean;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export const ISoundService = createDecorator<ISoundService>('SoundService');
|
|
109
|
+
export interface ISoundService {
|
|
110
|
+
serviceBrand: undefined;
|
|
111
|
+
|
|
112
|
+
playBellSound(): void;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
export const ICharacterJoinerService = createDecorator<ICharacterJoinerService>('CharacterJoinerService');
|
|
117
|
+
export interface ICharacterJoinerService {
|
|
118
|
+
serviceBrand: undefined;
|
|
119
|
+
|
|
120
|
+
register(handler: (text: string) => [number, number][]): number;
|
|
121
|
+
deregister(joinerId: number): boolean;
|
|
122
|
+
getJoinedCharacters(row: number): [number, number][];
|
|
123
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { IOptionsService } from 'common/services/Services';
|
|
7
|
+
import { ISoundService } from 'browser/services/Services';
|
|
8
|
+
|
|
9
|
+
export class SoundService implements ISoundService {
|
|
10
|
+
public serviceBrand: undefined;
|
|
11
|
+
|
|
12
|
+
private static _audioContext: AudioContext;
|
|
13
|
+
|
|
14
|
+
public static get audioContext(): AudioContext | null {
|
|
15
|
+
if (!SoundService._audioContext) {
|
|
16
|
+
const audioContextCtor: typeof AudioContext = (window as any).AudioContext || (window as any).webkitAudioContext;
|
|
17
|
+
if (!audioContextCtor) {
|
|
18
|
+
console.warn('Web Audio API is not supported by this browser. Consider upgrading to the latest version');
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
SoundService._audioContext = new audioContextCtor();
|
|
22
|
+
}
|
|
23
|
+
return SoundService._audioContext;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
constructor(
|
|
27
|
+
@IOptionsService private _optionsService: IOptionsService
|
|
28
|
+
) {
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public playBellSound(): void {
|
|
32
|
+
const ctx = SoundService.audioContext;
|
|
33
|
+
if (!ctx) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const bellAudioSource = ctx.createBufferSource();
|
|
37
|
+
ctx.decodeAudioData(this._base64ToArrayBuffer(this._removeMimeType(this._optionsService.rawOptions.bellSound)), (buffer) => {
|
|
38
|
+
bellAudioSource.buffer = buffer;
|
|
39
|
+
bellAudioSource.connect(ctx.destination);
|
|
40
|
+
bellAudioSource.start(0);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private _base64ToArrayBuffer(base64: string): ArrayBuffer {
|
|
45
|
+
const binaryString = window.atob(base64);
|
|
46
|
+
const len = binaryString.length;
|
|
47
|
+
const bytes = new Uint8Array(len);
|
|
48
|
+
|
|
49
|
+
for (let i = 0; i < len; i++) {
|
|
50
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return bytes.buffer;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private _removeMimeType(dataURI: string): string {
|
|
57
|
+
// Split the input to get the mime-type and the data itself
|
|
58
|
+
const splitUri = dataURI.split(',');
|
|
59
|
+
|
|
60
|
+
// Return only the data
|
|
61
|
+
return splitUri[1];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2016 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ICircularList } from 'common/Types';
|
|
7
|
+
import { EventEmitter, IEvent } from 'common/EventEmitter';
|
|
8
|
+
|
|
9
|
+
export interface IInsertEvent {
|
|
10
|
+
index: number;
|
|
11
|
+
amount: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface IDeleteEvent {
|
|
15
|
+
index: number;
|
|
16
|
+
amount: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Represents a circular list; a list with a maximum size that wraps around when push is called,
|
|
21
|
+
* overriding values at the start of the list.
|
|
22
|
+
*/
|
|
23
|
+
export class CircularList<T> implements ICircularList<T> {
|
|
24
|
+
protected _array: (T | undefined)[];
|
|
25
|
+
private _startIndex: number;
|
|
26
|
+
private _length: number;
|
|
27
|
+
|
|
28
|
+
public onDeleteEmitter = new EventEmitter<IDeleteEvent>();
|
|
29
|
+
public get onDelete(): IEvent<IDeleteEvent> { return this.onDeleteEmitter.event; }
|
|
30
|
+
public onInsertEmitter = new EventEmitter<IInsertEvent>();
|
|
31
|
+
public get onInsert(): IEvent<IInsertEvent> { return this.onInsertEmitter.event; }
|
|
32
|
+
public onTrimEmitter = new EventEmitter<number>();
|
|
33
|
+
public get onTrim(): IEvent<number> { return this.onTrimEmitter.event; }
|
|
34
|
+
|
|
35
|
+
constructor(
|
|
36
|
+
private _maxLength: number
|
|
37
|
+
) {
|
|
38
|
+
this._array = new Array<T>(this._maxLength);
|
|
39
|
+
this._startIndex = 0;
|
|
40
|
+
this._length = 0;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public get maxLength(): number {
|
|
44
|
+
return this._maxLength;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public set maxLength(newMaxLength: number) {
|
|
48
|
+
// There was no change in maxLength, return early.
|
|
49
|
+
if (this._maxLength === newMaxLength) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Reconstruct array, starting at index 0. Only transfer values from the
|
|
54
|
+
// indexes 0 to length.
|
|
55
|
+
const newArray = new Array<T | undefined>(newMaxLength);
|
|
56
|
+
for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {
|
|
57
|
+
newArray[i] = this._array[this._getCyclicIndex(i)];
|
|
58
|
+
}
|
|
59
|
+
this._array = newArray;
|
|
60
|
+
this._maxLength = newMaxLength;
|
|
61
|
+
this._startIndex = 0;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public get length(): number {
|
|
65
|
+
return this._length;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public set length(newLength: number) {
|
|
69
|
+
if (newLength > this._length) {
|
|
70
|
+
for (let i = this._length; i < newLength; i++) {
|
|
71
|
+
this._array[i] = undefined;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
this._length = newLength;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Gets the value at an index.
|
|
79
|
+
*
|
|
80
|
+
* Note that for performance reasons there is no bounds checking here, the index reference is
|
|
81
|
+
* circular so this should always return a value and never throw.
|
|
82
|
+
* @param index The index of the value to get.
|
|
83
|
+
* @return The value corresponding to the index.
|
|
84
|
+
*/
|
|
85
|
+
public get(index: number): T | undefined {
|
|
86
|
+
return this._array[this._getCyclicIndex(index)];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Sets the value at an index.
|
|
91
|
+
*
|
|
92
|
+
* Note that for performance reasons there is no bounds checking here, the index reference is
|
|
93
|
+
* circular so this should always return a value and never throw.
|
|
94
|
+
* @param index The index to set.
|
|
95
|
+
* @param value The value to set.
|
|
96
|
+
*/
|
|
97
|
+
public set(index: number, value: T | undefined): void {
|
|
98
|
+
this._array[this._getCyclicIndex(index)] = value;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0
|
|
103
|
+
* if the maximum length is reached.
|
|
104
|
+
* @param value The value to push onto the list.
|
|
105
|
+
*/
|
|
106
|
+
public push(value: T): void {
|
|
107
|
+
this._array[this._getCyclicIndex(this._length)] = value;
|
|
108
|
+
if (this._length === this._maxLength) {
|
|
109
|
+
this._startIndex = ++this._startIndex % this._maxLength;
|
|
110
|
+
this.onTrimEmitter.fire(1);
|
|
111
|
+
} else {
|
|
112
|
+
this._length++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Advance ringbuffer index and return current element for recycling.
|
|
118
|
+
* Note: The buffer must be full for this method to work.
|
|
119
|
+
* @throws When the buffer is not full.
|
|
120
|
+
*/
|
|
121
|
+
public recycle(): T {
|
|
122
|
+
if (this._length !== this._maxLength) {
|
|
123
|
+
throw new Error('Can only recycle when the buffer is full');
|
|
124
|
+
}
|
|
125
|
+
this._startIndex = ++this._startIndex % this._maxLength;
|
|
126
|
+
this.onTrimEmitter.fire(1);
|
|
127
|
+
return this._array[this._getCyclicIndex(this._length - 1)]!;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Ringbuffer is at max length.
|
|
132
|
+
*/
|
|
133
|
+
public get isFull(): boolean {
|
|
134
|
+
return this._length === this._maxLength;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Removes and returns the last value on the list.
|
|
139
|
+
* @return The popped value.
|
|
140
|
+
*/
|
|
141
|
+
public pop(): T | undefined {
|
|
142
|
+
return this._array[this._getCyclicIndex(this._length-- - 1)];
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Deletes and/or inserts items at a particular index (in that order). Unlike
|
|
147
|
+
* Array.prototype.splice, this operation does not return the deleted items as a new array in
|
|
148
|
+
* order to save creating a new array. Note that this operation may shift all values in the list
|
|
149
|
+
* in the worst case.
|
|
150
|
+
* @param start The index to delete and/or insert.
|
|
151
|
+
* @param deleteCount The number of elements to delete.
|
|
152
|
+
* @param items The items to insert.
|
|
153
|
+
*/
|
|
154
|
+
public splice(start: number, deleteCount: number, ...items: T[]): void {
|
|
155
|
+
// Delete items
|
|
156
|
+
if (deleteCount) {
|
|
157
|
+
for (let i = start; i < this._length - deleteCount; i++) {
|
|
158
|
+
this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];
|
|
159
|
+
}
|
|
160
|
+
this._length -= deleteCount;
|
|
161
|
+
this.onDeleteEmitter.fire({ index: start, amount: deleteCount });
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Add items
|
|
165
|
+
for (let i = this._length - 1; i >= start; i--) {
|
|
166
|
+
this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];
|
|
167
|
+
}
|
|
168
|
+
for (let i = 0; i < items.length; i++) {
|
|
169
|
+
this._array[this._getCyclicIndex(start + i)] = items[i];
|
|
170
|
+
}
|
|
171
|
+
if (items.length) {
|
|
172
|
+
this.onInsertEmitter.fire({ index: start, amount: items.length });
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Adjust length as needed
|
|
176
|
+
if (this._length + items.length > this._maxLength) {
|
|
177
|
+
const countToTrim = (this._length + items.length) - this._maxLength;
|
|
178
|
+
this._startIndex += countToTrim;
|
|
179
|
+
this._length = this._maxLength;
|
|
180
|
+
this.onTrimEmitter.fire(countToTrim);
|
|
181
|
+
} else {
|
|
182
|
+
this._length += items.length;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Trims a number of items from the start of the list.
|
|
188
|
+
* @param count The number of items to remove.
|
|
189
|
+
*/
|
|
190
|
+
public trimStart(count: number): void {
|
|
191
|
+
if (count > this._length) {
|
|
192
|
+
count = this._length;
|
|
193
|
+
}
|
|
194
|
+
this._startIndex += count;
|
|
195
|
+
this._length -= count;
|
|
196
|
+
this.onTrimEmitter.fire(count);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
public shiftElements(start: number, count: number, offset: number): void {
|
|
200
|
+
if (count <= 0) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (start < 0 || start >= this._length) {
|
|
204
|
+
throw new Error('start argument out of range');
|
|
205
|
+
}
|
|
206
|
+
if (start + offset < 0) {
|
|
207
|
+
throw new Error('Cannot shift elements in list beyond index 0');
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (offset > 0) {
|
|
211
|
+
for (let i = count - 1; i >= 0; i--) {
|
|
212
|
+
this.set(start + i + offset, this.get(start + i));
|
|
213
|
+
}
|
|
214
|
+
const expandListBy = (start + count + offset) - this._length;
|
|
215
|
+
if (expandListBy > 0) {
|
|
216
|
+
this._length += expandListBy;
|
|
217
|
+
while (this._length > this._maxLength) {
|
|
218
|
+
this._length--;
|
|
219
|
+
this._startIndex++;
|
|
220
|
+
this.onTrimEmitter.fire(1);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
} else {
|
|
224
|
+
for (let i = 0; i < count; i++) {
|
|
225
|
+
this.set(start + i + offset, this.get(start + i));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Gets the cyclic index for the specified regular index. The cyclic index can then be used on the
|
|
232
|
+
* backing array to get the element associated with the regular index.
|
|
233
|
+
* @param index The regular index.
|
|
234
|
+
* @returns The cyclic index.
|
|
235
|
+
*/
|
|
236
|
+
private _getCyclicIndex(index: number): number {
|
|
237
|
+
return (this._startIndex + index) % this._maxLength;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2016 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* A simple utility for cloning values
|
|
8
|
+
*/
|
|
9
|
+
export function clone<T>(val: T, depth: number = 5): T {
|
|
10
|
+
if (typeof val !== 'object') {
|
|
11
|
+
return val;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// If we're cloning an array, use an array as the base, otherwise use an object
|
|
15
|
+
const clonedObject: any = Array.isArray(val) ? [] : {};
|
|
16
|
+
|
|
17
|
+
for (const key in val) {
|
|
18
|
+
// Recursively clone eack item unless we're at the maximum depth
|
|
19
|
+
clonedObject[key] = depth <= 1 ? val[key] : (val[key] && clone(val[key], depth - 1));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return clonedObject as T;
|
|
23
|
+
}
|