pretext-pdf 1.1.1 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +689 -0
- package/README.md +82 -7
- package/dist/allowed-props.d.ts +76 -0
- package/dist/allowed-props.d.ts.map +1 -1
- package/dist/allowed-props.js.map +1 -1
- package/dist/assets/generators/barcode.d.ts +9 -0
- package/dist/assets/generators/barcode.d.ts.map +1 -0
- package/dist/assets/generators/barcode.js +24 -0
- package/dist/assets/generators/barcode.js.map +1 -0
- package/dist/assets/generators/chart.d.ts +13 -0
- package/dist/assets/generators/chart.d.ts.map +1 -0
- package/dist/assets/generators/chart.js +32 -0
- package/dist/assets/generators/chart.js.map +1 -0
- package/dist/assets/generators/qr.d.ts +9 -0
- package/dist/assets/generators/qr.d.ts.map +1 -0
- package/dist/assets/generators/qr.js +25 -0
- package/dist/assets/generators/qr.js.map +1 -0
- package/dist/assets/index.d.ts +19 -0
- package/dist/assets/index.d.ts.map +1 -0
- package/dist/assets/index.js +19 -0
- package/dist/assets/index.js.map +1 -0
- package/dist/assets/loaders/images.d.ts +20 -0
- package/dist/assets/loaders/images.d.ts.map +1 -0
- package/dist/assets/loaders/images.js +69 -0
- package/dist/assets/loaders/images.js.map +1 -0
- package/dist/assets/loaders/orchestrator.d.ts +24 -0
- package/dist/assets/loaders/orchestrator.d.ts.map +1 -0
- package/dist/assets/loaders/orchestrator.js +109 -0
- package/dist/assets/loaders/orchestrator.js.map +1 -0
- package/dist/assets/loaders/vectors.d.ts +25 -0
- package/dist/assets/loaders/vectors.d.ts.map +1 -0
- package/dist/assets/loaders/vectors.js +118 -0
- package/dist/assets/loaders/vectors.js.map +1 -0
- package/dist/assets/loaders/watermark.d.ts +12 -0
- package/dist/assets/loaders/watermark.d.ts.map +1 -0
- package/dist/assets/loaders/watermark.js +40 -0
- package/dist/assets/loaders/watermark.js.map +1 -0
- package/dist/assets/security/fetch.d.ts +14 -0
- package/dist/assets/security/fetch.d.ts.map +1 -0
- package/dist/assets/security/fetch.js +112 -0
- package/dist/assets/security/fetch.js.map +1 -0
- package/dist/assets/security/ipv4-normalize.d.ts +28 -0
- package/dist/assets/security/ipv4-normalize.d.ts.map +1 -0
- package/dist/assets/security/ipv4-normalize.js +116 -0
- package/dist/assets/security/ipv4-normalize.js.map +1 -0
- package/dist/assets/security/path-allowlist.d.ts +12 -0
- package/dist/assets/security/path-allowlist.d.ts.map +1 -0
- package/dist/assets/security/path-allowlist.js +26 -0
- package/dist/assets/security/path-allowlist.js.map +1 -0
- package/dist/assets/security/url-validation.d.ts +22 -0
- package/dist/assets/security/url-validation.d.ts.map +1 -0
- package/dist/assets/security/url-validation.js +164 -0
- package/dist/assets/security/url-validation.js.map +1 -0
- package/dist/assets/svg/dimensions.d.ts +19 -0
- package/dist/assets/svg/dimensions.d.ts.map +1 -0
- package/dist/assets/svg/dimensions.js +43 -0
- package/dist/assets/svg/dimensions.js.map +1 -0
- package/dist/assets/svg/rasterize.d.ts +6 -0
- package/dist/assets/svg/rasterize.d.ts.map +1 -0
- package/dist/assets/svg/rasterize.js +38 -0
- package/dist/assets/svg/rasterize.js.map +1 -0
- package/dist/assets/svg/resolve-content.d.ts +16 -0
- package/dist/assets/svg/resolve-content.d.ts.map +1 -0
- package/dist/assets/svg/resolve-content.js +38 -0
- package/dist/assets/svg/resolve-content.js.map +1 -0
- package/dist/assets/svg/sanitize.d.ts +22 -0
- package/dist/assets/svg/sanitize.d.ts.map +1 -0
- package/dist/assets/svg/sanitize.js +46 -0
- package/dist/assets/svg/sanitize.js.map +1 -0
- package/dist/assets/util/redact-path.d.ts +14 -0
- package/dist/assets/util/redact-path.d.ts.map +1 -0
- package/dist/assets/util/redact-path.js +16 -0
- package/dist/assets/util/redact-path.js.map +1 -0
- package/dist/assets.d.ts +10 -27
- package/dist/assets.d.ts.map +1 -1
- package/dist/assets.js +10 -549
- package/dist/assets.js.map +1 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +2 -1
- package/dist/builder.js.map +1 -1
- package/dist/cli.js +11 -1
- package/dist/cli.js.map +1 -1
- package/dist/compat.d.ts +63 -1
- package/dist/compat.d.ts.map +1 -1
- package/dist/compat.js +42 -5
- package/dist/compat.js.map +1 -1
- package/dist/errors.d.ts +2 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +2 -2
- package/dist/errors.js.map +1 -1
- package/dist/fonts.d.ts.map +1 -1
- package/dist/fonts.js +8 -10
- package/dist/fonts.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/layout-state.d.ts +1 -1
- package/dist/layout-state.d.ts.map +1 -1
- package/dist/layout-state.js +5 -0
- package/dist/layout-state.js.map +1 -1
- package/dist/measure-blocks/float-group.d.ts +9 -0
- package/dist/measure-blocks/float-group.d.ts.map +1 -0
- package/dist/measure-blocks/float-group.js +103 -0
- package/dist/measure-blocks/float-group.js.map +1 -0
- package/dist/measure-blocks/helpers.d.ts +44 -0
- package/dist/measure-blocks/helpers.d.ts.map +1 -0
- package/dist/measure-blocks/helpers.js +43 -0
- package/dist/measure-blocks/helpers.js.map +1 -0
- package/dist/measure-blocks/highlight.d.ts +26 -0
- package/dist/measure-blocks/highlight.d.ts.map +1 -0
- package/dist/measure-blocks/highlight.js +169 -0
- package/dist/measure-blocks/highlight.js.map +1 -0
- package/dist/measure-blocks/image.d.ts +9 -0
- package/dist/measure-blocks/image.d.ts.map +1 -0
- package/dist/measure-blocks/image.js +136 -0
- package/dist/measure-blocks/image.js.map +1 -0
- package/dist/measure-blocks/index.d.ts +24 -0
- package/dist/measure-blocks/index.d.ts.map +1 -0
- package/dist/measure-blocks/index.js +179 -0
- package/dist/measure-blocks/index.js.map +1 -0
- package/dist/measure-blocks/list.d.ts +8 -0
- package/dist/measure-blocks/list.d.ts.map +1 -0
- package/dist/measure-blocks/list.js +108 -0
- package/dist/measure-blocks/list.js.map +1 -0
- package/dist/measure-blocks/simple-blocks.d.ts +18 -0
- package/dist/measure-blocks/simple-blocks.d.ts.map +1 -0
- package/dist/measure-blocks/simple-blocks.js +121 -0
- package/dist/measure-blocks/simple-blocks.js.map +1 -0
- package/dist/measure-blocks/table/columns.d.ts +17 -0
- package/dist/measure-blocks/table/columns.d.ts.map +1 -0
- package/dist/measure-blocks/table/columns.js +83 -0
- package/dist/measure-blocks/table/columns.js.map +1 -0
- package/dist/measure-blocks/table/measure.d.ts +8 -0
- package/dist/measure-blocks/table/measure.d.ts.map +1 -0
- package/dist/measure-blocks/table/measure.js +231 -0
- package/dist/measure-blocks/table/measure.js.map +1 -0
- package/dist/measure-blocks/table/spans.d.ts +25 -0
- package/dist/measure-blocks/table/spans.d.ts.map +1 -0
- package/dist/measure-blocks/table/spans.js +55 -0
- package/dist/measure-blocks/table/spans.js.map +1 -0
- package/dist/measure-blocks/text-blocks.d.ts +17 -0
- package/dist/measure-blocks/text-blocks.d.ts.map +1 -0
- package/dist/measure-blocks/text-blocks.js +242 -0
- package/dist/measure-blocks/text-blocks.js.map +1 -0
- package/dist/measure-text.d.ts +21 -3
- package/dist/measure-text.d.ts.map +1 -1
- package/dist/measure-text.js +87 -36
- package/dist/measure-text.js.map +1 -1
- package/dist/measure.d.ts +1 -1
- package/dist/measure.d.ts.map +1 -1
- package/dist/measure.js +8 -6
- package/dist/measure.js.map +1 -1
- package/dist/node-polyfill.d.ts.map +1 -1
- package/dist/node-polyfill.js +9 -0
- package/dist/node-polyfill.js.map +1 -1
- package/dist/pipeline-footnotes.d.ts +1 -1
- package/dist/pipeline-footnotes.d.ts.map +1 -1
- package/dist/pipeline-toc.d.ts +1 -1
- package/dist/pipeline-toc.d.ts.map +1 -1
- package/dist/pipeline.d.ts +3 -3
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +4 -5
- package/dist/pipeline.js.map +1 -1
- package/dist/plugin-types.d.ts +1 -1
- package/dist/plugin-types.d.ts.map +1 -1
- package/dist/post-process.d.ts +2 -2
- package/dist/post-process.d.ts.map +1 -1
- package/dist/post-process.js +47 -10
- package/dist/post-process.js.map +1 -1
- package/dist/render-blocks/blockquote.d.ts +7 -0
- package/dist/render-blocks/blockquote.d.ts.map +1 -0
- package/dist/render-blocks/blockquote.js +87 -0
- package/dist/render-blocks/blockquote.js.map +1 -0
- package/dist/render-blocks/callout.d.ts +7 -0
- package/dist/render-blocks/callout.d.ts.map +1 -0
- package/dist/render-blocks/callout.js +84 -0
- package/dist/render-blocks/callout.js.map +1 -0
- package/dist/render-blocks/code.d.ts +7 -0
- package/dist/render-blocks/code.d.ts.map +1 -0
- package/dist/render-blocks/code.js +84 -0
- package/dist/render-blocks/code.js.map +1 -0
- package/dist/render-blocks/footnote.d.ts +11 -0
- package/dist/render-blocks/footnote.d.ts.map +1 -0
- package/dist/render-blocks/footnote.js +45 -0
- package/dist/render-blocks/footnote.js.map +1 -0
- package/dist/render-blocks/header-footer.d.ts +11 -0
- package/dist/render-blocks/header-footer.d.ts.map +1 -0
- package/dist/render-blocks/header-footer.js +56 -0
- package/dist/render-blocks/header-footer.js.map +1 -0
- package/dist/render-blocks/hr.d.ts +7 -0
- package/dist/render-blocks/hr.d.ts.map +1 -0
- package/dist/render-blocks/hr.js +24 -0
- package/dist/render-blocks/hr.js.map +1 -0
- package/dist/render-blocks/image.d.ts +9 -0
- package/dist/render-blocks/image.d.ts.map +1 -0
- package/dist/render-blocks/image.js +135 -0
- package/dist/render-blocks/image.js.map +1 -0
- package/dist/render-blocks/index.d.ts +17 -0
- package/dist/render-blocks/index.d.ts.map +1 -0
- package/dist/render-blocks/index.js +17 -0
- package/dist/render-blocks/index.js.map +1 -0
- package/dist/render-blocks/list-item.d.ts +7 -0
- package/dist/render-blocks/list-item.d.ts.map +1 -0
- package/dist/render-blocks/list-item.js +80 -0
- package/dist/render-blocks/list-item.js.map +1 -0
- package/dist/render-blocks/rich.d.ts +7 -0
- package/dist/render-blocks/rich.d.ts.map +1 -0
- package/dist/render-blocks/rich.js +160 -0
- package/dist/render-blocks/rich.js.map +1 -0
- package/dist/render-blocks/table.d.ts +7 -0
- package/dist/render-blocks/table.d.ts.map +1 -0
- package/dist/render-blocks/table.js +139 -0
- package/dist/render-blocks/table.js.map +1 -0
- package/dist/render-blocks/text.d.ts +7 -0
- package/dist/render-blocks/text.d.ts.map +1 -0
- package/dist/render-blocks/text.js +183 -0
- package/dist/render-blocks/text.js.map +1 -0
- package/dist/render-blocks/watermark.d.ts +8 -0
- package/dist/render-blocks/watermark.d.ts.map +1 -0
- package/dist/render-blocks/watermark.js +52 -0
- package/dist/render-blocks/watermark.js.map +1 -0
- package/dist/render-extras.d.ts.map +1 -1
- package/dist/render-extras.js +1 -2
- package/dist/render-extras.js.map +1 -1
- package/dist/render-utils.d.ts.map +1 -1
- package/dist/render-utils.js +10 -6
- package/dist/render-utils.js.map +1 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +9 -3
- package/dist/render.js.map +1 -1
- package/dist/rich-text.d.ts +2 -1
- package/dist/rich-text.d.ts.map +1 -1
- package/dist/rich-text.js +0 -1
- package/dist/rich-text.js.map +1 -1
- package/dist/types-internal.d.ts +19 -3
- package/dist/types-internal.d.ts.map +1 -1
- package/dist/types-public/document.d.ts +261 -0
- package/dist/types-public/document.d.ts.map +1 -0
- package/dist/types-public/document.js +2 -0
- package/dist/types-public/document.js.map +1 -0
- package/dist/types-public/elements-block.d.ts +246 -0
- package/dist/types-public/elements-block.d.ts.map +1 -0
- package/dist/types-public/elements-block.js +8 -0
- package/dist/types-public/elements-block.js.map +1 -0
- package/dist/types-public/elements-media.d.ts +199 -0
- package/dist/types-public/elements-media.d.ts.map +1 -0
- package/dist/types-public/elements-media.js +2 -0
- package/dist/types-public/elements-media.js.map +1 -0
- package/dist/types-public/elements-text.d.ts +327 -0
- package/dist/types-public/elements-text.d.ts.map +1 -0
- package/dist/types-public/elements-text.js +2 -0
- package/dist/types-public/elements-text.js.map +1 -0
- package/dist/types-public/index.d.ts +14 -0
- package/dist/types-public/index.d.ts.map +1 -0
- package/dist/types-public/index.js +2 -0
- package/dist/types-public/index.js.map +1 -0
- package/dist/types-public/render-options.d.ts +38 -0
- package/dist/types-public/render-options.d.ts.map +1 -0
- package/dist/types-public/render-options.js +2 -0
- package/dist/types-public/render-options.js.map +1 -0
- package/dist/types-public/union.d.ts +13 -0
- package/dist/types-public/union.d.ts.map +1 -0
- package/dist/types-public/union.js +2 -0
- package/dist/types-public/union.js.map +1 -0
- package/dist/types-public/validation.d.ts +64 -0
- package/dist/types-public/validation.d.ts.map +1 -0
- package/dist/types-public/validation.js +2 -0
- package/dist/types-public/validation.js.map +1 -0
- package/dist/types-public.d.ts +5 -1081
- package/dist/types-public.d.ts.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/validate/document.d.ts +28 -0
- package/dist/validate/document.d.ts.map +1 -0
- package/dist/validate/document.js +295 -0
- package/dist/validate/document.js.map +1 -0
- package/dist/validate/elements/forms-floats.d.ts +19 -0
- package/dist/validate/elements/forms-floats.d.ts.map +1 -0
- package/dist/validate/elements/forms-floats.js +96 -0
- package/dist/validate/elements/forms-floats.js.map +1 -0
- package/dist/validate/elements/list.d.ts +10 -0
- package/dist/validate/elements/list.d.ts.map +1 -0
- package/dist/validate/elements/list.js +66 -0
- package/dist/validate/elements/list.js.map +1 -0
- package/dist/validate/elements/media.d.ts +23 -0
- package/dist/validate/elements/media.d.ts.map +1 -0
- package/dist/validate/elements/media.js +179 -0
- package/dist/validate/elements/media.js.map +1 -0
- package/dist/validate/elements/structural-simple.d.ts +21 -0
- package/dist/validate/elements/structural-simple.d.ts.map +1 -0
- package/dist/validate/elements/structural-simple.js +63 -0
- package/dist/validate/elements/structural-simple.js.map +1 -0
- package/dist/validate/elements/structural.d.ts +12 -0
- package/dist/validate/elements/structural.d.ts.map +1 -0
- package/dist/validate/elements/structural.js +12 -0
- package/dist/validate/elements/structural.js.map +1 -0
- package/dist/validate/elements/table.d.ts +10 -0
- package/dist/validate/elements/table.d.ts.map +1 -0
- package/dist/validate/elements/table.js +165 -0
- package/dist/validate/elements/table.js.map +1 -0
- package/dist/validate/elements/text.d.ts +26 -0
- package/dist/validate/elements/text.d.ts.map +1 -0
- package/dist/validate/elements/text.js +331 -0
- package/dist/validate/elements/text.js.map +1 -0
- package/dist/validate/errors.d.ts +9 -0
- package/dist/validate/errors.d.ts.map +1 -0
- package/dist/validate/errors.js +43 -0
- package/dist/validate/errors.js.map +1 -0
- package/dist/validate/fonts.d.ts +11 -0
- package/dist/validate/fonts.d.ts.map +1 -0
- package/dist/validate/fonts.js +118 -0
- package/dist/validate/fonts.js.map +1 -0
- package/dist/validate/helpers.d.ts +76 -0
- package/dist/validate/helpers.d.ts.map +1 -0
- package/dist/validate/helpers.js +169 -0
- package/dist/validate/helpers.js.map +1 -0
- package/dist/validate/index.d.ts +37 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +279 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate.d.ts +6 -18
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +6 -1585
- package/dist/validate.js.map +1 -1
- package/dist/vendor/pretext/VERSION.d.ts +3 -0
- package/dist/vendor/pretext/VERSION.d.ts.map +1 -0
- package/dist/vendor/pretext/VERSION.js +12 -0
- package/dist/vendor/pretext/VERSION.js.map +1 -0
- package/dist/version-check.d.ts +47 -0
- package/dist/version-check.d.ts.map +1 -0
- package/dist/version-check.js +75 -0
- package/dist/version-check.js.map +1 -0
- package/package.json +30 -7
- package/dist/measure-blocks.d.ts +0 -26
- package/dist/measure-blocks.d.ts.map +0 -1
- package/dist/measure-blocks.js +0 -1317
- package/dist/measure-blocks.js.map +0 -1
- package/dist/render-blocks.d.ts +0 -28
- package/dist/render-blocks.d.ts.map +0 -1
- package/dist/render-blocks.js +0 -1059
- package/dist/render-blocks.js.map +0 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure-blocks/table/measure.ts — Table cell + row measurement.
|
|
3
|
+
*/
|
|
4
|
+
import { buildFontKey } from '../../measure.js';
|
|
5
|
+
import { measureText, detectAndReorderRTL } from '../../measure-text.js';
|
|
6
|
+
import { LINE_HEIGHT_BODY } from '../../render-utils.js';
|
|
7
|
+
import { measureNaturalTextWidth } from '../helpers.js';
|
|
8
|
+
import { buildSpanGrid, computeActiveBoundaries } from './spans.js';
|
|
9
|
+
import { resolveColumnWidths } from './columns.js';
|
|
10
|
+
export async function measureTable(element, contentWidth, doc, baseFontSize, hyphenatorOpts, wordWidthCache) {
|
|
11
|
+
const baseFontFamily = doc.defaultFont ?? 'Inter';
|
|
12
|
+
const fontSize = element.fontSize ?? baseFontSize;
|
|
13
|
+
const cellPaddingH = element.cellPaddingH ?? 8;
|
|
14
|
+
const cellPaddingV = element.cellPaddingV ?? 6;
|
|
15
|
+
const borderWidth = element.borderWidth ?? 0.5;
|
|
16
|
+
const borderColor = element.borderColor ?? '#cccccc';
|
|
17
|
+
const headerBgColor = element.headerBgColor ?? '#f5f5f5';
|
|
18
|
+
// Build span occupancy grid (needed for correct colStart tracking in all passes)
|
|
19
|
+
const spanGrid = buildSpanGrid(element.rows);
|
|
20
|
+
// Pre-pass: measure natural widths for 'auto' columns — run all in parallel
|
|
21
|
+
const hasAutoColumns = element.columns.some(c => c.width === 'auto');
|
|
22
|
+
let naturalWidths;
|
|
23
|
+
if (hasAutoColumns) {
|
|
24
|
+
naturalWidths = new Array(element.columns.length).fill(0);
|
|
25
|
+
const jobs = [];
|
|
26
|
+
for (let rowIdx = 0; rowIdx < element.rows.length; rowIdx++) {
|
|
27
|
+
const row = element.rows[rowIdx];
|
|
28
|
+
let colIdx = 0;
|
|
29
|
+
for (const cell of row.cells) {
|
|
30
|
+
while (spanGrid.has(`${rowIdx},${colIdx}`))
|
|
31
|
+
colIdx++;
|
|
32
|
+
const cs = cell.colspan ?? 1;
|
|
33
|
+
if (element.columns[colIdx]?.width === 'auto') {
|
|
34
|
+
jobs.push({
|
|
35
|
+
colIdx, cs,
|
|
36
|
+
fontWeight: (cell.fontWeight ?? (row.isHeader ? 700 : 400)),
|
|
37
|
+
cellFontSize: cell.fontSize ?? fontSize,
|
|
38
|
+
cellFamily: cell.fontFamily ?? baseFontFamily,
|
|
39
|
+
text: cell.text,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
colIdx += cs;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Measure all auto cells in parallel
|
|
46
|
+
const widths = await Promise.all(jobs.map(j => measureNaturalTextWidth(j.text, j.cellFontSize, j.cellFamily, j.fontWeight)));
|
|
47
|
+
// Assign results back
|
|
48
|
+
for (let i = 0; i < jobs.length; i++) {
|
|
49
|
+
const { colIdx, cs } = jobs[i];
|
|
50
|
+
const cellNaturalWidth = widths[i] + 2 * cellPaddingH;
|
|
51
|
+
const perColumn = cellNaturalWidth / cs;
|
|
52
|
+
for (let si = colIdx; si < colIdx + cs && si < element.columns.length; si++) {
|
|
53
|
+
if (element.columns[si]?.width === 'auto') {
|
|
54
|
+
naturalWidths[si] = Math.max(naturalWidths[si], perColumn);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Resolve column widths (passes naturalWidths for 'auto' columns)
|
|
60
|
+
const columnWidths = resolveColumnWidths(element.columns, contentWidth, cellPaddingH, borderWidth, naturalWidths);
|
|
61
|
+
// Determine header row count
|
|
62
|
+
const headerRowCount = element.headerRows !== undefined
|
|
63
|
+
? element.headerRows
|
|
64
|
+
: element.rows.filter(r => r.isHeader).length;
|
|
65
|
+
const allCellMeta = [];
|
|
66
|
+
for (let rowIdx = 0; rowIdx < element.rows.length; rowIdx++) {
|
|
67
|
+
const row = element.rows[rowIdx];
|
|
68
|
+
let colStart = 0;
|
|
69
|
+
for (const cell of row.cells) {
|
|
70
|
+
while (spanGrid.has(`${rowIdx},${colStart}`))
|
|
71
|
+
colStart++;
|
|
72
|
+
const cs = cell.colspan ?? 1;
|
|
73
|
+
const rs = cell.rowspan ?? 1;
|
|
74
|
+
const col = element.columns[colStart];
|
|
75
|
+
let mergedWidth = 0;
|
|
76
|
+
for (let si = colStart; si < colStart + cs && si < columnWidths.length; si++) {
|
|
77
|
+
mergedWidth += columnWidths[si];
|
|
78
|
+
if (si < colStart + cs - 1)
|
|
79
|
+
mergedWidth += borderWidth;
|
|
80
|
+
}
|
|
81
|
+
const fontWeight = (cell.fontWeight ?? (row.isHeader ? 700 : 400));
|
|
82
|
+
const fontFamily = cell.fontFamily ?? baseFontFamily;
|
|
83
|
+
const cellFontSize = cell.fontSize ?? fontSize;
|
|
84
|
+
const cellLineHeight = doc.defaultLineHeight ?? (cellFontSize * LINE_HEIGHT_BODY);
|
|
85
|
+
const cellFontKey = buildFontKey(fontFamily, fontWeight, 'normal');
|
|
86
|
+
const textWidth = mergedWidth - 2 * cellPaddingH - borderWidth;
|
|
87
|
+
const cellDir = (cell.dir ?? element.dir ?? 'auto');
|
|
88
|
+
allCellMeta.push({ cell, row, rowIdx, colStart, cs, rs, col, mergedWidth, fontWeight, fontFamily, cellFontSize, cellLineHeight, cellFontKey, textWidth, cellDir });
|
|
89
|
+
colStart += cs;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Step 2: Run all RTL detection + text measurement in parallel across the whole table
|
|
93
|
+
const cellResults = await Promise.all(allCellMeta.map(async (m) => {
|
|
94
|
+
const { visual: cellVisualText, isRTL: cellIsRTL } = await detectAndReorderRTL(m.cell.text, m.cellDir);
|
|
95
|
+
const lines = await measureText(cellVisualText, m.cellFontSize, m.fontFamily, m.fontWeight, Math.max(m.textWidth, 1), m.cellLineHeight, hyphenatorOpts, wordWidthCache);
|
|
96
|
+
return { cellVisualText, cellIsRTL, lines };
|
|
97
|
+
}));
|
|
98
|
+
const cellByKey = new Map();
|
|
99
|
+
for (let i = 0; i < allCellMeta.length; i++) {
|
|
100
|
+
const m = allCellMeta[i];
|
|
101
|
+
cellByKey.set(`${m.rowIdx},${m.colStart}`, { meta: m, result: cellResults[i] });
|
|
102
|
+
}
|
|
103
|
+
// Sub-pass 3a: Compute raw row heights from non-spanning cells only
|
|
104
|
+
const rowHeights = new Array(element.rows.length).fill(0);
|
|
105
|
+
for (const { meta: m, result } of cellByKey.values()) {
|
|
106
|
+
if (m.rs === 1) {
|
|
107
|
+
const cellContentHeight = Math.max(result.lines.length, 1) * m.cellLineHeight;
|
|
108
|
+
rowHeights[m.rowIdx] = Math.max(rowHeights[m.rowIdx], cellContentHeight);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
for (let ri = 0; ri < rowHeights.length; ri++) {
|
|
112
|
+
rowHeights[ri] = (rowHeights[ri] ?? 0) + 2 * cellPaddingV;
|
|
113
|
+
}
|
|
114
|
+
// Sub-pass 3b: Expand last spanned row if spanning cell needs more space
|
|
115
|
+
for (const { meta: m, result } of cellByKey.values()) {
|
|
116
|
+
if (m.rs > 1) {
|
|
117
|
+
const cellContentHeight = Math.max(result.lines.length, 1) * m.cellLineHeight + 2 * cellPaddingV;
|
|
118
|
+
let spanHeight = 0;
|
|
119
|
+
for (let r2 = m.rowIdx; r2 < m.rowIdx + m.rs && r2 < rowHeights.length; r2++) {
|
|
120
|
+
spanHeight += rowHeights[r2];
|
|
121
|
+
}
|
|
122
|
+
if (cellContentHeight > spanHeight) {
|
|
123
|
+
const lastRowIdx = Math.min(m.rowIdx + m.rs - 1, rowHeights.length - 1);
|
|
124
|
+
rowHeights[lastRowIdx] += cellContentHeight - spanHeight;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Sub-pass 3c: Build measuredRows, inserting placeholder cells for rowspan continuations
|
|
129
|
+
const measuredRows = [];
|
|
130
|
+
const numColumns = element.columns.length;
|
|
131
|
+
for (let rowIdx = 0; rowIdx < element.rows.length; rowIdx++) {
|
|
132
|
+
const row = element.rows[rowIdx];
|
|
133
|
+
const rowHeight = rowHeights[rowIdx];
|
|
134
|
+
const measuredCells = [];
|
|
135
|
+
let hasRowspan = false;
|
|
136
|
+
let colCursor = 0;
|
|
137
|
+
while (colCursor < numColumns) {
|
|
138
|
+
const spanEntry = spanGrid.get(`${rowIdx},${colCursor}`);
|
|
139
|
+
if (spanEntry) {
|
|
140
|
+
// Only insert ONE placeholder per span group (at the leftmost column of the span)
|
|
141
|
+
if (colCursor === spanEntry.originColStart) {
|
|
142
|
+
const originCell = cellByKey.get(`${spanEntry.originRowIdx},${spanEntry.originColStart}`);
|
|
143
|
+
const pw = originCell?.meta.mergedWidth ?? (columnWidths[colCursor] ?? 0);
|
|
144
|
+
measuredCells.push({
|
|
145
|
+
lines: [], fontSize: 0, lineHeight: 0, fontKey: '', fontFamily: '',
|
|
146
|
+
align: 'left', color: '#000000',
|
|
147
|
+
colspan: spanEntry.colspan, mergedWidth: pw,
|
|
148
|
+
isSpanPlaceholder: true,
|
|
149
|
+
});
|
|
150
|
+
colCursor += spanEntry.colspan;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// Mid-span column not at origin — advance past the full span group
|
|
154
|
+
colCursor += spanEntry.colspan;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const cellAtCol = cellByKey.get(`${rowIdx},${colCursor}`);
|
|
159
|
+
if (!cellAtCol) {
|
|
160
|
+
colCursor++;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const { meta: m, result: { cellIsRTL, lines } } = cellAtCol;
|
|
164
|
+
let spanHeight;
|
|
165
|
+
if (m.rs > 1) {
|
|
166
|
+
spanHeight = 0;
|
|
167
|
+
for (let r2 = rowIdx; r2 < rowIdx + m.rs && r2 < rowHeights.length; r2++) {
|
|
168
|
+
spanHeight += rowHeights[r2];
|
|
169
|
+
}
|
|
170
|
+
hasRowspan = true;
|
|
171
|
+
}
|
|
172
|
+
const align = m.cell.align ?? m.col.align ?? (cellIsRTL ? 'right' : 'left');
|
|
173
|
+
const measuredCell = {
|
|
174
|
+
lines,
|
|
175
|
+
fontSize: m.cellFontSize,
|
|
176
|
+
lineHeight: m.cellLineHeight,
|
|
177
|
+
fontKey: m.cellFontKey,
|
|
178
|
+
fontFamily: m.fontFamily,
|
|
179
|
+
align,
|
|
180
|
+
color: m.cell.color ?? '#000000',
|
|
181
|
+
colspan: m.cs,
|
|
182
|
+
mergedWidth: m.mergedWidth,
|
|
183
|
+
isRTL: cellIsRTL,
|
|
184
|
+
...(m.cell.tabularNumbers !== undefined && { tabularNumbers: m.cell.tabularNumbers }),
|
|
185
|
+
...(m.rs > 1 ? { rowspan: m.rs } : {}),
|
|
186
|
+
...(spanHeight !== undefined ? { spanHeight } : {}),
|
|
187
|
+
};
|
|
188
|
+
if (m.cell.bgColor !== undefined)
|
|
189
|
+
measuredCell.bgColor = m.cell.bgColor;
|
|
190
|
+
measuredCells.push(measuredCell);
|
|
191
|
+
colCursor += m.cs;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const activeBoundaries = computeActiveBoundaries(measuredCells, numColumns);
|
|
195
|
+
measuredRows.push({
|
|
196
|
+
cells: measuredCells,
|
|
197
|
+
height: rowHeight,
|
|
198
|
+
isHeader: row.isHeader ?? false,
|
|
199
|
+
activeBoundaries,
|
|
200
|
+
...(hasRowspan ? { hasRowspan: true } : {}),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// Header rows are the first N rows
|
|
204
|
+
const headerRows = measuredRows.slice(0, headerRowCount);
|
|
205
|
+
const headerRowHeight = headerRows.reduce((sum, r) => sum + r.height, 0);
|
|
206
|
+
// Total table height = sum of all row heights
|
|
207
|
+
const totalHeight = measuredRows.reduce((sum, r) => sum + r.height, 0);
|
|
208
|
+
const tableData = {
|
|
209
|
+
columnWidths,
|
|
210
|
+
rows: measuredRows,
|
|
211
|
+
headerRowCount,
|
|
212
|
+
headerRowHeight,
|
|
213
|
+
cellPaddingH,
|
|
214
|
+
cellPaddingV,
|
|
215
|
+
borderWidth,
|
|
216
|
+
borderColor,
|
|
217
|
+
headerBgColor,
|
|
218
|
+
};
|
|
219
|
+
return {
|
|
220
|
+
element,
|
|
221
|
+
height: totalHeight,
|
|
222
|
+
lines: [],
|
|
223
|
+
fontSize: 0,
|
|
224
|
+
lineHeight: 0,
|
|
225
|
+
fontKey: '',
|
|
226
|
+
spaceAfter: element.spaceAfter ?? 0,
|
|
227
|
+
spaceBefore: element.spaceBefore ?? 0,
|
|
228
|
+
tableData,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=measure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measure.js","sourceRoot":"","sources":["../../../src/measure-blocks/table/measure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure-blocks/table/spans.ts — Table span-grid construction and active-boundary
|
|
3
|
+
* computation. Pure synchronous helpers.
|
|
4
|
+
*/
|
|
5
|
+
import type { TableRow } from '../../types.js';
|
|
6
|
+
export type SpanEntry = {
|
|
7
|
+
originRowIdx: number;
|
|
8
|
+
originColStart: number;
|
|
9
|
+
colspan: number;
|
|
10
|
+
rowspan: number;
|
|
11
|
+
};
|
|
12
|
+
/** Build a map from "rowIdx,colIdx" → span origin info for all positions occupied by a rowspan cell from an earlier row. */
|
|
13
|
+
export declare function buildSpanGrid(rows: TableRow[]): Map<string, SpanEntry>;
|
|
14
|
+
/**
|
|
15
|
+
* Compute which column boundaries have visible vertical lines.
|
|
16
|
+
* A boundary is "active" (visible) if it's not spanned by any merged cell.
|
|
17
|
+
* Returns array of boundary indices (0 = between col 0 and 1, 1 = between col 1 and 2, etc.)
|
|
18
|
+
* where vertical lines should be drawn.
|
|
19
|
+
*
|
|
20
|
+
* Example: 3 columns with a cell spanning cols 0-1 → active boundaries are [1] (only between cols 1-2)
|
|
21
|
+
*/
|
|
22
|
+
export declare function computeActiveBoundaries(cells: Array<{
|
|
23
|
+
colspan?: number;
|
|
24
|
+
}>, colCount: number): number[];
|
|
25
|
+
//# sourceMappingURL=spans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spans.d.ts","sourceRoot":"","sources":["../../../src/measure-blocks/table/spans.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,4HAA4H;AAC5H,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAiBtE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBtG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure-blocks/table/spans.ts — Table span-grid construction and active-boundary
|
|
3
|
+
* computation. Pure synchronous helpers.
|
|
4
|
+
*/
|
|
5
|
+
/** Build a map from "rowIdx,colIdx" → span origin info for all positions occupied by a rowspan cell from an earlier row. */
|
|
6
|
+
export function buildSpanGrid(rows) {
|
|
7
|
+
const grid = new Map();
|
|
8
|
+
for (let ri = 0; ri < rows.length; ri++) {
|
|
9
|
+
let ci = 0;
|
|
10
|
+
for (const cell of rows[ri].cells) {
|
|
11
|
+
while (grid.has(`${ri},${ci}`))
|
|
12
|
+
ci++;
|
|
13
|
+
const cs = cell.colspan ?? 1;
|
|
14
|
+
const rs = cell.rowspan ?? 1;
|
|
15
|
+
for (let r2 = ri + 1; r2 < ri + rs; r2++) {
|
|
16
|
+
for (let c2 = ci; c2 < ci + cs; c2++) {
|
|
17
|
+
grid.set(`${r2},${c2}`, { originRowIdx: ri, originColStart: ci, colspan: cs, rowspan: rs });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
ci += cs;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return grid;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Compute which column boundaries have visible vertical lines.
|
|
27
|
+
* A boundary is "active" (visible) if it's not spanned by any merged cell.
|
|
28
|
+
* Returns array of boundary indices (0 = between col 0 and 1, 1 = between col 1 and 2, etc.)
|
|
29
|
+
* where vertical lines should be drawn.
|
|
30
|
+
*
|
|
31
|
+
* Example: 3 columns with a cell spanning cols 0-1 → active boundaries are [1] (only between cols 1-2)
|
|
32
|
+
*/
|
|
33
|
+
export function computeActiveBoundaries(cells, colCount) {
|
|
34
|
+
// Track which boundaries are "spanned" (internal to a merged cell)
|
|
35
|
+
const spannedBoundaries = new Set();
|
|
36
|
+
let colIdx = 0;
|
|
37
|
+
for (const cell of cells) {
|
|
38
|
+
const cs = cell.colspan ?? 1;
|
|
39
|
+
// Boundaries internal to this cell's span are: colIdx to colIdx + cs - 1
|
|
40
|
+
// The internal boundaries are colIdx, colIdx+1, ..., colIdx+cs-2
|
|
41
|
+
for (let b = colIdx; b < colIdx + cs - 1; b++) {
|
|
42
|
+
spannedBoundaries.add(b);
|
|
43
|
+
}
|
|
44
|
+
colIdx += cs;
|
|
45
|
+
}
|
|
46
|
+
// Active boundaries are all boundaries (0 to colCount-2) that are NOT spanned
|
|
47
|
+
const activeBoundaries = [];
|
|
48
|
+
for (let b = 0; b < colCount - 1; b++) {
|
|
49
|
+
if (!spannedBoundaries.has(b)) {
|
|
50
|
+
activeBoundaries.push(b);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return activeBoundaries;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=spans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spans.js","sourceRoot":"","sources":["../../../src/measure-blocks/table/spans.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,4HAA4H;AAC5H,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAqB,CAAA;IACzC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QACxC,IAAI,EAAE,GAAG,CAAC,CAAA;QACV,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,EAAE,CAAE,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;gBAAE,EAAE,EAAE,CAAA;YACpC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;YAC5B,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;gBACzC,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;oBACrC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;gBAC7F,CAAC;YACH,CAAC;YACD,EAAE,IAAI,EAAE,CAAA;QACV,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAkC,EAAE,QAAgB;IAC1F,mEAAmE;IACnE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAA;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAA;IAEd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;QAC5B,yEAAyE;QACzE,iEAAiE;QACjE,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;QACD,MAAM,IAAI,EAAE,CAAA;IACd,CAAC;IAED,8EAA8E;IAC9E,MAAM,gBAAgB,GAAa,EAAE,CAAA;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure-blocks/text-blocks.ts — Measurement helpers for text-bearing element
|
|
3
|
+
* types: paragraph, heading, blockquote, callout, code.
|
|
4
|
+
*
|
|
5
|
+
* Each helper is extracted from the original switch-statement body in
|
|
6
|
+
* measureBlock(). Behavior is identical — only the location changed.
|
|
7
|
+
*/
|
|
8
|
+
import type { PdfDocument } from '../types.js';
|
|
9
|
+
import type { ParagraphElement, HeadingElement, BlockquoteElement, CalloutElement, CodeBlockElement } from '../types.js';
|
|
10
|
+
import type { MeasuredBlock } from '../types-internal.js';
|
|
11
|
+
import type { HyphenatorOpts } from '../measure-text.js';
|
|
12
|
+
export declare function measureParagraph(element: ParagraphElement, contentWidth: number, doc: PdfDocument, baseFontSize: number, baseFont: string, hyphenatorOpts?: HyphenatorOpts, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
|
|
13
|
+
export declare function measureHeading(element: HeadingElement, contentWidth: number, doc: PdfDocument, baseFontSize: number, baseFont: string, hyphenatorOpts?: HyphenatorOpts, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
|
|
14
|
+
export declare function measureBlockquote(element: BlockquoteElement, contentWidth: number, doc: PdfDocument, baseFontSize: number, baseFont: string, hyphenatorOpts?: HyphenatorOpts, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
|
|
15
|
+
export declare function measureCallout(element: CalloutElement, contentWidth: number, _doc: PdfDocument, baseFontSize: number, baseFont: string, hyphenatorOpts?: HyphenatorOpts, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
|
|
16
|
+
export declare function measureCode(element: CodeBlockElement, contentWidth: number, _doc: PdfDocument, baseFontSize: number, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
|
|
17
|
+
//# sourceMappingURL=text-blocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-blocks.d.ts","sourceRoot":"","sources":["../../src/measure-blocks/text-blocks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EACV,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EACnD,cAAc,EAAE,gBAAgB,EACjC,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,sBAAsB,CAAA;AAItE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAKxD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,EACzB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,cAAc,EAC/B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CAwFxB;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,cAAc,EAC/B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CA2CxB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,iBAAiB,EAC1B,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,cAAc,EAC/B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CAwCxB;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,cAAc,EAC/B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CA6CxB;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,EACzB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CAuCxB"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure-blocks/text-blocks.ts — Measurement helpers for text-bearing element
|
|
3
|
+
* types: paragraph, heading, blockquote, callout, code.
|
|
4
|
+
*
|
|
5
|
+
* Each helper is extracted from the original switch-statement body in
|
|
6
|
+
* measureBlock(). Behavior is identical — only the location changed.
|
|
7
|
+
*/
|
|
8
|
+
import { PretextPdfError } from '../errors.js';
|
|
9
|
+
import { buildFontKey } from '../measure.js';
|
|
10
|
+
import { measureText, detectAndReorderRTL } from '../measure-text.js';
|
|
11
|
+
import { LINE_HEIGHT_BODY, LINE_HEIGHT_COMPACT } from '../render-utils.js';
|
|
12
|
+
import { HEADING_DEFAULTS, resolveCalloutColors } from './helpers.js';
|
|
13
|
+
import { tokenizeCodeForHighlighting } from './highlight.js';
|
|
14
|
+
export async function measureParagraph(element, contentWidth, doc, baseFontSize, baseFont, hyphenatorOpts, wordWidthCache) {
|
|
15
|
+
// Detect and reorder RTL text
|
|
16
|
+
const { visual: visualText, isRTL, logical: logicalText } = await detectAndReorderRTL(element.text, element.dir);
|
|
17
|
+
const fontSize = element.fontSize ?? doc.defaultParagraphStyle?.fontSize ?? baseFontSize;
|
|
18
|
+
// smallCaps renders at 80% of fontSize — measure at the same size to avoid
|
|
19
|
+
// overestimating block height and wasting vertical space
|
|
20
|
+
const effectiveFontSize = element.smallCaps === true ? fontSize * 0.8 : fontSize;
|
|
21
|
+
const lineHeight = element.lineHeight ?? doc.defaultParagraphStyle?.lineHeight ?? doc.defaultLineHeight ?? (effectiveFontSize * LINE_HEIGHT_BODY);
|
|
22
|
+
const fontFamily = element.fontFamily ?? doc.defaultParagraphStyle?.fontFamily ?? baseFont;
|
|
23
|
+
const fontWeight = element.fontWeight ?? doc.defaultParagraphStyle?.fontWeight ?? 400;
|
|
24
|
+
const fontKey = buildFontKey(fontFamily, fontWeight, 'normal');
|
|
25
|
+
const columns = element.columns ?? 1;
|
|
26
|
+
const columnGap = element.columnGap ?? 24;
|
|
27
|
+
let measureWidth = contentWidth;
|
|
28
|
+
let columnData;
|
|
29
|
+
// Multi-column layout
|
|
30
|
+
let computedColumnWidth = contentWidth;
|
|
31
|
+
if (columns > 1) {
|
|
32
|
+
if (columns > 6) {
|
|
33
|
+
throw new PretextPdfError('VALIDATION_ERROR', `columns must be 1–6, got ${columns}`);
|
|
34
|
+
}
|
|
35
|
+
computedColumnWidth = (contentWidth - (columns - 1) * columnGap) / columns;
|
|
36
|
+
if (computedColumnWidth < 50) {
|
|
37
|
+
throw new PretextPdfError('COLUMN_WIDTH_TOO_NARROW', `Column width would be ${computedColumnWidth.toFixed(1)}pt, which is below the minimum 50pt. Reduce columns, increase columnGap, or increase page width.`);
|
|
38
|
+
}
|
|
39
|
+
measureWidth = computedColumnWidth;
|
|
40
|
+
}
|
|
41
|
+
const opts = hyphenatorOpts && element.hyphenate !== false ? hyphenatorOpts : undefined;
|
|
42
|
+
// Compensate for letterSpacing: render adds `spacing` pts after each character,
|
|
43
|
+
// but pretext doesn't know about it. Reduce measureWidth so line-breaks happen
|
|
44
|
+
// before the rendered text would overflow. Formula: scale by avgCharWidth /
|
|
45
|
+
// (avgCharWidth + spacing), where avgCharWidth ≈ 0.5 * effectiveFontSize.
|
|
46
|
+
const letterSpacingValue = element.letterSpacing ?? doc.defaultParagraphStyle?.letterSpacing ?? 0;
|
|
47
|
+
if (letterSpacingValue > 0) {
|
|
48
|
+
const avgCharWidth = effectiveFontSize * 0.5;
|
|
49
|
+
measureWidth = Math.max(10, measureWidth * avgCharWidth / (avgCharWidth + letterSpacingValue));
|
|
50
|
+
}
|
|
51
|
+
// Measure post-reorder (visual-order) text because the renderer draws characters in
|
|
52
|
+
// visual order; measuring the logical string for an RTL run would pick break points
|
|
53
|
+
// that don't match what is actually drawn, producing wrong line widths.
|
|
54
|
+
//
|
|
55
|
+
// smallCaps uppercases at render time. Measure the same uppercase text so
|
|
56
|
+
// line-break widths match what the renderer actually draws.
|
|
57
|
+
const measureText_ = element.smallCaps === true ? visualText.toUpperCase() : visualText;
|
|
58
|
+
const lines = await measureText(measureText_, effectiveFontSize, fontFamily, fontWeight, measureWidth, lineHeight, opts, wordWidthCache);
|
|
59
|
+
if (columns > 1) {
|
|
60
|
+
const linesPerColumn = Math.max(1, Math.ceil(lines.length / columns));
|
|
61
|
+
columnData = { columnCount: columns, columnGap, columnWidth: computedColumnWidth, linesPerColumn };
|
|
62
|
+
}
|
|
63
|
+
// Construct result with or without columnData depending on columns value
|
|
64
|
+
const paraSpaceAfter = element.spaceAfter ?? doc.defaultParagraphStyle?.spaceAfter ?? 0;
|
|
65
|
+
const paraSpaceBefore = element.spaceBefore ?? doc.defaultParagraphStyle?.spaceBefore ?? 0;
|
|
66
|
+
if (columnData) {
|
|
67
|
+
return {
|
|
68
|
+
element,
|
|
69
|
+
height: columnData.linesPerColumn * lineHeight,
|
|
70
|
+
lines,
|
|
71
|
+
fontSize,
|
|
72
|
+
lineHeight,
|
|
73
|
+
fontKey,
|
|
74
|
+
spaceAfter: paraSpaceAfter,
|
|
75
|
+
spaceBefore: paraSpaceBefore,
|
|
76
|
+
columnData,
|
|
77
|
+
isRTL,
|
|
78
|
+
...(isRTL && { logicalText }), // NEW: Only store logical text when RTL
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
return {
|
|
83
|
+
element,
|
|
84
|
+
height: lines.length * lineHeight,
|
|
85
|
+
lines,
|
|
86
|
+
fontSize,
|
|
87
|
+
lineHeight,
|
|
88
|
+
fontKey,
|
|
89
|
+
spaceAfter: paraSpaceAfter,
|
|
90
|
+
spaceBefore: paraSpaceBefore,
|
|
91
|
+
isRTL,
|
|
92
|
+
...(isRTL && { logicalText }), // NEW: Only store logical text when RTL
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export async function measureHeading(element, contentWidth, doc, baseFontSize, baseFont, hyphenatorOpts, wordWidthCache) {
|
|
97
|
+
// Detect and reorder RTL text
|
|
98
|
+
const { visual: visualText, isRTL, logical: logicalText } = await detectAndReorderRTL(element.text, element.dir);
|
|
99
|
+
const defaults = HEADING_DEFAULTS[element.level];
|
|
100
|
+
const baseHeadingFontSize = doc.defaultParagraphStyle?.fontSize ?? baseFontSize;
|
|
101
|
+
const fontSize = element.fontSize ?? (baseHeadingFontSize * defaults.sizeMultiplier);
|
|
102
|
+
// smallCaps renders at 80% — measure at effective size
|
|
103
|
+
const effectiveFontSize = element.smallCaps === true ? fontSize * 0.8 : fontSize;
|
|
104
|
+
const lineHeight = element.lineHeight ?? doc.defaultParagraphStyle?.lineHeight ?? doc.defaultLineHeight ?? (effectiveFontSize * LINE_HEIGHT_COMPACT);
|
|
105
|
+
const fontFamily = element.fontFamily ?? doc.defaultParagraphStyle?.fontFamily ?? baseFont;
|
|
106
|
+
const fontWeight = element.fontWeight ?? doc.defaultParagraphStyle?.fontWeight ?? defaults.fontWeight;
|
|
107
|
+
const fontKey = buildFontKey(fontFamily, fontWeight, 'normal');
|
|
108
|
+
const opts = hyphenatorOpts && element.hyphenate !== false ? hyphenatorOpts : undefined;
|
|
109
|
+
// Compensate for letterSpacing (same logic as paragraph above)
|
|
110
|
+
const headingLetterSpacing = element.letterSpacing ?? doc.defaultParagraphStyle?.letterSpacing ?? 0;
|
|
111
|
+
const headingMeasureWidth = headingLetterSpacing > 0
|
|
112
|
+
? Math.max(10, contentWidth * (effectiveFontSize * 0.5) / (effectiveFontSize * 0.5 + headingLetterSpacing))
|
|
113
|
+
: contentWidth;
|
|
114
|
+
// Measure post-reorder (visual-order) text because the renderer draws characters in
|
|
115
|
+
// visual order; measuring the logical string for an RTL run would pick break points
|
|
116
|
+
// that don't match what is actually drawn, producing wrong line widths.
|
|
117
|
+
//
|
|
118
|
+
// smallCaps uppercases at render time. Measure the same uppercase text so
|
|
119
|
+
// line-break widths match what the renderer actually draws.
|
|
120
|
+
const headingMeasureText = element.smallCaps === true ? visualText.toUpperCase() : visualText;
|
|
121
|
+
const lines = await measureText(headingMeasureText, effectiveFontSize, fontFamily, fontWeight, headingMeasureWidth, lineHeight, opts, wordWidthCache);
|
|
122
|
+
return {
|
|
123
|
+
element,
|
|
124
|
+
height: lines.length * lineHeight,
|
|
125
|
+
lines,
|
|
126
|
+
fontSize,
|
|
127
|
+
lineHeight,
|
|
128
|
+
fontKey,
|
|
129
|
+
spaceAfter: element.spaceAfter ?? doc.defaultParagraphStyle?.spaceAfter ?? defaults.spaceAfter,
|
|
130
|
+
spaceBefore: element.spaceBefore ?? doc.defaultParagraphStyle?.spaceBefore ?? defaults.spaceBefore,
|
|
131
|
+
isRTL,
|
|
132
|
+
...(isRTL && { logicalText }), // NEW: Only store logical text when RTL
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
export async function measureBlockquote(element, contentWidth, doc, baseFontSize, baseFont, hyphenatorOpts, wordWidthCache) {
|
|
136
|
+
// Detect and reorder RTL text
|
|
137
|
+
const { visual: visualText, isRTL, logical: logicalText } = await detectAndReorderRTL(element.text, element.dir);
|
|
138
|
+
const fontSize = element.fontSize ?? baseFontSize;
|
|
139
|
+
const lineHeight = element.lineHeight ?? doc.defaultLineHeight ?? (fontSize * LINE_HEIGHT_BODY);
|
|
140
|
+
const fontFamily = element.fontFamily ?? baseFont;
|
|
141
|
+
const fontWeight = element.fontWeight ?? 400;
|
|
142
|
+
const fontStyle = element.fontStyle ?? 'normal';
|
|
143
|
+
const fontKey = buildFontKey(fontFamily, fontWeight, fontStyle);
|
|
144
|
+
const borderWidth = element.borderWidth ?? 3;
|
|
145
|
+
const paddingH = element.paddingH ?? element.padding ?? 16;
|
|
146
|
+
const paddingV = element.paddingV ?? element.padding ?? 10;
|
|
147
|
+
// Text area excludes left border + horizontal padding on both sides
|
|
148
|
+
const textWidth = contentWidth - borderWidth - 2 * paddingH;
|
|
149
|
+
// Measure post-reorder (visual-order) text because the renderer draws characters in
|
|
150
|
+
// visual order; measuring the logical string for an RTL run would pick break points
|
|
151
|
+
// that don't match what is actually drawn, producing wrong line widths.
|
|
152
|
+
const lines = await measureText(visualText, fontSize, fontFamily, fontWeight, Math.max(textWidth, 1), lineHeight, hyphenatorOpts, wordWidthCache);
|
|
153
|
+
// height = lines * lineHeight + padding top + padding bottom
|
|
154
|
+
const height = (lines.length || 1) * lineHeight + 2 * paddingV;
|
|
155
|
+
return {
|
|
156
|
+
element,
|
|
157
|
+
height,
|
|
158
|
+
lines,
|
|
159
|
+
fontSize,
|
|
160
|
+
lineHeight,
|
|
161
|
+
fontKey,
|
|
162
|
+
spaceAfter: element.spaceAfter ?? 12,
|
|
163
|
+
spaceBefore: element.spaceBefore ?? 0,
|
|
164
|
+
blockquotePaddingV: paddingV,
|
|
165
|
+
blockquotePaddingH: paddingH,
|
|
166
|
+
blockquoteBorderWidth: borderWidth,
|
|
167
|
+
isRTL,
|
|
168
|
+
...(isRTL && { logicalText }), // NEW: Only store logical text when RTL
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
export async function measureCallout(element, contentWidth, _doc, baseFontSize, baseFont, hyphenatorOpts, wordWidthCache) {
|
|
172
|
+
const el = element;
|
|
173
|
+
const fs = el.fontSize ?? baseFontSize;
|
|
174
|
+
const lh = el.lineHeight ?? (fs * LINE_HEIGHT_BODY);
|
|
175
|
+
const ph = el.paddingH ?? el.padding ?? 16;
|
|
176
|
+
const pv = el.paddingV ?? el.padding ?? 10;
|
|
177
|
+
const family = el.fontFamily ?? baseFont;
|
|
178
|
+
const colors = resolveCalloutColors(el.style);
|
|
179
|
+
const borderColor = el.borderColor ?? colors.border;
|
|
180
|
+
const backgroundColor = el.backgroundColor ?? colors.bg;
|
|
181
|
+
const color = el.color ?? '#1F2937';
|
|
182
|
+
const titleColor = el.titleColor ?? borderColor;
|
|
183
|
+
// Measure title height (one line assumed, bold)
|
|
184
|
+
let titleHeight = 0;
|
|
185
|
+
if (el.title) {
|
|
186
|
+
titleHeight = fs * LINE_HEIGHT_COMPACT + 4; // compact line height + 4pt separator
|
|
187
|
+
}
|
|
188
|
+
// Measure content text
|
|
189
|
+
const innerWidth = contentWidth - ph * 2;
|
|
190
|
+
const lines = await measureText(el.content, fs, family, el.fontWeight ?? 400, Math.max(innerWidth, 1), lh, hyphenatorOpts, wordWidthCache);
|
|
191
|
+
const contentTextHeight = lines.length * lh;
|
|
192
|
+
const totalHeight = pv + titleHeight + contentTextHeight + pv;
|
|
193
|
+
// Construct calloutData via a typed literal so TypeScript enforces the
|
|
194
|
+
// full contract at the producer site (every field present, correct type).
|
|
195
|
+
const calloutData = {
|
|
196
|
+
titleHeight, paddingH: ph, paddingV: pv,
|
|
197
|
+
borderColor, backgroundColor, titleColor, color,
|
|
198
|
+
...(el.title !== undefined ? { titleText: el.title } : {}),
|
|
199
|
+
};
|
|
200
|
+
return {
|
|
201
|
+
element,
|
|
202
|
+
height: totalHeight,
|
|
203
|
+
lines,
|
|
204
|
+
fontSize: fs,
|
|
205
|
+
lineHeight: lh,
|
|
206
|
+
fontKey: buildFontKey(family, el.fontWeight ?? 400, 'normal'),
|
|
207
|
+
spaceAfter: el.spaceAfter ?? 12,
|
|
208
|
+
spaceBefore: el.spaceBefore ?? 0,
|
|
209
|
+
calloutData,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
export async function measureCode(element, contentWidth, _doc, baseFontSize, wordWidthCache) {
|
|
213
|
+
const fontSize = element.fontSize ?? Math.max(baseFontSize - 2, 8);
|
|
214
|
+
const lineHeight = element.lineHeight ?? (fontSize * LINE_HEIGHT_COMPACT);
|
|
215
|
+
const padding = element.padding ?? 8;
|
|
216
|
+
// Text area is narrower by padding on both sides
|
|
217
|
+
const textWidth = contentWidth - 2 * padding;
|
|
218
|
+
// Code blocks: never hyphenate — breaks would corrupt source code meaning
|
|
219
|
+
// Code blocks: always measure in logical (LTR) order — reordering breaks syntax
|
|
220
|
+
const lines = await measureText(element.text, fontSize, element.fontFamily, 400, Math.max(textWidth, 1), lineHeight, undefined, wordWidthCache);
|
|
221
|
+
// height = lines * lineHeight + padding top + padding bottom
|
|
222
|
+
const height = (lines.length || 1) * lineHeight + 2 * padding;
|
|
223
|
+
// Syntax highlighting: tokenize if language is set
|
|
224
|
+
let codeHighlightTokens;
|
|
225
|
+
if (element.language) {
|
|
226
|
+
codeHighlightTokens = await tokenizeCodeForHighlighting(element.text, element.language, element.color ?? '#24292f', lines.length, element.highlightTheme);
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
element,
|
|
230
|
+
height,
|
|
231
|
+
lines,
|
|
232
|
+
fontSize,
|
|
233
|
+
lineHeight,
|
|
234
|
+
fontKey: buildFontKey(element.fontFamily, 400, 'normal'),
|
|
235
|
+
spaceAfter: element.spaceAfter ?? 12,
|
|
236
|
+
spaceBefore: element.spaceBefore ?? 12,
|
|
237
|
+
codePadding: padding,
|
|
238
|
+
...(codeHighlightTokens ? { codeHighlightTokens } : {}),
|
|
239
|
+
isRTL: false, // Code blocks always LTR
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=text-blocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-blocks.js","sourceRoot":"","sources":["../../src/measure-blocks/text-blocks.ts"],"names":[],"mappings":"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"}
|