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
package/dist/layout-state.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @internal Not part of the stable public API. Subject to change without a semver bump.
|
|
4
4
|
*/
|
|
5
5
|
import { PDFDocument } from '@cantoo/pdf-lib';
|
|
6
|
-
import type { PdfDocument, RenderOptions } from './types-public.js';
|
|
6
|
+
import type { PdfDocument, RenderOptions } from './types-public/index.js';
|
|
7
7
|
import type { MeasuredBlock, PaginatedDocument, PageGeometry, FontMap, ImageMap } from './types-internal.js';
|
|
8
8
|
export interface LayoutState {
|
|
9
9
|
doc: PdfDocument;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-state.d.ts","sourceRoot":"","sources":["../src/layout-state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"layout-state.d.ts","sourceRoot":"","sources":["../src/layout-state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAI5G,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,WAAW,CAAA;IAChB,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,YAAY,EAAE,iBAAiB,CAAA;IAC/B,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,QAAQ,CAAA;IAClB,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IAClC,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IACvE,KAAK,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACrC;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBxG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAcpE"}
|
package/dist/layout-state.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout inspection API — run the pipeline up to pagination without rendering.
|
|
3
|
+
* @internal Not part of the stable public API. Subject to change without a semver bump.
|
|
4
|
+
*/
|
|
5
|
+
import { PDFDocument } from '@cantoo/pdf-lib';
|
|
1
6
|
import { stageValidate, stageInit, stageLoadAssets, stageFinalizeGeo, stageMeasure, stagePaginate } from './pipeline.js';
|
|
2
7
|
import { PretextPdfError } from './errors.js';
|
|
3
8
|
/**
|
package/dist/layout-state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-state.js","sourceRoot":"","sources":["../src/layout-state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"layout-state.js","sourceRoot":"","sources":["../src/layout-state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACxH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAkB7C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAgB,EAAE,OAAuB;IAChF,IAAI,OAAO,IAAI,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;QAC1C,MAAM,IAAI,eAAe,CAAC,eAAe,EAAE,uHAAuH,CAAC,CAAA;IACrK,CAAC;IACD,IAAI,OAAO,eAAe,KAAK,WAAW,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAC5E,IAAI,CAAC;YACH,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;YAClE,MAAM,mBAAmB,EAAE,CAAA;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,eAAe,CAAC,oBAAoB,EAAE,iDAAiD,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAChJ,CAAC;IACH,CAAC;IAED,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAE3B,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;IACrE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC3G,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,CAAC,CAAA;IAChE,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC/G,MAAM,YAAY,GAAG,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IAE1E,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,CAAA;AAC5F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAkB;IACrD,OAAO;QACL,QAAQ,EAAE;YACR,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM;SACvC;QACD,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,IAAK,KAAK,CAAC,OAA4B,CAAC,GAAG,KAAK,KAAK;SACnF,CAAC,CAAC;QACH,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;SAC/B,CAAC,CAAC;KACJ,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure-blocks/float-group.ts — Multi-paragraph float-group measurement.
|
|
3
|
+
*/
|
|
4
|
+
import type { ContentElement, FloatGroupElement, PdfDocument } from '../types.js';
|
|
5
|
+
import type { MeasuredBlock, ImageMap } from '../types-internal.js';
|
|
6
|
+
import type { HyphenatorOpts } from '../measure-text.js';
|
|
7
|
+
export type MeasureBlockFn = (element: ContentElement, contentWidth: number, doc: PdfDocument, hyphenatorOpts?: HyphenatorOpts, wordWidthCache?: Map<string, number>) => Promise<MeasuredBlock | MeasuredBlock[]>;
|
|
8
|
+
export declare function measureFloatGroup(element: FloatGroupElement, imageKey: string, imageMap: ImageMap, contentWidth: number, pageContentHeight: number, doc: PdfDocument, measureBlock: MeasureBlockFn, hyphenatorOpts?: HyphenatorOpts, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
|
|
9
|
+
//# sourceMappingURL=float-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"float-group.d.ts","sourceRoot":"","sources":["../../src/measure-blocks/float-group.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAgB,WAAW,EAAE,MAAM,aAAa,CAAA;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAyB,MAAM,sBAAsB,CAAA;AAE1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAQxD,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,WAAW,EAChB,cAAc,CAAC,EAAE,cAAc,EAC/B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KACjC,OAAO,CAAC,aAAa,GAAG,aAAa,EAAE,CAAC,CAAA;AAE7C,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EACzB,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,cAAc,EAC5B,cAAc,CAAC,EAAE,cAAc,EAC/B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CAqHxB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure-blocks/float-group.ts — Multi-paragraph float-group measurement.
|
|
3
|
+
*/
|
|
4
|
+
import { PretextPdfError } from '../errors.js';
|
|
5
|
+
import { measureImageWithKey } from './image.js';
|
|
6
|
+
export async function measureFloatGroup(element, imageKey, imageMap, contentWidth, pageContentHeight, doc, measureBlock, hyphenatorOpts, wordWidthCache) {
|
|
7
|
+
const floatWidth = element.floatWidth ?? (contentWidth * 0.35);
|
|
8
|
+
const floatGap = element.floatGap ?? 12;
|
|
9
|
+
const textColWidth = contentWidth - floatWidth - floatGap;
|
|
10
|
+
if (textColWidth < 50) {
|
|
11
|
+
throw new PretextPdfError('COLUMN_WIDTH_TOO_NARROW', `Float group: text column would be ${textColWidth.toFixed(1)}pt (minimum 50pt). ` +
|
|
12
|
+
`Reduce floatWidth or increase page width.`);
|
|
13
|
+
}
|
|
14
|
+
// Measure the image at floatWidth
|
|
15
|
+
const syntheticImageEl = {
|
|
16
|
+
type: 'image',
|
|
17
|
+
src: '',
|
|
18
|
+
...(element.image.height !== undefined ? { height: element.image.height } : {}),
|
|
19
|
+
align: 'left',
|
|
20
|
+
spaceAfter: 0,
|
|
21
|
+
spaceBefore: 0,
|
|
22
|
+
};
|
|
23
|
+
const imageBlock = await measureImageWithKey(syntheticImageEl, imageKey, imageMap, floatWidth, pageContentHeight);
|
|
24
|
+
const imageRenderWidth = imageBlock.imageData.renderWidth;
|
|
25
|
+
const imageRenderHeight = imageBlock.imageData.renderHeight;
|
|
26
|
+
// Measure each content element in the text column.
|
|
27
|
+
//
|
|
28
|
+
// NOTE (v1.5.2): an earlier draft computed `const baseFontSize =
|
|
29
|
+
// doc.defaultFontSize ?? 12` plus a per-block `const fontSize =
|
|
30
|
+
// block.fontSize || baseFontSize` fallback. v1.5.1 M5a removed both as
|
|
31
|
+
// unused locals (the item below assigns `block.fontSize` directly, so the
|
|
32
|
+
// local was never read). That removal is correct: upstream measure helpers
|
|
33
|
+
// (measure-paragraph, measure-heading, …) always populate `block.fontSize`
|
|
34
|
+
// with a positive value, so a `block.fontSize || baseFontSize` fallback
|
|
35
|
+
// would never fire in practice. Do NOT reintroduce the fallback without
|
|
36
|
+
// first finding a measure helper that returns `fontSize === 0` for real
|
|
37
|
+
// content.
|
|
38
|
+
const textItems = [];
|
|
39
|
+
let totalTextHeight = 0;
|
|
40
|
+
for (const contentEl of element.content) {
|
|
41
|
+
const measuredEl = await measureBlock(contentEl, textColWidth, doc, hyphenatorOpts, wordWidthCache);
|
|
42
|
+
// Handle arrays (lists return MeasuredBlock[])
|
|
43
|
+
const blocks = Array.isArray(measuredEl) ? measuredEl : [measuredEl];
|
|
44
|
+
for (const block of blocks) {
|
|
45
|
+
// Extract text from lines or rich-lines
|
|
46
|
+
let lines = [];
|
|
47
|
+
if (block.richLines && block.richLines.length > 0) {
|
|
48
|
+
// Rich paragraph: extract plain text from rich lines (plain-text fallback)
|
|
49
|
+
lines = block.richLines.map(rl => ({
|
|
50
|
+
text: rl.fragments.map(f => f.text).join(''),
|
|
51
|
+
width: rl.totalWidth,
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
lines = block.lines;
|
|
56
|
+
}
|
|
57
|
+
const yOffsetFromTop = totalTextHeight;
|
|
58
|
+
const item = {
|
|
59
|
+
lines,
|
|
60
|
+
fontSize: block.fontSize,
|
|
61
|
+
lineHeight: block.lineHeight,
|
|
62
|
+
fontKey: block.fontKey,
|
|
63
|
+
fontWeight: 400,
|
|
64
|
+
spaceAfter: block.spaceAfter,
|
|
65
|
+
yOffsetFromTop,
|
|
66
|
+
};
|
|
67
|
+
if (block.richLines) {
|
|
68
|
+
item.richLines = block.richLines;
|
|
69
|
+
}
|
|
70
|
+
textItems.push(item);
|
|
71
|
+
totalTextHeight += block.height + block.spaceAfter;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Remove trailing spaceAfter (it's not needed at the end)
|
|
75
|
+
if (textItems.length > 0) {
|
|
76
|
+
totalTextHeight -= textItems[textItems.length - 1].spaceAfter;
|
|
77
|
+
}
|
|
78
|
+
// Column X positions
|
|
79
|
+
const imageColX = element.float === 'left' ? 0 : textColWidth + floatGap;
|
|
80
|
+
const textColX = element.float === 'left' ? floatWidth + floatGap : 0;
|
|
81
|
+
const compositeHeight = Math.max(imageRenderHeight, totalTextHeight);
|
|
82
|
+
return {
|
|
83
|
+
element,
|
|
84
|
+
height: compositeHeight,
|
|
85
|
+
lines: [],
|
|
86
|
+
fontSize: 0,
|
|
87
|
+
lineHeight: 0,
|
|
88
|
+
fontKey: '',
|
|
89
|
+
spaceAfter: element.spaceAfter ?? 12,
|
|
90
|
+
spaceBefore: element.spaceBefore ?? 0,
|
|
91
|
+
floatGroupData: {
|
|
92
|
+
imageKey,
|
|
93
|
+
imageRenderWidth,
|
|
94
|
+
imageRenderHeight,
|
|
95
|
+
imageColX,
|
|
96
|
+
textColX,
|
|
97
|
+
textColWidth,
|
|
98
|
+
textItems,
|
|
99
|
+
totalTextHeight,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=float-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"float-group.js","sourceRoot":"","sources":["../../src/measure-blocks/float-group.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure-blocks/helpers.ts — Shared helpers and constants used by multiple
|
|
3
|
+
* per-element-type measurement modules.
|
|
4
|
+
*/
|
|
5
|
+
/** Heading level size multipliers and defaults */
|
|
6
|
+
export declare const HEADING_DEFAULTS: {
|
|
7
|
+
1: {
|
|
8
|
+
sizeMultiplier: number;
|
|
9
|
+
fontWeight: 700;
|
|
10
|
+
spaceAfter: number;
|
|
11
|
+
spaceBefore: number;
|
|
12
|
+
};
|
|
13
|
+
2: {
|
|
14
|
+
sizeMultiplier: number;
|
|
15
|
+
fontWeight: 700;
|
|
16
|
+
spaceAfter: number;
|
|
17
|
+
spaceBefore: number;
|
|
18
|
+
};
|
|
19
|
+
3: {
|
|
20
|
+
sizeMultiplier: number;
|
|
21
|
+
fontWeight: 700;
|
|
22
|
+
spaceAfter: number;
|
|
23
|
+
spaceBefore: number;
|
|
24
|
+
};
|
|
25
|
+
4: {
|
|
26
|
+
sizeMultiplier: number;
|
|
27
|
+
fontWeight: 700;
|
|
28
|
+
spaceAfter: number;
|
|
29
|
+
spaceBefore: number;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Resolve preset callout style colors
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveCalloutColors(style?: string): {
|
|
36
|
+
bg: string;
|
|
37
|
+
border: string;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Measure the natural (unwrapped) width of text in pt.
|
|
41
|
+
* Uses a very large maxWidth so Pretext never wraps — returns the actual line width.
|
|
42
|
+
*/
|
|
43
|
+
export declare function measureNaturalTextWidth(text: string, fontSize: number, fontFamily: string, fontWeight: 400 | 700): Promise<number>;
|
|
44
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/measure-blocks/helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,kDAAkD;AAClD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;CAK5B,CAAA;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQnF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,GAAG,GAAG,GAAG,GACpB,OAAO,CAAC,MAAM,CAAC,CAejB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure-blocks/helpers.ts — Shared helpers and constants used by multiple
|
|
3
|
+
* per-element-type measurement modules.
|
|
4
|
+
*/
|
|
5
|
+
import { getPretext } from '../measure-text.js';
|
|
6
|
+
import { LINE_HEIGHT_BODY } from '../render-utils.js';
|
|
7
|
+
/** Heading level size multipliers and defaults */
|
|
8
|
+
export const HEADING_DEFAULTS = {
|
|
9
|
+
1: { sizeMultiplier: 2.0, fontWeight: 700, spaceAfter: 16, spaceBefore: 28 },
|
|
10
|
+
2: { sizeMultiplier: 1.5, fontWeight: 700, spaceAfter: 12, spaceBefore: 24 },
|
|
11
|
+
3: { sizeMultiplier: 1.25, fontWeight: 700, spaceAfter: 8, spaceBefore: 20 },
|
|
12
|
+
4: { sizeMultiplier: 1.1, fontWeight: 700, spaceAfter: 6, spaceBefore: 16 },
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Resolve preset callout style colors
|
|
16
|
+
*/
|
|
17
|
+
export function resolveCalloutColors(style) {
|
|
18
|
+
switch (style) {
|
|
19
|
+
case 'info': return { bg: '#EFF6FF', border: '#3B82F6' };
|
|
20
|
+
case 'warning': return { bg: '#FFFBEB', border: '#F59E0B' };
|
|
21
|
+
case 'tip': return { bg: '#F0FDF4', border: '#22C55E' };
|
|
22
|
+
case 'note': return { bg: '#F9FAFB', border: '#9CA3AF' };
|
|
23
|
+
default: return { bg: '#F8F9FA', border: '#0070F3' };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Measure the natural (unwrapped) width of text in pt.
|
|
28
|
+
* Uses a very large maxWidth so Pretext never wraps — returns the actual line width.
|
|
29
|
+
*/
|
|
30
|
+
export async function measureNaturalTextWidth(text, fontSize, fontFamily, fontWeight) {
|
|
31
|
+
if (!text || text.trim() === '')
|
|
32
|
+
return 0;
|
|
33
|
+
const { prepareWithSegments, layoutWithLines } = await getPretext();
|
|
34
|
+
const weightPrefix = fontWeight === 700 ? 'bold ' : '';
|
|
35
|
+
const fontString = `${weightPrefix}${fontSize}px ${fontFamily}`;
|
|
36
|
+
// Use a very large width to prevent wrapping; also handle multi-line text (\n)
|
|
37
|
+
// by taking the max line width across all lines
|
|
38
|
+
const prepared = prepareWithSegments(text, fontString, { whiteSpace: 'pre-wrap' });
|
|
39
|
+
const result = layoutWithLines(prepared, 99999, fontSize * LINE_HEIGHT_BODY);
|
|
40
|
+
const lines = result.lines ?? [];
|
|
41
|
+
return lines.reduce((max, line) => Math.max(max, line.width), 0);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/measure-blocks/helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,kDAAkD;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAG,UAAU,EAAE,GAAY,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;IACtF,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAG,UAAU,EAAE,GAAY,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;IACtF,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,GAAY,EAAE,UAAU,EAAE,CAAC,EAAG,WAAW,EAAE,EAAE,EAAE;IACtF,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAG,UAAU,EAAE,GAAY,EAAE,UAAU,EAAE,CAAC,EAAG,WAAW,EAAE,EAAE,EAAE;CACvF,CAAA;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM,CAAC,CAAI,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAC3D,KAAK,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAC3D,KAAK,KAAK,CAAC,CAAK,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAC3D,KAAK,MAAM,CAAC,CAAI,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAC3D,OAAO,CAAC,CAAQ,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC7D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,IAAY,EACZ,QAAgB,EAChB,UAAkB,EAClB,UAAqB;IAErB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,CAAC,CAAA;IAEzC,MAAM,EAAE,mBAAmB,EAAE,eAAe,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA;IAEnE,MAAM,YAAY,GAAG,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;IACtD,MAAM,UAAU,GAAG,GAAG,YAAY,GAAG,QAAQ,MAAM,UAAU,EAAE,CAAA;IAE/D,+EAA+E;IAC/E,gDAAgD;IAChD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAA;IAClF,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,gBAAgB,CAAC,CAAA;IAC5E,MAAM,KAAK,GAA2C,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA;IAExE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;AAClE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure-blocks/highlight.ts — Syntax highlighting for code blocks.
|
|
3
|
+
*
|
|
4
|
+
* NOTE: _hljsCache and _hljsLoadAttempted are intentionally module-scoped here.
|
|
5
|
+
* They implement process-wide idempotent caching of the dynamic highlight.js
|
|
6
|
+
* import. Do not thread these through a context object — module state is correct.
|
|
7
|
+
*/
|
|
8
|
+
/** Default GitHub-light-inspired highlight theme colors */
|
|
9
|
+
export declare const DEFAULT_HIGHLIGHT_THEME: Record<string, string>;
|
|
10
|
+
/**
|
|
11
|
+
* Tokenize source code into per-line colored spans using highlight.js.
|
|
12
|
+
* Returns undefined if highlight.js is not installed (renderer falls back to plain text).
|
|
13
|
+
*/
|
|
14
|
+
export declare function tokenizeCodeForHighlighting(text: string, language: string, defaultColor: string, measuredLineCount: number, customTheme?: Record<string, string | undefined>): Promise<Array<Array<{
|
|
15
|
+
text: string;
|
|
16
|
+
color: string;
|
|
17
|
+
}>> | undefined>;
|
|
18
|
+
/**
|
|
19
|
+
* Parse highlight.js HTML into per-line token arrays.
|
|
20
|
+
* Handles nested spans (e.g. string interpolation) by tracking a color stack.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseHighlightHtml(html: string, defaultColor: string, theme: Record<string, string>): Array<Array<{
|
|
23
|
+
text: string;
|
|
24
|
+
color: string;
|
|
25
|
+
}>>;
|
|
26
|
+
//# sourceMappingURL=highlight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../../src/measure-blocks/highlight.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2DAA2D;AAC3D,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA4B1D,CAAA;AAMD;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EACzB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC/C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GAAG,SAAS,CAAC,CA0CpE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,KAAK,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAgE/C"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure-blocks/highlight.ts — Syntax highlighting for code blocks.
|
|
3
|
+
*
|
|
4
|
+
* NOTE: _hljsCache and _hljsLoadAttempted are intentionally module-scoped here.
|
|
5
|
+
* They implement process-wide idempotent caching of the dynamic highlight.js
|
|
6
|
+
* import. Do not thread these through a context object — module state is correct.
|
|
7
|
+
*/
|
|
8
|
+
/** Default GitHub-light-inspired highlight theme colors */
|
|
9
|
+
export const DEFAULT_HIGHLIGHT_THEME = {
|
|
10
|
+
keyword: '#cf222e',
|
|
11
|
+
string: '#0a3069',
|
|
12
|
+
comment: '#6e7781',
|
|
13
|
+
number: '#0550ae',
|
|
14
|
+
function: '#8250df',
|
|
15
|
+
title: '#8250df',
|
|
16
|
+
built_in: '#0550ae',
|
|
17
|
+
literal: '#0550ae',
|
|
18
|
+
type: '#953800',
|
|
19
|
+
meta: '#cf222e',
|
|
20
|
+
attr: '#0550ae',
|
|
21
|
+
name: '#0550ae',
|
|
22
|
+
params: '#24292f',
|
|
23
|
+
punctuation: '#24292f',
|
|
24
|
+
operator: '#24292f',
|
|
25
|
+
regexp: '#0a3069',
|
|
26
|
+
variable: '#953800',
|
|
27
|
+
property: '#0550ae',
|
|
28
|
+
tag: '#116329',
|
|
29
|
+
selector: '#116329',
|
|
30
|
+
subst: '#24292f',
|
|
31
|
+
'template-tag': '#cf222e',
|
|
32
|
+
'template-string': '#0a3069',
|
|
33
|
+
symbol: '#0550ae',
|
|
34
|
+
addition: '#116329',
|
|
35
|
+
deletion: '#cf222e',
|
|
36
|
+
section: '#0550ae',
|
|
37
|
+
};
|
|
38
|
+
/** Cached highlight.js module (loaded once, reused across code blocks) */
|
|
39
|
+
let _hljsCache = null;
|
|
40
|
+
let _hljsLoadAttempted = false;
|
|
41
|
+
/**
|
|
42
|
+
* Tokenize source code into per-line colored spans using highlight.js.
|
|
43
|
+
* Returns undefined if highlight.js is not installed (renderer falls back to plain text).
|
|
44
|
+
*/
|
|
45
|
+
export async function tokenizeCodeForHighlighting(text, language, defaultColor, measuredLineCount, customTheme) {
|
|
46
|
+
if (!_hljsLoadAttempted) {
|
|
47
|
+
_hljsLoadAttempted = true;
|
|
48
|
+
try {
|
|
49
|
+
const mod = await import('highlight.js');
|
|
50
|
+
_hljsCache = mod.default ?? mod;
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
const code = e?.code;
|
|
54
|
+
if (code !== 'ERR_MODULE_NOT_FOUND' && code !== 'MODULE_NOT_FOUND') {
|
|
55
|
+
console.warn(`[pretext-pdf] highlight.js installed but failed to load: ${e instanceof Error ? e.message : String(e)}`);
|
|
56
|
+
}
|
|
57
|
+
// ERR_MODULE_NOT_FOUND / MODULE_NOT_FOUND is expected when optional dep absent — silent
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (!_hljsCache)
|
|
61
|
+
return undefined;
|
|
62
|
+
const hljs = _hljsCache;
|
|
63
|
+
const theme = { ...DEFAULT_HIGHLIGHT_THEME };
|
|
64
|
+
if (customTheme) {
|
|
65
|
+
for (const [k, v] of Object.entries(customTheme)) {
|
|
66
|
+
if (v !== undefined)
|
|
67
|
+
theme[k] = v;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
let highlighted;
|
|
71
|
+
try {
|
|
72
|
+
const result = language === 'auto'
|
|
73
|
+
? hljs.highlightAuto(text)
|
|
74
|
+
: hljs.highlight(text, { language });
|
|
75
|
+
highlighted = result.value;
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
console.warn(`[pretext-pdf] syntax highlighting failed for language "${language}": ${e instanceof Error ? e.message : String(e)}`);
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
const tokens = parseHighlightHtml(highlighted, defaultColor, theme);
|
|
82
|
+
// Safety check: tokenizer splits on \n but the layout engine may wrap long lines.
|
|
83
|
+
// If line counts don't match, the colors would be applied to the wrong lines.
|
|
84
|
+
if (tokens.length !== measuredLineCount)
|
|
85
|
+
return undefined;
|
|
86
|
+
return tokens;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Parse highlight.js HTML into per-line token arrays.
|
|
90
|
+
* Handles nested spans (e.g. string interpolation) by tracking a color stack.
|
|
91
|
+
*/
|
|
92
|
+
export function parseHighlightHtml(html, defaultColor, theme) {
|
|
93
|
+
const lines = [[]];
|
|
94
|
+
const colorStack = [defaultColor];
|
|
95
|
+
let i = 0;
|
|
96
|
+
while (i < html.length) {
|
|
97
|
+
if (html[i] === '<') {
|
|
98
|
+
const closeTag = html.indexOf('>', i);
|
|
99
|
+
if (closeTag === -1)
|
|
100
|
+
break;
|
|
101
|
+
const tag = html.slice(i, closeTag + 1);
|
|
102
|
+
if (tag.startsWith('<span')) {
|
|
103
|
+
// Extract class: <span class="hljs-keyword"> or <span class="hljs-template-string">
|
|
104
|
+
const classMatch = tag.match(/class="hljs-([\w-]+)"/);
|
|
105
|
+
const cls = classMatch ? classMatch[1] : '';
|
|
106
|
+
colorStack.push(theme[cls] ?? defaultColor);
|
|
107
|
+
}
|
|
108
|
+
else if (tag === '</span>') {
|
|
109
|
+
if (colorStack.length > 1)
|
|
110
|
+
colorStack.pop();
|
|
111
|
+
}
|
|
112
|
+
i = closeTag + 1;
|
|
113
|
+
}
|
|
114
|
+
else if (html[i] === '&') {
|
|
115
|
+
// HTML entities: named (&), hex (=), decimal (`)
|
|
116
|
+
const semi = html.indexOf(';', i);
|
|
117
|
+
if (semi !== -1 && semi - i < 10) {
|
|
118
|
+
const entity = html.slice(i, semi + 1);
|
|
119
|
+
let ch;
|
|
120
|
+
if (entity === '&')
|
|
121
|
+
ch = '&';
|
|
122
|
+
else if (entity === '<')
|
|
123
|
+
ch = '<';
|
|
124
|
+
else if (entity === '>')
|
|
125
|
+
ch = '>';
|
|
126
|
+
else if (entity === '"')
|
|
127
|
+
ch = '"';
|
|
128
|
+
else if (entity === ''' || entity === ''')
|
|
129
|
+
ch = "'";
|
|
130
|
+
else if (entity.startsWith('&#x'))
|
|
131
|
+
ch = String.fromCodePoint(parseInt(entity.slice(3, -1), 16));
|
|
132
|
+
else if (entity.startsWith('&#'))
|
|
133
|
+
ch = String.fromCodePoint(parseInt(entity.slice(2, -1), 10));
|
|
134
|
+
else
|
|
135
|
+
ch = entity; // unknown named entity — keep as-is
|
|
136
|
+
lines[lines.length - 1].push({ text: ch, color: colorStack[colorStack.length - 1] });
|
|
137
|
+
i = semi + 1;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
lines[lines.length - 1].push({ text: '&', color: colorStack[colorStack.length - 1] });
|
|
141
|
+
i++;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else if (html[i] === '\n') {
|
|
145
|
+
lines.push([]);
|
|
146
|
+
i++;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// Regular text — accumulate consecutive chars with same color
|
|
150
|
+
const color = colorStack[colorStack.length - 1];
|
|
151
|
+
let end = i + 1;
|
|
152
|
+
while (end < html.length && html[end] !== '<' && html[end] !== '&' && html[end] !== '\n')
|
|
153
|
+
end++;
|
|
154
|
+
lines[lines.length - 1].push({ text: html.slice(i, end), color });
|
|
155
|
+
i = end;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Merge adjacent tokens with the same color on each line (fewer drawText calls)
|
|
159
|
+
for (const line of lines) {
|
|
160
|
+
for (let j = line.length - 1; j > 0; j--) {
|
|
161
|
+
if (line[j].color === line[j - 1].color) {
|
|
162
|
+
line[j - 1].text += line[j].text;
|
|
163
|
+
line.splice(j, 1);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return lines;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=highlight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"highlight.js","sourceRoot":"","sources":["../../src/measure-blocks/highlight.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure-blocks/image.ts — Image measurement (single image + float image block).
|
|
3
|
+
*/
|
|
4
|
+
import type { ImageElement, PdfDocument } from '../types.js';
|
|
5
|
+
import type { MeasuredBlock, ImageMap } from '../types-internal.js';
|
|
6
|
+
/** Measure an image element with its known imageMap key */
|
|
7
|
+
export declare function measureImageWithKey(element: ImageElement, imageKey: string, imageMap: ImageMap, contentWidth: number, pageContentHeight: number): Promise<MeasuredBlock>;
|
|
8
|
+
export declare function measureFloatImageBlock(element: ImageElement, imageKey: string, imageMap: ImageMap, contentWidth: number, pageContentHeight: number, doc: PdfDocument, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
|
|
9
|
+
//# sourceMappingURL=image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/measure-blocks/image.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,KAAK,EACV,aAAa,EAAqB,QAAQ,EAC3C,MAAM,sBAAsB,CAAA;AAO7B,2DAA2D;AAC3D,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,aAAa,CAAC,CAqExB;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EACzB,GAAG,EAAE,WAAW,EAChB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CAkFxB"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure-blocks/image.ts — Image measurement (single image + float image block).
|
|
3
|
+
*/
|
|
4
|
+
import { PretextPdfError } from '../errors.js';
|
|
5
|
+
import { measureRichText } from '../rich-text.js';
|
|
6
|
+
import { buildFontKey } from '../measure.js';
|
|
7
|
+
import { measureText } from '../measure-text.js';
|
|
8
|
+
import { LINE_HEIGHT_BODY } from '../render-utils.js';
|
|
9
|
+
/** Measure an image element with its known imageMap key */
|
|
10
|
+
export async function measureImageWithKey(element, imageKey, imageMap, contentWidth, pageContentHeight) {
|
|
11
|
+
const pdfImage = imageMap.get(imageKey);
|
|
12
|
+
if (!pdfImage) {
|
|
13
|
+
throw new PretextPdfError('IMAGE_LOAD_FAILED', `Image "${imageKey}": not found in imageMap. This is an internal error — please report it.`);
|
|
14
|
+
}
|
|
15
|
+
// Natural dimensions (in original pixels — aspect ratio is what matters, not the pixel count)
|
|
16
|
+
const naturalWidth = pdfImage.width;
|
|
17
|
+
const naturalHeight = pdfImage.height;
|
|
18
|
+
// Resolve render dimensions (in pt)
|
|
19
|
+
let renderWidth;
|
|
20
|
+
let renderHeight;
|
|
21
|
+
if (element.width !== undefined && element.height !== undefined) {
|
|
22
|
+
// Both provided: use as-is
|
|
23
|
+
renderWidth = element.width;
|
|
24
|
+
renderHeight = element.height;
|
|
25
|
+
}
|
|
26
|
+
else if (element.width !== undefined) {
|
|
27
|
+
// Width only: scale height
|
|
28
|
+
renderWidth = element.width;
|
|
29
|
+
renderHeight = renderWidth * (naturalHeight / naturalWidth);
|
|
30
|
+
}
|
|
31
|
+
else if (element.height !== undefined) {
|
|
32
|
+
// Height only: scale width
|
|
33
|
+
renderHeight = element.height;
|
|
34
|
+
renderWidth = renderHeight * (naturalWidth / naturalHeight);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Neither: fit to content width
|
|
38
|
+
renderWidth = contentWidth;
|
|
39
|
+
renderHeight = renderWidth * (naturalHeight / naturalWidth);
|
|
40
|
+
}
|
|
41
|
+
// Clamp to content width
|
|
42
|
+
if (renderWidth > contentWidth) {
|
|
43
|
+
const scale = contentWidth / renderWidth;
|
|
44
|
+
renderWidth = contentWidth;
|
|
45
|
+
renderHeight = renderHeight * scale;
|
|
46
|
+
}
|
|
47
|
+
// Validate height doesn't exceed page
|
|
48
|
+
if (renderHeight > pageContentHeight) {
|
|
49
|
+
throw new PretextPdfError('IMAGE_TOO_TALL', `Image "${imageKey}" would render at ${renderHeight.toFixed(1)}pt tall, which exceeds the page content area (${pageContentHeight.toFixed(1)}pt). ` +
|
|
50
|
+
`Reduce 'height' or increase page size/reduce margins.`);
|
|
51
|
+
}
|
|
52
|
+
const imageData = {
|
|
53
|
+
imageKey,
|
|
54
|
+
renderWidth,
|
|
55
|
+
renderHeight,
|
|
56
|
+
align: element.align ?? 'left',
|
|
57
|
+
};
|
|
58
|
+
return {
|
|
59
|
+
element,
|
|
60
|
+
height: renderHeight,
|
|
61
|
+
lines: [],
|
|
62
|
+
fontSize: 0,
|
|
63
|
+
lineHeight: 0,
|
|
64
|
+
fontKey: '',
|
|
65
|
+
spaceAfter: element.spaceAfter ?? 0,
|
|
66
|
+
spaceBefore: element.spaceBefore ?? 0,
|
|
67
|
+
imageData,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export async function measureFloatImageBlock(element, imageKey, imageMap, contentWidth, pageContentHeight, doc, wordWidthCache) {
|
|
71
|
+
const floatWidth = element.floatWidth ?? (contentWidth * 0.35);
|
|
72
|
+
const floatGap = element.floatGap ?? 12;
|
|
73
|
+
const textColWidth = contentWidth - floatWidth - floatGap;
|
|
74
|
+
if (textColWidth < 50) {
|
|
75
|
+
throw new PretextPdfError('COLUMN_WIDTH_TOO_NARROW', `Float image: text column would be ${textColWidth.toFixed(1)}pt (minimum 50pt). ` +
|
|
76
|
+
`Reduce floatWidth or increase page width.`);
|
|
77
|
+
}
|
|
78
|
+
// Measure the image at floatWidth using a synthetic element
|
|
79
|
+
const syntheticEl = {
|
|
80
|
+
type: 'image',
|
|
81
|
+
src: element.src,
|
|
82
|
+
...(element.format !== undefined ? { format: element.format } : {}),
|
|
83
|
+
width: floatWidth,
|
|
84
|
+
align: 'left',
|
|
85
|
+
spaceAfter: 0,
|
|
86
|
+
spaceBefore: 0,
|
|
87
|
+
};
|
|
88
|
+
const imageBlock = await measureImageWithKey(syntheticEl, imageKey, imageMap, floatWidth, pageContentHeight);
|
|
89
|
+
const imageRenderWidth = imageBlock.imageData.renderWidth;
|
|
90
|
+
const imageRenderHeight = imageBlock.imageData.renderHeight;
|
|
91
|
+
// Measure the float text (plain or rich)
|
|
92
|
+
const fontSize = element.floatFontSize ?? doc.defaultFontSize ?? 12;
|
|
93
|
+
const lineHeight = fontSize * LINE_HEIGHT_BODY;
|
|
94
|
+
const fontFamily = element.floatFontFamily ?? doc.defaultFont ?? 'Inter';
|
|
95
|
+
const fontKey = buildFontKey(fontFamily, 400, 'normal');
|
|
96
|
+
let textLines = [];
|
|
97
|
+
let richFloatLines;
|
|
98
|
+
if (element.floatSpans) {
|
|
99
|
+
richFloatLines = await measureRichText(element.floatSpans, fontSize, lineHeight, textColWidth, 'left', doc);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
textLines = await measureText(element.floatText, fontSize, fontFamily, 400, textColWidth, lineHeight, undefined, wordWidthCache);
|
|
103
|
+
}
|
|
104
|
+
// Column X positions
|
|
105
|
+
const imageColX = element.float === 'left' ? 0 : textColWidth + floatGap;
|
|
106
|
+
const textColX = element.float === 'left' ? floatWidth + floatGap : 0;
|
|
107
|
+
const textHeight = richFloatLines
|
|
108
|
+
? richFloatLines.reduce((sum, l) => sum + l.lineHeight, 0)
|
|
109
|
+
: textLines.length * lineHeight;
|
|
110
|
+
const compositeHeight = Math.max(imageRenderHeight, textHeight);
|
|
111
|
+
return {
|
|
112
|
+
element,
|
|
113
|
+
height: compositeHeight,
|
|
114
|
+
lines: [],
|
|
115
|
+
fontSize: 0,
|
|
116
|
+
lineHeight: 0,
|
|
117
|
+
fontKey: '',
|
|
118
|
+
spaceAfter: element.spaceAfter ?? 0,
|
|
119
|
+
spaceBefore: element.spaceBefore ?? 0,
|
|
120
|
+
floatData: {
|
|
121
|
+
imageKey,
|
|
122
|
+
imageRenderWidth,
|
|
123
|
+
imageRenderHeight,
|
|
124
|
+
imageColX,
|
|
125
|
+
textColX,
|
|
126
|
+
textColWidth,
|
|
127
|
+
textLines,
|
|
128
|
+
...(richFloatLines ? { richFloatLines } : {}),
|
|
129
|
+
textFontKey: fontKey,
|
|
130
|
+
textFontSize: fontSize,
|
|
131
|
+
textLineHeight: lineHeight,
|
|
132
|
+
textColor: element.floatColor ?? '#000000',
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/measure-blocks/image.ts"],"names":[],"mappings":"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"}
|