UNPKG

nehan

Version:

Html layout engine for paged-media written in Typescript

50 lines 2.36 kB
import { FlowFormatContext, LogicalBlockNode, LogicalBlockReNode, LogicalLineNode, } from './public-api'; export class TableCellsFormatContext extends FlowFormatContext { constructor(elements, env, parent) { super(env, parent); this.elements = elements; this.env = env; this.parent = parent; this.cells = []; } acceptLayoutReducer(reducer) { return reducer.visit(this); } setCells(cells) { this.cells = cells; const isCollapse = this.env.borderCollapse.isCollapse(); const maxCell = cells.reduce((acm, cell) => acm.size.extent > cell.size.extent ? acm : cell, cells[0]); const maxContentExtent = maxCell.size.extent; const maxTotalExtent = Math.max(...cells.map(cell => cell.extent)); let startPos = 0; this.cells.forEach((cell, index) => { cell.size.extent = maxContentExtent; cell.size.extent += maxTotalExtent - cell.extent; cell.layoutPos.start = startPos; startPos += cell.measure; if (cell.autoSize.extent !== maxCell.extent && maxCell.border.afterWidth === 0) { cell.border.clearAfter(); } if (isCollapse) { const prevBorderSize = (index === 0) ? this.env.edge.border.width.start : this.cells[index - 1].border.width.end; const inlineCollapseSize = Math.min(prevBorderSize, cell.border.width.start); cell.layoutPos.start -= inlineCollapseSize; startPos -= inlineCollapseSize; } const diffSize = cell.size.extent - cell.autoSize.extent; const valign = cell.env.verticalAlign.value; if (diffSize > 0 && (valign === "middle" || valign === "after")) { const delta = valign === "middle" ? Math.floor(diffSize / 2) : diffSize; cell.children.forEach(child => { if (child instanceof LogicalLineNode) { child.linePos.before += delta; } else if (child instanceof LogicalBlockNode || child instanceof LogicalBlockReNode) { child.layoutPos.before += delta; } }); } }); } } //# sourceMappingURL=table-cells-format-context.js.map