@native-html/heuristic-table-plugin
Version:
🔠A 100% native component using heuristics to render tables in react-native-render-html
46 lines (43 loc) • 2.06 kB
JavaScript
import pipe from 'ramda/src/pipe';
import map from 'ramda/src/map';
import prop from 'ramda/src/prop';
import sum from 'ramda/src/sum';
import min from 'ramda/src/min';
import reduce from 'ramda/src/reduce';
import converge from 'ramda/src/converge';
import subtract from 'ramda/src/subtract';
import partialRight from 'ramda/src/partialRight';
import divide from 'ramda/src/divide';
import add from 'ramda/src/add';
import zip from 'ramda/src/zip';
import multiply from 'ramda/src/multiply';
import identity from 'ramda/src/identity';
import reduceColumnConstraints from './reduceColumnConstraints';
const mapMinWidths = map(prop('minWidth'));
const mapspreads = map(prop('spread')); // Compute the normal content density for each column,
// that is content density with the zero reference as
// the shortest column.
const mapNormalContentDensity = converge((m, list) => {
return map(partialRight(subtract, [m]))(list);
}, [reduce(min, Infinity), identity]);
const weightContentDensity = converge((s, list) => {
return map(partialRight(divide, [s]))(list);
}, [sum, identity]);
const mapWeightedColumnCoeffs = pipe(map(prop('contentDensity')), mapNormalContentDensity, weightContentDensity);
const totalMinWidths = pipe(mapMinWidths, sum);
export default function computeColumnWidths(display) {
const contentWidth = display.contentWidth;
let shouldClampWidth = !display.forceStretch;
const columnConstraints = reduceColumnConstraints(display.cells);
const minWidths = mapMinWidths(columnConstraints);
const spreads = mapspreads(columnConstraints);
const sumOfMinWidths = totalMinWidths(columnConstraints);
if (contentWidth < sumOfMinWidths) {
return minWidths;
}
const widthToAssign = contentWidth - sumOfMinWidths;
const clampWidths = pipe(zip(spreads), map(reduce(min, Infinity)));
const columns = pipe(mapWeightedColumnCoeffs, map(multiply(widthToAssign)), zip(minWidths), map(reduce(add, 0)), shouldClampWidth ? clampWidths : identity)(columnConstraints);
return columns;
}
//# sourceMappingURL=computeColumnWidths.js.map