nehan
Version:
Html layout engine for paged-media written in Typescript
50 lines • 2.36 kB
JavaScript
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