ConsoleWriter.ts
100 lines
| 2.8 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r82 | import { TextWriterBase } from "../text/TextWriterBase"; | ||
| import { isNull, isNullOrEmptyString, isPrimitive } from "../safe"; | ||||
| import { NullConsole } from "./NullConsole"; | ||||
| interface LogConsole { | ||||
| debug(...args: any[]): void; | ||||
| log(...args: any[]): void; | ||||
| warn(...args: any[]): void; | ||||
| error(...args: any[]): void; | ||||
| } | ||||
| function hasConsole() { | ||||
| try { | ||||
| // tslint:disable-next-line:no-console | ||||
| return (typeof console !== "undefined" && typeof console.log === "function"); | ||||
| } catch { | ||||
| return false; | ||||
| } | ||||
| } | ||||
| function getConsole() { | ||||
| return hasConsole() ? console : NullConsole.instance; | ||||
| } | ||||
| export class ConsoleWriter extends TextWriterBase { | ||||
| static readonly default = new ConsoleWriter(getConsole()); | ||||
| private _buffer: any[]; | ||||
| private _out: LogConsole; | ||||
| private _level: keyof LogConsole; | ||||
| constructor(out?: LogConsole) { | ||||
| super(); | ||||
| this._out = out || NullConsole.instance; | ||||
| this._buffer = []; | ||||
| this._level = "log"; | ||||
| } | ||||
| getLogLevel() { | ||||
| return this._level; | ||||
| } | ||||
| setLogLevel(level: keyof LogConsole) { | ||||
| this._level = level; | ||||
| } | ||||
| /** Flushes the buffer to the console | ||||
| */ | ||||
| writeNewLine() { | ||||
| // group text chunks together, and let objects as is | ||||
| // ['a', 'b', {foo: 'bar'}, 'c', 'd'] -> ['ab', {foo: 'bar'}, 'cd'] | ||||
| // this will prevent from additional spaces to occur in the console | ||||
| // ['a', 'b'] will be printed as 'a b' rather then 'ab'. | ||||
| // console.log("writeLine", this._buffer); | ||||
| let offset = 0; | ||||
| const args = []; | ||||
| this._buffer.forEach((v, i) => { | ||||
| if (!isPrimitive(v)) { | ||||
| if (offset < i) | ||||
| args.push(i - offset > 1 ? this._buffer.slice(offset, i).join("") : this._buffer[offset]); | ||||
| args.push(v); | ||||
| offset = i + 1; | ||||
| } | ||||
| }); | ||||
| if (offset < this._buffer.length) | ||||
| args.push(this._buffer.slice(offset).join("")); | ||||
| // console.log("WriteLine", args); | ||||
| this._out[this._level].apply(this._out, args); | ||||
| this._buffer = []; | ||||
| } | ||||
| /** Adds a text chunk to the buffer. Buffer contents will be flushed when | ||||
| * the end of line will be printed. | ||||
| * | ||||
| * @param text The text to be added to the buffer. | ||||
| */ | ||||
| writeText(text: string) { | ||||
| this._buffer.push(text); | ||||
| } | ||||
| /** Wrotes the specified value to the buffer. | ||||
| * | ||||
| * @param value The value to be added to the buffer | ||||
| * @param spec The instructions how to format the value, is this parameter | ||||
| * is ommited the raw value will be added to the buffer and | ||||
| * passed directly to the console out. | ||||
| */ | ||||
| writeValue(value: any, spec?: string) { | ||||
| if (isNullOrEmptyString(spec)) | ||||
| this._buffer.push(value); | ||||
| else | ||||
|
|
r85 | super.writeValue(value, spec); | ||
|
|
r82 | } | ||
| } | ||||
