pagyra-js 0.0.1
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/.eslintrc.json +30 -0
- package/CHANGELOG.md +13 -0
- package/README.md +275 -0
- package/UA_Styles_Chromium.md +93 -0
- package/_ext/woff2_conversion/brotli-decode.d.ts +139 -0
- package/_ext/woff2_conversion/brotli-encode.d.ts +129 -0
- package/_ext/woff2_conversion/brotli-port.d.ts +12 -0
- package/_ext/woff2_conversion/brotli-shared-dictionary.d.ts +25 -0
- package/_ext/woff2_conversion/brotli-types.d.ts +15 -0
- package/_ext/woff2_conversion/woff2-common.d.ts +37 -0
- package/_ext/woff2_conversion/woff2-decode.d.ts +32 -0
- package/_ext/woff2_conversion/woff2-encode.d.ts +31 -0
- package/_ext/woff2_conversion/woff2-output.d.ts +39 -0
- package/_ext/woff2_original_cpp/brotli/brotli.c +1559 -0
- package/_ext/woff2_original_cpp/brotli/brotli.md +116 -0
- package/_ext/woff2_original_cpp/brotli/decode.h +409 -0
- package/_ext/woff2_original_cpp/brotli/encode.h +505 -0
- package/_ext/woff2_original_cpp/brotli/port.h +302 -0
- package/_ext/woff2_original_cpp/brotli/shared_dictionary.h +100 -0
- package/_ext/woff2_original_cpp/brotli/types.h +83 -0
- package/_ext/woff2_original_cpp/cmake/FindBrotliDec.cmake +35 -0
- package/_ext/woff2_original_cpp/cmake/FindBrotliEnc.cmake +35 -0
- package/_ext/woff2_original_cpp/include/woff2/decode.h +36 -0
- package/_ext/woff2_original_cpp/include/woff2/encode.h +43 -0
- package/_ext/woff2_original_cpp/include/woff2/output.h +86 -0
- package/_ext/woff2_original_cpp/src/buffer.h +164 -0
- package/_ext/woff2_original_cpp/src/convert_woff2ttf_fuzzer.cc +13 -0
- package/_ext/woff2_original_cpp/src/convert_woff2ttf_fuzzer_new_entry.cc +12 -0
- package/_ext/woff2_original_cpp/src/file.h +30 -0
- package/_ext/woff2_original_cpp/src/font.cc +400 -0
- package/_ext/woff2_original_cpp/src/font.h +105 -0
- package/_ext/woff2_original_cpp/src/glyph.cc +383 -0
- package/_ext/woff2_original_cpp/src/glyph.h +71 -0
- package/_ext/woff2_original_cpp/src/normalize.cc +314 -0
- package/_ext/woff2_original_cpp/src/normalize.h +39 -0
- package/_ext/woff2_original_cpp/src/port.h +66 -0
- package/_ext/woff2_original_cpp/src/round.h +27 -0
- package/_ext/woff2_original_cpp/src/store_bytes.h +55 -0
- package/_ext/woff2_original_cpp/src/table_tags.cc +82 -0
- package/_ext/woff2_original_cpp/src/table_tags.h +30 -0
- package/_ext/woff2_original_cpp/src/transform.cc +430 -0
- package/_ext/woff2_original_cpp/src/transform.h +26 -0
- package/_ext/woff2_original_cpp/src/variable_length.cc +129 -0
- package/_ext/woff2_original_cpp/src/variable_length.h +30 -0
- package/_ext/woff2_original_cpp/src/woff2_common.cc +50 -0
- package/_ext/woff2_original_cpp/src/woff2_common.h +64 -0
- package/_ext/woff2_original_cpp/src/woff2_compress.cc +43 -0
- package/_ext/woff2_original_cpp/src/woff2_dec.cc +1398 -0
- package/_ext/woff2_original_cpp/src/woff2_decompress.cc +41 -0
- package/_ext/woff2_original_cpp/src/woff2_enc.cc +458 -0
- package/_ext/woff2_original_cpp/src/woff2_info.cc +142 -0
- package/_ext/woff2_original_cpp/src/woff2_out.cc +63 -0
- package/assets/fonts/ttf/arimo/Arimo-Bold.ttf +0 -0
- package/assets/fonts/ttf/arimo/Arimo-BoldItalic.ttf +0 -0
- package/assets/fonts/ttf/arimo/Arimo-Italic.ttf +0 -0
- package/assets/fonts/ttf/arimo/Arimo-Regular.ttf +0 -0
- package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Black.ttf +0 -0
- package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Bold.ttf +0 -0
- package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Regular.ttf +0 -0
- package/assets/fonts/ttf/dejavu/DejaVuSans.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-Bold.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-Light.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-Medium.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-Regular.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-SemiBold.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-Bold.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-Light.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-Medium.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-Regular.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-SemiBold.ttf +0 -0
- package/assets/fonts/ttf/notosans/NotoSans-Regular.ttf +0 -0
- package/assets/fonts/ttf/roboto/Roboto-Bold.ttf +0 -0
- package/assets/fonts/ttf/roboto/Roboto-BoldItalic.ttf +0 -0
- package/assets/fonts/ttf/roboto/Roboto-Italic.ttf +0 -0
- package/assets/fonts/ttf/roboto/Roboto-Regular.ttf +0 -0
- package/assets/fonts/ttf/stixtwomath/STIXTwoMath-Regular.ttf +0 -0
- package/assets/fonts/ttf/tinos/Tinos-Bold.ttf +0 -0
- package/assets/fonts/ttf/tinos/Tinos-BoldItalic.ttf +0 -0
- package/assets/fonts/ttf/tinos/Tinos-Italic.ttf +0 -0
- package/assets/fonts/ttf/tinos/Tinos-Regular.ttf +0 -0
- package/assets/fonts/woff/lato/lato-latin-400-italic.woff +0 -0
- package/assets/fonts/woff/lato/lato-latin-400-normal.woff +0 -0
- package/assets/fonts/woff/lato/lato-latin-700-italic.woff +0 -0
- package/assets/fonts/woff/lato/lato-latin-700-normal.woff +0 -0
- package/assets/fonts/woff2/caveat/Caveat-Bold.woff2 +0 -0
- package/assets/fonts/woff2/caveat/Caveat-Regular.woff2 +0 -0
- package/assets/fonts/woff2/lato/lato-latin-400-italic.woff2 +0 -0
- package/assets/fonts/woff2/lato/lato-latin-400-normal.woff2 +0 -0
- package/assets/fonts/woff2/lato/lato-latin-700-italic.woff2 +0 -0
- package/assets/fonts/woff2/lato/lato-latin-700-normal.woff2 +0 -0
- package/docs/AGENTS.md +288 -0
- package/docs/BACKGROUND-REPEAT-IMPLEMENTATION.md +127 -0
- package/docs/BACKGROUND-REPEAT-REFERENCE.md +127 -0
- package/docs/BACKGROUND-REPEAT-SPACE-ROUND.md +164 -0
- package/docs/css-properties-support.md +256 -0
- package/docs/src_modules_table.md +172 -0
- package/docs/text-overlap-fix.md +85 -0
- package/docs/text-overlap-investigation.md +27 -0
- package/eslint.config.js +36 -0
- package/glyph_measure.htm +1458 -0
- package/package.json +50 -0
- package/playground/browser-entry.ts +2 -0
- package/playground/exports/background-text-debug.pdf +0 -0
- package/playground/public/app.js +875 -0
- package/playground/public/assets/1.webp +0 -0
- package/playground/public/examples/accents-test.html +24 -0
- package/playground/public/examples/advanced-selectors-demo.html +118 -0
- package/playground/public/examples/background-advanced-showcase.html +82 -0
- package/playground/public/examples/background-clip-text.html +36 -0
- package/playground/public/examples/background-origin-showcase.html +137 -0
- package/playground/public/examples/background-position-showcase.html +83 -0
- package/playground/public/examples/background-repeat-showcase.html +83 -0
- package/playground/public/examples/background-repeat-space-round.html +348 -0
- package/playground/public/examples/background-size-showcase.html +82 -0
- package/playground/public/examples/background-text-debug.html +18 -0
- package/playground/public/examples/baseline-test.html +24 -0
- package/playground/public/examples/bold-showcase.html +150 -0
- package/playground/public/examples/bold-strike-example.html +12 -0
- package/playground/public/examples/border-collapse-test.html +23 -0
- package/playground/public/examples/centered-shadow-div.html +72 -0
- package/playground/public/examples/css-variables.html +50 -0
- package/playground/public/examples/debug-accents.html +11 -0
- package/playground/public/examples/debug-text-overlap.html +46 -0
- package/playground/public/examples/flex-gap-column.html +130 -0
- package/playground/public/examples/flex-gap-row.html +137 -0
- package/playground/public/examples/flex-padding-test.html +29 -0
- package/playground/public/examples/flexbox-text-test.html +193 -0
- package/playground/public/examples/fonts-demo.html +126 -0
- package/playground/public/examples/footer-example.html +4 -0
- package/playground/public/examples/gradient-text.html +54 -0
- package/playground/public/examples/grid-gap-demo.html +156 -0
- package/playground/public/examples/header-example.html +4 -0
- package/playground/public/examples/header-footer-example.html +27 -0
- package/playground/public/examples/image-showcase.html +33 -0
- package/playground/public/examples/justify-text.html +22 -0
- package/playground/public/examples/linear-gradient-example.html +38 -0
- package/playground/public/examples/lorem-span.html +14 -0
- package/playground/public/examples/margin-block-showcase.html +21 -0
- package/playground/public/examples/margin-inline-showcase.html +21 -0
- package/playground/public/examples/monthly-summary.html +95 -0
- package/playground/public/examples/multi-page-lorem.html +190 -0
- package/playground/public/examples/opacity-debug.html +39 -0
- package/playground/public/examples/opacity-example.html +70 -0
- package/playground/public/examples/png-image-example.html +13 -0
- package/playground/public/examples/red-rectangle.html +18 -0
- package/playground/public/examples/repro.html +24 -0
- package/playground/public/examples/rounded-borders-test.html +24 -0
- package/playground/public/examples/simple-list.html +89 -0
- package/playground/public/examples/simple-svg.html +37 -0
- package/playground/public/examples/simple-table.html +52 -0
- package/playground/public/examples/skew-div.html +138 -0
- package/playground/public/examples/skew-text.html +21 -0
- package/playground/public/examples/starter-report.css +51 -0
- package/playground/public/examples/starter-report.html +23 -0
- package/playground/public/examples/svg-aspect-ratio-showcase.html +116 -0
- package/playground/public/examples/svg-gradients-linear.html +28 -0
- package/playground/public/examples/svg-gradients-radial.html +29 -0
- package/playground/public/examples/svg-gradients-showcase.html +66 -0
- package/playground/public/examples/svg-image-path-test.html +43 -0
- package/playground/public/examples/svg-images-clipping.html +27 -0
- package/playground/public/examples/svg-path-gallery.html +118 -0
- package/playground/public/examples/svg-radial-transform-demo.html +78 -0
- package/playground/public/examples/svg-transform-stack.html +103 -0
- package/playground/public/examples/svg-transforms-demo.html +127 -0
- package/playground/public/examples/table-merge-test.html +34 -0
- package/playground/public/examples/text-decoration-showcase.html +138 -0
- package/playground/public/examples/text-indent-showcase.html +137 -0
- package/playground/public/examples/text-shadow-example.html +29 -0
- package/playground/public/examples/very-complex-css.html +293 -0
- package/playground/public/examples/webp-example.html +13 -0
- package/playground/public/examples/z-index-demo.html +93 -0
- package/playground/public/examples.json +240 -0
- package/playground/public/images/dice.png +0 -0
- package/playground/public/images/duck.jpg +0 -0
- package/playground/public/index.html +149 -0
- package/playground/public/mode.js +1 -0
- package/playground/public/styles.css +382 -0
- package/playground/public/tmp-h2-debug.html +33 -0
- package/playground/public/tmp-italic-debug.html +32 -0
- package/playground/public/vendor/codemirror/codemirror.min.css +1 -0
- package/playground/public/vendor/codemirror/codemirror.min.js +1 -0
- package/playground/public/vendor/codemirror/css.min.js +1 -0
- package/playground/public/vendor/codemirror/darcula.min.css +1 -0
- package/playground/public/vendor/codemirror/htmlmixed.min.js +1 -0
- package/playground/public/vendor/codemirror/javascript.min.js +1 -0
- package/playground/public/vendor/codemirror/xml.min.js +1 -0
- package/playground/public/vendor/pagyra-playground-browser.js +165966 -0
- package/playground/public/vendor/pagyra-playground-browser.js.map +7 -0
- package/playground/server.d.ts +1 -0
- package/playground/server.js +68 -0
- package/playground/server.ts +128 -0
- package/scripts/browser-build.ts +101 -0
- package/scripts/build-browser-bundle.ts +52 -0
- package/scripts/glyph-comparison/simulate.ts +744 -0
- package/scripts/playground-browser-server.ts +57 -0
- package/scripts/probe-roboto.ts +6 -0
- package/scripts/render-playground-example.ts +121 -0
- package/scripts/run-glyph-atlas-tuner-runner.mjs +113 -0
- package/scripts/run-glyph-atlas-tuner.ts +141 -0
- package/scripts/top-ts-files.ps1 +39 -0
- package/scripts/top-ts-files.sh +37 -0
- package/scripts/woff2_info.ps1 +132 -0
- package/src/browser-entry.ts +14 -0
- package/src/compression/adler32.ts +45 -0
- package/src/compression/brotli/brotli.ts +463 -0
- package/src/compression/brotli/index.ts +15 -0
- package/src/compression/brotli/transform.ts +184 -0
- package/src/compression/brotli/types.ts +58 -0
- package/src/compression/brotli/utils.ts +157 -0
- package/src/compression/brotli/vendor/bit_reader.js +124 -0
- package/src/compression/brotli/vendor/context.js +250 -0
- package/src/compression/brotli/vendor/decode.d.ts +2 -0
- package/src/compression/brotli/vendor/decode.js +938 -0
- package/src/compression/brotli/vendor/dictionary-data.js +9469 -0
- package/src/compression/brotli/vendor/dictionary.js +36 -0
- package/src/compression/brotli/vendor/huffman.js +123 -0
- package/src/compression/brotli/vendor/package.json +3 -0
- package/src/compression/brotli/vendor/prefix.js +60 -0
- package/src/compression/brotli/vendor/streams.js +31 -0
- package/src/compression/brotli/vendor/transform.js +247 -0
- package/src/compression/brotli/vendor-decode.d.ts +4 -0
- package/src/compression/brotli/woff2-glyf-transform.ts +623 -0
- package/src/compression/decompress.ts +16 -0
- package/src/compression/deflate.ts +295 -0
- package/src/compression/index.ts +4 -0
- package/src/compression/types.ts +26 -0
- package/src/compression/utils.ts +107 -0
- package/src/core.ts +18 -0
- package/src/css/apply-declarations.ts +86 -0
- package/src/css/background-types.ts +65 -0
- package/src/css/browser-defaults.ts +16 -0
- package/src/css/clip-path-types.ts +13 -0
- package/src/css/compute-style.ts +494 -0
- package/src/css/css-unit-resolver.ts +65 -0
- package/src/css/custom-properties.ts +215 -0
- package/src/css/enums.ts +127 -0
- package/src/css/font-face-parser.ts +233 -0
- package/src/css/font-weight.ts +65 -0
- package/src/css/inline-style-parser.ts +27 -0
- package/src/css/layout-property-resolver.ts +75 -0
- package/src/css/length.ts +141 -0
- package/src/css/line-height.ts +96 -0
- package/src/css/named-colors.ts +150 -0
- package/src/css/parsers/background-parser-extended.ts +111 -0
- package/src/css/parsers/background-parser.ts +456 -0
- package/src/css/parsers/border-block-parser.ts +26 -0
- package/src/css/parsers/border-inline-parser.ts +26 -0
- package/src/css/parsers/border-parser-extended.ts +256 -0
- package/src/css/parsers/border-parser.ts +175 -0
- package/src/css/parsers/box-shadow-parser.ts +106 -0
- package/src/css/parsers/clip-path-parser.ts +92 -0
- package/src/css/parsers/color-parser.ts +14 -0
- package/src/css/parsers/dimension-parser.ts +117 -0
- package/src/css/parsers/display-flex-parser.ts +59 -0
- package/src/css/parsers/flex-parser.ts +144 -0
- package/src/css/parsers/font-parser.ts +40 -0
- package/src/css/parsers/gradient-parser.ts +366 -0
- package/src/css/parsers/grid-parser-extended.ts +55 -0
- package/src/css/parsers/grid-parser.ts +218 -0
- package/src/css/parsers/length-parser.ts +95 -0
- package/src/css/parsers/list-style-parser.ts +39 -0
- package/src/css/parsers/margin-block-parser.ts +12 -0
- package/src/css/parsers/margin-inline-parser.ts +12 -0
- package/src/css/parsers/margin-parser.ts +30 -0
- package/src/css/parsers/opacity-parser.ts +32 -0
- package/src/css/parsers/overflow-wrap-parser.ts +38 -0
- package/src/css/parsers/padding-block-parser.ts +12 -0
- package/src/css/parsers/padding-inline-parser.ts +12 -0
- package/src/css/parsers/padding-parser.ts +30 -0
- package/src/css/parsers/position-parser.ts +75 -0
- package/src/css/parsers/register-parsers.ts +302 -0
- package/src/css/parsers/registry.ts +18 -0
- package/src/css/parsers/text-parser-extended.ts +144 -0
- package/src/css/parsers/text-parser.ts +25 -0
- package/src/css/parsers/text-shadow-parser.ts +94 -0
- package/src/css/properties/box-model.ts +82 -0
- package/src/css/properties/flexbox.ts +44 -0
- package/src/css/properties/gap.ts +14 -0
- package/src/css/properties/grid.ts +94 -0
- package/src/css/properties/layout.ts +59 -0
- package/src/css/properties/misc.ts +44 -0
- package/src/css/properties/typography.ts +71 -0
- package/src/css/properties/visual.ts +68 -0
- package/src/css/selectors/matcher.ts +219 -0
- package/src/css/selectors/parser.ts +163 -0
- package/src/css/selectors/simple-key.ts +31 -0
- package/src/css/selectors/specificity.ts +41 -0
- package/src/css/selectors/types.ts +31 -0
- package/src/css/shorthands/border-shorthand.ts +68 -0
- package/src/css/shorthands/box-shorthand.ts +33 -0
- package/src/css/style-inheritance.ts +50 -0
- package/src/css/style.ts +402 -0
- package/src/css/ua-defaults/base-defaults.ts +266 -0
- package/src/css/ua-defaults/browser-defaults.ts +134 -0
- package/src/css/ua-defaults/element-defaults.ts +374 -0
- package/src/css/ua-defaults/types.ts +43 -0
- package/src/css/unit-conversion.ts +24 -0
- package/src/css/utils.ts +108 -0
- package/src/css/viewport.ts +17 -0
- package/src/debug/audit.ts +20 -0
- package/src/debug/ids.ts +13 -0
- package/src/debug/log.js +28 -0
- package/src/debug/log.ts +52 -0
- package/src/debug/tree.ts +57 -0
- package/src/dom/node.ts +133 -0
- package/src/environment/browser-environment.ts +78 -0
- package/src/environment/environment.ts +35 -0
- package/src/environment/global.ts +13 -0
- package/src/environment/node-environment.browser.ts +28 -0
- package/src/environment/node-environment.ts +64 -0
- package/src/fonts/detector.ts +28 -0
- package/src/fonts/engines/ttf-engine.ts +28 -0
- package/src/fonts/engines/woff-engine.ts +38 -0
- package/src/fonts/engines/woff2-engine.ts +41 -0
- package/src/fonts/extractors/metrics-extractor.ts +362 -0
- package/src/fonts/font-registry-resolver.ts +132 -0
- package/src/fonts/index.ts +3 -0
- package/src/fonts/orchestrator.ts +92 -0
- package/src/fonts/parsers/base-parser.ts +23 -0
- package/src/fonts/types.ts +85 -0
- package/src/fonts/utils/ttf-reconstructor.ts +120 -0
- package/src/fonts/woff/decoder.ts +105 -0
- package/src/fonts/woff2/buffer.ts +106 -0
- package/src/fonts/woff2/decoder.ts +981 -0
- package/src/geometry/box.ts +48 -0
- package/src/geometry/matrix.ts +59 -0
- package/src/html/css/parse-css.ts +85 -0
- package/src/html/dom-converter.ts +433 -0
- package/src/html/image-converter.ts +200 -0
- package/src/html-to-pdf.ts +410 -0
- package/src/image/base-decoder.ts +149 -0
- package/src/image/image-service.ts +188 -0
- package/src/image/jpeg-decoder.ts +73 -0
- package/src/image/png-decoder.ts +550 -0
- package/src/image/types.ts +20 -0
- package/src/image/webp-decoder.ts +242 -0
- package/src/image/webp-huffman.ts +218 -0
- package/src/image/webp-riff-parser.ts +54 -0
- package/src/image/webp-vp8l-decoder.ts +199 -0
- package/src/index.ts +35 -0
- package/src/layout/context/float-context.ts +62 -0
- package/src/layout/context/layout-environment.ts +29 -0
- package/src/layout/debug.ts +18 -0
- package/src/layout/inline/bounding-box-calculator.ts +132 -0
- package/src/layout/inline/font-baseline-calculator.ts +76 -0
- package/src/layout/inline/inline-utils.ts +94 -0
- package/src/layout/inline/layout.ts +285 -0
- package/src/layout/inline/line_breaker.ts +109 -0
- package/src/layout/inline/measurement.ts +144 -0
- package/src/layout/inline/run-placer.ts +139 -0
- package/src/layout/inline/text-alignment.ts +70 -0
- package/src/layout/inline/tokenizer.ts +195 -0
- package/src/layout/inline/types.ts +76 -0
- package/src/layout/pipeline/context-factory.ts +16 -0
- package/src/layout/pipeline/default-engine.ts +24 -0
- package/src/layout/pipeline/engine.ts +59 -0
- package/src/layout/pipeline/layout-tree.ts +13 -0
- package/src/layout/pipeline/out-of-flow-manager.ts +73 -0
- package/src/layout/pipeline/strategy.ts +12 -0
- package/src/layout/pipeline/text-metrics-initializer.ts +13 -0
- package/src/layout/strategies/block.ts +236 -0
- package/src/layout/strategies/display-none.ts +14 -0
- package/src/layout/strategies/fallback.ts +15 -0
- package/src/layout/strategies/flex.ts +477 -0
- package/src/layout/strategies/fragmentation.ts +17 -0
- package/src/layout/strategies/grid.ts +247 -0
- package/src/layout/strategies/image.ts +342 -0
- package/src/layout/strategies/inline.ts +128 -0
- package/src/layout/strategies/table.ts +595 -0
- package/src/layout/table/cell_layout.ts +31 -0
- package/src/layout/table/diagnostics.ts +19 -0
- package/src/layout/text-run.ts +42 -0
- package/src/layout/utils/content-measurer.ts +117 -0
- package/src/layout/utils/display-utils.ts +24 -0
- package/src/layout/utils/floats.ts +98 -0
- package/src/layout/utils/gap-calculator.ts +167 -0
- package/src/layout/utils/inline-formatter.ts +31 -0
- package/src/layout/utils/inline-formatting.ts +9 -0
- package/src/layout/utils/margin.ts +140 -0
- package/src/layout/utils/node-math.ts +237 -0
- package/src/layout/utils/overflow.ts +14 -0
- package/src/layout/utils/sizing.ts +12 -0
- package/src/layout/utils/text-metrics.ts +361 -0
- package/src/logging/debug.ts +58 -0
- package/src/pdf/font/base14/widths-courier-bold.ts +159 -0
- package/src/pdf/font/base14/widths-courier.ts +159 -0
- package/src/pdf/font/base14/widths-helvetica-bold.ts +158 -0
- package/src/pdf/font/base14/widths-helvetica.ts +158 -0
- package/src/pdf/font/base14/widths-times-bold.ts +158 -0
- package/src/pdf/font/base14/widths-times-roman.ts +158 -0
- package/src/pdf/font/base14/widths-types.ts +25 -0
- package/src/pdf/font/base14-widths.ts +32 -0
- package/src/pdf/font/blur.ts +81 -0
- package/src/pdf/font/builtin-fonts.browser.ts +262 -0
- package/src/pdf/font/builtin-fonts.ts +126 -0
- package/src/pdf/font/composite-glyph-parser.ts +242 -0
- package/src/pdf/font/embedder.ts +395 -0
- package/src/pdf/font/font-config.ts +190 -0
- package/src/pdf/font/font-registry.ts +263 -0
- package/src/pdf/font/font-subset.ts +258 -0
- package/src/pdf/font/glyph-atlas-maxrects.ts +305 -0
- package/src/pdf/font/glyph-atlas-tuner.ts +98 -0
- package/src/pdf/font/glyph-atlas.ts +226 -0
- package/src/pdf/font/glyph-cache.ts +127 -0
- package/src/pdf/font/loca-reader.ts +109 -0
- package/src/pdf/font/managers/font-resource-manager.ts +73 -0
- package/src/pdf/font/managers/subset-resource-manager.ts +164 -0
- package/src/pdf/font/rasterizer.ts +270 -0
- package/src/pdf/font/resolvers/base-font-mapper.ts +77 -0
- package/src/pdf/font/resolvers/family-resolver.ts +33 -0
- package/src/pdf/font/resolvers/weight-style-applicator.ts +63 -0
- package/src/pdf/font/simple-glyph-parser.ts +289 -0
- package/src/pdf/font/to-unicode.ts +109 -0
- package/src/pdf/font/transformation-matrix.ts +136 -0
- package/src/pdf/font/ttf-cmap.ts +180 -0
- package/src/pdf/font/ttf-global-metrics.ts +58 -0
- package/src/pdf/font/ttf-glyf.ts +125 -0
- package/src/pdf/font/ttf-glyph-metrics.ts +43 -0
- package/src/pdf/font/ttf-lite.ts +269 -0
- package/src/pdf/font/ttf-table-parser.ts +132 -0
- package/src/pdf/font/ttf-table-provider.ts +61 -0
- package/src/pdf/font/widths.ts +79 -0
- package/src/pdf/font-subset/font-registry.ts +127 -0
- package/src/pdf/header-footer-layout.ts +153 -0
- package/src/pdf/header-footer-painter.ts +209 -0
- package/src/pdf/header-footer-renderer.ts +357 -0
- package/src/pdf/header-footer-tokens.ts +55 -0
- package/src/pdf/header-footer.ts +25 -0
- package/src/pdf/layout-tree-builder.ts +261 -0
- package/src/pdf/page-painter.ts +241 -0
- package/src/pdf/pagination.ts +155 -0
- package/src/pdf/primitives/pdf-builder.ts +378 -0
- package/src/pdf/primitives/pdf-bytes.ts +40 -0
- package/src/pdf/primitives/pdf-document.ts +108 -0
- package/src/pdf/primitives/pdf-reference-manager.ts +47 -0
- package/src/pdf/primitives/pdf-resource-registries.ts +255 -0
- package/src/pdf/primitives/pdf-serializers.ts +194 -0
- package/src/pdf/primitives/pdf-types.ts +73 -0
- package/src/pdf/render.ts +210 -0
- package/src/pdf/renderer/box-painter.ts +236 -0
- package/src/pdf/renderer/page-paint.ts +102 -0
- package/src/pdf/renderer/paint-box-shadows.ts +218 -0
- package/src/pdf/renderer/radius.ts +58 -0
- package/src/pdf/renderers/graphics-state-manager.ts +40 -0
- package/src/pdf/renderers/image-renderer.ts +127 -0
- package/src/pdf/renderers/radius-utils.ts +80 -0
- package/src/pdf/renderers/rectangle-renderer.ts +129 -0
- package/src/pdf/renderers/rounded-rect-path.ts +120 -0
- package/src/pdf/renderers/shape-renderer.ts +563 -0
- package/src/pdf/renderers/shape-utils.ts +194 -0
- package/src/pdf/renderers/text-decoration-renderer.ts +313 -0
- package/src/pdf/renderers/text-encoder.ts +41 -0
- package/src/pdf/renderers/text-font-resolver.ts +75 -0
- package/src/pdf/renderers/text-renderer-utils.ts +28 -0
- package/src/pdf/renderers/text-renderer.ts +391 -0
- package/src/pdf/renderers/text-shadow-renderer.ts +300 -0
- package/src/pdf/shading/gradient-service.ts +525 -0
- package/src/pdf/shading/index.ts +1 -0
- package/src/pdf/stacking/build-stacking-contexts.ts +93 -0
- package/src/pdf/stacking/resolve-paint-order.ts +157 -0
- package/src/pdf/stacking/types.ts +40 -0
- package/src/pdf/svg/aspect-ratio.ts +81 -0
- package/src/pdf/svg/coordinate-mapper.ts +81 -0
- package/src/pdf/svg/geometry-builder.ts +45 -0
- package/src/pdf/svg/render-svg.ts +296 -0
- package/src/pdf/svg/shape-renderer.ts +463 -0
- package/src/pdf/svg/style-computer.ts +246 -0
- package/src/pdf/transform-adapter.ts +26 -0
- package/src/pdf/types.ts +377 -0
- package/src/pdf/utils/background-layer-resolver.ts +439 -0
- package/src/pdf/utils/background-tiles.ts +192 -0
- package/src/pdf/utils/border-dashes.ts +109 -0
- package/src/pdf/utils/border-radius-utils.ts +86 -0
- package/src/pdf/utils/box-dimensions-utils.ts +47 -0
- package/src/pdf/utils/clip-path-resolver.ts +50 -0
- package/src/pdf/utils/clipping-path-builder.ts +190 -0
- package/src/pdf/utils/color-utils.ts +102 -0
- package/src/pdf/utils/coordinate-transformer.ts +30 -0
- package/src/pdf/utils/drop-shadow-raster.ts +233 -0
- package/src/pdf/utils/encoding.ts +98 -0
- package/src/pdf/utils/glyph-atlas-registrar.ts +13 -0
- package/src/pdf/utils/glyph-run-renderer.ts +129 -0
- package/src/pdf/utils/image-command-partitioner.ts +28 -0
- package/src/pdf/utils/image-matrix-builder.ts +31 -0
- package/src/pdf/utils/image-utils.ts +26 -0
- package/src/pdf/utils/list-utils.ts +194 -0
- package/src/pdf/utils/node-text-run-factory.ts +202 -0
- package/src/pdf/utils/page-resource-registrar.ts +46 -0
- package/src/pdf/utils/result-combiner.ts +102 -0
- package/src/pdf/utils/shadow-utils.ts +127 -0
- package/src/pdf/utils/text-alignment-resolver.ts +76 -0
- package/src/pdf/utils/text-decoration-utils.ts +64 -0
- package/src/pdf/utils/text-layout-adjuster.ts +185 -0
- package/src/pdf/utils/text-utils.ts +193 -0
- package/src/pdf/utils/transform-scope-manager.ts +69 -0
- package/src/render/offset.ts +170 -0
- package/src/shim/empty.ts +2 -0
- package/src/shim/fs-empty.ts +5 -0
- package/src/shim/url-empty.ts +7 -0
- package/src/shim/zlib-empty.ts +9 -0
- package/src/style/shorthands/index.ts +19 -0
- package/src/style/ua/defaults.ts +69 -0
- package/src/svg/index.ts +4 -0
- package/src/svg/parser-registry.ts +71 -0
- package/src/svg/parser.ts +486 -0
- package/src/svg/path-data.ts +515 -0
- package/src/svg/types.ts +194 -0
- package/src/text/line-breaker.ts +321 -0
- package/src/text/text-transform.ts +43 -0
- package/src/text/text.ts +33 -0
- package/src/transform/css-parser.ts +95 -0
- package/src/types/fonts.ts +62 -0
- package/src/types/public.ts +19 -0
- package/src/units/page-utils.ts +58 -0
- package/src/units/units.ts +50 -0
- package/src/utils/base64.ts +24 -0
- package/test-output.txt +79 -0
- package/tests/css/background-parser.spec.ts +14 -0
- package/tests/css/clip-path-parser.spec.ts +66 -0
- package/tests/environment/path-resolution.spec.ts +104 -0
- package/tests/helpers/ai-layout-diagnostics.ts +141 -0
- package/tests/helpers/render-utils.ts +52 -0
- package/tests/helpers/text-geometry.ts +56 -0
- package/tests/layout/custom-properties.test.ts +38 -0
- package/tests/layout/gap-calculator.spec.ts +196 -0
- package/tests/layout/inline-background-alignment.spec.ts +93 -0
- package/tests/layout/inline-fragments.spec.ts +26 -0
- package/tests/layout/run-placer-baseline.spec.ts +108 -0
- package/tests/pdf/alignments.spec.ts +26 -0
- package/tests/pdf/background-clip.spec.ts +57 -0
- package/tests/pdf/background-repeat-space-round.spec.ts +35 -0
- package/tests/pdf/background-repeat.spec.ts +137 -0
- package/tests/pdf/border-radius.spec.ts +151 -0
- package/tests/pdf/clip-path.spec.ts +92 -0
- package/tests/pdf/radial-gradient.spec.ts +50 -0
- package/tests/pdf/svg-stroke-dash.spec.ts +81 -0
- package/tests/pdf/text-transform-matrix.spec.ts +43 -0
- package/tsconfig.json +17 -0
- package/types/fonts.js +10 -0
- package/vitest.config.ts +9 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { Adler32 } from './adler32.js';
|
|
2
|
+
import type {
|
|
3
|
+
DeflateOptions,
|
|
4
|
+
InflateOptions,
|
|
5
|
+
DeflateResult,
|
|
6
|
+
CompressionStats,
|
|
7
|
+
} from './types.js';
|
|
8
|
+
import { CompressionMethod } from './types.js';
|
|
9
|
+
import {
|
|
10
|
+
writeUInt32BE,
|
|
11
|
+
readUInt32BE,
|
|
12
|
+
concatUint8Arrays,
|
|
13
|
+
toUint8Array,
|
|
14
|
+
} from './utils.js';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* DEFLATE compression/decompression module for WOFF 1.0
|
|
18
|
+
*
|
|
19
|
+
* WOFF 1.0 uses zlib-compressed data, which consists of:
|
|
20
|
+
* - 2-byte zlib header
|
|
21
|
+
* - DEFLATE-compressed data
|
|
22
|
+
* - 4-byte Adler-32 checksum
|
|
23
|
+
*/
|
|
24
|
+
export class WOFFDeflate {
|
|
25
|
+
private static readonly ZLIB_HEADER_CM_DEFLATE = 0x78; // CMF byte for DEFLATE
|
|
26
|
+
private static readonly DEFAULT_COMPRESSION_LEVEL = 6;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Compress data using DEFLATE algorithm (zlib format for WOFF)
|
|
30
|
+
*/
|
|
31
|
+
static async compress(
|
|
32
|
+
input: Uint8Array | ArrayBuffer,
|
|
33
|
+
options: DeflateOptions = {}
|
|
34
|
+
): Promise<DeflateResult> {
|
|
35
|
+
const data = toUint8Array(input);
|
|
36
|
+
const level = options.level ?? this.DEFAULT_COMPRESSION_LEVEL;
|
|
37
|
+
|
|
38
|
+
// Compress using available implementation
|
|
39
|
+
const compressed = await this.deflateCompress(data, level);
|
|
40
|
+
|
|
41
|
+
// Create zlib format: header + compressed data + checksum
|
|
42
|
+
const zlibData = this.wrapWithZlibFormat(compressed, data);
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
data: zlibData,
|
|
46
|
+
compressedSize: zlibData.length,
|
|
47
|
+
uncompressedSize: data.length,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Decompress DEFLATE data (zlib format)
|
|
53
|
+
*/
|
|
54
|
+
static async decompress(
|
|
55
|
+
input: Uint8Array | ArrayBuffer,
|
|
56
|
+
_options: InflateOptions = {}
|
|
57
|
+
): Promise<Uint8Array> {
|
|
58
|
+
const data = toUint8Array(input);
|
|
59
|
+
|
|
60
|
+
// Verify and strip zlib wrapper
|
|
61
|
+
const { compressed, checksum } = this.unwrapZlibFormat(data);
|
|
62
|
+
|
|
63
|
+
// Decompress
|
|
64
|
+
const decompressed = await this.deflateDecompress(compressed);
|
|
65
|
+
|
|
66
|
+
// Verify checksum
|
|
67
|
+
const calculatedChecksum = Adler32.calculate(decompressed);
|
|
68
|
+
if (calculatedChecksum !== checksum) {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`Adler-32 checksum mismatch: expected ${checksum}, got ${calculatedChecksum}`
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return decompressed;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Get compression statistics
|
|
79
|
+
*/
|
|
80
|
+
static getCompressionStats(
|
|
81
|
+
original: Uint8Array,
|
|
82
|
+
compressed: Uint8Array
|
|
83
|
+
): CompressionStats {
|
|
84
|
+
return {
|
|
85
|
+
originalSize: original.length,
|
|
86
|
+
compressedSize: compressed.length,
|
|
87
|
+
compressionRatio: compressed.length / original.length,
|
|
88
|
+
checksum: Adler32.calculate(original),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Wrap compressed data with zlib format header and checksum
|
|
94
|
+
*/
|
|
95
|
+
private static wrapWithZlibFormat(
|
|
96
|
+
compressed: Uint8Array,
|
|
97
|
+
original: Uint8Array
|
|
98
|
+
): Uint8Array {
|
|
99
|
+
const checksum = Adler32.calculate(original);
|
|
100
|
+
const result = new Uint8Array(compressed.length + 6);
|
|
101
|
+
|
|
102
|
+
// Zlib header (2 bytes)
|
|
103
|
+
// CMF (Compression Method and flags)
|
|
104
|
+
const cmf = 0x78; // DEFLATE with 32K window
|
|
105
|
+
|
|
106
|
+
// FLG (Flags)
|
|
107
|
+
let flg = 0x9c; // Default compression
|
|
108
|
+
|
|
109
|
+
// Ensure (CMF * 256 + FLG) is a multiple of 31
|
|
110
|
+
const fcheck = 31 - ((cmf * 256 + flg) % 31);
|
|
111
|
+
flg = (flg & 0xe0) | fcheck;
|
|
112
|
+
|
|
113
|
+
result[0] = cmf;
|
|
114
|
+
result[1] = flg;
|
|
115
|
+
|
|
116
|
+
// Compressed data
|
|
117
|
+
result.set(compressed, 2);
|
|
118
|
+
|
|
119
|
+
// Adler-32 checksum (4 bytes, big-endian)
|
|
120
|
+
writeUInt32BE(checksum, result, result.length - 4);
|
|
121
|
+
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Unwrap zlib format to get compressed data and checksum
|
|
127
|
+
*/
|
|
128
|
+
private static unwrapZlibFormat(data: Uint8Array): {
|
|
129
|
+
compressed: Uint8Array;
|
|
130
|
+
checksum: number;
|
|
131
|
+
uncompressedSize: number;
|
|
132
|
+
} {
|
|
133
|
+
if (data.length < 6) {
|
|
134
|
+
throw new Error('Invalid zlib data: too short');
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Verify zlib header
|
|
138
|
+
const cmf = data[0];
|
|
139
|
+
const flg = data[1];
|
|
140
|
+
|
|
141
|
+
// Check compression method
|
|
142
|
+
const cm = cmf & 0x0f;
|
|
143
|
+
if (cm !== CompressionMethod.DEFLATE) {
|
|
144
|
+
throw new Error(`Unsupported compression method: ${cm}`);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Verify header checksum
|
|
148
|
+
if ((cmf * 256 + flg) % 31 !== 0) {
|
|
149
|
+
throw new Error('Invalid zlib header checksum');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Extract compressed data (between header and checksum)
|
|
153
|
+
const compressed = data.slice(2, -4);
|
|
154
|
+
|
|
155
|
+
// Extract Adler-32 checksum
|
|
156
|
+
const checksum = readUInt32BE(data, data.length - 4);
|
|
157
|
+
|
|
158
|
+
return {
|
|
159
|
+
compressed,
|
|
160
|
+
checksum,
|
|
161
|
+
uncompressedSize: 0, // Unknown until decompressed
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Platform-specific DEFLATE compression
|
|
167
|
+
*/
|
|
168
|
+
private static async deflateCompress(
|
|
169
|
+
data: Uint8Array,
|
|
170
|
+
level: number
|
|
171
|
+
): Promise<Uint8Array> {
|
|
172
|
+
// Try browser CompressionStream API
|
|
173
|
+
if (typeof CompressionStream !== 'undefined') {
|
|
174
|
+
return this.browserDeflateCompress(data);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Fallback to Node zlib when available
|
|
178
|
+
if (typeof process !== 'undefined' && process.versions?.node) {
|
|
179
|
+
return this.nodeDeflateCompress(data, level);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
throw new Error('No DEFLATE implementation available');
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Platform-specific DEFLATE decompression
|
|
187
|
+
*/
|
|
188
|
+
private static async deflateDecompress(data: Uint8Array): Promise<Uint8Array> {
|
|
189
|
+
// Try browser DecompressionStream API
|
|
190
|
+
if (typeof DecompressionStream !== 'undefined') {
|
|
191
|
+
return this.browserDeflateDecompress(data);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Fallback to Node zlib when available
|
|
195
|
+
if (typeof process !== 'undefined' && process.versions?.node) {
|
|
196
|
+
return this.nodeDeflateDecompress(data);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
throw new Error('No DEFLATE implementation available');
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Node.js DEFLATE compression using zlib
|
|
204
|
+
*/
|
|
205
|
+
private static async nodeDeflateCompress(
|
|
206
|
+
data: Uint8Array,
|
|
207
|
+
level: number
|
|
208
|
+
): Promise<Uint8Array> {
|
|
209
|
+
const zlib = await import('zlib');
|
|
210
|
+
const { promisify } = await import('util');
|
|
211
|
+
const deflateRaw = promisify(zlib.deflateRaw);
|
|
212
|
+
|
|
213
|
+
const compressed = await deflateRaw(data, {
|
|
214
|
+
level,
|
|
215
|
+
windowBits: 15,
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
return new Uint8Array(compressed);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Node.js DEFLATE decompression using zlib
|
|
223
|
+
*/
|
|
224
|
+
private static async nodeDeflateDecompress(data: Uint8Array): Promise<Uint8Array> {
|
|
225
|
+
const zlib = await import('zlib');
|
|
226
|
+
const { promisify } = await import('util');
|
|
227
|
+
const inflateRaw = promisify(zlib.inflateRaw);
|
|
228
|
+
|
|
229
|
+
const decompressed = await inflateRaw(data, {
|
|
230
|
+
windowBits: 15,
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
return new Uint8Array(decompressed);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Browser DEFLATE compression using CompressionStream API
|
|
238
|
+
*/
|
|
239
|
+
private static async browserDeflateCompress(data: Uint8Array): Promise<Uint8Array> {
|
|
240
|
+
const stream = new CompressionStream('deflate-raw');
|
|
241
|
+
const writer = stream.writable.getWriter();
|
|
242
|
+
writer.write(data as BufferSource);
|
|
243
|
+
writer.close();
|
|
244
|
+
|
|
245
|
+
const chunks: Uint8Array[] = [];
|
|
246
|
+
const reader = stream.readable.getReader();
|
|
247
|
+
|
|
248
|
+
while (true) {
|
|
249
|
+
const { done, value } = await reader.read();
|
|
250
|
+
if (done) break;
|
|
251
|
+
chunks.push(value);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
return concatUint8Arrays(chunks);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Browser DEFLATE decompression using DecompressionStream API
|
|
259
|
+
*/
|
|
260
|
+
private static async browserDeflateDecompress(data: Uint8Array): Promise<Uint8Array> {
|
|
261
|
+
const stream = new DecompressionStream('deflate-raw');
|
|
262
|
+
const writer = stream.writable.getWriter();
|
|
263
|
+
writer.write(data as BufferSource);
|
|
264
|
+
writer.close();
|
|
265
|
+
|
|
266
|
+
const chunks: Uint8Array[] = [];
|
|
267
|
+
const reader = stream.readable.getReader();
|
|
268
|
+
|
|
269
|
+
while (true) {
|
|
270
|
+
const { done, value } = await reader.read();
|
|
271
|
+
if (done) break;
|
|
272
|
+
chunks.push(value);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return concatUint8Arrays(chunks);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Validate WOFF compressed data
|
|
280
|
+
*/
|
|
281
|
+
static validateCompressedData(data: Uint8Array): boolean {
|
|
282
|
+
try {
|
|
283
|
+
const { compressed, checksum } = this.unwrapZlibFormat(data);
|
|
284
|
+
return compressed.length > 0 && checksum > 0;
|
|
285
|
+
} catch {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Export convenience functions
|
|
292
|
+
export const compress = WOFFDeflate.compress.bind(WOFFDeflate);
|
|
293
|
+
export const decompress = WOFFDeflate.decompress.bind(WOFFDeflate);
|
|
294
|
+
export const getCompressionStats = WOFFDeflate.getCompressionStats.bind(WOFFDeflate);
|
|
295
|
+
export const validateCompressedData = WOFFDeflate.validateCompressedData.bind(WOFFDeflate);
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface DeflateOptions {
|
|
2
|
+
level?: number; // Compression level 0-9
|
|
3
|
+
windowBits?: number; // Size of compression window
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export interface InflateOptions {
|
|
7
|
+
windowBits?: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface DeflateResult {
|
|
11
|
+
data: Uint8Array;
|
|
12
|
+
compressedSize: number;
|
|
13
|
+
uncompressedSize: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface CompressionStats {
|
|
17
|
+
originalSize: number;
|
|
18
|
+
compressedSize: number;
|
|
19
|
+
compressionRatio: number;
|
|
20
|
+
checksum: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export enum CompressionMethod {
|
|
24
|
+
NONE = 0,
|
|
25
|
+
DEFLATE = 8,
|
|
26
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for DEFLATE operations
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Read a 16-bit big-endian integer from buffer
|
|
7
|
+
*/
|
|
8
|
+
export function readUInt16BE(buffer: Uint8Array, offset: number): number {
|
|
9
|
+
return (buffer[offset] << 8) | buffer[offset + 1];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Write a 32-bit big-endian integer to buffer.
|
|
14
|
+
* No bounds checking is performed for performance reasons.
|
|
15
|
+
*/
|
|
16
|
+
export function writeUInt32BE(value: number, buffer: Uint8Array, offset: number): void {
|
|
17
|
+
buffer[offset] = (value >>> 24) & 0xff;
|
|
18
|
+
buffer[offset + 1] = (value >>> 16) & 0xff;
|
|
19
|
+
buffer[offset + 2] = (value >>> 8) & 0xff;
|
|
20
|
+
buffer[offset + 3] = value & 0xff;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Read a 32-bit big-endian integer from buffer.
|
|
25
|
+
*/
|
|
26
|
+
export function readUInt32BE(buffer: Uint8Array, offset: number): number {
|
|
27
|
+
return (
|
|
28
|
+
((buffer[offset] << 24) |
|
|
29
|
+
(buffer[offset + 1] << 16) |
|
|
30
|
+
(buffer[offset + 2] << 8) |
|
|
31
|
+
buffer[offset + 3]) >>> 0 // '>>> 0' ensures result is treated as unsigned
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Write a 16-bit big-endian integer to buffer.
|
|
37
|
+
*/
|
|
38
|
+
export function writeUInt16BE(value: number, buffer: Uint8Array, offset: number): void {
|
|
39
|
+
buffer[offset] = (value >>> 8) & 0xff;
|
|
40
|
+
buffer[offset + 1] = value & 0xff;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Concatenate multiple Uint8Arrays.
|
|
45
|
+
*/
|
|
46
|
+
export function concatUint8Arrays(arrays: Uint8Array[]): Uint8Array {
|
|
47
|
+
// Optimization: Check for 0 or 1 array to avoid allocation
|
|
48
|
+
if (arrays.length === 0) return new Uint8Array(0);
|
|
49
|
+
if (arrays.length === 1) return arrays[0];
|
|
50
|
+
|
|
51
|
+
const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);
|
|
52
|
+
const result = new Uint8Array(totalLength);
|
|
53
|
+
let offset = 0;
|
|
54
|
+
|
|
55
|
+
for (const arr of arrays) {
|
|
56
|
+
result.set(arr, offset);
|
|
57
|
+
offset += arr.length;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Convert ArrayBuffer, DataView, or TypedArray to Uint8Array.
|
|
65
|
+
* This ensures we have a raw byte view regardless of input type.
|
|
66
|
+
*/
|
|
67
|
+
export function toUint8Array(data: ArrayBuffer | ArrayBufferView): Uint8Array {
|
|
68
|
+
if (data instanceof Uint8Array) {
|
|
69
|
+
return data;
|
|
70
|
+
}
|
|
71
|
+
if (ArrayBuffer.isView(data)) {
|
|
72
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
73
|
+
}
|
|
74
|
+
return new Uint8Array(data);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Reads a UBASE128-encoded (Variable Length) number.
|
|
79
|
+
* Returns the number and the number of bytes read.
|
|
80
|
+
*
|
|
81
|
+
* Note: This implementation assumes "Big Endian" variable length
|
|
82
|
+
* (most significant group first), common in some compression formats.
|
|
83
|
+
*/
|
|
84
|
+
export function readUBASE128(data: Uint8Array, offset: number): [number, number] {
|
|
85
|
+
let result = 0;
|
|
86
|
+
let bytesRead = 0;
|
|
87
|
+
|
|
88
|
+
// Limit to 5 bytes (35 bits) to prevent infinite loops on bad data
|
|
89
|
+
// and to stay within JS Safe Integer range.
|
|
90
|
+
for (let i = 0; i < 5; i++) {
|
|
91
|
+
const byte = data[offset + i];
|
|
92
|
+
|
|
93
|
+
// Use arithmetic (* 128) instead of bitwise (<< 7).
|
|
94
|
+
// Bitwise operators in JS work on 32-bit integers.
|
|
95
|
+
// 5 bytes can exceed 32 bits (up to 35 bits), which would overflow using '<<'.
|
|
96
|
+
result = (result * 128) + (byte & 0x7f);
|
|
97
|
+
|
|
98
|
+
bytesRead++;
|
|
99
|
+
|
|
100
|
+
// If the high bit is NOT set, this is the last byte
|
|
101
|
+
if ((byte & 0x80) === 0) {
|
|
102
|
+
return [result, bytesRead];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
throw new Error("Invalid UBASE128 sequence (too long or incomplete)");
|
|
107
|
+
}
|
package/src/core.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { LayoutNode } from "./dom/node.js";
|
|
2
|
+
export type { NodeVisitor } from "./dom/node.js";
|
|
3
|
+
|
|
4
|
+
export { ComputedStyle } from "./css/style.js";
|
|
5
|
+
export type { StyleProperties, FlexDirection, GridAutoFlow, AlignSelfValue, TrackDefinition } from "./css/style.js";
|
|
6
|
+
|
|
7
|
+
export * from "./css/enums.js";
|
|
8
|
+
|
|
9
|
+
export type { Viewport, ContainingBlock } from "./geometry/box.js";
|
|
10
|
+
export { Box } from "./geometry/box.js";
|
|
11
|
+
|
|
12
|
+
export { LayoutEngine } from "./layout/pipeline/engine.js";
|
|
13
|
+
export { createDefaultLayoutEngine } from "./layout/pipeline/default-engine.js";
|
|
14
|
+
export { layoutTree } from "./layout/pipeline/layout-tree.js";
|
|
15
|
+
export { renderPdf } from "./pdf/render.js";
|
|
16
|
+
export { buildRenderTree } from "./pdf/layout-tree-builder.js";
|
|
17
|
+
export type { RenderPdfOptions } from "./pdf/render.js";
|
|
18
|
+
export type { LayoutTree as PdfLayoutTree } from "./pdf/types.js";
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// src/css/apply-declarations.ts
|
|
2
|
+
|
|
3
|
+
import { getPropertyParser, type PropertyParser } from "./parsers/registry.js";
|
|
4
|
+
import { registerAllPropertyParsers } from "./parsers/register-parsers.js";
|
|
5
|
+
import { type StyleAccumulator } from "./style.js";
|
|
6
|
+
import { type UnitParsers } from "../units/units.js";
|
|
7
|
+
|
|
8
|
+
export { setViewportSize } from "./viewport.js";
|
|
9
|
+
|
|
10
|
+
// Initialize the property parsers registry
|
|
11
|
+
registerAllPropertyParsers();
|
|
12
|
+
|
|
13
|
+
// Define shorthand properties that should be applied before longhands
|
|
14
|
+
const SHORTHAND_PROPERTIES = new Set([
|
|
15
|
+
"border",
|
|
16
|
+
"border-color",
|
|
17
|
+
"border-style",
|
|
18
|
+
"border-width",
|
|
19
|
+
"border-radius",
|
|
20
|
+
"margin",
|
|
21
|
+
"padding",
|
|
22
|
+
"background",
|
|
23
|
+
"font",
|
|
24
|
+
"text-decoration",
|
|
25
|
+
"flex",
|
|
26
|
+
"gap"
|
|
27
|
+
]);
|
|
28
|
+
|
|
29
|
+
// Cache for frequently used parsers to reduce Map lookups
|
|
30
|
+
const parserCache = new Map<string, PropertyParser>();
|
|
31
|
+
|
|
32
|
+
function getCachedParser(property: string) {
|
|
33
|
+
if (parserCache.has(property)) {
|
|
34
|
+
return parserCache.get(property);
|
|
35
|
+
}
|
|
36
|
+
const parser = getPropertyParser(property);
|
|
37
|
+
if (parser) {
|
|
38
|
+
parserCache.set(property, parser);
|
|
39
|
+
}
|
|
40
|
+
return parser;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function applyDeclarationsToStyle(
|
|
44
|
+
declarations: Record<string, string>,
|
|
45
|
+
target: StyleAccumulator,
|
|
46
|
+
units: UnitParsers,
|
|
47
|
+
inheritedFontWeight?: number
|
|
48
|
+
): void {
|
|
49
|
+
// Pre-normalize declarations (lowercase keys and trim values)
|
|
50
|
+
const normalizedDeclarations: Record<string, string> = {};
|
|
51
|
+
for (const [property, value] of Object.entries(declarations)) {
|
|
52
|
+
normalizedDeclarations[property.toLowerCase()] = value.trim();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Separate shorthands and longhands
|
|
56
|
+
const shorthands: Array<[string, string]> = [];
|
|
57
|
+
const longhands: Array<[string, string]> = [];
|
|
58
|
+
|
|
59
|
+
for (const [property, value] of Object.entries(normalizedDeclarations)) {
|
|
60
|
+
if (SHORTHAND_PROPERTIES.has(property)) {
|
|
61
|
+
shorthands.push([property, value]);
|
|
62
|
+
} else {
|
|
63
|
+
longhands.push([property, value]);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Pass 1: Apply shorthands first
|
|
68
|
+
for (const [property, value] of shorthands) {
|
|
69
|
+
const parser = getCachedParser(property);
|
|
70
|
+
if (parser) {
|
|
71
|
+
parser(value, target, units, inheritedFontWeight);
|
|
72
|
+
} else if (!property.startsWith('--')) {
|
|
73
|
+
console.warn(`Unsupported CSS property: ${property}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Pass 2: Apply longhands (they can override shorthands)
|
|
78
|
+
for (const [property, value] of longhands) {
|
|
79
|
+
const parser = getCachedParser(property);
|
|
80
|
+
if (parser) {
|
|
81
|
+
parser(value, target, units, inheritedFontWeight);
|
|
82
|
+
} else if (!property.startsWith('--')) {
|
|
83
|
+
console.warn(`Unsupported CSS property: ${property}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { ImageInfo } from "../image/types.js";
|
|
2
|
+
|
|
3
|
+
export interface ColorBackgroundLayer {
|
|
4
|
+
kind: "color";
|
|
5
|
+
color: string; // ex: #fff, rgba(...)
|
|
6
|
+
clip?: BackgroundClip;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface ImageBackgroundLayer {
|
|
10
|
+
kind: "image";
|
|
11
|
+
url: string;
|
|
12
|
+
repeat?: BackgroundRepeat;
|
|
13
|
+
position?: BackgroundPosition;
|
|
14
|
+
size?: BackgroundSize;
|
|
15
|
+
origin?: BackgroundOrigin;
|
|
16
|
+
clip?: BackgroundClip;
|
|
17
|
+
attachment?: "scroll" | "fixed" | "local";
|
|
18
|
+
originalUrl?: string;
|
|
19
|
+
resolvedUrl?: string;
|
|
20
|
+
imageInfo?: ImageInfo;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface GradientBackgroundLayer {
|
|
24
|
+
kind: "gradient";
|
|
25
|
+
gradient: Gradient;
|
|
26
|
+
repeat?: BackgroundRepeat;
|
|
27
|
+
position?: BackgroundPosition;
|
|
28
|
+
size?: BackgroundSize;
|
|
29
|
+
origin?: BackgroundOrigin;
|
|
30
|
+
clip?: BackgroundClip;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type BackgroundLayer = ColorBackgroundLayer | ImageBackgroundLayer | GradientBackgroundLayer;
|
|
34
|
+
|
|
35
|
+
export type BackgroundRepeat = "repeat" | "repeat-x" | "repeat-y" | "no-repeat" | "space" | "round";
|
|
36
|
+
export type BackgroundOrigin = "padding-box" | "border-box" | "content-box";
|
|
37
|
+
export type BackgroundClip = "border-box" | "padding-box" | "content-box" | "text";
|
|
38
|
+
|
|
39
|
+
export type BackgroundPosition = { x: string; y: string }; // "left"/"center"/"right"/<length|%>
|
|
40
|
+
export type BackgroundSize = "auto" | "cover" | "contain" | { width: string; height: string };
|
|
41
|
+
|
|
42
|
+
export type Gradient = LinearGradient | RadialGradient | ConicGradient;
|
|
43
|
+
|
|
44
|
+
export interface LinearGradient {
|
|
45
|
+
type: "linear";
|
|
46
|
+
angleOrTo?: string; // "to right", "45deg"
|
|
47
|
+
stops: { color: string; pos?: number }[];
|
|
48
|
+
renderOffset?: { x: number; y: number };
|
|
49
|
+
renderScale?: { x: number; y: number };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface RadialGradient {
|
|
53
|
+
type: "radial";
|
|
54
|
+
shape?: "circle" | "ellipse";
|
|
55
|
+
sizeHint?: "closest-side" | "farthest-side" | "closest-corner" | "farthest-corner";
|
|
56
|
+
at?: { x: string; y: string };
|
|
57
|
+
stops: { color: string; pos?: number }[];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface ConicGradient {
|
|
61
|
+
type: "conic";
|
|
62
|
+
from?: string; // "0deg", "90deg"
|
|
63
|
+
at?: { x: string; y: string };
|
|
64
|
+
stops: { color: string; pos?: number }[];
|
|
65
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-like User Agent (UA) defaults for PDF conversion.
|
|
3
|
+
* SRP: this file now acts as a façade, re-exporting focused UA defaults modules.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export type { ElementDefaults } from "./ua-defaults/types.js";
|
|
7
|
+
export {
|
|
8
|
+
TypographyDefaults,
|
|
9
|
+
BoxModelDefaults,
|
|
10
|
+
LayoutDefaults,
|
|
11
|
+
TextLayoutDefaults,
|
|
12
|
+
createBaseDefaultsObject,
|
|
13
|
+
} from "./ua-defaults/base-defaults.js";
|
|
14
|
+
export { ElementSpecificDefaults } from "./ua-defaults/element-defaults.js";
|
|
15
|
+
export { BrowserDefaults } from "./ua-defaults/browser-defaults.js";
|
|
16
|
+
export * from "./unit-conversion.js";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type ClipPathReferenceBox = "border-box" | "padding-box" | "content-box";
|
|
2
|
+
|
|
3
|
+
export type ClipPathLength =
|
|
4
|
+
| { unit: "px"; value: number }
|
|
5
|
+
| { unit: "percent"; value: number };
|
|
6
|
+
|
|
7
|
+
export interface ClipPathPolygon {
|
|
8
|
+
type: "polygon";
|
|
9
|
+
points: Array<{ x: ClipPathLength; y: ClipPathLength }>;
|
|
10
|
+
referenceBox?: ClipPathReferenceBox;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type ClipPath = ClipPathPolygon;
|