@react-slate/core
Version:
Write interactive CLI apps with React
69 lines • 2.69 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const shallowequal_1 = __importDefault(require("shallowequal"));
const applyStyle_1 = __importDefault(require("./applyStyle"));
const Canvas_1 = __importDefault(require("./Canvas"));
class Renderer {
constructor() {
this.pixels = [];
this.memoizedRows = [];
this.renderToString = (rootNode, layout) => {
const canvas = this.render(rootNode, layout);
this.pixels = canvas.pixels;
const rows = this.getAnsiRows(canvas);
return rows.join('\n');
};
this.renderDiff = (rootNode, layout) => {
const canvas = this.render(rootNode, layout);
this.pixels = canvas.pixels;
const rows = this.getAnsiRows(canvas);
const diff = [];
for (let y = 0; y < Math.max(rows.length, this.memoizedRows.length); y += 1) {
if (this.memoizedRows[y] !== rows[y]) {
diff[diff.length] = { line: y, text: rows[y] || '' };
}
}
this.memoizedRows = rows;
return diff;
};
}
render(rootNode, layout) {
const canvas = new Canvas_1.default();
canvas.fill(rootNode, layout, {
parentZ: rootNode.parent ? rootNode.parent.zIndex : 0,
});
rootNode.children.forEach((child, i) => {
canvas.mergeChildCanvas(this.render(child, layout.child(i)));
});
return canvas;
}
getAnsiRows(canvas) {
const rows = [];
for (let y = 0; y < canvas.height; y += 1) {
let line = '';
let groupText = '';
let groupAttributes;
for (let x = 0; x < canvas.width; x += 1) {
if (shallowequal_1.default(groupAttributes, canvas.pixels[y][x].style)) {
groupText += canvas.pixels[y][x].char || ' ';
}
else {
line += groupAttributes
? applyStyle_1.default(groupAttributes, groupText)
: groupText;
groupAttributes = canvas.pixels[y][x].style;
groupText = canvas.pixels[y][x].char || ' ';
}
}
rows[y] =
line +
(groupAttributes ? applyStyle_1.default(groupAttributes, groupText) : groupText);
}
return rows;
}
}
exports.default = Renderer;
//# sourceMappingURL=Renderer.js.map