UNPKG

@react-slate/core

Version:

Write interactive CLI apps with React

69 lines 2.69 kB
"use strict"; 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