@visactor/vgrammar-core
Version:
VGrammar is a visual grammar library
76 lines (66 loc) • 4.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: !0
}), exports.doGridLayout = void 0;
const vutils_1 = require("@visactor/vutils");
function parseTemplate(template, total) {
if ((0, vutils_1.isValidNumber)(template)) return template;
const trimmedTemplate = template.trim();
if ("auto" === trimmedTemplate) return 0;
if (trimmedTemplate.endsWith("%")) {
const percent = parseFloat(trimmedTemplate.substring(0, trimmedTemplate.length - 1));
return (0, vutils_1.isValidNumber)(percent) ? percent * total : 0;
}
return 0;
}
function computeGrid(layout, width, height) {
var _a, _b, _c, _d;
const templateRows = null !== (_a = layout.gridTemplateRows) && void 0 !== _a ? _a : [ height ], templateColumns = null !== (_b = layout.gridTemplateColumns) && void 0 !== _b ? _b : [ width ], rowGap = null !== (_c = layout.gridRowGap) && void 0 !== _c ? _c : 0, columnGap = null !== (_d = layout.gridColumnGap) && void 0 !== _d ? _d : 0, rows = templateRows.map((row => parseTemplate(row, height))), columns = templateColumns.map((column => parseTemplate(column, width))), rowAuto = Math.max(0, rows.reduce(((left, row) => left - row), height) - rows.length * rowGap) / templateRows.filter((row => "auto" === row)).length, columnAuto = Math.max(0, columns.reduce(((left, column) => left - column), width) - columns.length * columnGap) / templateColumns.filter((column => "auto" === column)).length;
let lastRow = 0;
const accumulateRows = rows.map(((row, index) => {
const finalRow = "auto" === templateRows[index] ? rowAuto : row, last = lastRow;
return lastRow += finalRow + rowGap, last;
}));
accumulateRows.push(lastRow);
let lastColumn = 0;
const accumulateColumns = columns.map(((column, index) => {
const finalColumn = "auto" === templateColumns[index] ? columnAuto : column, last = lastColumn;
return lastColumn += finalColumn + columnGap, last;
}));
return accumulateColumns.push(lastColumn), {
rows: accumulateRows,
columns: accumulateColumns,
rowGap: rowGap,
columnGap: columnGap
};
}
function normalizeIndex(index, count) {
return Math.min(index < 0 ? index + count : index - 1, count);
}
function normalizeStartEndIndex(start, end, count) {
let finalStart = normalizeIndex(start, count), finalEnd = normalizeIndex(end, count);
if ((0, vutils_1.isValidNumber)(start) || (0, vutils_1.isValidNumber)(end) ? (0,
vutils_1.isValidNumber)(start) ? (0, vutils_1.isValidNumber)(end) || (finalStart = normalizeIndex(Math.max(0, finalEnd - 1), count)) : finalEnd = normalizeIndex(finalStart + 1, count) : (finalStart = 1,
finalEnd = 2), finalStart > finalEnd) {
const temp = finalEnd;
finalEnd = finalStart, finalStart = temp;
}
return {
start: finalStart,
end: finalEnd
};
}
function getCellBounds(grid, rowStart, rowEnd, columnStart, columnEnd) {
const rowCount = grid.rows.length, columnCount = grid.columns.length, {start: finalRowStart, end: finalRowEnd} = normalizeStartEndIndex(rowStart, rowEnd, rowCount), {start: finalColumnStart, end: finalColumnEnd} = normalizeStartEndIndex(columnStart, columnEnd, columnCount), x1 = grid.columns[finalRowStart], x2 = grid.columns[finalRowEnd] - (finalColumnEnd === columnCount ? 0 : grid.columnGap), y1 = grid.rows[finalColumnStart], y2 = grid.rows[finalColumnEnd] - (finalRowEnd === rowCount ? 0 : grid.rowGap);
return (new vutils_1.Bounds).set(x1, y1, x2, y2);
}
const doGridLayout = (group, children, parentLayoutBounds, options) => {
const grid = computeGrid(group.getSpec().layout, parentLayoutBounds.width(), parentLayoutBounds.height());
children && children.forEach((mark => {
const markLayout = mark.getSpec().layout;
mark.layoutBounds = getCellBounds(grid, markLayout.gridRowStart, markLayout.gridRowEnd, markLayout.gridColumnStart, markLayout.gridColumnEnd),
mark.commit();
}));
};
exports.doGridLayout = doGridLayout;
//# sourceMappingURL=grid.js.map