pretext-pdf 1.1.1 → 1.6.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 +659 -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 +32 -9
- 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 +26 -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,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* render-blocks/header-footer.ts — Header / Footer rendering
|
|
3
|
+
*/
|
|
4
|
+
import { PDFDocument, rgb } from '@cantoo/pdf-lib';
|
|
5
|
+
import { PretextPdfError } from '../errors.js';
|
|
6
|
+
import { toPdfY, resolveX, resolveTokens, hexToRgb, } from '../render-utils.js';
|
|
7
|
+
// ─── Header / Footer rendering ────────────────────────────────────────────────
|
|
8
|
+
export function renderHeaderFooter(pdfPage, spec, pageNumber, totalPages, geo, fontMap, position, extra) {
|
|
9
|
+
const text = resolveTokens(spec.text, pageNumber, totalPages, extra);
|
|
10
|
+
const fontSize = spec.fontSize ?? 10;
|
|
11
|
+
const align = spec.align ?? 'center';
|
|
12
|
+
const fontKey = `${spec.fontFamily ?? 'Inter'}-${spec.fontWeight ?? 400}-normal`;
|
|
13
|
+
const pdfFont = fontMap.get(fontKey);
|
|
14
|
+
if (!pdfFont) {
|
|
15
|
+
throw new PretextPdfError('FONT_NOT_LOADED', `${position} font "${fontKey}" not found in fontMap. This is a bug — font validation should have caught this.`);
|
|
16
|
+
}
|
|
17
|
+
const fontHeight = pdfFont.heightAtSize(fontSize);
|
|
18
|
+
let yFromTop;
|
|
19
|
+
if (position === 'header') {
|
|
20
|
+
yFromTop = (geo.margins.top - fontHeight) / 2;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
yFromTop = geo.pageHeight - geo.margins.bottom + (geo.margins.bottom - fontHeight) / 2;
|
|
24
|
+
}
|
|
25
|
+
const pdfY = toPdfY(yFromTop, fontHeight, geo.pageHeight);
|
|
26
|
+
const textWidth = pdfFont.widthOfTextAtSize(text, fontSize);
|
|
27
|
+
const x = resolveX(align, geo.margins.left, geo.contentWidth, textWidth);
|
|
28
|
+
const [textR, textG, textB] = hexToRgb(spec.color ?? '#666666');
|
|
29
|
+
pdfPage.drawText(text, {
|
|
30
|
+
x,
|
|
31
|
+
y: pdfY,
|
|
32
|
+
size: fontSize,
|
|
33
|
+
font: pdfFont,
|
|
34
|
+
color: rgb(textR, textG, textB),
|
|
35
|
+
});
|
|
36
|
+
// Separator line
|
|
37
|
+
if (position === 'header') {
|
|
38
|
+
const lineY = toPdfY(geo.margins.top - 4, 1, geo.pageHeight);
|
|
39
|
+
pdfPage.drawLine({
|
|
40
|
+
start: { x: geo.margins.left, y: lineY },
|
|
41
|
+
end: { x: geo.margins.left + geo.contentWidth, y: lineY },
|
|
42
|
+
thickness: 0.5,
|
|
43
|
+
color: rgb(0.8, 0.8, 0.8),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const lineY = toPdfY(geo.pageHeight - geo.margins.bottom + 4, 1, geo.pageHeight);
|
|
48
|
+
pdfPage.drawLine({
|
|
49
|
+
start: { x: geo.margins.left, y: lineY },
|
|
50
|
+
end: { x: geo.margins.left + geo.contentWidth, y: lineY },
|
|
51
|
+
thickness: 0.5,
|
|
52
|
+
color: rgb(0.8, 0.8, 0.8),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=header-footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-footer.js","sourceRoot":"","sources":["../../src/render-blocks/header-footer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* render-blocks/hr.ts — Horizontal rule rendering
|
|
3
|
+
*/
|
|
4
|
+
import { PDFDocument } from '@cantoo/pdf-lib';
|
|
5
|
+
import type { PagedBlock, PageGeometry } from '../types-internal.js';
|
|
6
|
+
export declare function renderHR(pdfPage: ReturnType<PDFDocument['addPage']>, pagedBlock: PagedBlock, geo: PageGeometry): void;
|
|
7
|
+
//# sourceMappingURL=hr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hr.d.ts","sourceRoot":"","sources":["../../src/render-blocks/hr.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAO,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EACV,UAAU,EAAE,YAAY,EACzB,MAAM,sBAAsB,CAAA;AAQ7B,wBAAgB,QAAQ,CACtB,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAC3C,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,YAAY,GAChB,IAAI,CAoBN"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* render-blocks/hr.ts — Horizontal rule rendering
|
|
3
|
+
*/
|
|
4
|
+
import { PDFDocument, rgb } from '@cantoo/pdf-lib';
|
|
5
|
+
import { toPdfY, hexToRgb, } from '../render-utils.js';
|
|
6
|
+
// ─── Horizontal rule rendering ────────────────────────────────────────────────
|
|
7
|
+
export function renderHR(pdfPage, pagedBlock, geo) {
|
|
8
|
+
const { measuredBlock, yFromTop } = pagedBlock;
|
|
9
|
+
const element = measuredBlock.element;
|
|
10
|
+
const spaceAbove = element.spaceAbove ?? 12;
|
|
11
|
+
const thickness = element.thickness ?? 0.5;
|
|
12
|
+
const colorHex = element.color ?? '#cccccc';
|
|
13
|
+
// Line sits at the middle of the HR element (after spaceAbove, before spaceBelow)
|
|
14
|
+
const lineYFromTop = yFromTop + spaceAbove + geo.margins.top + geo.headerHeight;
|
|
15
|
+
const pdfY = toPdfY(lineYFromTop, thickness / 2, geo.pageHeight);
|
|
16
|
+
const [r, g, b] = hexToRgb(colorHex);
|
|
17
|
+
pdfPage.drawLine({
|
|
18
|
+
start: { x: geo.margins.left, y: pdfY },
|
|
19
|
+
end: { x: geo.margins.left + geo.contentWidth, y: pdfY },
|
|
20
|
+
thickness,
|
|
21
|
+
color: rgb(r, g, b),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=hr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hr.js","sourceRoot":"","sources":["../../src/render-blocks/hr.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAIlD,OAAO,EACL,MAAM,EACN,QAAQ,GACT,MAAM,oBAAoB,CAAA;AAE3B,iFAAiF;AAEjF,MAAM,UAAU,QAAQ,CACtB,OAA2C,EAC3C,UAAsB,EACtB,GAAiB;IAEjB,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAA;IAC9C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAsD,CAAA;IAEpF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAA;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAA;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,IAAI,SAAS,CAAA;IAE3C,kFAAkF;IAClF,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,YAAY,CAAA;IAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;IAEhE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAEpC,OAAO,CAAC,QAAQ,CAAC;QACf,KAAK,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE;QACvC,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE;QACxD,SAAS;QACT,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KACpB,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* render-blocks/image.ts — Image, float block, and float group rendering
|
|
3
|
+
*/
|
|
4
|
+
import { PDFDocument } from '@cantoo/pdf-lib';
|
|
5
|
+
import type { PagedBlock, FontMap, ImageMap, PageGeometry } from '../types-internal.js';
|
|
6
|
+
export declare function renderImage(pdfPage: ReturnType<PDFDocument['addPage']>, pagedBlock: PagedBlock, geo: PageGeometry, imageMap: ImageMap): void;
|
|
7
|
+
export declare function renderFloatBlock(pdfPage: ReturnType<PDFDocument['addPage']>, pagedBlock: PagedBlock, geo: PageGeometry, fontMap: FontMap, imageMap: ImageMap, pdfDoc: PDFDocument): void;
|
|
8
|
+
export declare function renderFloatGroup(pdfPage: ReturnType<PDFDocument['addPage']>, pagedBlock: PagedBlock, geo: PageGeometry, fontMap: FontMap, imageMap: ImageMap, _pdfDoc: PDFDocument): void;
|
|
9
|
+
//# sourceMappingURL=image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/render-blocks/image.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAO,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EACV,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAC5C,MAAM,sBAAsB,CAAA;AAY7B,wBAAgB,WAAW,CACzB,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAC3C,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,QAAQ,GACjB,IAAI,CAoBN;AAID,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAC3C,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,GAClB,IAAI,CA8DN;AAID,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAC3C,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,WAAW,GACnB,IAAI,CA4CN"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* render-blocks/image.ts — Image, float block, and float group rendering
|
|
3
|
+
*/
|
|
4
|
+
import { PDFDocument, rgb } from '@cantoo/pdf-lib';
|
|
5
|
+
import { PretextPdfError } from '../errors.js';
|
|
6
|
+
import { addLinkAnnotation, drawTextDecoration, toPdfY, resolveX, hexToRgb, } from '../render-utils.js';
|
|
7
|
+
// ─── Image rendering ──────────────────────────────────────────────────────────
|
|
8
|
+
export function renderImage(pdfPage, pagedBlock, geo, imageMap) {
|
|
9
|
+
const { measuredBlock, yFromTop } = pagedBlock;
|
|
10
|
+
const imageData = measuredBlock.imageData;
|
|
11
|
+
const pdfImage = imageMap.get(imageData.imageKey);
|
|
12
|
+
if (!pdfImage) {
|
|
13
|
+
throw new PretextPdfError('IMAGE_LOAD_FAILED', `Image "${imageData.imageKey}" not found in imageMap. This is a bug — image loading should have caught this.`);
|
|
14
|
+
}
|
|
15
|
+
const absoluteYFromTop = yFromTop + geo.margins.top + geo.headerHeight;
|
|
16
|
+
// drawImage places the BOTTOM-LEFT corner at (x, y) — use toPdfY with renderHeight
|
|
17
|
+
const pdfY = toPdfY(absoluteYFromTop, imageData.renderHeight, geo.pageHeight);
|
|
18
|
+
const x = resolveX(imageData.align, geo.margins.left, geo.contentWidth, imageData.renderWidth);
|
|
19
|
+
pdfPage.drawImage(pdfImage, {
|
|
20
|
+
x,
|
|
21
|
+
y: pdfY,
|
|
22
|
+
width: imageData.renderWidth,
|
|
23
|
+
height: imageData.renderHeight,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
// ─── Float image block rendering ─────────────────────────────────────────────
|
|
27
|
+
export function renderFloatBlock(pdfPage, pagedBlock, geo, fontMap, imageMap, pdfDoc) {
|
|
28
|
+
const { measuredBlock, yFromTop } = pagedBlock;
|
|
29
|
+
const fd = measuredBlock.floatData;
|
|
30
|
+
const baseAbsY = yFromTop + geo.margins.top + geo.headerHeight;
|
|
31
|
+
// Draw image
|
|
32
|
+
const pdfImage = imageMap.get(fd.imageKey);
|
|
33
|
+
if (!pdfImage)
|
|
34
|
+
throw new PretextPdfError('IMAGE_LOAD_FAILED', `Float image key "${fd.imageKey}" not found in imageMap. This is a bug — image loading should have caught this.`);
|
|
35
|
+
const imgX = geo.margins.left + fd.imageColX;
|
|
36
|
+
const imgPdfY = toPdfY(baseAbsY, fd.imageRenderHeight, geo.pageHeight);
|
|
37
|
+
pdfPage.drawImage(pdfImage, {
|
|
38
|
+
x: imgX,
|
|
39
|
+
y: imgPdfY,
|
|
40
|
+
width: fd.imageRenderWidth,
|
|
41
|
+
height: fd.imageRenderHeight,
|
|
42
|
+
});
|
|
43
|
+
// Draw text lines (rich or plain)
|
|
44
|
+
const textBaseX = geo.margins.left + fd.textColX;
|
|
45
|
+
if (fd.richFloatLines && fd.richFloatLines.length > 0) {
|
|
46
|
+
let cumY = 0;
|
|
47
|
+
for (const richLine of fd.richFloatLines) {
|
|
48
|
+
const lineAbsY = baseAbsY + cumY;
|
|
49
|
+
for (const fragment of richLine.fragments) {
|
|
50
|
+
if (!fragment.text || fragment.text.trim() === '')
|
|
51
|
+
continue;
|
|
52
|
+
const pdfFont = fontMap.get(fragment.fontKey);
|
|
53
|
+
if (!pdfFont)
|
|
54
|
+
throw new PretextPdfError('FONT_NOT_LOADED', `Float rich text font "${fragment.fontKey}" not found in fontMap.`);
|
|
55
|
+
const fontHeight = pdfFont.heightAtSize(fragment.fontSize);
|
|
56
|
+
const [r, g, b] = hexToRgb(fragment.color);
|
|
57
|
+
const drawX = textBaseX + fragment.x;
|
|
58
|
+
const pdfY = toPdfY(lineAbsY, fontHeight, geo.pageHeight) + (fragment.yOffset ?? 0);
|
|
59
|
+
const drawText = fragment.text.trimEnd();
|
|
60
|
+
if (fragment.letterSpacing && fragment.letterSpacing > 0) {
|
|
61
|
+
let cx = drawX;
|
|
62
|
+
for (const ch of drawText) {
|
|
63
|
+
pdfPage.drawText(ch, { x: cx, y: pdfY, size: fragment.fontSize, font: pdfFont, color: rgb(r, g, b) });
|
|
64
|
+
cx += pdfFont.widthOfTextAtSize(ch, fragment.fontSize) + fragment.letterSpacing;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
pdfPage.drawText(drawText, { x: drawX, y: pdfY, size: fragment.fontSize, font: pdfFont, color: rgb(r, g, b) });
|
|
69
|
+
}
|
|
70
|
+
const fragWidth = pdfFont.widthOfTextAtSize(drawText, fragment.fontSize);
|
|
71
|
+
drawTextDecoration(pdfPage, drawX, fragWidth, pdfY, fragment.fontSize, pdfFont, [r, g, b], { underline: fragment.underline ?? false, strikethrough: fragment.strikethrough ?? false });
|
|
72
|
+
if (fragment.url)
|
|
73
|
+
addLinkAnnotation(pdfDoc, pdfPage, drawX, pdfY, fragWidth, fragment.fontSize, fragment.url);
|
|
74
|
+
}
|
|
75
|
+
cumY += richLine.lineHeight;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const pdfFont = fontMap.get(fd.textFontKey);
|
|
80
|
+
if (!pdfFont)
|
|
81
|
+
throw new PretextPdfError('FONT_NOT_LOADED', `Float text font key "${fd.textFontKey}" not found in fontMap. This is a bug — font loading should have caught this.`);
|
|
82
|
+
const fontHeight = pdfFont.heightAtSize(fd.textFontSize);
|
|
83
|
+
const [r, g, b] = hexToRgb(fd.textColor);
|
|
84
|
+
for (let i = 0; i < fd.textLines.length; i++) {
|
|
85
|
+
const line = fd.textLines[i];
|
|
86
|
+
if (line.text === '')
|
|
87
|
+
continue;
|
|
88
|
+
const lineAbsY = baseAbsY + (i * fd.textLineHeight);
|
|
89
|
+
const pdfY = toPdfY(lineAbsY, fontHeight, geo.pageHeight);
|
|
90
|
+
pdfPage.drawText(line.text.trimEnd(), { x: textBaseX, y: pdfY, size: fd.textFontSize, font: pdfFont, color: rgb(r, g, b) });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// ─── Float group block rendering ──────────────────────────────────────────────
|
|
95
|
+
export function renderFloatGroup(pdfPage, pagedBlock, geo, fontMap, imageMap, _pdfDoc) {
|
|
96
|
+
const { measuredBlock, yFromTop } = pagedBlock;
|
|
97
|
+
const fd = measuredBlock.floatGroupData;
|
|
98
|
+
const baseAbsY = yFromTop + geo.margins.top + geo.headerHeight;
|
|
99
|
+
// Draw image
|
|
100
|
+
const pdfImage = imageMap.get(fd.imageKey);
|
|
101
|
+
if (!pdfImage)
|
|
102
|
+
throw new PretextPdfError('IMAGE_LOAD_FAILED', `Float group image key "${fd.imageKey}" not found in imageMap. This is a bug — image loading should have caught this.`);
|
|
103
|
+
const imgX = geo.margins.left + fd.imageColX;
|
|
104
|
+
const imgPdfY = toPdfY(baseAbsY, fd.imageRenderHeight, geo.pageHeight);
|
|
105
|
+
pdfPage.drawImage(pdfImage, {
|
|
106
|
+
x: imgX,
|
|
107
|
+
y: imgPdfY,
|
|
108
|
+
width: fd.imageRenderWidth,
|
|
109
|
+
height: fd.imageRenderHeight,
|
|
110
|
+
});
|
|
111
|
+
// Draw text items
|
|
112
|
+
const textBaseX = geo.margins.left + fd.textColX;
|
|
113
|
+
for (const textItem of fd.textItems) {
|
|
114
|
+
const pdfFont = fontMap.get(textItem.fontKey);
|
|
115
|
+
if (!pdfFont)
|
|
116
|
+
throw new PretextPdfError('FONT_NOT_LOADED', `Float group font key "${textItem.fontKey}" not found in fontMap. This is a bug — font loading should have caught this.`);
|
|
117
|
+
const fontHeight = pdfFont.heightAtSize(textItem.fontSize);
|
|
118
|
+
// Draw plain lines (plain-text fallback for rich-paragraphs)
|
|
119
|
+
for (let i = 0; i < textItem.lines.length; i++) {
|
|
120
|
+
const line = textItem.lines[i];
|
|
121
|
+
if (line.text === '')
|
|
122
|
+
continue;
|
|
123
|
+
const lineAbsY = baseAbsY + textItem.yOffsetFromTop + (i * textItem.lineHeight);
|
|
124
|
+
const pdfY = toPdfY(lineAbsY, fontHeight, geo.pageHeight);
|
|
125
|
+
pdfPage.drawText(line.text.trimEnd(), {
|
|
126
|
+
x: textBaseX,
|
|
127
|
+
y: pdfY,
|
|
128
|
+
size: textItem.fontSize,
|
|
129
|
+
font: pdfFont,
|
|
130
|
+
color: rgb(0, 0, 0),
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/render-blocks/image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* render-blocks/index.ts — Barrel re-export for element-level rendering functions.
|
|
3
|
+
* All 14 render functions previously lived in src/render-blocks.ts.
|
|
4
|
+
*/
|
|
5
|
+
export { renderTextBlock } from './text.js';
|
|
6
|
+
export { renderListItem } from './list-item.js';
|
|
7
|
+
export { renderTable } from './table.js';
|
|
8
|
+
export { renderImage, renderFloatBlock, renderFloatGroup } from './image.js';
|
|
9
|
+
export { renderHR } from './hr.js';
|
|
10
|
+
export { renderCodeBlock } from './code.js';
|
|
11
|
+
export { renderBlockquote } from './blockquote.js';
|
|
12
|
+
export { renderCallout } from './callout.js';
|
|
13
|
+
export { renderRichParagraph } from './rich.js';
|
|
14
|
+
export { renderFootnoteZone } from './footnote.js';
|
|
15
|
+
export { renderHeaderFooter } from './header-footer.js';
|
|
16
|
+
export { renderWatermark } from './watermark.js';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render-blocks/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* render-blocks/index.ts — Barrel re-export for element-level rendering functions.
|
|
3
|
+
* All 14 render functions previously lived in src/render-blocks.ts.
|
|
4
|
+
*/
|
|
5
|
+
export { renderTextBlock } from './text.js';
|
|
6
|
+
export { renderListItem } from './list-item.js';
|
|
7
|
+
export { renderTable } from './table.js';
|
|
8
|
+
export { renderImage, renderFloatBlock, renderFloatGroup } from './image.js';
|
|
9
|
+
export { renderHR } from './hr.js';
|
|
10
|
+
export { renderCodeBlock } from './code.js';
|
|
11
|
+
export { renderBlockquote } from './blockquote.js';
|
|
12
|
+
export { renderCallout } from './callout.js';
|
|
13
|
+
export { renderRichParagraph } from './rich.js';
|
|
14
|
+
export { renderFootnoteZone } from './footnote.js';
|
|
15
|
+
export { renderHeaderFooter } from './header-footer.js';
|
|
16
|
+
export { renderWatermark } from './watermark.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render-blocks/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* render-blocks/list-item.ts — List item rendering
|
|
3
|
+
*/
|
|
4
|
+
import { PDFDocument } from '@cantoo/pdf-lib';
|
|
5
|
+
import type { PagedBlock, FontMap, PageGeometry } from '../types-internal.js';
|
|
6
|
+
export declare function renderListItem(pdfPage: ReturnType<PDFDocument['addPage']>, pagedBlock: PagedBlock, geo: PageGeometry, fontMap: FontMap): void;
|
|
7
|
+
//# sourceMappingURL=list-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-item.d.ts","sourceRoot":"","sources":["../../src/render-blocks/list-item.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAO,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EACV,UAAU,EAAE,OAAO,EAAE,YAAY,EAClC,MAAM,sBAAsB,CAAA;AAU7B,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAC3C,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,OAAO,GACf,IAAI,CAgFN"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* render-blocks/list-item.ts — List item rendering
|
|
3
|
+
*/
|
|
4
|
+
import { PDFDocument, rgb } from '@cantoo/pdf-lib';
|
|
5
|
+
import { PretextPdfError } from '../errors.js';
|
|
6
|
+
import { toPdfY, resolveX, hexToRgb, } from '../render-utils.js';
|
|
7
|
+
// ─── List item rendering ──────────────────────────────────────────────────────
|
|
8
|
+
export function renderListItem(pdfPage, pagedBlock, geo, fontMap) {
|
|
9
|
+
const { measuredBlock, startLine, endLine, yFromTop } = pagedBlock;
|
|
10
|
+
const listItemData = measuredBlock.listItemData;
|
|
11
|
+
const lines = measuredBlock.lines.slice(startLine, endLine);
|
|
12
|
+
if (lines.length === 0)
|
|
13
|
+
return;
|
|
14
|
+
const pdfFont = fontMap.get(measuredBlock.fontKey);
|
|
15
|
+
if (!pdfFont) {
|
|
16
|
+
throw new PretextPdfError('FONT_NOT_LOADED', `Font "${measuredBlock.fontKey}" not found in fontMap. This is a bug — font validation should have caught this.`);
|
|
17
|
+
}
|
|
18
|
+
const fontHeight = pdfFont.heightAtSize(measuredBlock.fontSize);
|
|
19
|
+
const [cr, cg, cb] = hexToRgb(listItemData.color);
|
|
20
|
+
// RTL support: mirror list layout if detected
|
|
21
|
+
const isRTL = measuredBlock.isRTL ?? false;
|
|
22
|
+
let textStartX;
|
|
23
|
+
let textAreaWidth;
|
|
24
|
+
if (isRTL) {
|
|
25
|
+
// RTL: marker on the right, text area on the left
|
|
26
|
+
textAreaWidth = geo.contentWidth - listItemData.indent - listItemData.markerWidth;
|
|
27
|
+
textStartX = geo.margins.left + listItemData.indent;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// LTR: marker on the left, text area on the right
|
|
31
|
+
textStartX = geo.margins.left + listItemData.indent + listItemData.markerWidth;
|
|
32
|
+
textAreaWidth = geo.contentWidth - listItemData.indent - listItemData.markerWidth;
|
|
33
|
+
}
|
|
34
|
+
// Draw marker on the first line of this item (only if startLine === 0)
|
|
35
|
+
// If startLine > 0, the item continued from a previous page — no marker
|
|
36
|
+
if (startLine === 0) {
|
|
37
|
+
const markerText = listItemData.marker;
|
|
38
|
+
const markerMeasuredWidth = pdfFont.widthOfTextAtSize(markerText, measuredBlock.fontSize);
|
|
39
|
+
let markerX;
|
|
40
|
+
if (isRTL) {
|
|
41
|
+
// RTL: marker on the right, right-aligned within marker column
|
|
42
|
+
markerX = geo.margins.left + geo.contentWidth - listItemData.indent - markerMeasuredWidth;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// LTR: marker on the left, right-aligned within marker column
|
|
46
|
+
markerX = geo.margins.left + listItemData.indent + listItemData.markerWidth - markerMeasuredWidth;
|
|
47
|
+
}
|
|
48
|
+
const firstLineAbsY = yFromTop + geo.margins.top + geo.headerHeight;
|
|
49
|
+
const markerPdfY = toPdfY(firstLineAbsY, fontHeight, geo.pageHeight);
|
|
50
|
+
pdfPage.drawText(markerText, {
|
|
51
|
+
x: markerX,
|
|
52
|
+
y: markerPdfY,
|
|
53
|
+
size: measuredBlock.fontSize,
|
|
54
|
+
font: pdfFont,
|
|
55
|
+
color: rgb(cr, cg, cb),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
// Draw all text lines, indented to align with body text column
|
|
59
|
+
// RTL lists are right-aligned, LTR lists are left-aligned
|
|
60
|
+
const textAlign = isRTL ? 'right' : 'left';
|
|
61
|
+
for (let i = 0; i < lines.length; i++) {
|
|
62
|
+
const line = lines[i];
|
|
63
|
+
if (line.text === '')
|
|
64
|
+
continue;
|
|
65
|
+
const lineYFromTop = yFromTop + (i * measuredBlock.lineHeight);
|
|
66
|
+
const absoluteYFromTop = lineYFromTop + geo.margins.top + geo.headerHeight;
|
|
67
|
+
const pdfY = toPdfY(absoluteYFromTop, fontHeight, geo.pageHeight);
|
|
68
|
+
const trimmedText = line.text.trimEnd();
|
|
69
|
+
const lineWidth = pdfFont.widthOfTextAtSize(trimmedText, measuredBlock.fontSize);
|
|
70
|
+
const x = resolveX(textAlign, textStartX, textAreaWidth, lineWidth);
|
|
71
|
+
pdfPage.drawText(trimmedText, {
|
|
72
|
+
x,
|
|
73
|
+
y: pdfY,
|
|
74
|
+
size: measuredBlock.fontSize,
|
|
75
|
+
font: pdfFont,
|
|
76
|
+
color: rgb(cr, cg, cb),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=list-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-item.js","sourceRoot":"","sources":["../../src/render-blocks/list-item.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* render-blocks/rich.ts — Rich paragraph rendering
|
|
3
|
+
*/
|
|
4
|
+
import { PDFDocument } from '@cantoo/pdf-lib';
|
|
5
|
+
import type { PagedBlock, FontMap, PageGeometry } from '../types-internal.js';
|
|
6
|
+
export declare function renderRichParagraph(pdfPage: ReturnType<PDFDocument['addPage']>, pagedBlock: PagedBlock, geo: PageGeometry, fontMap: FontMap, pdfDoc: PDFDocument, footnoteNumbering?: Map<string, number>): void;
|
|
7
|
+
//# sourceMappingURL=rich.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rich.d.ts","sourceRoot":"","sources":["../../src/render-blocks/rich.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAO,MAAM,iBAAiB,CAAA;AAElD,OAAO,KAAK,EACV,UAAU,EAAE,OAAO,EAAE,YAAY,EAClC,MAAM,sBAAsB,CAAA;AAY7B,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAC3C,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,EACnB,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,IAAI,CAgKN"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* render-blocks/rich.ts — Rich paragraph rendering
|
|
3
|
+
*/
|
|
4
|
+
import { PDFDocument, rgb } from '@cantoo/pdf-lib';
|
|
5
|
+
import { PretextPdfError } from '../errors.js';
|
|
6
|
+
import { addLinkAnnotation, drawTextDecoration, toPdfY, hexToRgb, drawTabularText, } from '../render-utils.js';
|
|
7
|
+
// ─── Rich paragraph rendering ─────────────────────────────────────────────────
|
|
8
|
+
export function renderRichParagraph(pdfPage, pagedBlock, geo, fontMap, pdfDoc, footnoteNumbering) {
|
|
9
|
+
const { measuredBlock, startLine, endLine, yFromTop } = pagedBlock;
|
|
10
|
+
const { element, richLines } = measuredBlock;
|
|
11
|
+
const tabularNumbers = element.type === 'rich-paragraph' && element.tabularNumbers === true;
|
|
12
|
+
if (!richLines || richLines.length === 0)
|
|
13
|
+
return;
|
|
14
|
+
// Only render the lines on this page chunk
|
|
15
|
+
const visibleLines = richLines.slice(startLine, endLine);
|
|
16
|
+
// Draw background color if set
|
|
17
|
+
const columnData = measuredBlock.columnData;
|
|
18
|
+
if (element.type === 'rich-paragraph' && element.bgColor) {
|
|
19
|
+
// Use sum of per-line heights (may vary with per-span fontSize)
|
|
20
|
+
const chunkHeight = columnData
|
|
21
|
+
? visibleLines.slice(0, columnData.linesPerColumn).reduce((sum, rl) => sum + rl.lineHeight, 0)
|
|
22
|
+
: visibleLines.reduce((sum, rl) => sum + rl.lineHeight, 0);
|
|
23
|
+
const boxAbsY = yFromTop + geo.margins.top + geo.headerHeight;
|
|
24
|
+
const boxPdfY = toPdfY(boxAbsY, chunkHeight, geo.pageHeight);
|
|
25
|
+
const [bgR, bgG, bgB] = hexToRgb(element.bgColor);
|
|
26
|
+
pdfPage.drawRectangle({
|
|
27
|
+
x: geo.margins.left,
|
|
28
|
+
y: boxPdfY,
|
|
29
|
+
width: geo.contentWidth,
|
|
30
|
+
height: chunkHeight,
|
|
31
|
+
color: rgb(bgR, bgG, bgB),
|
|
32
|
+
borderWidth: 0,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
// Multi-column layout
|
|
36
|
+
if (columnData) {
|
|
37
|
+
const { columnCount, columnGap, columnWidth, linesPerColumn } = columnData;
|
|
38
|
+
// Track cumulative Y per column (per-line heights may vary)
|
|
39
|
+
const colCumY = new Array(columnCount).fill(0);
|
|
40
|
+
for (let i = 0; i < visibleLines.length; i++) {
|
|
41
|
+
const richLine = visibleLines[i];
|
|
42
|
+
const colIdx = Math.floor(i / linesPerColumn);
|
|
43
|
+
const colOffsetX = colIdx * (columnWidth + columnGap);
|
|
44
|
+
const lineYFromTop = yFromTop + colCumY[colIdx] + geo.margins.top + geo.headerHeight;
|
|
45
|
+
for (const fragment of richLine.fragments) {
|
|
46
|
+
if (!fragment.text || fragment.text.trim() === '')
|
|
47
|
+
continue;
|
|
48
|
+
const pdfFont = fontMap.get(fragment.fontKey);
|
|
49
|
+
if (!pdfFont) {
|
|
50
|
+
throw new PretextPdfError('FONT_NOT_LOADED', `Rich text fragment font "${fragment.fontKey}" not found in fontMap. This is a bug — font validation should have caught this.`);
|
|
51
|
+
}
|
|
52
|
+
const fontHeight = pdfFont.heightAtSize(fragment.fontSize);
|
|
53
|
+
const basePdfY = toPdfY(lineYFromTop, fontHeight, geo.pageHeight);
|
|
54
|
+
const [r, g, b] = hexToRgb(fragment.color);
|
|
55
|
+
const drawX = geo.margins.left + colOffsetX + fragment.x;
|
|
56
|
+
// Footnote ref spans render as superscript number, replacing the original text
|
|
57
|
+
if (fragment.footnoteRef) {
|
|
58
|
+
const num = footnoteNumbering?.get(fragment.footnoteRef) ?? '?';
|
|
59
|
+
const superText = String(num);
|
|
60
|
+
const superSize = fragment.fontSize * 0.65;
|
|
61
|
+
const superYOffset = fragment.fontSize * 0.4;
|
|
62
|
+
const superPdfY = basePdfY + superYOffset;
|
|
63
|
+
pdfPage.drawText(superText, {
|
|
64
|
+
x: drawX,
|
|
65
|
+
y: superPdfY,
|
|
66
|
+
size: superSize,
|
|
67
|
+
font: pdfFont,
|
|
68
|
+
color: rgb(r, g, b),
|
|
69
|
+
});
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const fragmentPdfY = basePdfY + (fragment.yOffset ?? 0);
|
|
73
|
+
const drawText = fragment.text.trimEnd();
|
|
74
|
+
let fragWidth;
|
|
75
|
+
if (fragment.letterSpacing && fragment.letterSpacing > 0) {
|
|
76
|
+
let cx = drawX;
|
|
77
|
+
for (const ch of drawText) {
|
|
78
|
+
pdfPage.drawText(ch, { x: cx, y: fragmentPdfY, size: fragment.fontSize, font: pdfFont, color: rgb(r, g, b) });
|
|
79
|
+
cx += pdfFont.widthOfTextAtSize(ch, fragment.fontSize) + fragment.letterSpacing;
|
|
80
|
+
}
|
|
81
|
+
fragWidth = pdfFont.widthOfTextAtSize(drawText, fragment.fontSize) + fragment.letterSpacing * (drawText.length - 1);
|
|
82
|
+
}
|
|
83
|
+
else if (tabularNumbers) {
|
|
84
|
+
drawTabularText(pdfPage, drawText, drawX, fragmentPdfY, fragment.fontSize, pdfFont, rgb(r, g, b));
|
|
85
|
+
fragWidth = pdfFont.widthOfTextAtSize(drawText, fragment.fontSize);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
pdfPage.drawText(drawText, { x: drawX, y: fragmentPdfY, size: fragment.fontSize, font: pdfFont, color: rgb(r, g, b) });
|
|
89
|
+
fragWidth = pdfFont.widthOfTextAtSize(drawText, fragment.fontSize);
|
|
90
|
+
}
|
|
91
|
+
drawTextDecoration(pdfPage, drawX, fragWidth, fragmentPdfY, fragment.fontSize, pdfFont, [r, g, b], { underline: fragment.underline ?? false, strikethrough: fragment.strikethrough ?? false });
|
|
92
|
+
if (fragment.url) {
|
|
93
|
+
addLinkAnnotation(pdfDoc, pdfPage, drawX, fragmentPdfY, fragWidth, fragment.fontSize, fragment.url);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
colCumY[colIdx] += richLine.lineHeight;
|
|
97
|
+
}
|
|
98
|
+
return; // skip standard single-column path
|
|
99
|
+
}
|
|
100
|
+
// Single-column layout (standard path)
|
|
101
|
+
// Track cumulative Y (per-line heights may vary due to per-span fontSize)
|
|
102
|
+
let cumY = 0;
|
|
103
|
+
for (let i = 0; i < visibleLines.length; i++) {
|
|
104
|
+
const richLine = visibleLines[i];
|
|
105
|
+
const lineYFromTop = yFromTop + cumY + geo.margins.top + geo.headerHeight;
|
|
106
|
+
for (const fragment of richLine.fragments) {
|
|
107
|
+
if (!fragment.text || fragment.text.trim() === '')
|
|
108
|
+
continue;
|
|
109
|
+
const pdfFont = fontMap.get(fragment.fontKey);
|
|
110
|
+
if (!pdfFont) {
|
|
111
|
+
throw new PretextPdfError('FONT_NOT_LOADED', `Rich text fragment font "${fragment.fontKey}" not found in fontMap. This is a bug — font validation should have caught this.`);
|
|
112
|
+
}
|
|
113
|
+
const fontHeight = pdfFont.heightAtSize(fragment.fontSize);
|
|
114
|
+
const basePdfY = toPdfY(lineYFromTop, fontHeight, geo.pageHeight);
|
|
115
|
+
const [r, g, b] = hexToRgb(fragment.color);
|
|
116
|
+
const drawX = geo.margins.left + fragment.x;
|
|
117
|
+
// Footnote ref spans render as superscript number, replacing the original text
|
|
118
|
+
if (fragment.footnoteRef) {
|
|
119
|
+
const num = footnoteNumbering?.get(fragment.footnoteRef) ?? '?';
|
|
120
|
+
const superText = String(num);
|
|
121
|
+
const superSize = fragment.fontSize * 0.65;
|
|
122
|
+
const superYOffset = fragment.fontSize * 0.4;
|
|
123
|
+
const superPdfY = basePdfY + superYOffset;
|
|
124
|
+
pdfPage.drawText(superText, {
|
|
125
|
+
x: drawX,
|
|
126
|
+
y: superPdfY,
|
|
127
|
+
size: superSize,
|
|
128
|
+
font: pdfFont,
|
|
129
|
+
color: rgb(r, g, b),
|
|
130
|
+
});
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const fragmentPdfY = basePdfY + (fragment.yOffset ?? 0);
|
|
134
|
+
const drawText = fragment.text.trimEnd();
|
|
135
|
+
let fragWidth;
|
|
136
|
+
if (fragment.letterSpacing && fragment.letterSpacing > 0) {
|
|
137
|
+
let cx = drawX;
|
|
138
|
+
for (const ch of drawText) {
|
|
139
|
+
pdfPage.drawText(ch, { x: cx, y: fragmentPdfY, size: fragment.fontSize, font: pdfFont, color: rgb(r, g, b) });
|
|
140
|
+
cx += pdfFont.widthOfTextAtSize(ch, fragment.fontSize) + fragment.letterSpacing;
|
|
141
|
+
}
|
|
142
|
+
fragWidth = pdfFont.widthOfTextAtSize(drawText, fragment.fontSize) + fragment.letterSpacing * (drawText.length - 1);
|
|
143
|
+
}
|
|
144
|
+
else if (tabularNumbers) {
|
|
145
|
+
drawTabularText(pdfPage, drawText, drawX, fragmentPdfY, fragment.fontSize, pdfFont, rgb(r, g, b));
|
|
146
|
+
fragWidth = pdfFont.widthOfTextAtSize(drawText, fragment.fontSize);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
pdfPage.drawText(drawText, { x: drawX, y: fragmentPdfY, size: fragment.fontSize, font: pdfFont, color: rgb(r, g, b) });
|
|
150
|
+
fragWidth = pdfFont.widthOfTextAtSize(drawText, fragment.fontSize);
|
|
151
|
+
}
|
|
152
|
+
drawTextDecoration(pdfPage, drawX, fragWidth, fragmentPdfY, fragment.fontSize, pdfFont, [r, g, b], { underline: fragment.underline ?? false, strikethrough: fragment.strikethrough ?? false });
|
|
153
|
+
if (fragment.url) {
|
|
154
|
+
addLinkAnnotation(pdfDoc, pdfPage, drawX, fragmentPdfY, fragWidth, fragment.fontSize, fragment.url);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
cumY += richLine.lineHeight;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=rich.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rich.js","sourceRoot":"","sources":["../../src/render-blocks/rich.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* render-blocks/table.ts — Table rendering
|
|
3
|
+
*/
|
|
4
|
+
import { PDFDocument } from '@cantoo/pdf-lib';
|
|
5
|
+
import type { PagedBlock, FontMap, PageGeometry } from '../types-internal.js';
|
|
6
|
+
export declare function renderTable(pdfPage: ReturnType<PDFDocument['addPage']>, pagedBlock: PagedBlock, geo: PageGeometry, fontMap: FontMap): void;
|
|
7
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/render-blocks/table.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAO,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EACV,UAAU,EAAE,OAAO,EAAE,YAAY,EAClC,MAAM,sBAAsB,CAAA;AAW7B,wBAAgB,WAAW,CACzB,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAC3C,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,OAAO,GACf,IAAI,CAiJN"}
|