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.
Files changed (540) hide show
  1. package/.eslintrc.json +30 -0
  2. package/CHANGELOG.md +13 -0
  3. package/README.md +275 -0
  4. package/UA_Styles_Chromium.md +93 -0
  5. package/_ext/woff2_conversion/brotli-decode.d.ts +139 -0
  6. package/_ext/woff2_conversion/brotli-encode.d.ts +129 -0
  7. package/_ext/woff2_conversion/brotli-port.d.ts +12 -0
  8. package/_ext/woff2_conversion/brotli-shared-dictionary.d.ts +25 -0
  9. package/_ext/woff2_conversion/brotli-types.d.ts +15 -0
  10. package/_ext/woff2_conversion/woff2-common.d.ts +37 -0
  11. package/_ext/woff2_conversion/woff2-decode.d.ts +32 -0
  12. package/_ext/woff2_conversion/woff2-encode.d.ts +31 -0
  13. package/_ext/woff2_conversion/woff2-output.d.ts +39 -0
  14. package/_ext/woff2_original_cpp/brotli/brotli.c +1559 -0
  15. package/_ext/woff2_original_cpp/brotli/brotli.md +116 -0
  16. package/_ext/woff2_original_cpp/brotli/decode.h +409 -0
  17. package/_ext/woff2_original_cpp/brotli/encode.h +505 -0
  18. package/_ext/woff2_original_cpp/brotli/port.h +302 -0
  19. package/_ext/woff2_original_cpp/brotli/shared_dictionary.h +100 -0
  20. package/_ext/woff2_original_cpp/brotli/types.h +83 -0
  21. package/_ext/woff2_original_cpp/cmake/FindBrotliDec.cmake +35 -0
  22. package/_ext/woff2_original_cpp/cmake/FindBrotliEnc.cmake +35 -0
  23. package/_ext/woff2_original_cpp/include/woff2/decode.h +36 -0
  24. package/_ext/woff2_original_cpp/include/woff2/encode.h +43 -0
  25. package/_ext/woff2_original_cpp/include/woff2/output.h +86 -0
  26. package/_ext/woff2_original_cpp/src/buffer.h +164 -0
  27. package/_ext/woff2_original_cpp/src/convert_woff2ttf_fuzzer.cc +13 -0
  28. package/_ext/woff2_original_cpp/src/convert_woff2ttf_fuzzer_new_entry.cc +12 -0
  29. package/_ext/woff2_original_cpp/src/file.h +30 -0
  30. package/_ext/woff2_original_cpp/src/font.cc +400 -0
  31. package/_ext/woff2_original_cpp/src/font.h +105 -0
  32. package/_ext/woff2_original_cpp/src/glyph.cc +383 -0
  33. package/_ext/woff2_original_cpp/src/glyph.h +71 -0
  34. package/_ext/woff2_original_cpp/src/normalize.cc +314 -0
  35. package/_ext/woff2_original_cpp/src/normalize.h +39 -0
  36. package/_ext/woff2_original_cpp/src/port.h +66 -0
  37. package/_ext/woff2_original_cpp/src/round.h +27 -0
  38. package/_ext/woff2_original_cpp/src/store_bytes.h +55 -0
  39. package/_ext/woff2_original_cpp/src/table_tags.cc +82 -0
  40. package/_ext/woff2_original_cpp/src/table_tags.h +30 -0
  41. package/_ext/woff2_original_cpp/src/transform.cc +430 -0
  42. package/_ext/woff2_original_cpp/src/transform.h +26 -0
  43. package/_ext/woff2_original_cpp/src/variable_length.cc +129 -0
  44. package/_ext/woff2_original_cpp/src/variable_length.h +30 -0
  45. package/_ext/woff2_original_cpp/src/woff2_common.cc +50 -0
  46. package/_ext/woff2_original_cpp/src/woff2_common.h +64 -0
  47. package/_ext/woff2_original_cpp/src/woff2_compress.cc +43 -0
  48. package/_ext/woff2_original_cpp/src/woff2_dec.cc +1398 -0
  49. package/_ext/woff2_original_cpp/src/woff2_decompress.cc +41 -0
  50. package/_ext/woff2_original_cpp/src/woff2_enc.cc +458 -0
  51. package/_ext/woff2_original_cpp/src/woff2_info.cc +142 -0
  52. package/_ext/woff2_original_cpp/src/woff2_out.cc +63 -0
  53. package/assets/fonts/ttf/arimo/Arimo-Bold.ttf +0 -0
  54. package/assets/fonts/ttf/arimo/Arimo-BoldItalic.ttf +0 -0
  55. package/assets/fonts/ttf/arimo/Arimo-Italic.ttf +0 -0
  56. package/assets/fonts/ttf/arimo/Arimo-Regular.ttf +0 -0
  57. package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Black.ttf +0 -0
  58. package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Bold.ttf +0 -0
  59. package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Regular.ttf +0 -0
  60. package/assets/fonts/ttf/dejavu/DejaVuSans.ttf +0 -0
  61. package/assets/fonts/ttf/firecode/FiraCode-Bold.ttf +0 -0
  62. package/assets/fonts/ttf/firecode/FiraCode-Light.ttf +0 -0
  63. package/assets/fonts/ttf/firecode/FiraCode-Medium.ttf +0 -0
  64. package/assets/fonts/ttf/firecode/FiraCode-Regular.ttf +0 -0
  65. package/assets/fonts/ttf/firecode/FiraCode-SemiBold.ttf +0 -0
  66. package/assets/fonts/ttf/notoemoji/NotoEmoji-Bold.ttf +0 -0
  67. package/assets/fonts/ttf/notoemoji/NotoEmoji-Light.ttf +0 -0
  68. package/assets/fonts/ttf/notoemoji/NotoEmoji-Medium.ttf +0 -0
  69. package/assets/fonts/ttf/notoemoji/NotoEmoji-Regular.ttf +0 -0
  70. package/assets/fonts/ttf/notoemoji/NotoEmoji-SemiBold.ttf +0 -0
  71. package/assets/fonts/ttf/notosans/NotoSans-Regular.ttf +0 -0
  72. package/assets/fonts/ttf/roboto/Roboto-Bold.ttf +0 -0
  73. package/assets/fonts/ttf/roboto/Roboto-BoldItalic.ttf +0 -0
  74. package/assets/fonts/ttf/roboto/Roboto-Italic.ttf +0 -0
  75. package/assets/fonts/ttf/roboto/Roboto-Regular.ttf +0 -0
  76. package/assets/fonts/ttf/stixtwomath/STIXTwoMath-Regular.ttf +0 -0
  77. package/assets/fonts/ttf/tinos/Tinos-Bold.ttf +0 -0
  78. package/assets/fonts/ttf/tinos/Tinos-BoldItalic.ttf +0 -0
  79. package/assets/fonts/ttf/tinos/Tinos-Italic.ttf +0 -0
  80. package/assets/fonts/ttf/tinos/Tinos-Regular.ttf +0 -0
  81. package/assets/fonts/woff/lato/lato-latin-400-italic.woff +0 -0
  82. package/assets/fonts/woff/lato/lato-latin-400-normal.woff +0 -0
  83. package/assets/fonts/woff/lato/lato-latin-700-italic.woff +0 -0
  84. package/assets/fonts/woff/lato/lato-latin-700-normal.woff +0 -0
  85. package/assets/fonts/woff2/caveat/Caveat-Bold.woff2 +0 -0
  86. package/assets/fonts/woff2/caveat/Caveat-Regular.woff2 +0 -0
  87. package/assets/fonts/woff2/lato/lato-latin-400-italic.woff2 +0 -0
  88. package/assets/fonts/woff2/lato/lato-latin-400-normal.woff2 +0 -0
  89. package/assets/fonts/woff2/lato/lato-latin-700-italic.woff2 +0 -0
  90. package/assets/fonts/woff2/lato/lato-latin-700-normal.woff2 +0 -0
  91. package/docs/AGENTS.md +288 -0
  92. package/docs/BACKGROUND-REPEAT-IMPLEMENTATION.md +127 -0
  93. package/docs/BACKGROUND-REPEAT-REFERENCE.md +127 -0
  94. package/docs/BACKGROUND-REPEAT-SPACE-ROUND.md +164 -0
  95. package/docs/css-properties-support.md +256 -0
  96. package/docs/src_modules_table.md +172 -0
  97. package/docs/text-overlap-fix.md +85 -0
  98. package/docs/text-overlap-investigation.md +27 -0
  99. package/eslint.config.js +36 -0
  100. package/glyph_measure.htm +1458 -0
  101. package/package.json +50 -0
  102. package/playground/browser-entry.ts +2 -0
  103. package/playground/exports/background-text-debug.pdf +0 -0
  104. package/playground/public/app.js +875 -0
  105. package/playground/public/assets/1.webp +0 -0
  106. package/playground/public/examples/accents-test.html +24 -0
  107. package/playground/public/examples/advanced-selectors-demo.html +118 -0
  108. package/playground/public/examples/background-advanced-showcase.html +82 -0
  109. package/playground/public/examples/background-clip-text.html +36 -0
  110. package/playground/public/examples/background-origin-showcase.html +137 -0
  111. package/playground/public/examples/background-position-showcase.html +83 -0
  112. package/playground/public/examples/background-repeat-showcase.html +83 -0
  113. package/playground/public/examples/background-repeat-space-round.html +348 -0
  114. package/playground/public/examples/background-size-showcase.html +82 -0
  115. package/playground/public/examples/background-text-debug.html +18 -0
  116. package/playground/public/examples/baseline-test.html +24 -0
  117. package/playground/public/examples/bold-showcase.html +150 -0
  118. package/playground/public/examples/bold-strike-example.html +12 -0
  119. package/playground/public/examples/border-collapse-test.html +23 -0
  120. package/playground/public/examples/centered-shadow-div.html +72 -0
  121. package/playground/public/examples/css-variables.html +50 -0
  122. package/playground/public/examples/debug-accents.html +11 -0
  123. package/playground/public/examples/debug-text-overlap.html +46 -0
  124. package/playground/public/examples/flex-gap-column.html +130 -0
  125. package/playground/public/examples/flex-gap-row.html +137 -0
  126. package/playground/public/examples/flex-padding-test.html +29 -0
  127. package/playground/public/examples/flexbox-text-test.html +193 -0
  128. package/playground/public/examples/fonts-demo.html +126 -0
  129. package/playground/public/examples/footer-example.html +4 -0
  130. package/playground/public/examples/gradient-text.html +54 -0
  131. package/playground/public/examples/grid-gap-demo.html +156 -0
  132. package/playground/public/examples/header-example.html +4 -0
  133. package/playground/public/examples/header-footer-example.html +27 -0
  134. package/playground/public/examples/image-showcase.html +33 -0
  135. package/playground/public/examples/justify-text.html +22 -0
  136. package/playground/public/examples/linear-gradient-example.html +38 -0
  137. package/playground/public/examples/lorem-span.html +14 -0
  138. package/playground/public/examples/margin-block-showcase.html +21 -0
  139. package/playground/public/examples/margin-inline-showcase.html +21 -0
  140. package/playground/public/examples/monthly-summary.html +95 -0
  141. package/playground/public/examples/multi-page-lorem.html +190 -0
  142. package/playground/public/examples/opacity-debug.html +39 -0
  143. package/playground/public/examples/opacity-example.html +70 -0
  144. package/playground/public/examples/png-image-example.html +13 -0
  145. package/playground/public/examples/red-rectangle.html +18 -0
  146. package/playground/public/examples/repro.html +24 -0
  147. package/playground/public/examples/rounded-borders-test.html +24 -0
  148. package/playground/public/examples/simple-list.html +89 -0
  149. package/playground/public/examples/simple-svg.html +37 -0
  150. package/playground/public/examples/simple-table.html +52 -0
  151. package/playground/public/examples/skew-div.html +138 -0
  152. package/playground/public/examples/skew-text.html +21 -0
  153. package/playground/public/examples/starter-report.css +51 -0
  154. package/playground/public/examples/starter-report.html +23 -0
  155. package/playground/public/examples/svg-aspect-ratio-showcase.html +116 -0
  156. package/playground/public/examples/svg-gradients-linear.html +28 -0
  157. package/playground/public/examples/svg-gradients-radial.html +29 -0
  158. package/playground/public/examples/svg-gradients-showcase.html +66 -0
  159. package/playground/public/examples/svg-image-path-test.html +43 -0
  160. package/playground/public/examples/svg-images-clipping.html +27 -0
  161. package/playground/public/examples/svg-path-gallery.html +118 -0
  162. package/playground/public/examples/svg-radial-transform-demo.html +78 -0
  163. package/playground/public/examples/svg-transform-stack.html +103 -0
  164. package/playground/public/examples/svg-transforms-demo.html +127 -0
  165. package/playground/public/examples/table-merge-test.html +34 -0
  166. package/playground/public/examples/text-decoration-showcase.html +138 -0
  167. package/playground/public/examples/text-indent-showcase.html +137 -0
  168. package/playground/public/examples/text-shadow-example.html +29 -0
  169. package/playground/public/examples/very-complex-css.html +293 -0
  170. package/playground/public/examples/webp-example.html +13 -0
  171. package/playground/public/examples/z-index-demo.html +93 -0
  172. package/playground/public/examples.json +240 -0
  173. package/playground/public/images/dice.png +0 -0
  174. package/playground/public/images/duck.jpg +0 -0
  175. package/playground/public/index.html +149 -0
  176. package/playground/public/mode.js +1 -0
  177. package/playground/public/styles.css +382 -0
  178. package/playground/public/tmp-h2-debug.html +33 -0
  179. package/playground/public/tmp-italic-debug.html +32 -0
  180. package/playground/public/vendor/codemirror/codemirror.min.css +1 -0
  181. package/playground/public/vendor/codemirror/codemirror.min.js +1 -0
  182. package/playground/public/vendor/codemirror/css.min.js +1 -0
  183. package/playground/public/vendor/codemirror/darcula.min.css +1 -0
  184. package/playground/public/vendor/codemirror/htmlmixed.min.js +1 -0
  185. package/playground/public/vendor/codemirror/javascript.min.js +1 -0
  186. package/playground/public/vendor/codemirror/xml.min.js +1 -0
  187. package/playground/public/vendor/pagyra-playground-browser.js +165966 -0
  188. package/playground/public/vendor/pagyra-playground-browser.js.map +7 -0
  189. package/playground/server.d.ts +1 -0
  190. package/playground/server.js +68 -0
  191. package/playground/server.ts +128 -0
  192. package/scripts/browser-build.ts +101 -0
  193. package/scripts/build-browser-bundle.ts +52 -0
  194. package/scripts/glyph-comparison/simulate.ts +744 -0
  195. package/scripts/playground-browser-server.ts +57 -0
  196. package/scripts/probe-roboto.ts +6 -0
  197. package/scripts/render-playground-example.ts +121 -0
  198. package/scripts/run-glyph-atlas-tuner-runner.mjs +113 -0
  199. package/scripts/run-glyph-atlas-tuner.ts +141 -0
  200. package/scripts/top-ts-files.ps1 +39 -0
  201. package/scripts/top-ts-files.sh +37 -0
  202. package/scripts/woff2_info.ps1 +132 -0
  203. package/src/browser-entry.ts +14 -0
  204. package/src/compression/adler32.ts +45 -0
  205. package/src/compression/brotli/brotli.ts +463 -0
  206. package/src/compression/brotli/index.ts +15 -0
  207. package/src/compression/brotli/transform.ts +184 -0
  208. package/src/compression/brotli/types.ts +58 -0
  209. package/src/compression/brotli/utils.ts +157 -0
  210. package/src/compression/brotli/vendor/bit_reader.js +124 -0
  211. package/src/compression/brotli/vendor/context.js +250 -0
  212. package/src/compression/brotli/vendor/decode.d.ts +2 -0
  213. package/src/compression/brotli/vendor/decode.js +938 -0
  214. package/src/compression/brotli/vendor/dictionary-data.js +9469 -0
  215. package/src/compression/brotli/vendor/dictionary.js +36 -0
  216. package/src/compression/brotli/vendor/huffman.js +123 -0
  217. package/src/compression/brotli/vendor/package.json +3 -0
  218. package/src/compression/brotli/vendor/prefix.js +60 -0
  219. package/src/compression/brotli/vendor/streams.js +31 -0
  220. package/src/compression/brotli/vendor/transform.js +247 -0
  221. package/src/compression/brotli/vendor-decode.d.ts +4 -0
  222. package/src/compression/brotli/woff2-glyf-transform.ts +623 -0
  223. package/src/compression/decompress.ts +16 -0
  224. package/src/compression/deflate.ts +295 -0
  225. package/src/compression/index.ts +4 -0
  226. package/src/compression/types.ts +26 -0
  227. package/src/compression/utils.ts +107 -0
  228. package/src/core.ts +18 -0
  229. package/src/css/apply-declarations.ts +86 -0
  230. package/src/css/background-types.ts +65 -0
  231. package/src/css/browser-defaults.ts +16 -0
  232. package/src/css/clip-path-types.ts +13 -0
  233. package/src/css/compute-style.ts +494 -0
  234. package/src/css/css-unit-resolver.ts +65 -0
  235. package/src/css/custom-properties.ts +215 -0
  236. package/src/css/enums.ts +127 -0
  237. package/src/css/font-face-parser.ts +233 -0
  238. package/src/css/font-weight.ts +65 -0
  239. package/src/css/inline-style-parser.ts +27 -0
  240. package/src/css/layout-property-resolver.ts +75 -0
  241. package/src/css/length.ts +141 -0
  242. package/src/css/line-height.ts +96 -0
  243. package/src/css/named-colors.ts +150 -0
  244. package/src/css/parsers/background-parser-extended.ts +111 -0
  245. package/src/css/parsers/background-parser.ts +456 -0
  246. package/src/css/parsers/border-block-parser.ts +26 -0
  247. package/src/css/parsers/border-inline-parser.ts +26 -0
  248. package/src/css/parsers/border-parser-extended.ts +256 -0
  249. package/src/css/parsers/border-parser.ts +175 -0
  250. package/src/css/parsers/box-shadow-parser.ts +106 -0
  251. package/src/css/parsers/clip-path-parser.ts +92 -0
  252. package/src/css/parsers/color-parser.ts +14 -0
  253. package/src/css/parsers/dimension-parser.ts +117 -0
  254. package/src/css/parsers/display-flex-parser.ts +59 -0
  255. package/src/css/parsers/flex-parser.ts +144 -0
  256. package/src/css/parsers/font-parser.ts +40 -0
  257. package/src/css/parsers/gradient-parser.ts +366 -0
  258. package/src/css/parsers/grid-parser-extended.ts +55 -0
  259. package/src/css/parsers/grid-parser.ts +218 -0
  260. package/src/css/parsers/length-parser.ts +95 -0
  261. package/src/css/parsers/list-style-parser.ts +39 -0
  262. package/src/css/parsers/margin-block-parser.ts +12 -0
  263. package/src/css/parsers/margin-inline-parser.ts +12 -0
  264. package/src/css/parsers/margin-parser.ts +30 -0
  265. package/src/css/parsers/opacity-parser.ts +32 -0
  266. package/src/css/parsers/overflow-wrap-parser.ts +38 -0
  267. package/src/css/parsers/padding-block-parser.ts +12 -0
  268. package/src/css/parsers/padding-inline-parser.ts +12 -0
  269. package/src/css/parsers/padding-parser.ts +30 -0
  270. package/src/css/parsers/position-parser.ts +75 -0
  271. package/src/css/parsers/register-parsers.ts +302 -0
  272. package/src/css/parsers/registry.ts +18 -0
  273. package/src/css/parsers/text-parser-extended.ts +144 -0
  274. package/src/css/parsers/text-parser.ts +25 -0
  275. package/src/css/parsers/text-shadow-parser.ts +94 -0
  276. package/src/css/properties/box-model.ts +82 -0
  277. package/src/css/properties/flexbox.ts +44 -0
  278. package/src/css/properties/gap.ts +14 -0
  279. package/src/css/properties/grid.ts +94 -0
  280. package/src/css/properties/layout.ts +59 -0
  281. package/src/css/properties/misc.ts +44 -0
  282. package/src/css/properties/typography.ts +71 -0
  283. package/src/css/properties/visual.ts +68 -0
  284. package/src/css/selectors/matcher.ts +219 -0
  285. package/src/css/selectors/parser.ts +163 -0
  286. package/src/css/selectors/simple-key.ts +31 -0
  287. package/src/css/selectors/specificity.ts +41 -0
  288. package/src/css/selectors/types.ts +31 -0
  289. package/src/css/shorthands/border-shorthand.ts +68 -0
  290. package/src/css/shorthands/box-shorthand.ts +33 -0
  291. package/src/css/style-inheritance.ts +50 -0
  292. package/src/css/style.ts +402 -0
  293. package/src/css/ua-defaults/base-defaults.ts +266 -0
  294. package/src/css/ua-defaults/browser-defaults.ts +134 -0
  295. package/src/css/ua-defaults/element-defaults.ts +374 -0
  296. package/src/css/ua-defaults/types.ts +43 -0
  297. package/src/css/unit-conversion.ts +24 -0
  298. package/src/css/utils.ts +108 -0
  299. package/src/css/viewport.ts +17 -0
  300. package/src/debug/audit.ts +20 -0
  301. package/src/debug/ids.ts +13 -0
  302. package/src/debug/log.js +28 -0
  303. package/src/debug/log.ts +52 -0
  304. package/src/debug/tree.ts +57 -0
  305. package/src/dom/node.ts +133 -0
  306. package/src/environment/browser-environment.ts +78 -0
  307. package/src/environment/environment.ts +35 -0
  308. package/src/environment/global.ts +13 -0
  309. package/src/environment/node-environment.browser.ts +28 -0
  310. package/src/environment/node-environment.ts +64 -0
  311. package/src/fonts/detector.ts +28 -0
  312. package/src/fonts/engines/ttf-engine.ts +28 -0
  313. package/src/fonts/engines/woff-engine.ts +38 -0
  314. package/src/fonts/engines/woff2-engine.ts +41 -0
  315. package/src/fonts/extractors/metrics-extractor.ts +362 -0
  316. package/src/fonts/font-registry-resolver.ts +132 -0
  317. package/src/fonts/index.ts +3 -0
  318. package/src/fonts/orchestrator.ts +92 -0
  319. package/src/fonts/parsers/base-parser.ts +23 -0
  320. package/src/fonts/types.ts +85 -0
  321. package/src/fonts/utils/ttf-reconstructor.ts +120 -0
  322. package/src/fonts/woff/decoder.ts +105 -0
  323. package/src/fonts/woff2/buffer.ts +106 -0
  324. package/src/fonts/woff2/decoder.ts +981 -0
  325. package/src/geometry/box.ts +48 -0
  326. package/src/geometry/matrix.ts +59 -0
  327. package/src/html/css/parse-css.ts +85 -0
  328. package/src/html/dom-converter.ts +433 -0
  329. package/src/html/image-converter.ts +200 -0
  330. package/src/html-to-pdf.ts +410 -0
  331. package/src/image/base-decoder.ts +149 -0
  332. package/src/image/image-service.ts +188 -0
  333. package/src/image/jpeg-decoder.ts +73 -0
  334. package/src/image/png-decoder.ts +550 -0
  335. package/src/image/types.ts +20 -0
  336. package/src/image/webp-decoder.ts +242 -0
  337. package/src/image/webp-huffman.ts +218 -0
  338. package/src/image/webp-riff-parser.ts +54 -0
  339. package/src/image/webp-vp8l-decoder.ts +199 -0
  340. package/src/index.ts +35 -0
  341. package/src/layout/context/float-context.ts +62 -0
  342. package/src/layout/context/layout-environment.ts +29 -0
  343. package/src/layout/debug.ts +18 -0
  344. package/src/layout/inline/bounding-box-calculator.ts +132 -0
  345. package/src/layout/inline/font-baseline-calculator.ts +76 -0
  346. package/src/layout/inline/inline-utils.ts +94 -0
  347. package/src/layout/inline/layout.ts +285 -0
  348. package/src/layout/inline/line_breaker.ts +109 -0
  349. package/src/layout/inline/measurement.ts +144 -0
  350. package/src/layout/inline/run-placer.ts +139 -0
  351. package/src/layout/inline/text-alignment.ts +70 -0
  352. package/src/layout/inline/tokenizer.ts +195 -0
  353. package/src/layout/inline/types.ts +76 -0
  354. package/src/layout/pipeline/context-factory.ts +16 -0
  355. package/src/layout/pipeline/default-engine.ts +24 -0
  356. package/src/layout/pipeline/engine.ts +59 -0
  357. package/src/layout/pipeline/layout-tree.ts +13 -0
  358. package/src/layout/pipeline/out-of-flow-manager.ts +73 -0
  359. package/src/layout/pipeline/strategy.ts +12 -0
  360. package/src/layout/pipeline/text-metrics-initializer.ts +13 -0
  361. package/src/layout/strategies/block.ts +236 -0
  362. package/src/layout/strategies/display-none.ts +14 -0
  363. package/src/layout/strategies/fallback.ts +15 -0
  364. package/src/layout/strategies/flex.ts +477 -0
  365. package/src/layout/strategies/fragmentation.ts +17 -0
  366. package/src/layout/strategies/grid.ts +247 -0
  367. package/src/layout/strategies/image.ts +342 -0
  368. package/src/layout/strategies/inline.ts +128 -0
  369. package/src/layout/strategies/table.ts +595 -0
  370. package/src/layout/table/cell_layout.ts +31 -0
  371. package/src/layout/table/diagnostics.ts +19 -0
  372. package/src/layout/text-run.ts +42 -0
  373. package/src/layout/utils/content-measurer.ts +117 -0
  374. package/src/layout/utils/display-utils.ts +24 -0
  375. package/src/layout/utils/floats.ts +98 -0
  376. package/src/layout/utils/gap-calculator.ts +167 -0
  377. package/src/layout/utils/inline-formatter.ts +31 -0
  378. package/src/layout/utils/inline-formatting.ts +9 -0
  379. package/src/layout/utils/margin.ts +140 -0
  380. package/src/layout/utils/node-math.ts +237 -0
  381. package/src/layout/utils/overflow.ts +14 -0
  382. package/src/layout/utils/sizing.ts +12 -0
  383. package/src/layout/utils/text-metrics.ts +361 -0
  384. package/src/logging/debug.ts +58 -0
  385. package/src/pdf/font/base14/widths-courier-bold.ts +159 -0
  386. package/src/pdf/font/base14/widths-courier.ts +159 -0
  387. package/src/pdf/font/base14/widths-helvetica-bold.ts +158 -0
  388. package/src/pdf/font/base14/widths-helvetica.ts +158 -0
  389. package/src/pdf/font/base14/widths-times-bold.ts +158 -0
  390. package/src/pdf/font/base14/widths-times-roman.ts +158 -0
  391. package/src/pdf/font/base14/widths-types.ts +25 -0
  392. package/src/pdf/font/base14-widths.ts +32 -0
  393. package/src/pdf/font/blur.ts +81 -0
  394. package/src/pdf/font/builtin-fonts.browser.ts +262 -0
  395. package/src/pdf/font/builtin-fonts.ts +126 -0
  396. package/src/pdf/font/composite-glyph-parser.ts +242 -0
  397. package/src/pdf/font/embedder.ts +395 -0
  398. package/src/pdf/font/font-config.ts +190 -0
  399. package/src/pdf/font/font-registry.ts +263 -0
  400. package/src/pdf/font/font-subset.ts +258 -0
  401. package/src/pdf/font/glyph-atlas-maxrects.ts +305 -0
  402. package/src/pdf/font/glyph-atlas-tuner.ts +98 -0
  403. package/src/pdf/font/glyph-atlas.ts +226 -0
  404. package/src/pdf/font/glyph-cache.ts +127 -0
  405. package/src/pdf/font/loca-reader.ts +109 -0
  406. package/src/pdf/font/managers/font-resource-manager.ts +73 -0
  407. package/src/pdf/font/managers/subset-resource-manager.ts +164 -0
  408. package/src/pdf/font/rasterizer.ts +270 -0
  409. package/src/pdf/font/resolvers/base-font-mapper.ts +77 -0
  410. package/src/pdf/font/resolvers/family-resolver.ts +33 -0
  411. package/src/pdf/font/resolvers/weight-style-applicator.ts +63 -0
  412. package/src/pdf/font/simple-glyph-parser.ts +289 -0
  413. package/src/pdf/font/to-unicode.ts +109 -0
  414. package/src/pdf/font/transformation-matrix.ts +136 -0
  415. package/src/pdf/font/ttf-cmap.ts +180 -0
  416. package/src/pdf/font/ttf-global-metrics.ts +58 -0
  417. package/src/pdf/font/ttf-glyf.ts +125 -0
  418. package/src/pdf/font/ttf-glyph-metrics.ts +43 -0
  419. package/src/pdf/font/ttf-lite.ts +269 -0
  420. package/src/pdf/font/ttf-table-parser.ts +132 -0
  421. package/src/pdf/font/ttf-table-provider.ts +61 -0
  422. package/src/pdf/font/widths.ts +79 -0
  423. package/src/pdf/font-subset/font-registry.ts +127 -0
  424. package/src/pdf/header-footer-layout.ts +153 -0
  425. package/src/pdf/header-footer-painter.ts +209 -0
  426. package/src/pdf/header-footer-renderer.ts +357 -0
  427. package/src/pdf/header-footer-tokens.ts +55 -0
  428. package/src/pdf/header-footer.ts +25 -0
  429. package/src/pdf/layout-tree-builder.ts +261 -0
  430. package/src/pdf/page-painter.ts +241 -0
  431. package/src/pdf/pagination.ts +155 -0
  432. package/src/pdf/primitives/pdf-builder.ts +378 -0
  433. package/src/pdf/primitives/pdf-bytes.ts +40 -0
  434. package/src/pdf/primitives/pdf-document.ts +108 -0
  435. package/src/pdf/primitives/pdf-reference-manager.ts +47 -0
  436. package/src/pdf/primitives/pdf-resource-registries.ts +255 -0
  437. package/src/pdf/primitives/pdf-serializers.ts +194 -0
  438. package/src/pdf/primitives/pdf-types.ts +73 -0
  439. package/src/pdf/render.ts +210 -0
  440. package/src/pdf/renderer/box-painter.ts +236 -0
  441. package/src/pdf/renderer/page-paint.ts +102 -0
  442. package/src/pdf/renderer/paint-box-shadows.ts +218 -0
  443. package/src/pdf/renderer/radius.ts +58 -0
  444. package/src/pdf/renderers/graphics-state-manager.ts +40 -0
  445. package/src/pdf/renderers/image-renderer.ts +127 -0
  446. package/src/pdf/renderers/radius-utils.ts +80 -0
  447. package/src/pdf/renderers/rectangle-renderer.ts +129 -0
  448. package/src/pdf/renderers/rounded-rect-path.ts +120 -0
  449. package/src/pdf/renderers/shape-renderer.ts +563 -0
  450. package/src/pdf/renderers/shape-utils.ts +194 -0
  451. package/src/pdf/renderers/text-decoration-renderer.ts +313 -0
  452. package/src/pdf/renderers/text-encoder.ts +41 -0
  453. package/src/pdf/renderers/text-font-resolver.ts +75 -0
  454. package/src/pdf/renderers/text-renderer-utils.ts +28 -0
  455. package/src/pdf/renderers/text-renderer.ts +391 -0
  456. package/src/pdf/renderers/text-shadow-renderer.ts +300 -0
  457. package/src/pdf/shading/gradient-service.ts +525 -0
  458. package/src/pdf/shading/index.ts +1 -0
  459. package/src/pdf/stacking/build-stacking-contexts.ts +93 -0
  460. package/src/pdf/stacking/resolve-paint-order.ts +157 -0
  461. package/src/pdf/stacking/types.ts +40 -0
  462. package/src/pdf/svg/aspect-ratio.ts +81 -0
  463. package/src/pdf/svg/coordinate-mapper.ts +81 -0
  464. package/src/pdf/svg/geometry-builder.ts +45 -0
  465. package/src/pdf/svg/render-svg.ts +296 -0
  466. package/src/pdf/svg/shape-renderer.ts +463 -0
  467. package/src/pdf/svg/style-computer.ts +246 -0
  468. package/src/pdf/transform-adapter.ts +26 -0
  469. package/src/pdf/types.ts +377 -0
  470. package/src/pdf/utils/background-layer-resolver.ts +439 -0
  471. package/src/pdf/utils/background-tiles.ts +192 -0
  472. package/src/pdf/utils/border-dashes.ts +109 -0
  473. package/src/pdf/utils/border-radius-utils.ts +86 -0
  474. package/src/pdf/utils/box-dimensions-utils.ts +47 -0
  475. package/src/pdf/utils/clip-path-resolver.ts +50 -0
  476. package/src/pdf/utils/clipping-path-builder.ts +190 -0
  477. package/src/pdf/utils/color-utils.ts +102 -0
  478. package/src/pdf/utils/coordinate-transformer.ts +30 -0
  479. package/src/pdf/utils/drop-shadow-raster.ts +233 -0
  480. package/src/pdf/utils/encoding.ts +98 -0
  481. package/src/pdf/utils/glyph-atlas-registrar.ts +13 -0
  482. package/src/pdf/utils/glyph-run-renderer.ts +129 -0
  483. package/src/pdf/utils/image-command-partitioner.ts +28 -0
  484. package/src/pdf/utils/image-matrix-builder.ts +31 -0
  485. package/src/pdf/utils/image-utils.ts +26 -0
  486. package/src/pdf/utils/list-utils.ts +194 -0
  487. package/src/pdf/utils/node-text-run-factory.ts +202 -0
  488. package/src/pdf/utils/page-resource-registrar.ts +46 -0
  489. package/src/pdf/utils/result-combiner.ts +102 -0
  490. package/src/pdf/utils/shadow-utils.ts +127 -0
  491. package/src/pdf/utils/text-alignment-resolver.ts +76 -0
  492. package/src/pdf/utils/text-decoration-utils.ts +64 -0
  493. package/src/pdf/utils/text-layout-adjuster.ts +185 -0
  494. package/src/pdf/utils/text-utils.ts +193 -0
  495. package/src/pdf/utils/transform-scope-manager.ts +69 -0
  496. package/src/render/offset.ts +170 -0
  497. package/src/shim/empty.ts +2 -0
  498. package/src/shim/fs-empty.ts +5 -0
  499. package/src/shim/url-empty.ts +7 -0
  500. package/src/shim/zlib-empty.ts +9 -0
  501. package/src/style/shorthands/index.ts +19 -0
  502. package/src/style/ua/defaults.ts +69 -0
  503. package/src/svg/index.ts +4 -0
  504. package/src/svg/parser-registry.ts +71 -0
  505. package/src/svg/parser.ts +486 -0
  506. package/src/svg/path-data.ts +515 -0
  507. package/src/svg/types.ts +194 -0
  508. package/src/text/line-breaker.ts +321 -0
  509. package/src/text/text-transform.ts +43 -0
  510. package/src/text/text.ts +33 -0
  511. package/src/transform/css-parser.ts +95 -0
  512. package/src/types/fonts.ts +62 -0
  513. package/src/types/public.ts +19 -0
  514. package/src/units/page-utils.ts +58 -0
  515. package/src/units/units.ts +50 -0
  516. package/src/utils/base64.ts +24 -0
  517. package/test-output.txt +79 -0
  518. package/tests/css/background-parser.spec.ts +14 -0
  519. package/tests/css/clip-path-parser.spec.ts +66 -0
  520. package/tests/environment/path-resolution.spec.ts +104 -0
  521. package/tests/helpers/ai-layout-diagnostics.ts +141 -0
  522. package/tests/helpers/render-utils.ts +52 -0
  523. package/tests/helpers/text-geometry.ts +56 -0
  524. package/tests/layout/custom-properties.test.ts +38 -0
  525. package/tests/layout/gap-calculator.spec.ts +196 -0
  526. package/tests/layout/inline-background-alignment.spec.ts +93 -0
  527. package/tests/layout/inline-fragments.spec.ts +26 -0
  528. package/tests/layout/run-placer-baseline.spec.ts +108 -0
  529. package/tests/pdf/alignments.spec.ts +26 -0
  530. package/tests/pdf/background-clip.spec.ts +57 -0
  531. package/tests/pdf/background-repeat-space-round.spec.ts +35 -0
  532. package/tests/pdf/background-repeat.spec.ts +137 -0
  533. package/tests/pdf/border-radius.spec.ts +151 -0
  534. package/tests/pdf/clip-path.spec.ts +92 -0
  535. package/tests/pdf/radial-gradient.spec.ts +50 -0
  536. package/tests/pdf/svg-stroke-dash.spec.ts +81 -0
  537. package/tests/pdf/text-transform-matrix.spec.ts +43 -0
  538. package/tsconfig.json +17 -0
  539. package/types/fonts.js +10 -0
  540. 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,4 @@
1
+ export { WOFFDeflate, compress, decompress, getCompressionStats, validateCompressedData } from './deflate.js';
2
+ export { Adler32 } from './adler32.js';
3
+ export * from './types.js';
4
+ export * from './utils.js';
@@ -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;