diff --git a/src/Buffer.ts b/src/Buffer.ts index d9117fda..37d61d88 100644 --- a/src/Buffer.ts +++ b/src/Buffer.ts @@ -6,11 +6,9 @@ import { CircularList, IInsertEvent } from './common/CircularList'; import { ITerminal, IBuffer, BufferIndex, IBufferStringIterator, IBufferStringIteratorResult } from './Types'; import { IBufferLine, ICellData, IAttributeData } from './core/Types'; -import { IMarker } from 'xterm'; import { BufferLine, CellData, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_CHAR_INDEX, DEFAULT_ATTR_DATA } from './core/buffer/BufferLine'; -import { reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths, getWrappedLineTrimmedLength } from './BufferReflow'; -import { EventEmitter2, IEvent } from './common/EventEmitter2'; -import { Disposable } from './common/Lifecycle'; +import { reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths, getWrappedLineTrimmedLength } from './core/buffer/BufferReflow'; +import { Marker } from './core/buffer/Marker'; export const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1 @@ -603,33 +601,6 @@ export class Buffer implements IBuffer { } } -export class Marker extends Disposable implements IMarker { - private static _nextId = 1; - - private _id: number = Marker._nextId++; - public isDisposed: boolean = false; - - public get id(): number { return this._id; } - - private _onDispose = new EventEmitter2(); - public get onDispose(): IEvent { return this._onDispose.event; } - - constructor( - public line: number - ) { - super(); - } - - public dispose(): void { - if (this.isDisposed) { - return; - } - this.isDisposed = true; - // Emit before super.dispose such that dispose listeners get a change to react - this._onDispose.fire(); - } -} - /** * Iterator to get unwrapped content strings from the buffer. * The iterator returns at least the string data between the borders diff --git a/src/core/Types.ts b/src/core/Types.ts index ae9274b8..5b97f249 100644 --- a/src/core/Types.ts +++ b/src/core/Types.ts @@ -3,6 +3,8 @@ * @license MIT */ +import { IDisposable } from '../common/Types'; + export const enum KeyboardResultType { SEND_KEY, SELECT_ALL, @@ -98,3 +100,9 @@ export interface IBufferLine { isCombined(index: number): number; getString(index: number): string; } + +export interface IMarker extends IDisposable { + readonly id: number; + readonly isDisposed: boolean; + readonly line: number; +} diff --git a/src/BufferReflow.test.ts b/src/core/buffer/BufferReflow.test.ts similarity index 70% rename from src/BufferReflow.test.ts rename to src/core/buffer/BufferReflow.test.ts index 91454e2a..d0d97dff 100644 --- a/src/BufferReflow.test.ts +++ b/src/core/buffer/BufferReflow.test.ts @@ -3,17 +3,17 @@ * @license MIT */ import { assert } from 'chai'; -import { BufferLine, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE } from './core/buffer/BufferLine'; +import { BufferLine, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE } from './BufferLine'; import { reflowSmallerGetNewLineLengths } from './BufferReflow'; describe('BufferReflow', () => { describe('reflowSmallerGetNewLineLengths', () => { it('should return correct line lengths for a small line with wide characters', () => { const line = new BufferLine(4); - line.set(0, [null, '汉', 2, '汉'.charCodeAt(0)]); - line.set(1, [null, '', 0, undefined]); - line.set(2, [null, '语', 2, '语'.charCodeAt(0)]); - line.set(3, [null, '', 0, undefined]); + line.set(0, [0, '汉', 2, '汉'.charCodeAt(0)]); + line.set(1, [0, '', 0, 0]); + line.set(2, [0, '语', 2, '语'.charCodeAt(0)]); + line.set(3, [0, '', 0, 0]); assert.equal(line.translateToString(true), '汉语'); assert.deepEqual(reflowSmallerGetNewLineLengths([line], 4, 3), [2, 2], 'line: 汉, 语'); assert.deepEqual(reflowSmallerGetNewLineLengths([line], 4, 2), [2, 2], 'line: 汉, 语'); @@ -21,12 +21,12 @@ describe('BufferReflow', () => { it('should return correct line lengths for a large line with wide characters', () => { const line = new BufferLine(12); for (let i = 0; i < 12; i += 4) { - line.set(i, [null, '汉', 2, '汉'.charCodeAt(0)]); - line.set(i + 2, [null, '语', 2, '语'.charCodeAt(0)]); + line.set(i, [0, '汉', 2, '汉'.charCodeAt(0)]); + line.set(i + 2, [0, '语', 2, '语'.charCodeAt(0)]); } for (let i = 1; i < 12; i += 2) { - line.set(i, [null, '', 0, undefined]); - line.set(i, [null, '', 0, undefined]); + line.set(i, [0, '', 0, 0]); + line.set(i, [0, '', 0, 0]); } assert.equal(line.translateToString(), '汉语汉语汉语'); assert.deepEqual(reflowSmallerGetNewLineLengths([line], 12, 11), [10, 2], 'line: 汉语汉语汉, 语'); @@ -42,12 +42,12 @@ describe('BufferReflow', () => { }); it('should return correct line lengths for a string with wide and single characters', () => { const line = new BufferLine(6); - line.set(0, [null, 'a', 1, 'a'.charCodeAt(0)]); - line.set(1, [null, '汉', 2, '汉'.charCodeAt(0)]); - line.set(2, [null, '', 0, undefined]); - line.set(3, [null, '语', 2, '语'.charCodeAt(0)]); - line.set(4, [null, '', 0, undefined]); - line.set(5, [null, 'b', 1, 'b'.charCodeAt(0)]); + line.set(0, [0, 'a', 1, 'a'.charCodeAt(0)]); + line.set(1, [0, '汉', 2, '汉'.charCodeAt(0)]); + line.set(2, [0, '', 0, 0]); + line.set(3, [0, '语', 2, '语'.charCodeAt(0)]); + line.set(4, [0, '', 0, 0]); + line.set(5, [0, 'b', 1, 'b'.charCodeAt(0)]); assert.equal(line.translateToString(), 'a汉语b'); assert.deepEqual(reflowSmallerGetNewLineLengths([line], 6, 5), [5, 1], 'line: a汉语b'); assert.deepEqual(reflowSmallerGetNewLineLengths([line], 6, 4), [3, 3], 'line: a汉, 语b'); @@ -56,19 +56,19 @@ describe('BufferReflow', () => { }); it('should return correct line lengths for a wrapped line with wide and single characters', () => { const line1 = new BufferLine(6); - line1.set(0, [null, 'a', 1, 'a'.charCodeAt(0)]); - line1.set(1, [null, '汉', 2, '汉'.charCodeAt(0)]); - line1.set(2, [null, '', 0, undefined]); - line1.set(3, [null, '语', 2, '语'.charCodeAt(0)]); - line1.set(4, [null, '', 0, undefined]); - line1.set(5, [null, 'b', 1, 'b'.charCodeAt(0)]); + line1.set(0, [0, 'a', 1, 'a'.charCodeAt(0)]); + line1.set(1, [0, '汉', 2, '汉'.charCodeAt(0)]); + line1.set(2, [0, '', 0, 0]); + line1.set(3, [0, '语', 2, '语'.charCodeAt(0)]); + line1.set(4, [0, '', 0, 0]); + line1.set(5, [0, 'b', 1, 'b'.charCodeAt(0)]); const line2 = new BufferLine(6, undefined, true); - line2.set(0, [null, 'a', 1, 'a'.charCodeAt(0)]); - line2.set(1, [null, '汉', 2, '汉'.charCodeAt(0)]); - line2.set(2, [null, '', 0, undefined]); - line2.set(3, [null, '语', 2, '语'.charCodeAt(0)]); - line2.set(4, [null, '', 0, undefined]); - line2.set(5, [null, 'b', 1, 'b'.charCodeAt(0)]); + line2.set(0, [0, 'a', 1, 'a'.charCodeAt(0)]); + line2.set(1, [0, '汉', 2, '汉'.charCodeAt(0)]); + line2.set(2, [0, '', 0, 0]); + line2.set(3, [0, '语', 2, '语'.charCodeAt(0)]); + line2.set(4, [0, '', 0, 0]); + line2.set(5, [0, 'b', 1, 'b'.charCodeAt(0)]); assert.equal(line1.translateToString(), 'a汉语b'); assert.equal(line2.translateToString(), 'a汉语b'); assert.deepEqual(reflowSmallerGetNewLineLengths([line1, line2], 6, 5), [5, 4, 3], 'lines: a汉语, ba汉, 语b'); @@ -78,11 +78,11 @@ describe('BufferReflow', () => { }); it('should work on lines ending in null space', () => { const line = new BufferLine(5); - line.set(0, [null, '汉', 2, '汉'.charCodeAt(0)]); - line.set(1, [null, '', 0, undefined]); - line.set(2, [null, '语', 2, '语'.charCodeAt(0)]); - line.set(3, [null, '', 0, undefined]); - line.set(4, [null, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]); + line.set(0, [0, '汉', 2, '汉'.charCodeAt(0)]); + line.set(1, [0, '', 0, 0]); + line.set(2, [0, '语', 2, '语'.charCodeAt(0)]); + line.set(3, [0, '', 0, 0]); + line.set(4, [0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]); assert.equal(line.translateToString(true), '汉语'); assert.equal(line.translateToString(false), '汉语 '); assert.deepEqual(reflowSmallerGetNewLineLengths([line], 4, 3), [2, 2], 'line: 汉, 语'); diff --git a/src/BufferReflow.ts b/src/core/buffer/BufferReflow.ts similarity index 97% rename from src/BufferReflow.ts rename to src/core/buffer/BufferReflow.ts index c1068967..e363da0b 100644 --- a/src/BufferReflow.ts +++ b/src/core/buffer/BufferReflow.ts @@ -3,9 +3,9 @@ * @license MIT */ -import { BufferLine } from './core/buffer/BufferLine'; -import { CircularList } from './common/CircularList'; -import { IBufferLine, ICellData } from './core/Types'; +import { BufferLine } from './BufferLine'; +import { CircularList } from '../../common/CircularList'; +import { IBufferLine, ICellData } from '../Types'; export interface INewLayoutResult { layout: number[]; diff --git a/src/core/buffer/Marker.ts b/src/core/buffer/Marker.ts new file mode 100644 index 00000000..26de0dfe --- /dev/null +++ b/src/core/buffer/Marker.ts @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2018 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import { EventEmitter2, IEvent } from '../../common/EventEmitter2'; +import { Disposable } from '../../common/Lifecycle'; +import { IMarker } from '../Types'; + +export class Marker extends Disposable implements IMarker { + private static _nextId = 1; + + private _id: number = Marker._nextId++; + public isDisposed: boolean = false; + + public get id(): number { return this._id; } + + private _onDispose = new EventEmitter2(); + public get onDispose(): IEvent { return this._onDispose.event; } + + constructor( + public line: number + ) { + super(); + } + + public dispose(): void { + if (this.isDisposed) { + return; + } + this.isDisposed = true; + // Emit before super.dispose such that dispose listeners get a change to react + this._onDispose.fire(); + } +}