| "use strict"; |
| Object.defineProperty(exports, "__esModule", { value: true }); |
| exports.createTableBorderGetter = exports.drawBorderBottom = exports.drawBorderJoin = exports.drawBorderTop = exports.drawBorder = exports.createSeparatorGetter = exports.drawBorderSegments = void 0; |
| const drawContent_1 = require("./drawContent"); |
| const drawBorderSegments = (columnWidths, parameters) => { |
| const { separator, horizontalBorderIndex, spanningCellManager } = parameters; |
| return columnWidths.map((columnWidth, columnIndex) => { |
| const normalSegment = separator.body.repeat(columnWidth); |
| if (horizontalBorderIndex === undefined) { |
| return normalSegment; |
| } |
| /* istanbul ignore next */ |
| const range = spanningCellManager === null || spanningCellManager === void 0 ? void 0 : spanningCellManager.getContainingRange({ col: columnIndex, |
| row: horizontalBorderIndex }); |
| if (!range) { |
| return normalSegment; |
| } |
| const { topLeft } = range; |
| // draw border segments as usual for top border of spanning cell |
| if (horizontalBorderIndex === topLeft.row) { |
| return normalSegment; |
| } |
| // if for first column/row of spanning cell, just skip |
| if (columnIndex !== topLeft.col) { |
| return ''; |
| } |
| return range.extractBorderContent(horizontalBorderIndex); |
| }); |
| }; |
| exports.drawBorderSegments = drawBorderSegments; |
| const createSeparatorGetter = (dependencies) => { |
| const { separator, spanningCellManager, horizontalBorderIndex, rowCount } = dependencies; |
| // eslint-disable-next-line complexity |
| return (verticalBorderIndex, columnCount) => { |
| const inSameRange = spanningCellManager === null || spanningCellManager === void 0 ? void 0 : spanningCellManager.inSameRange; |
| if (horizontalBorderIndex !== undefined && inSameRange) { |
| const topCell = { col: verticalBorderIndex, |
| row: horizontalBorderIndex - 1 }; |
| const leftCell = { col: verticalBorderIndex - 1, |
| row: horizontalBorderIndex }; |
| const oppositeCell = { col: verticalBorderIndex - 1, |
| row: horizontalBorderIndex - 1 }; |
| const currentCell = { col: verticalBorderIndex, |
| row: horizontalBorderIndex }; |
| const pairs = [ |
| [oppositeCell, topCell], |
| [topCell, currentCell], |
| [currentCell, leftCell], |
| [leftCell, oppositeCell], |
| ]; |
| // left side of horizontal border |
| if (verticalBorderIndex === 0) { |
| if (inSameRange(currentCell, topCell) && separator.bodyJoinOuter) { |
| return separator.bodyJoinOuter; |
| } |
| return separator.left; |
| } |
| // right side of horizontal border |
| if (verticalBorderIndex === columnCount) { |
| if (inSameRange(oppositeCell, leftCell) && separator.bodyJoinOuter) { |
| return separator.bodyJoinOuter; |
| } |
| return separator.right; |
| } |
| // top horizontal border |
| if (horizontalBorderIndex === 0) { |
| if (inSameRange(currentCell, leftCell)) { |
| return separator.body; |
| } |
| return separator.join; |
| } |
| // bottom horizontal border |
| if (horizontalBorderIndex === rowCount) { |
| if (inSameRange(topCell, oppositeCell)) { |
| return separator.body; |
| } |
| return separator.join; |
| } |
| const sameRangeCount = pairs.map((pair) => { |
| return inSameRange(...pair); |
| }).filter(Boolean).length; |
| // four cells are belongs to different spanning cells |
| if (sameRangeCount === 0) { |
| return separator.join; |
| } |
| // belong to one spanning cell |
| if (sameRangeCount === 4) { |
| return ''; |
| } |
| // belongs to two spanning cell |
| if (sameRangeCount === 2) { |
| if (inSameRange(...pairs[1]) && inSameRange(...pairs[3]) && separator.bodyJoinInner) { |
| return separator.bodyJoinInner; |
| } |
| return separator.body; |
| } |
| /* istanbul ignore next */ |
| if (sameRangeCount === 1) { |
| if (!separator.joinRight || !separator.joinLeft || !separator.joinUp || !separator.joinDown) { |
| throw new Error(`Can not get border separator for position [${horizontalBorderIndex}, ${verticalBorderIndex}]`); |
| } |
| if (inSameRange(...pairs[0])) { |
| return separator.joinDown; |
| } |
| if (inSameRange(...pairs[1])) { |
| return separator.joinLeft; |
| } |
| if (inSameRange(...pairs[2])) { |
| return separator.joinUp; |
| } |
| return separator.joinRight; |
| } |
| /* istanbul ignore next */ |
| throw new Error('Invalid case'); |
| } |
| if (verticalBorderIndex === 0) { |
| return separator.left; |
| } |
| if (verticalBorderIndex === columnCount) { |
| return separator.right; |
| } |
| return separator.join; |
| }; |
| }; |
| exports.createSeparatorGetter = createSeparatorGetter; |
| const drawBorder = (columnWidths, parameters) => { |
| const borderSegments = (0, exports.drawBorderSegments)(columnWidths, parameters); |
| const { drawVerticalLine, horizontalBorderIndex, spanningCellManager } = parameters; |
| return (0, drawContent_1.drawContent)({ |
| contents: borderSegments, |
| drawSeparator: drawVerticalLine, |
| elementType: 'border', |
| rowIndex: horizontalBorderIndex, |
| separatorGetter: (0, exports.createSeparatorGetter)(parameters), |
| spanningCellManager, |
| }) + '\n'; |
| }; |
| exports.drawBorder = drawBorder; |
| const drawBorderTop = (columnWidths, parameters) => { |
| const { border } = parameters; |
| const result = (0, exports.drawBorder)(columnWidths, { |
| ...parameters, |
| separator: { |
| body: border.topBody, |
| join: border.topJoin, |
| left: border.topLeft, |
| right: border.topRight, |
| }, |
| }); |
| if (result === '\n') { |
| return ''; |
| } |
| return result; |
| }; |
| exports.drawBorderTop = drawBorderTop; |
| const drawBorderJoin = (columnWidths, parameters) => { |
| const { border } = parameters; |
| return (0, exports.drawBorder)(columnWidths, { |
| ...parameters, |
| separator: { |
| body: border.joinBody, |
| bodyJoinInner: border.bodyJoin, |
| bodyJoinOuter: border.bodyLeft, |
| join: border.joinJoin, |
| joinDown: border.joinMiddleDown, |
| joinLeft: border.joinMiddleLeft, |
| joinRight: border.joinMiddleRight, |
| joinUp: border.joinMiddleUp, |
| left: border.joinLeft, |
| right: border.joinRight, |
| }, |
| }); |
| }; |
| exports.drawBorderJoin = drawBorderJoin; |
| const drawBorderBottom = (columnWidths, parameters) => { |
| const { border } = parameters; |
| return (0, exports.drawBorder)(columnWidths, { |
| ...parameters, |
| separator: { |
| body: border.bottomBody, |
| join: border.bottomJoin, |
| left: border.bottomLeft, |
| right: border.bottomRight, |
| }, |
| }); |
| }; |
| exports.drawBorderBottom = drawBorderBottom; |
| const createTableBorderGetter = (columnWidths, parameters) => { |
| return (index, size) => { |
| const drawBorderParameters = { ...parameters, |
| horizontalBorderIndex: index }; |
| if (index === 0) { |
| return (0, exports.drawBorderTop)(columnWidths, drawBorderParameters); |
| } |
| else if (index === size) { |
| return (0, exports.drawBorderBottom)(columnWidths, drawBorderParameters); |
| } |
| return (0, exports.drawBorderJoin)(columnWidths, drawBorderParameters); |
| }; |
| }; |
| exports.createTableBorderGetter = createTableBorderGetter; |
| //# sourceMappingURL=drawBorder.js.map |