0a6bf1372f0ce2e62f6545996f66f625af6ed530.svn-base
1.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _stringLength = _interopRequireDefault(require("string-length"));
var _sliceAnsi = _interopRequireDefault(require("slice-ansi"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* "Virtual" output class
*
* Handles the positioning and saving of the output of each node in the tree.
* Also responsible for applying transformations to each character of the output.
*
* Used to generate the final output of all nodes before writing it to actual output stream (e.g. stdout)
*/
class Output {
constructor({
width,
height
}) {
// Initialize output array with a specific set of rows, so that margin/padding at the bottom is preserved
const output = [];
for (let y = 0; y < height; y++) {
output.push(' '.repeat(width));
}
this.output = output;
}
write(x, y, text, {
transformers
}) {
if (!text) {
return;
}
const lines = text.split('\n');
let offsetY = 0;
for (let line of lines) {
const length = (0, _stringLength.default)(line);
const currentLine = this.output[y + offsetY]; // Line can be missing if `text` is taller than height of pre-initialized `this.output`
if (!currentLine) {
continue;
}
for (const transformer of transformers) {
line = transformer(line);
}
this.output[y + offsetY] = (0, _sliceAnsi.default)(currentLine, 0, x) + line + (0, _sliceAnsi.default)(currentLine, x + length);
offsetY++;
}
}
get() {
return this.output.map(line => line.trimRight()).join('\n');
}
getHeight() {
return this.output.length;
}
}
exports.default = Output;