diff --git a/src/Charsets.ts b/src/Charsets.ts index 0ee91d326..e62e3f9c0 100644 --- a/src/Charsets.ts +++ b/src/Charsets.ts @@ -3,19 +3,19 @@ * @license MIT */ -import { Charset } from './Types'; +import { ICharset } from './Interfaces'; /** * The character sets supported by the terminal. These enable several languages * to be represented within the terminal with only 8-bit encoding. See ISO 2022 * for a discussion on character sets. Only VT100 character sets are supported. */ -export const CHARSETS: { [key: string]: Charset } = {}; +export const CHARSETS: { [key: string]: ICharset } = {}; /** * The default character set, US. */ -export const DEFAULT_CHARSET: Charset = CHARSETS['B']; +export const DEFAULT_CHARSET: ICharset = CHARSETS['B']; /** * DEC Special Character and Line Drawing Set. diff --git a/src/Interfaces.ts b/src/Interfaces.ts index e209c4dc2..5947f10b3 100644 --- a/src/Interfaces.ts +++ b/src/Interfaces.ts @@ -3,8 +3,8 @@ * @license MIT */ -import { ILinkMatcherOptions } from './Interfaces'; -import { LinkMatcherHandler, LinkMatcherValidationCallback, Charset, LineData } from './Types'; +import { ICharset, ILinkMatcherOptions } from './Interfaces'; +import { LinkMatcherHandler, LinkMatcherValidationCallback, LineData } from './Types'; import { IColorSet, IRenderer } from './renderer/Interfaces'; import { IMouseZoneManager } from './input/Interfaces'; @@ -74,10 +74,10 @@ export interface IInputHandlingTerminal extends IEventEmitter { options: ITerminalOptions; cols: number; rows: number; - charset: Charset; + charset: ICharset; gcharset: number; glevel: number; - charsets: Charset[]; + charsets: ICharset[]; applicationKeypad: boolean; applicationCursor: boolean; originMode: boolean; @@ -116,7 +116,7 @@ export interface IInputHandlingTerminal extends IEventEmitter { blankLine(cur?: boolean, isWrapped?: boolean): LineData; is(term: string): boolean; send(data: string): void; - setgCharset(g: number, charset: Charset): void; + setgCharset(g: number, charset: ICharset): void; resize(x: number, y: number): void; log(text: string, data?: any): void; reset(): void; @@ -352,3 +352,23 @@ export interface ITheme { brightCyan?: string; brightWhite?: string; } + +export interface ILinkMatcher { + id: number; + regex: RegExp; + handler: LinkMatcherHandler; + hoverTooltipCallback?: LinkMatcherHandler; + hoverLeaveCallback?: () => void; + matchIndex?: number; + validationCallback?: LinkMatcherValidationCallback; + priority?: number; +} +export interface ICharset { + [key: string]: string; +} + +export interface ILinkHoverEvent { + x: number; + y: number; + length: number; +} diff --git a/src/Linkifier.test.ts b/src/Linkifier.test.ts index 0878aafc2..8b66dcaa5 100644 --- a/src/Linkifier.test.ts +++ b/src/Linkifier.test.ts @@ -4,9 +4,9 @@ */ import { assert } from 'chai'; -import { ITerminal, ILinkifier, IBuffer, IBufferAccessor, IElementAccessor } from './Interfaces'; +import { ITerminal, ILinkifier, ILinkMatcher, IBuffer, IBufferAccessor, IElementAccessor } from './Interfaces'; import { Linkifier } from './Linkifier'; -import { LinkMatcher, LineData } from './Types'; +import { LineData } from './Types'; import { IMouseZoneManager, IMouseZone } from './input/Interfaces'; import { MockBuffer } from './utils/TestUtils.test'; import { CircularList } from './utils/CircularList'; @@ -17,7 +17,7 @@ class TestLinkifier extends Linkifier { Linkifier.TIME_BEFORE_LINKIFY = 0; } - public get linkMatchers(): LinkMatcher[] { return this._linkMatchers; } + public get linkMatchers(): ILinkMatcher[] { return this._linkMatchers; } public linkifyRows(): void { super.linkifyRows(0, this._terminal.buffer.lines.length - 1); } } diff --git a/src/Linkifier.ts b/src/Linkifier.ts index e6a63b5c9..767719301 100644 --- a/src/Linkifier.ts +++ b/src/Linkifier.ts @@ -3,8 +3,8 @@ * @license MIT */ -import { ILinkMatcherOptions, ITerminal, IBufferAccessor, ILinkifier, IElementAccessor } from './Interfaces'; -import { LinkMatcher, LinkMatcherHandler, LinkMatcherValidationCallback, LineData, LinkHoverEvent, LinkHoverEventTypes } from './Types'; +import { ILinkHoverEvent, ILinkMatcher, ILinkMatcherOptions, ITerminal, IBufferAccessor, ILinkifier, IElementAccessor } from './Interfaces'; +import { LinkMatcherHandler, LinkMatcherValidationCallback, LineData, LinkHoverEventTypes } from './Types'; import { IMouseZoneManager } from './input/Interfaces'; import { MouseZone } from './input/MouseZoneManager'; import { EventEmitter } from './EventEmitter'; @@ -44,7 +44,7 @@ export class Linkifier extends EventEmitter implements ILinkifier { */ protected static TIME_BEFORE_LINKIFY = 200; - protected _linkMatchers: LinkMatcher[] = []; + protected _linkMatchers: ILinkMatcher[] = []; private _mouseZoneManager: IMouseZoneManager; private _rowsTimeoutId: number; @@ -143,7 +143,7 @@ export class Linkifier extends EventEmitter implements ILinkifier { if (this._nextLinkMatcherId !== HYPERTEXT_LINK_MATCHER_ID && !handler) { throw new Error('handler must be defined'); } - const matcher: LinkMatcher = { + const matcher: ILinkMatcher = { id: this._nextLinkMatcherId++, regex, handler, @@ -163,7 +163,7 @@ export class Linkifier extends EventEmitter implements ILinkifier { * considered after older link matchers. * @param matcher The link matcher to be added. */ - private _addLinkMatcherToList(matcher: LinkMatcher): void { + private _addLinkMatcherToList(matcher: ILinkMatcher): void { if (this._linkMatchers.length === 0) { this._linkMatchers.push(matcher); return; @@ -219,7 +219,7 @@ export class Linkifier extends EventEmitter implements ILinkifier { * @param offset The how much of the row has already been linkified. * @return The link element(s) that were added. */ - private _doLinkifyRow(rowIndex: number, text: string, matcher: LinkMatcher, offset: number = 0): void { + private _doLinkifyRow(rowIndex: number, text: string, matcher: ILinkMatcher, offset: number = 0): void { // Iterate over nodes as we want to consider text nodes let result = []; const isHttpLinkMatcher = matcher.id === HYPERTEXT_LINK_MATCHER_ID; @@ -264,7 +264,7 @@ export class Linkifier extends EventEmitter implements ILinkifier { * @param uri The URI of the link. * @param matcher The link matcher for the link. */ - private _addLink(x: number, y: number, uri: string, matcher: LinkMatcher): void { + private _addLink(x: number, y: number, uri: string, matcher: ILinkMatcher): void { this._mouseZoneManager.add(new MouseZone( x + 1, x + 1 + uri.length, @@ -276,17 +276,17 @@ export class Linkifier extends EventEmitter implements ILinkifier { window.open(uri, '_blank'); }, e => { - this.emit(LinkHoverEventTypes.HOVER, { x, y, length: uri.length}); + this.emit(LinkHoverEventTypes.HOVER, { x, y, length: uri.length}); this._terminal.element.style.cursor = 'pointer'; }, e => { - this.emit(LinkHoverEventTypes.TOOLTIP, { x, y, length: uri.length}); + this.emit(LinkHoverEventTypes.TOOLTIP, { x, y, length: uri.length}); if (matcher.hoverTooltipCallback) { matcher.hoverTooltipCallback(e, uri); } }, () => { - this.emit(LinkHoverEventTypes.LEAVE, { x, y, length: uri.length}); + this.emit(LinkHoverEventTypes.LEAVE, { x, y, length: uri.length}); this._terminal.element.style.cursor = ''; if (matcher.hoverLeaveCallback) { matcher.hoverLeaveCallback(); diff --git a/src/Terminal.ts b/src/Terminal.ts index 8c0a3793c..2280be8ef 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -38,8 +38,8 @@ import { CharMeasure } from './utils/CharMeasure'; import * as Browser from './utils/Browser'; import { MouseHelper } from './utils/MouseHelper'; import { CHARSETS } from './Charsets'; -import { CustomKeyEventHandler, Charset, LinkMatcherHandler, LinkMatcherValidationCallback, CharData, LineData } from './Types'; -import { ITerminal, IBrowser, ITerminalOptions, IInputHandlingTerminal, ILinkMatcherOptions, IViewport, ICompositionHelper, ITheme, ILinkifier } from './Interfaces'; +import { CustomKeyEventHandler, LinkMatcherHandler, LinkMatcherValidationCallback, CharData, LineData } from './Types'; +import { ITerminal, IBrowser, ICharset, ITerminalOptions, IInputHandlingTerminal, ILinkMatcherOptions, IViewport, ICompositionHelper, ITheme, ILinkifier } from './Interfaces'; import { BELL_SOUND } from './utils/Sounds'; import { DEFAULT_ANSI_COLORS } from './renderer/ColorManager'; import { IMouseZoneManager } from './input/Interfaces'; @@ -131,10 +131,10 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT // charset // The current charset - public charset: Charset; + public charset: ICharset; public gcharset: number; public glevel: number; - public charsets: Charset[]; + public charsets: ICharset[]; // mouse properties private decLocator: boolean; // This is unstable and never set @@ -1728,7 +1728,7 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT * @param g * @param charset */ - public setgCharset(g: number, charset: Charset): void { + public setgCharset(g: number, charset: ICharset): void { this.charsets[g] = charset; if (this.glevel === g) { this.charset = charset; diff --git a/src/Types.ts b/src/Types.ts index 4a2b99ed0..3263282e0 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -3,31 +3,14 @@ * @license MIT */ -export type LinkMatcher = { - id: number, - regex: RegExp, - handler: LinkMatcherHandler, - hoverTooltipCallback?: LinkMatcherHandler, - hoverLeaveCallback?: () => void, - matchIndex?: number, - validationCallback?: LinkMatcherValidationCallback, - priority?: number -}; export type LinkMatcherHandler = (event: MouseEvent, uri: string) => boolean | void; export type LinkMatcherValidationCallback = (uri: string, callback: (isValid: boolean) => void) => void; export type CustomKeyEventHandler = (event: KeyboardEvent) => boolean; -export type Charset = {[key: string]: string}; export type CharData = [number, string, number, number]; export type LineData = CharData[]; -export type LinkHoverEvent = { - x: number, - y: number, - length: number -}; - export enum LinkHoverEventTypes { HOVER = 'linkhover', TOOLTIP = 'linktooltip', diff --git a/src/addons/attach/attach.ts b/src/addons/attach/attach.ts index 21645c8a6..ba9386958 100644 --- a/src/addons/attach/attach.ts +++ b/src/addons/attach/attach.ts @@ -105,8 +105,8 @@ export function apply(terminalConstructor: any): void { * should happen instantly or at a maximum * frequency of 1 rendering per 10ms. */ - terminalConstructor.prototype.attach = (socket: WebSocket, bidirectional: boolean, buffered: boolean) => { - return attach(this, socket, bidirectional, buffered); + terminalConstructor.prototype.attach = function (socket: WebSocket, bidirectional: boolean, buffered: boolean): void { + attach(this, socket, bidirectional, buffered); }; /** @@ -115,7 +115,7 @@ export function apply(terminalConstructor: any): void { * @param {WebSocket} socket - The socket from which to detach the current * terminal. */ - terminalConstructor.prototype.detach = (socket: WebSocket) => { - return detach(this, socket); + terminalConstructor.prototype.detach = function (socket: WebSocket): void { + detach(this, socket); }; } diff --git a/src/renderer/CursorRenderLayer.ts b/src/renderer/CursorRenderLayer.ts index 689d69141..2706085f7 100644 --- a/src/renderer/CursorRenderLayer.ts +++ b/src/renderer/CursorRenderLayer.ts @@ -11,7 +11,7 @@ import { FLAGS } from './Types'; import { BaseRenderLayer } from './BaseRenderLayer'; import { CharData } from '../Types'; -interface CursorState { +interface ICursorState { x: number; y: number; isFocused: boolean; @@ -25,7 +25,7 @@ interface CursorState { const BLINK_INTERVAL = 600; export class CursorRenderLayer extends BaseRenderLayer { - private _state: CursorState; + private _state: ICursorState; private _cursorRenderers: {[key: string]: (terminal: ITerminal, x: number, y: number, charData: CharData) => void}; private _cursorBlinkStateManager: CursorBlinkStateManager; private _isFocused: boolean; diff --git a/src/renderer/LinkRenderLayer.ts b/src/renderer/LinkRenderLayer.ts index 8f3b63a54..87fbddbdf 100644 --- a/src/renderer/LinkRenderLayer.ts +++ b/src/renderer/LinkRenderLayer.ts @@ -4,20 +4,20 @@ */ import { IColorSet, IRenderDimensions } from './Interfaces'; -import { IBuffer, ICharMeasure, ITerminal, ILinkifierAccessor } from '../Interfaces'; +import { IBuffer, ICharMeasure, ILinkHoverEvent, ITerminal, ILinkifierAccessor } from '../Interfaces'; import { CHAR_DATA_ATTR_INDEX } from '../Buffer'; import { GridCache } from './GridCache'; import { FLAGS } from './Types'; import { BaseRenderLayer, INVERTED_DEFAULT_COLOR } from './BaseRenderLayer'; -import { LinkHoverEvent, LinkHoverEventTypes } from '../Types'; +import { LinkHoverEventTypes } from '../Types'; export class LinkRenderLayer extends BaseRenderLayer { - private _state: LinkHoverEvent = null; + private _state: ILinkHoverEvent = null; constructor(container: HTMLElement, zIndex: number, colors: IColorSet, terminal: ILinkifierAccessor) { super(container, 'link', zIndex, true, colors); - terminal.linkifier.on(LinkHoverEventTypes.HOVER, (e: LinkHoverEvent) => this._onLinkHover(e)); - terminal.linkifier.on(LinkHoverEventTypes.LEAVE, (e: LinkHoverEvent) => this._onLinkLeave(e)); + terminal.linkifier.on(LinkHoverEventTypes.HOVER, (e: ILinkHoverEvent) => this._onLinkHover(e)); + terminal.linkifier.on(LinkHoverEventTypes.LEAVE, (e: ILinkHoverEvent) => this._onLinkLeave(e)); } public resize(terminal: ITerminal, dim: IRenderDimensions, charSizeChanged: boolean): void { @@ -37,13 +37,13 @@ export class LinkRenderLayer extends BaseRenderLayer { } } - private _onLinkHover(e: LinkHoverEvent): void { + private _onLinkHover(e: ILinkHoverEvent): void { this._ctx.fillStyle = this._colors.foreground; this.fillBottomLineAtCells(e.x, e.y, e.length); this._state = e; } - private _onLinkLeave(e: LinkHoverEvent): void { + private _onLinkLeave(e: ILinkHoverEvent): void { this._clearCurrentLink(); } } diff --git a/tslint.json b/tslint.json index 31c9ec848..b5367f6a0 100644 --- a/tslint.json +++ b/tslint.json @@ -13,6 +13,11 @@ true, "spaces" ], + "interface-name": [ + true, + "always-prefix" + ], + "interface-over-type-literal": true, "typedef": [ true, "call-signature",