pretext-pdf 1.1.1 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/CHANGELOG.md +659 -0
  2. package/README.md +82 -7
  3. package/dist/allowed-props.d.ts +76 -0
  4. package/dist/allowed-props.d.ts.map +1 -1
  5. package/dist/allowed-props.js.map +1 -1
  6. package/dist/assets/generators/barcode.d.ts +9 -0
  7. package/dist/assets/generators/barcode.d.ts.map +1 -0
  8. package/dist/assets/generators/barcode.js +24 -0
  9. package/dist/assets/generators/barcode.js.map +1 -0
  10. package/dist/assets/generators/chart.d.ts +13 -0
  11. package/dist/assets/generators/chart.d.ts.map +1 -0
  12. package/dist/assets/generators/chart.js +32 -0
  13. package/dist/assets/generators/chart.js.map +1 -0
  14. package/dist/assets/generators/qr.d.ts +9 -0
  15. package/dist/assets/generators/qr.d.ts.map +1 -0
  16. package/dist/assets/generators/qr.js +25 -0
  17. package/dist/assets/generators/qr.js.map +1 -0
  18. package/dist/assets/index.d.ts +19 -0
  19. package/dist/assets/index.d.ts.map +1 -0
  20. package/dist/assets/index.js +19 -0
  21. package/dist/assets/index.js.map +1 -0
  22. package/dist/assets/loaders/images.d.ts +20 -0
  23. package/dist/assets/loaders/images.d.ts.map +1 -0
  24. package/dist/assets/loaders/images.js +69 -0
  25. package/dist/assets/loaders/images.js.map +1 -0
  26. package/dist/assets/loaders/orchestrator.d.ts +24 -0
  27. package/dist/assets/loaders/orchestrator.d.ts.map +1 -0
  28. package/dist/assets/loaders/orchestrator.js +109 -0
  29. package/dist/assets/loaders/orchestrator.js.map +1 -0
  30. package/dist/assets/loaders/vectors.d.ts +25 -0
  31. package/dist/assets/loaders/vectors.d.ts.map +1 -0
  32. package/dist/assets/loaders/vectors.js +118 -0
  33. package/dist/assets/loaders/vectors.js.map +1 -0
  34. package/dist/assets/loaders/watermark.d.ts +12 -0
  35. package/dist/assets/loaders/watermark.d.ts.map +1 -0
  36. package/dist/assets/loaders/watermark.js +40 -0
  37. package/dist/assets/loaders/watermark.js.map +1 -0
  38. package/dist/assets/security/fetch.d.ts +14 -0
  39. package/dist/assets/security/fetch.d.ts.map +1 -0
  40. package/dist/assets/security/fetch.js +112 -0
  41. package/dist/assets/security/fetch.js.map +1 -0
  42. package/dist/assets/security/ipv4-normalize.d.ts +28 -0
  43. package/dist/assets/security/ipv4-normalize.d.ts.map +1 -0
  44. package/dist/assets/security/ipv4-normalize.js +116 -0
  45. package/dist/assets/security/ipv4-normalize.js.map +1 -0
  46. package/dist/assets/security/path-allowlist.d.ts +12 -0
  47. package/dist/assets/security/path-allowlist.d.ts.map +1 -0
  48. package/dist/assets/security/path-allowlist.js +26 -0
  49. package/dist/assets/security/path-allowlist.js.map +1 -0
  50. package/dist/assets/security/url-validation.d.ts +22 -0
  51. package/dist/assets/security/url-validation.d.ts.map +1 -0
  52. package/dist/assets/security/url-validation.js +164 -0
  53. package/dist/assets/security/url-validation.js.map +1 -0
  54. package/dist/assets/svg/dimensions.d.ts +19 -0
  55. package/dist/assets/svg/dimensions.d.ts.map +1 -0
  56. package/dist/assets/svg/dimensions.js +43 -0
  57. package/dist/assets/svg/dimensions.js.map +1 -0
  58. package/dist/assets/svg/rasterize.d.ts +6 -0
  59. package/dist/assets/svg/rasterize.d.ts.map +1 -0
  60. package/dist/assets/svg/rasterize.js +38 -0
  61. package/dist/assets/svg/rasterize.js.map +1 -0
  62. package/dist/assets/svg/resolve-content.d.ts +16 -0
  63. package/dist/assets/svg/resolve-content.d.ts.map +1 -0
  64. package/dist/assets/svg/resolve-content.js +38 -0
  65. package/dist/assets/svg/resolve-content.js.map +1 -0
  66. package/dist/assets/svg/sanitize.d.ts +22 -0
  67. package/dist/assets/svg/sanitize.d.ts.map +1 -0
  68. package/dist/assets/svg/sanitize.js +46 -0
  69. package/dist/assets/svg/sanitize.js.map +1 -0
  70. package/dist/assets/util/redact-path.d.ts +14 -0
  71. package/dist/assets/util/redact-path.d.ts.map +1 -0
  72. package/dist/assets/util/redact-path.js +16 -0
  73. package/dist/assets/util/redact-path.js.map +1 -0
  74. package/dist/assets.d.ts +10 -27
  75. package/dist/assets.d.ts.map +1 -1
  76. package/dist/assets.js +10 -549
  77. package/dist/assets.js.map +1 -1
  78. package/dist/builder.d.ts.map +1 -1
  79. package/dist/builder.js +2 -1
  80. package/dist/builder.js.map +1 -1
  81. package/dist/cli.js +11 -1
  82. package/dist/cli.js.map +1 -1
  83. package/dist/compat.d.ts +63 -1
  84. package/dist/compat.d.ts.map +1 -1
  85. package/dist/compat.js +42 -5
  86. package/dist/compat.js.map +1 -1
  87. package/dist/errors.d.ts +2 -2
  88. package/dist/errors.d.ts.map +1 -1
  89. package/dist/errors.js +2 -2
  90. package/dist/errors.js.map +1 -1
  91. package/dist/fonts.d.ts.map +1 -1
  92. package/dist/fonts.js +8 -10
  93. package/dist/fonts.js.map +1 -1
  94. package/dist/index.d.ts +1 -1
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +7 -5
  97. package/dist/index.js.map +1 -1
  98. package/dist/layout-state.d.ts +1 -1
  99. package/dist/layout-state.d.ts.map +1 -1
  100. package/dist/layout-state.js +5 -0
  101. package/dist/layout-state.js.map +1 -1
  102. package/dist/measure-blocks/float-group.d.ts +9 -0
  103. package/dist/measure-blocks/float-group.d.ts.map +1 -0
  104. package/dist/measure-blocks/float-group.js +103 -0
  105. package/dist/measure-blocks/float-group.js.map +1 -0
  106. package/dist/measure-blocks/helpers.d.ts +44 -0
  107. package/dist/measure-blocks/helpers.d.ts.map +1 -0
  108. package/dist/measure-blocks/helpers.js +43 -0
  109. package/dist/measure-blocks/helpers.js.map +1 -0
  110. package/dist/measure-blocks/highlight.d.ts +26 -0
  111. package/dist/measure-blocks/highlight.d.ts.map +1 -0
  112. package/dist/measure-blocks/highlight.js +169 -0
  113. package/dist/measure-blocks/highlight.js.map +1 -0
  114. package/dist/measure-blocks/image.d.ts +9 -0
  115. package/dist/measure-blocks/image.d.ts.map +1 -0
  116. package/dist/measure-blocks/image.js +136 -0
  117. package/dist/measure-blocks/image.js.map +1 -0
  118. package/dist/measure-blocks/index.d.ts +24 -0
  119. package/dist/measure-blocks/index.d.ts.map +1 -0
  120. package/dist/measure-blocks/index.js +179 -0
  121. package/dist/measure-blocks/index.js.map +1 -0
  122. package/dist/measure-blocks/list.d.ts +8 -0
  123. package/dist/measure-blocks/list.d.ts.map +1 -0
  124. package/dist/measure-blocks/list.js +108 -0
  125. package/dist/measure-blocks/list.js.map +1 -0
  126. package/dist/measure-blocks/simple-blocks.d.ts +18 -0
  127. package/dist/measure-blocks/simple-blocks.d.ts.map +1 -0
  128. package/dist/measure-blocks/simple-blocks.js +121 -0
  129. package/dist/measure-blocks/simple-blocks.js.map +1 -0
  130. package/dist/measure-blocks/table/columns.d.ts +17 -0
  131. package/dist/measure-blocks/table/columns.d.ts.map +1 -0
  132. package/dist/measure-blocks/table/columns.js +83 -0
  133. package/dist/measure-blocks/table/columns.js.map +1 -0
  134. package/dist/measure-blocks/table/measure.d.ts +8 -0
  135. package/dist/measure-blocks/table/measure.d.ts.map +1 -0
  136. package/dist/measure-blocks/table/measure.js +231 -0
  137. package/dist/measure-blocks/table/measure.js.map +1 -0
  138. package/dist/measure-blocks/table/spans.d.ts +25 -0
  139. package/dist/measure-blocks/table/spans.d.ts.map +1 -0
  140. package/dist/measure-blocks/table/spans.js +55 -0
  141. package/dist/measure-blocks/table/spans.js.map +1 -0
  142. package/dist/measure-blocks/text-blocks.d.ts +17 -0
  143. package/dist/measure-blocks/text-blocks.d.ts.map +1 -0
  144. package/dist/measure-blocks/text-blocks.js +242 -0
  145. package/dist/measure-blocks/text-blocks.js.map +1 -0
  146. package/dist/measure-text.d.ts +21 -3
  147. package/dist/measure-text.d.ts.map +1 -1
  148. package/dist/measure-text.js +87 -36
  149. package/dist/measure-text.js.map +1 -1
  150. package/dist/measure.d.ts +1 -1
  151. package/dist/measure.d.ts.map +1 -1
  152. package/dist/measure.js +8 -6
  153. package/dist/measure.js.map +1 -1
  154. package/dist/node-polyfill.d.ts.map +1 -1
  155. package/dist/node-polyfill.js +9 -0
  156. package/dist/node-polyfill.js.map +1 -1
  157. package/dist/pipeline-footnotes.d.ts +1 -1
  158. package/dist/pipeline-footnotes.d.ts.map +1 -1
  159. package/dist/pipeline-toc.d.ts +1 -1
  160. package/dist/pipeline-toc.d.ts.map +1 -1
  161. package/dist/pipeline.d.ts +3 -3
  162. package/dist/pipeline.d.ts.map +1 -1
  163. package/dist/pipeline.js +4 -5
  164. package/dist/pipeline.js.map +1 -1
  165. package/dist/plugin-types.d.ts +1 -1
  166. package/dist/plugin-types.d.ts.map +1 -1
  167. package/dist/post-process.d.ts +2 -2
  168. package/dist/post-process.d.ts.map +1 -1
  169. package/dist/post-process.js +32 -9
  170. package/dist/post-process.js.map +1 -1
  171. package/dist/render-blocks/blockquote.d.ts +7 -0
  172. package/dist/render-blocks/blockquote.d.ts.map +1 -0
  173. package/dist/render-blocks/blockquote.js +87 -0
  174. package/dist/render-blocks/blockquote.js.map +1 -0
  175. package/dist/render-blocks/callout.d.ts +7 -0
  176. package/dist/render-blocks/callout.d.ts.map +1 -0
  177. package/dist/render-blocks/callout.js +84 -0
  178. package/dist/render-blocks/callout.js.map +1 -0
  179. package/dist/render-blocks/code.d.ts +7 -0
  180. package/dist/render-blocks/code.d.ts.map +1 -0
  181. package/dist/render-blocks/code.js +84 -0
  182. package/dist/render-blocks/code.js.map +1 -0
  183. package/dist/render-blocks/footnote.d.ts +11 -0
  184. package/dist/render-blocks/footnote.d.ts.map +1 -0
  185. package/dist/render-blocks/footnote.js +45 -0
  186. package/dist/render-blocks/footnote.js.map +1 -0
  187. package/dist/render-blocks/header-footer.d.ts +11 -0
  188. package/dist/render-blocks/header-footer.d.ts.map +1 -0
  189. package/dist/render-blocks/header-footer.js +56 -0
  190. package/dist/render-blocks/header-footer.js.map +1 -0
  191. package/dist/render-blocks/hr.d.ts +7 -0
  192. package/dist/render-blocks/hr.d.ts.map +1 -0
  193. package/dist/render-blocks/hr.js +24 -0
  194. package/dist/render-blocks/hr.js.map +1 -0
  195. package/dist/render-blocks/image.d.ts +9 -0
  196. package/dist/render-blocks/image.d.ts.map +1 -0
  197. package/dist/render-blocks/image.js +135 -0
  198. package/dist/render-blocks/image.js.map +1 -0
  199. package/dist/render-blocks/index.d.ts +17 -0
  200. package/dist/render-blocks/index.d.ts.map +1 -0
  201. package/dist/render-blocks/index.js +17 -0
  202. package/dist/render-blocks/index.js.map +1 -0
  203. package/dist/render-blocks/list-item.d.ts +7 -0
  204. package/dist/render-blocks/list-item.d.ts.map +1 -0
  205. package/dist/render-blocks/list-item.js +80 -0
  206. package/dist/render-blocks/list-item.js.map +1 -0
  207. package/dist/render-blocks/rich.d.ts +7 -0
  208. package/dist/render-blocks/rich.d.ts.map +1 -0
  209. package/dist/render-blocks/rich.js +160 -0
  210. package/dist/render-blocks/rich.js.map +1 -0
  211. package/dist/render-blocks/table.d.ts +7 -0
  212. package/dist/render-blocks/table.d.ts.map +1 -0
  213. package/dist/render-blocks/table.js +139 -0
  214. package/dist/render-blocks/table.js.map +1 -0
  215. package/dist/render-blocks/text.d.ts +7 -0
  216. package/dist/render-blocks/text.d.ts.map +1 -0
  217. package/dist/render-blocks/text.js +183 -0
  218. package/dist/render-blocks/text.js.map +1 -0
  219. package/dist/render-blocks/watermark.d.ts +8 -0
  220. package/dist/render-blocks/watermark.d.ts.map +1 -0
  221. package/dist/render-blocks/watermark.js +52 -0
  222. package/dist/render-blocks/watermark.js.map +1 -0
  223. package/dist/render-extras.d.ts.map +1 -1
  224. package/dist/render-extras.js +1 -2
  225. package/dist/render-extras.js.map +1 -1
  226. package/dist/render-utils.d.ts.map +1 -1
  227. package/dist/render-utils.js +10 -6
  228. package/dist/render-utils.js.map +1 -1
  229. package/dist/render.d.ts.map +1 -1
  230. package/dist/render.js +9 -3
  231. package/dist/render.js.map +1 -1
  232. package/dist/rich-text.d.ts +2 -1
  233. package/dist/rich-text.d.ts.map +1 -1
  234. package/dist/rich-text.js +0 -1
  235. package/dist/rich-text.js.map +1 -1
  236. package/dist/types-internal.d.ts +19 -3
  237. package/dist/types-internal.d.ts.map +1 -1
  238. package/dist/types-public/document.d.ts +261 -0
  239. package/dist/types-public/document.d.ts.map +1 -0
  240. package/dist/types-public/document.js +2 -0
  241. package/dist/types-public/document.js.map +1 -0
  242. package/dist/types-public/elements-block.d.ts +246 -0
  243. package/dist/types-public/elements-block.d.ts.map +1 -0
  244. package/dist/types-public/elements-block.js +8 -0
  245. package/dist/types-public/elements-block.js.map +1 -0
  246. package/dist/types-public/elements-media.d.ts +199 -0
  247. package/dist/types-public/elements-media.d.ts.map +1 -0
  248. package/dist/types-public/elements-media.js +2 -0
  249. package/dist/types-public/elements-media.js.map +1 -0
  250. package/dist/types-public/elements-text.d.ts +327 -0
  251. package/dist/types-public/elements-text.d.ts.map +1 -0
  252. package/dist/types-public/elements-text.js +2 -0
  253. package/dist/types-public/elements-text.js.map +1 -0
  254. package/dist/types-public/index.d.ts +14 -0
  255. package/dist/types-public/index.d.ts.map +1 -0
  256. package/dist/types-public/index.js +2 -0
  257. package/dist/types-public/index.js.map +1 -0
  258. package/dist/types-public/render-options.d.ts +38 -0
  259. package/dist/types-public/render-options.d.ts.map +1 -0
  260. package/dist/types-public/render-options.js +2 -0
  261. package/dist/types-public/render-options.js.map +1 -0
  262. package/dist/types-public/union.d.ts +13 -0
  263. package/dist/types-public/union.d.ts.map +1 -0
  264. package/dist/types-public/union.js +2 -0
  265. package/dist/types-public/union.js.map +1 -0
  266. package/dist/types-public/validation.d.ts +64 -0
  267. package/dist/types-public/validation.d.ts.map +1 -0
  268. package/dist/types-public/validation.js +2 -0
  269. package/dist/types-public/validation.js.map +1 -0
  270. package/dist/types-public.d.ts +5 -1081
  271. package/dist/types-public.d.ts.map +1 -1
  272. package/dist/types.d.ts +1 -1
  273. package/dist/types.d.ts.map +1 -1
  274. package/dist/validate/document.d.ts +28 -0
  275. package/dist/validate/document.d.ts.map +1 -0
  276. package/dist/validate/document.js +295 -0
  277. package/dist/validate/document.js.map +1 -0
  278. package/dist/validate/elements/forms-floats.d.ts +19 -0
  279. package/dist/validate/elements/forms-floats.d.ts.map +1 -0
  280. package/dist/validate/elements/forms-floats.js +96 -0
  281. package/dist/validate/elements/forms-floats.js.map +1 -0
  282. package/dist/validate/elements/list.d.ts +10 -0
  283. package/dist/validate/elements/list.d.ts.map +1 -0
  284. package/dist/validate/elements/list.js +66 -0
  285. package/dist/validate/elements/list.js.map +1 -0
  286. package/dist/validate/elements/media.d.ts +23 -0
  287. package/dist/validate/elements/media.d.ts.map +1 -0
  288. package/dist/validate/elements/media.js +179 -0
  289. package/dist/validate/elements/media.js.map +1 -0
  290. package/dist/validate/elements/structural-simple.d.ts +21 -0
  291. package/dist/validate/elements/structural-simple.d.ts.map +1 -0
  292. package/dist/validate/elements/structural-simple.js +63 -0
  293. package/dist/validate/elements/structural-simple.js.map +1 -0
  294. package/dist/validate/elements/structural.d.ts +12 -0
  295. package/dist/validate/elements/structural.d.ts.map +1 -0
  296. package/dist/validate/elements/structural.js +12 -0
  297. package/dist/validate/elements/structural.js.map +1 -0
  298. package/dist/validate/elements/table.d.ts +10 -0
  299. package/dist/validate/elements/table.d.ts.map +1 -0
  300. package/dist/validate/elements/table.js +165 -0
  301. package/dist/validate/elements/table.js.map +1 -0
  302. package/dist/validate/elements/text.d.ts +26 -0
  303. package/dist/validate/elements/text.d.ts.map +1 -0
  304. package/dist/validate/elements/text.js +331 -0
  305. package/dist/validate/elements/text.js.map +1 -0
  306. package/dist/validate/errors.d.ts +9 -0
  307. package/dist/validate/errors.d.ts.map +1 -0
  308. package/dist/validate/errors.js +43 -0
  309. package/dist/validate/errors.js.map +1 -0
  310. package/dist/validate/fonts.d.ts +11 -0
  311. package/dist/validate/fonts.d.ts.map +1 -0
  312. package/dist/validate/fonts.js +118 -0
  313. package/dist/validate/fonts.js.map +1 -0
  314. package/dist/validate/helpers.d.ts +76 -0
  315. package/dist/validate/helpers.d.ts.map +1 -0
  316. package/dist/validate/helpers.js +169 -0
  317. package/dist/validate/helpers.js.map +1 -0
  318. package/dist/validate/index.d.ts +37 -0
  319. package/dist/validate/index.d.ts.map +1 -0
  320. package/dist/validate/index.js +279 -0
  321. package/dist/validate/index.js.map +1 -0
  322. package/dist/validate.d.ts +6 -18
  323. package/dist/validate.d.ts.map +1 -1
  324. package/dist/validate.js +6 -1585
  325. package/dist/validate.js.map +1 -1
  326. package/dist/vendor/pretext/VERSION.d.ts +3 -0
  327. package/dist/vendor/pretext/VERSION.d.ts.map +1 -0
  328. package/dist/vendor/pretext/VERSION.js +12 -0
  329. package/dist/vendor/pretext/VERSION.js.map +1 -0
  330. package/dist/version-check.d.ts +47 -0
  331. package/dist/version-check.d.ts.map +1 -0
  332. package/dist/version-check.js +75 -0
  333. package/dist/version-check.js.map +1 -0
  334. package/package.json +26 -7
  335. package/dist/measure-blocks.d.ts +0 -26
  336. package/dist/measure-blocks.d.ts.map +0 -1
  337. package/dist/measure-blocks.js +0 -1317
  338. package/dist/measure-blocks.js.map +0 -1
  339. package/dist/render-blocks.d.ts +0 -28
  340. package/dist/render-blocks.d.ts.map +0 -1
  341. package/dist/render-blocks.js +0 -1059
  342. package/dist/render-blocks.js.map +0 -1
@@ -3,7 +3,7 @@
3
3
  * @internal Not part of the stable public API. Subject to change without a semver bump.
4
4
  */
5
5
  import { PDFDocument } from '@cantoo/pdf-lib';
6
- import type { PdfDocument, RenderOptions } from './types-public.js';
6
+ import type { PdfDocument, RenderOptions } from './types-public/index.js';
7
7
  import type { MeasuredBlock, PaginatedDocument, PageGeometry, FontMap, ImageMap } from './types-internal.js';
8
8
  export interface LayoutState {
9
9
  doc: PdfDocument;
@@ -1 +1 @@
1
- {"version":3,"file":"layout-state.d.ts","sourceRoot":"","sources":["../src/layout-state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAI5G,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,WAAW,CAAA;IAChB,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,YAAY,EAAE,iBAAiB,CAAA;IAC/B,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,QAAQ,CAAA;IAClB,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IAClC,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IACvE,KAAK,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACrC;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBxG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAcpE"}
1
+ {"version":3,"file":"layout-state.d.ts","sourceRoot":"","sources":["../src/layout-state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAI5G,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,WAAW,CAAA;IAChB,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,YAAY,EAAE,iBAAiB,CAAA;IAC/B,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,QAAQ,CAAA;IAClB,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IAClC,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IACvE,KAAK,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACrC;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBxG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAcpE"}
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Layout inspection API — run the pipeline up to pagination without rendering.
3
+ * @internal Not part of the stable public API. Subject to change without a semver bump.
4
+ */
5
+ import { PDFDocument } from '@cantoo/pdf-lib';
1
6
  import { stageValidate, stageInit, stageLoadAssets, stageFinalizeGeo, stageMeasure, stagePaginate } from './pipeline.js';
2
7
  import { PretextPdfError } from './errors.js';
3
8
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"layout-state.js","sourceRoot":"","sources":["../src/layout-state.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACxH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAkB7C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAgB,EAAE,OAAuB;IAChF,IAAI,OAAO,IAAI,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;QAC1C,MAAM,IAAI,eAAe,CAAC,eAAe,EAAE,uHAAuH,CAAC,CAAA;IACrK,CAAC;IACD,IAAI,OAAO,eAAe,KAAK,WAAW,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAC5E,IAAI,CAAC;YACH,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;YAClE,MAAM,mBAAmB,EAAE,CAAA;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,eAAe,CAAC,oBAAoB,EAAE,iDAAiD,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAChJ,CAAC;IACH,CAAC;IAED,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAE3B,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;IACrE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC3G,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,CAAC,CAAA;IAChE,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC/G,MAAM,YAAY,GAAG,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IAE1E,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,CAAA;AAC5F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAkB;IACrD,OAAO;QACL,QAAQ,EAAE;YACR,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM;SACvC;QACD,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,IAAK,KAAK,CAAC,OAA4B,CAAC,GAAG,KAAK,KAAK;SACnF,CAAC,CAAC;QACH,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;SAC/B,CAAC,CAAC;KACJ,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"layout-state.js","sourceRoot":"","sources":["../src/layout-state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACxH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAkB7C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAgB,EAAE,OAAuB;IAChF,IAAI,OAAO,IAAI,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;QAC1C,MAAM,IAAI,eAAe,CAAC,eAAe,EAAE,uHAAuH,CAAC,CAAA;IACrK,CAAC;IACD,IAAI,OAAO,eAAe,KAAK,WAAW,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAC5E,IAAI,CAAC;YACH,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;YAClE,MAAM,mBAAmB,EAAE,CAAA;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,eAAe,CAAC,oBAAoB,EAAE,iDAAiD,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAChJ,CAAC;IACH,CAAC;IAED,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAE3B,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;IACrE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC3G,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,CAAC,CAAA;IAChE,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC/G,MAAM,YAAY,GAAG,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IAE1E,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,CAAA;AAC5F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAkB;IACrD,OAAO;QACL,QAAQ,EAAE;YACR,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM;SACvC;QACD,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,IAAK,KAAK,CAAC,OAA4B,CAAC,GAAG,KAAK,KAAK;SACnF,CAAC,CAAC;QACH,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;SAC/B,CAAC,CAAC;KACJ,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * measure-blocks/float-group.ts — Multi-paragraph float-group measurement.
3
+ */
4
+ import type { ContentElement, FloatGroupElement, PdfDocument } from '../types.js';
5
+ import type { MeasuredBlock, ImageMap } from '../types-internal.js';
6
+ import type { HyphenatorOpts } from '../measure-text.js';
7
+ export type MeasureBlockFn = (element: ContentElement, contentWidth: number, doc: PdfDocument, hyphenatorOpts?: HyphenatorOpts, wordWidthCache?: Map<string, number>) => Promise<MeasuredBlock | MeasuredBlock[]>;
8
+ export declare function measureFloatGroup(element: FloatGroupElement, imageKey: string, imageMap: ImageMap, contentWidth: number, pageContentHeight: number, doc: PdfDocument, measureBlock: MeasureBlockFn, hyphenatorOpts?: HyphenatorOpts, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
9
+ //# sourceMappingURL=float-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"float-group.d.ts","sourceRoot":"","sources":["../../src/measure-blocks/float-group.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAgB,WAAW,EAAE,MAAM,aAAa,CAAA;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAyB,MAAM,sBAAsB,CAAA;AAE1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAQxD,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,WAAW,EAChB,cAAc,CAAC,EAAE,cAAc,EAC/B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KACjC,OAAO,CAAC,aAAa,GAAG,aAAa,EAAE,CAAC,CAAA;AAE7C,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EACzB,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,cAAc,EAC5B,cAAc,CAAC,EAAE,cAAc,EAC/B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CAqHxB"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * measure-blocks/float-group.ts — Multi-paragraph float-group measurement.
3
+ */
4
+ import { PretextPdfError } from '../errors.js';
5
+ import { measureImageWithKey } from './image.js';
6
+ export async function measureFloatGroup(element, imageKey, imageMap, contentWidth, pageContentHeight, doc, measureBlock, hyphenatorOpts, wordWidthCache) {
7
+ const floatWidth = element.floatWidth ?? (contentWidth * 0.35);
8
+ const floatGap = element.floatGap ?? 12;
9
+ const textColWidth = contentWidth - floatWidth - floatGap;
10
+ if (textColWidth < 50) {
11
+ throw new PretextPdfError('COLUMN_WIDTH_TOO_NARROW', `Float group: text column would be ${textColWidth.toFixed(1)}pt (minimum 50pt). ` +
12
+ `Reduce floatWidth or increase page width.`);
13
+ }
14
+ // Measure the image at floatWidth
15
+ const syntheticImageEl = {
16
+ type: 'image',
17
+ src: '',
18
+ ...(element.image.height !== undefined ? { height: element.image.height } : {}),
19
+ align: 'left',
20
+ spaceAfter: 0,
21
+ spaceBefore: 0,
22
+ };
23
+ const imageBlock = await measureImageWithKey(syntheticImageEl, imageKey, imageMap, floatWidth, pageContentHeight);
24
+ const imageRenderWidth = imageBlock.imageData.renderWidth;
25
+ const imageRenderHeight = imageBlock.imageData.renderHeight;
26
+ // Measure each content element in the text column.
27
+ //
28
+ // NOTE (v1.5.2): an earlier draft computed `const baseFontSize =
29
+ // doc.defaultFontSize ?? 12` plus a per-block `const fontSize =
30
+ // block.fontSize || baseFontSize` fallback. v1.5.1 M5a removed both as
31
+ // unused locals (the item below assigns `block.fontSize` directly, so the
32
+ // local was never read). That removal is correct: upstream measure helpers
33
+ // (measure-paragraph, measure-heading, …) always populate `block.fontSize`
34
+ // with a positive value, so a `block.fontSize || baseFontSize` fallback
35
+ // would never fire in practice. Do NOT reintroduce the fallback without
36
+ // first finding a measure helper that returns `fontSize === 0` for real
37
+ // content.
38
+ const textItems = [];
39
+ let totalTextHeight = 0;
40
+ for (const contentEl of element.content) {
41
+ const measuredEl = await measureBlock(contentEl, textColWidth, doc, hyphenatorOpts, wordWidthCache);
42
+ // Handle arrays (lists return MeasuredBlock[])
43
+ const blocks = Array.isArray(measuredEl) ? measuredEl : [measuredEl];
44
+ for (const block of blocks) {
45
+ // Extract text from lines or rich-lines
46
+ let lines = [];
47
+ if (block.richLines && block.richLines.length > 0) {
48
+ // Rich paragraph: extract plain text from rich lines (plain-text fallback)
49
+ lines = block.richLines.map(rl => ({
50
+ text: rl.fragments.map(f => f.text).join(''),
51
+ width: rl.totalWidth,
52
+ }));
53
+ }
54
+ else {
55
+ lines = block.lines;
56
+ }
57
+ const yOffsetFromTop = totalTextHeight;
58
+ const item = {
59
+ lines,
60
+ fontSize: block.fontSize,
61
+ lineHeight: block.lineHeight,
62
+ fontKey: block.fontKey,
63
+ fontWeight: 400,
64
+ spaceAfter: block.spaceAfter,
65
+ yOffsetFromTop,
66
+ };
67
+ if (block.richLines) {
68
+ item.richLines = block.richLines;
69
+ }
70
+ textItems.push(item);
71
+ totalTextHeight += block.height + block.spaceAfter;
72
+ }
73
+ }
74
+ // Remove trailing spaceAfter (it's not needed at the end)
75
+ if (textItems.length > 0) {
76
+ totalTextHeight -= textItems[textItems.length - 1].spaceAfter;
77
+ }
78
+ // Column X positions
79
+ const imageColX = element.float === 'left' ? 0 : textColWidth + floatGap;
80
+ const textColX = element.float === 'left' ? floatWidth + floatGap : 0;
81
+ const compositeHeight = Math.max(imageRenderHeight, totalTextHeight);
82
+ return {
83
+ element,
84
+ height: compositeHeight,
85
+ lines: [],
86
+ fontSize: 0,
87
+ lineHeight: 0,
88
+ fontKey: '',
89
+ spaceAfter: element.spaceAfter ?? 12,
90
+ spaceBefore: element.spaceBefore ?? 0,
91
+ floatGroupData: {
92
+ imageKey,
93
+ imageRenderWidth,
94
+ imageRenderHeight,
95
+ imageColX,
96
+ textColX,
97
+ textColWidth,
98
+ textItems,
99
+ totalTextHeight,
100
+ },
101
+ };
102
+ }
103
+ //# sourceMappingURL=float-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"float-group.js","sourceRoot":"","sources":["../../src/measure-blocks/float-group.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * measure-blocks/helpers.ts — Shared helpers and constants used by multiple
3
+ * per-element-type measurement modules.
4
+ */
5
+ /** Heading level size multipliers and defaults */
6
+ export declare const HEADING_DEFAULTS: {
7
+ 1: {
8
+ sizeMultiplier: number;
9
+ fontWeight: 700;
10
+ spaceAfter: number;
11
+ spaceBefore: number;
12
+ };
13
+ 2: {
14
+ sizeMultiplier: number;
15
+ fontWeight: 700;
16
+ spaceAfter: number;
17
+ spaceBefore: number;
18
+ };
19
+ 3: {
20
+ sizeMultiplier: number;
21
+ fontWeight: 700;
22
+ spaceAfter: number;
23
+ spaceBefore: number;
24
+ };
25
+ 4: {
26
+ sizeMultiplier: number;
27
+ fontWeight: 700;
28
+ spaceAfter: number;
29
+ spaceBefore: number;
30
+ };
31
+ };
32
+ /**
33
+ * Resolve preset callout style colors
34
+ */
35
+ export declare function resolveCalloutColors(style?: string): {
36
+ bg: string;
37
+ border: string;
38
+ };
39
+ /**
40
+ * Measure the natural (unwrapped) width of text in pt.
41
+ * Uses a very large maxWidth so Pretext never wraps — returns the actual line width.
42
+ */
43
+ export declare function measureNaturalTextWidth(text: string, fontSize: number, fontFamily: string, fontWeight: 400 | 700): Promise<number>;
44
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/measure-blocks/helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,kDAAkD;AAClD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;CAK5B,CAAA;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQnF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,GAAG,GAAG,GAAG,GACpB,OAAO,CAAC,MAAM,CAAC,CAejB"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * measure-blocks/helpers.ts — Shared helpers and constants used by multiple
3
+ * per-element-type measurement modules.
4
+ */
5
+ import { getPretext } from '../measure-text.js';
6
+ import { LINE_HEIGHT_BODY } from '../render-utils.js';
7
+ /** Heading level size multipliers and defaults */
8
+ export const HEADING_DEFAULTS = {
9
+ 1: { sizeMultiplier: 2.0, fontWeight: 700, spaceAfter: 16, spaceBefore: 28 },
10
+ 2: { sizeMultiplier: 1.5, fontWeight: 700, spaceAfter: 12, spaceBefore: 24 },
11
+ 3: { sizeMultiplier: 1.25, fontWeight: 700, spaceAfter: 8, spaceBefore: 20 },
12
+ 4: { sizeMultiplier: 1.1, fontWeight: 700, spaceAfter: 6, spaceBefore: 16 },
13
+ };
14
+ /**
15
+ * Resolve preset callout style colors
16
+ */
17
+ export function resolveCalloutColors(style) {
18
+ switch (style) {
19
+ case 'info': return { bg: '#EFF6FF', border: '#3B82F6' };
20
+ case 'warning': return { bg: '#FFFBEB', border: '#F59E0B' };
21
+ case 'tip': return { bg: '#F0FDF4', border: '#22C55E' };
22
+ case 'note': return { bg: '#F9FAFB', border: '#9CA3AF' };
23
+ default: return { bg: '#F8F9FA', border: '#0070F3' };
24
+ }
25
+ }
26
+ /**
27
+ * Measure the natural (unwrapped) width of text in pt.
28
+ * Uses a very large maxWidth so Pretext never wraps — returns the actual line width.
29
+ */
30
+ export async function measureNaturalTextWidth(text, fontSize, fontFamily, fontWeight) {
31
+ if (!text || text.trim() === '')
32
+ return 0;
33
+ const { prepareWithSegments, layoutWithLines } = await getPretext();
34
+ const weightPrefix = fontWeight === 700 ? 'bold ' : '';
35
+ const fontString = `${weightPrefix}${fontSize}px ${fontFamily}`;
36
+ // Use a very large width to prevent wrapping; also handle multi-line text (\n)
37
+ // by taking the max line width across all lines
38
+ const prepared = prepareWithSegments(text, fontString, { whiteSpace: 'pre-wrap' });
39
+ const result = layoutWithLines(prepared, 99999, fontSize * LINE_HEIGHT_BODY);
40
+ const lines = result.lines ?? [];
41
+ return lines.reduce((max, line) => Math.max(max, line.width), 0);
42
+ }
43
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/measure-blocks/helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,kDAAkD;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAG,UAAU,EAAE,GAAY,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;IACtF,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAG,UAAU,EAAE,GAAY,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;IACtF,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,GAAY,EAAE,UAAU,EAAE,CAAC,EAAG,WAAW,EAAE,EAAE,EAAE;IACtF,CAAC,EAAE,EAAE,cAAc,EAAE,GAAG,EAAG,UAAU,EAAE,GAAY,EAAE,UAAU,EAAE,CAAC,EAAG,WAAW,EAAE,EAAE,EAAE;CACvF,CAAA;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM,CAAC,CAAI,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAC3D,KAAK,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAC3D,KAAK,KAAK,CAAC,CAAK,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAC3D,KAAK,MAAM,CAAC,CAAI,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAC3D,OAAO,CAAC,CAAQ,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC7D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,IAAY,EACZ,QAAgB,EAChB,UAAkB,EAClB,UAAqB;IAErB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,CAAC,CAAA;IAEzC,MAAM,EAAE,mBAAmB,EAAE,eAAe,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA;IAEnE,MAAM,YAAY,GAAG,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;IACtD,MAAM,UAAU,GAAG,GAAG,YAAY,GAAG,QAAQ,MAAM,UAAU,EAAE,CAAA;IAE/D,+EAA+E;IAC/E,gDAAgD;IAChD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAA;IAClF,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,gBAAgB,CAAC,CAAA;IAC5E,MAAM,KAAK,GAA2C,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA;IAExE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;AAClE,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * measure-blocks/highlight.ts — Syntax highlighting for code blocks.
3
+ *
4
+ * NOTE: _hljsCache and _hljsLoadAttempted are intentionally module-scoped here.
5
+ * They implement process-wide idempotent caching of the dynamic highlight.js
6
+ * import. Do not thread these through a context object — module state is correct.
7
+ */
8
+ /** Default GitHub-light-inspired highlight theme colors */
9
+ export declare const DEFAULT_HIGHLIGHT_THEME: Record<string, string>;
10
+ /**
11
+ * Tokenize source code into per-line colored spans using highlight.js.
12
+ * Returns undefined if highlight.js is not installed (renderer falls back to plain text).
13
+ */
14
+ export declare function tokenizeCodeForHighlighting(text: string, language: string, defaultColor: string, measuredLineCount: number, customTheme?: Record<string, string | undefined>): Promise<Array<Array<{
15
+ text: string;
16
+ color: string;
17
+ }>> | undefined>;
18
+ /**
19
+ * Parse highlight.js HTML into per-line token arrays.
20
+ * Handles nested spans (e.g. string interpolation) by tracking a color stack.
21
+ */
22
+ export declare function parseHighlightHtml(html: string, defaultColor: string, theme: Record<string, string>): Array<Array<{
23
+ text: string;
24
+ color: string;
25
+ }>>;
26
+ //# sourceMappingURL=highlight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../../src/measure-blocks/highlight.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2DAA2D;AAC3D,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA4B1D,CAAA;AAMD;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EACzB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC/C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GAAG,SAAS,CAAC,CA0CpE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,KAAK,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAgE/C"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * measure-blocks/highlight.ts — Syntax highlighting for code blocks.
3
+ *
4
+ * NOTE: _hljsCache and _hljsLoadAttempted are intentionally module-scoped here.
5
+ * They implement process-wide idempotent caching of the dynamic highlight.js
6
+ * import. Do not thread these through a context object — module state is correct.
7
+ */
8
+ /** Default GitHub-light-inspired highlight theme colors */
9
+ export const DEFAULT_HIGHLIGHT_THEME = {
10
+ keyword: '#cf222e',
11
+ string: '#0a3069',
12
+ comment: '#6e7781',
13
+ number: '#0550ae',
14
+ function: '#8250df',
15
+ title: '#8250df',
16
+ built_in: '#0550ae',
17
+ literal: '#0550ae',
18
+ type: '#953800',
19
+ meta: '#cf222e',
20
+ attr: '#0550ae',
21
+ name: '#0550ae',
22
+ params: '#24292f',
23
+ punctuation: '#24292f',
24
+ operator: '#24292f',
25
+ regexp: '#0a3069',
26
+ variable: '#953800',
27
+ property: '#0550ae',
28
+ tag: '#116329',
29
+ selector: '#116329',
30
+ subst: '#24292f',
31
+ 'template-tag': '#cf222e',
32
+ 'template-string': '#0a3069',
33
+ symbol: '#0550ae',
34
+ addition: '#116329',
35
+ deletion: '#cf222e',
36
+ section: '#0550ae',
37
+ };
38
+ /** Cached highlight.js module (loaded once, reused across code blocks) */
39
+ let _hljsCache = null;
40
+ let _hljsLoadAttempted = false;
41
+ /**
42
+ * Tokenize source code into per-line colored spans using highlight.js.
43
+ * Returns undefined if highlight.js is not installed (renderer falls back to plain text).
44
+ */
45
+ export async function tokenizeCodeForHighlighting(text, language, defaultColor, measuredLineCount, customTheme) {
46
+ if (!_hljsLoadAttempted) {
47
+ _hljsLoadAttempted = true;
48
+ try {
49
+ const mod = await import('highlight.js');
50
+ _hljsCache = mod.default ?? mod;
51
+ }
52
+ catch (e) {
53
+ const code = e?.code;
54
+ if (code !== 'ERR_MODULE_NOT_FOUND' && code !== 'MODULE_NOT_FOUND') {
55
+ console.warn(`[pretext-pdf] highlight.js installed but failed to load: ${e instanceof Error ? e.message : String(e)}`);
56
+ }
57
+ // ERR_MODULE_NOT_FOUND / MODULE_NOT_FOUND is expected when optional dep absent — silent
58
+ }
59
+ }
60
+ if (!_hljsCache)
61
+ return undefined;
62
+ const hljs = _hljsCache;
63
+ const theme = { ...DEFAULT_HIGHLIGHT_THEME };
64
+ if (customTheme) {
65
+ for (const [k, v] of Object.entries(customTheme)) {
66
+ if (v !== undefined)
67
+ theme[k] = v;
68
+ }
69
+ }
70
+ let highlighted;
71
+ try {
72
+ const result = language === 'auto'
73
+ ? hljs.highlightAuto(text)
74
+ : hljs.highlight(text, { language });
75
+ highlighted = result.value;
76
+ }
77
+ catch (e) {
78
+ console.warn(`[pretext-pdf] syntax highlighting failed for language "${language}": ${e instanceof Error ? e.message : String(e)}`);
79
+ return undefined;
80
+ }
81
+ const tokens = parseHighlightHtml(highlighted, defaultColor, theme);
82
+ // Safety check: tokenizer splits on \n but the layout engine may wrap long lines.
83
+ // If line counts don't match, the colors would be applied to the wrong lines.
84
+ if (tokens.length !== measuredLineCount)
85
+ return undefined;
86
+ return tokens;
87
+ }
88
+ /**
89
+ * Parse highlight.js HTML into per-line token arrays.
90
+ * Handles nested spans (e.g. string interpolation) by tracking a color stack.
91
+ */
92
+ export function parseHighlightHtml(html, defaultColor, theme) {
93
+ const lines = [[]];
94
+ const colorStack = [defaultColor];
95
+ let i = 0;
96
+ while (i < html.length) {
97
+ if (html[i] === '<') {
98
+ const closeTag = html.indexOf('>', i);
99
+ if (closeTag === -1)
100
+ break;
101
+ const tag = html.slice(i, closeTag + 1);
102
+ if (tag.startsWith('<span')) {
103
+ // Extract class: <span class="hljs-keyword"> or <span class="hljs-template-string">
104
+ const classMatch = tag.match(/class="hljs-([\w-]+)"/);
105
+ const cls = classMatch ? classMatch[1] : '';
106
+ colorStack.push(theme[cls] ?? defaultColor);
107
+ }
108
+ else if (tag === '</span>') {
109
+ if (colorStack.length > 1)
110
+ colorStack.pop();
111
+ }
112
+ i = closeTag + 1;
113
+ }
114
+ else if (html[i] === '&') {
115
+ // HTML entities: named (&amp;), hex (&#x3D;), decimal (&#96;)
116
+ const semi = html.indexOf(';', i);
117
+ if (semi !== -1 && semi - i < 10) {
118
+ const entity = html.slice(i, semi + 1);
119
+ let ch;
120
+ if (entity === '&amp;')
121
+ ch = '&';
122
+ else if (entity === '&lt;')
123
+ ch = '<';
124
+ else if (entity === '&gt;')
125
+ ch = '>';
126
+ else if (entity === '&quot;')
127
+ ch = '"';
128
+ else if (entity === '&#x27;' || entity === '&apos;')
129
+ ch = "'";
130
+ else if (entity.startsWith('&#x'))
131
+ ch = String.fromCodePoint(parseInt(entity.slice(3, -1), 16));
132
+ else if (entity.startsWith('&#'))
133
+ ch = String.fromCodePoint(parseInt(entity.slice(2, -1), 10));
134
+ else
135
+ ch = entity; // unknown named entity — keep as-is
136
+ lines[lines.length - 1].push({ text: ch, color: colorStack[colorStack.length - 1] });
137
+ i = semi + 1;
138
+ }
139
+ else {
140
+ lines[lines.length - 1].push({ text: '&', color: colorStack[colorStack.length - 1] });
141
+ i++;
142
+ }
143
+ }
144
+ else if (html[i] === '\n') {
145
+ lines.push([]);
146
+ i++;
147
+ }
148
+ else {
149
+ // Regular text — accumulate consecutive chars with same color
150
+ const color = colorStack[colorStack.length - 1];
151
+ let end = i + 1;
152
+ while (end < html.length && html[end] !== '<' && html[end] !== '&' && html[end] !== '\n')
153
+ end++;
154
+ lines[lines.length - 1].push({ text: html.slice(i, end), color });
155
+ i = end;
156
+ }
157
+ }
158
+ // Merge adjacent tokens with the same color on each line (fewer drawText calls)
159
+ for (const line of lines) {
160
+ for (let j = line.length - 1; j > 0; j--) {
161
+ if (line[j].color === line[j - 1].color) {
162
+ line[j - 1].text += line[j].text;
163
+ line.splice(j, 1);
164
+ }
165
+ }
166
+ }
167
+ return lines;
168
+ }
169
+ //# sourceMappingURL=highlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.js","sourceRoot":"","sources":["../../src/measure-blocks/highlight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * measure-blocks/image.ts — Image measurement (single image + float image block).
3
+ */
4
+ import type { ImageElement, PdfDocument } from '../types.js';
5
+ import type { MeasuredBlock, ImageMap } from '../types-internal.js';
6
+ /** Measure an image element with its known imageMap key */
7
+ export declare function measureImageWithKey(element: ImageElement, imageKey: string, imageMap: ImageMap, contentWidth: number, pageContentHeight: number): Promise<MeasuredBlock>;
8
+ export declare function measureFloatImageBlock(element: ImageElement, imageKey: string, imageMap: ImageMap, contentWidth: number, pageContentHeight: number, doc: PdfDocument, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
9
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/measure-blocks/image.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,KAAK,EACV,aAAa,EAAqB,QAAQ,EAC3C,MAAM,sBAAsB,CAAA;AAO7B,2DAA2D;AAC3D,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,aAAa,CAAC,CAqExB;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EACzB,GAAG,EAAE,WAAW,EAChB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CAkFxB"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * measure-blocks/image.ts — Image measurement (single image + float image block).
3
+ */
4
+ import { PretextPdfError } from '../errors.js';
5
+ import { measureRichText } from '../rich-text.js';
6
+ import { buildFontKey } from '../measure.js';
7
+ import { measureText } from '../measure-text.js';
8
+ import { LINE_HEIGHT_BODY } from '../render-utils.js';
9
+ /** Measure an image element with its known imageMap key */
10
+ export async function measureImageWithKey(element, imageKey, imageMap, contentWidth, pageContentHeight) {
11
+ const pdfImage = imageMap.get(imageKey);
12
+ if (!pdfImage) {
13
+ throw new PretextPdfError('IMAGE_LOAD_FAILED', `Image "${imageKey}": not found in imageMap. This is an internal error — please report it.`);
14
+ }
15
+ // Natural dimensions (in original pixels — aspect ratio is what matters, not the pixel count)
16
+ const naturalWidth = pdfImage.width;
17
+ const naturalHeight = pdfImage.height;
18
+ // Resolve render dimensions (in pt)
19
+ let renderWidth;
20
+ let renderHeight;
21
+ if (element.width !== undefined && element.height !== undefined) {
22
+ // Both provided: use as-is
23
+ renderWidth = element.width;
24
+ renderHeight = element.height;
25
+ }
26
+ else if (element.width !== undefined) {
27
+ // Width only: scale height
28
+ renderWidth = element.width;
29
+ renderHeight = renderWidth * (naturalHeight / naturalWidth);
30
+ }
31
+ else if (element.height !== undefined) {
32
+ // Height only: scale width
33
+ renderHeight = element.height;
34
+ renderWidth = renderHeight * (naturalWidth / naturalHeight);
35
+ }
36
+ else {
37
+ // Neither: fit to content width
38
+ renderWidth = contentWidth;
39
+ renderHeight = renderWidth * (naturalHeight / naturalWidth);
40
+ }
41
+ // Clamp to content width
42
+ if (renderWidth > contentWidth) {
43
+ const scale = contentWidth / renderWidth;
44
+ renderWidth = contentWidth;
45
+ renderHeight = renderHeight * scale;
46
+ }
47
+ // Validate height doesn't exceed page
48
+ if (renderHeight > pageContentHeight) {
49
+ throw new PretextPdfError('IMAGE_TOO_TALL', `Image "${imageKey}" would render at ${renderHeight.toFixed(1)}pt tall, which exceeds the page content area (${pageContentHeight.toFixed(1)}pt). ` +
50
+ `Reduce 'height' or increase page size/reduce margins.`);
51
+ }
52
+ const imageData = {
53
+ imageKey,
54
+ renderWidth,
55
+ renderHeight,
56
+ align: element.align ?? 'left',
57
+ };
58
+ return {
59
+ element,
60
+ height: renderHeight,
61
+ lines: [],
62
+ fontSize: 0,
63
+ lineHeight: 0,
64
+ fontKey: '',
65
+ spaceAfter: element.spaceAfter ?? 0,
66
+ spaceBefore: element.spaceBefore ?? 0,
67
+ imageData,
68
+ };
69
+ }
70
+ export async function measureFloatImageBlock(element, imageKey, imageMap, contentWidth, pageContentHeight, doc, wordWidthCache) {
71
+ const floatWidth = element.floatWidth ?? (contentWidth * 0.35);
72
+ const floatGap = element.floatGap ?? 12;
73
+ const textColWidth = contentWidth - floatWidth - floatGap;
74
+ if (textColWidth < 50) {
75
+ throw new PretextPdfError('COLUMN_WIDTH_TOO_NARROW', `Float image: text column would be ${textColWidth.toFixed(1)}pt (minimum 50pt). ` +
76
+ `Reduce floatWidth or increase page width.`);
77
+ }
78
+ // Measure the image at floatWidth using a synthetic element
79
+ const syntheticEl = {
80
+ type: 'image',
81
+ src: element.src,
82
+ ...(element.format !== undefined ? { format: element.format } : {}),
83
+ width: floatWidth,
84
+ align: 'left',
85
+ spaceAfter: 0,
86
+ spaceBefore: 0,
87
+ };
88
+ const imageBlock = await measureImageWithKey(syntheticEl, imageKey, imageMap, floatWidth, pageContentHeight);
89
+ const imageRenderWidth = imageBlock.imageData.renderWidth;
90
+ const imageRenderHeight = imageBlock.imageData.renderHeight;
91
+ // Measure the float text (plain or rich)
92
+ const fontSize = element.floatFontSize ?? doc.defaultFontSize ?? 12;
93
+ const lineHeight = fontSize * LINE_HEIGHT_BODY;
94
+ const fontFamily = element.floatFontFamily ?? doc.defaultFont ?? 'Inter';
95
+ const fontKey = buildFontKey(fontFamily, 400, 'normal');
96
+ let textLines = [];
97
+ let richFloatLines;
98
+ if (element.floatSpans) {
99
+ richFloatLines = await measureRichText(element.floatSpans, fontSize, lineHeight, textColWidth, 'left', doc);
100
+ }
101
+ else {
102
+ textLines = await measureText(element.floatText, fontSize, fontFamily, 400, textColWidth, lineHeight, undefined, wordWidthCache);
103
+ }
104
+ // Column X positions
105
+ const imageColX = element.float === 'left' ? 0 : textColWidth + floatGap;
106
+ const textColX = element.float === 'left' ? floatWidth + floatGap : 0;
107
+ const textHeight = richFloatLines
108
+ ? richFloatLines.reduce((sum, l) => sum + l.lineHeight, 0)
109
+ : textLines.length * lineHeight;
110
+ const compositeHeight = Math.max(imageRenderHeight, textHeight);
111
+ return {
112
+ element,
113
+ height: compositeHeight,
114
+ lines: [],
115
+ fontSize: 0,
116
+ lineHeight: 0,
117
+ fontKey: '',
118
+ spaceAfter: element.spaceAfter ?? 0,
119
+ spaceBefore: element.spaceBefore ?? 0,
120
+ floatData: {
121
+ imageKey,
122
+ imageRenderWidth,
123
+ imageRenderHeight,
124
+ imageColX,
125
+ textColX,
126
+ textColWidth,
127
+ textLines,
128
+ ...(richFloatLines ? { richFloatLines } : {}),
129
+ textFontKey: fontKey,
130
+ textFontSize: fontSize,
131
+ textLineHeight: lineHeight,
132
+ textColor: element.floatColor ?? '#000000',
133
+ },
134
+ };
135
+ }
136
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/measure-blocks/image.ts"],"names":[],"mappings":"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"}