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
@@ -0,0 +1,231 @@
1
+ /**
2
+ * measure-blocks/table/measure.ts — Table cell + row measurement.
3
+ */
4
+ import { buildFontKey } from '../../measure.js';
5
+ import { measureText, detectAndReorderRTL } from '../../measure-text.js';
6
+ import { LINE_HEIGHT_BODY } from '../../render-utils.js';
7
+ import { measureNaturalTextWidth } from '../helpers.js';
8
+ import { buildSpanGrid, computeActiveBoundaries } from './spans.js';
9
+ import { resolveColumnWidths } from './columns.js';
10
+ export async function measureTable(element, contentWidth, doc, baseFontSize, hyphenatorOpts, wordWidthCache) {
11
+ const baseFontFamily = doc.defaultFont ?? 'Inter';
12
+ const fontSize = element.fontSize ?? baseFontSize;
13
+ const cellPaddingH = element.cellPaddingH ?? 8;
14
+ const cellPaddingV = element.cellPaddingV ?? 6;
15
+ const borderWidth = element.borderWidth ?? 0.5;
16
+ const borderColor = element.borderColor ?? '#cccccc';
17
+ const headerBgColor = element.headerBgColor ?? '#f5f5f5';
18
+ // Build span occupancy grid (needed for correct colStart tracking in all passes)
19
+ const spanGrid = buildSpanGrid(element.rows);
20
+ // Pre-pass: measure natural widths for 'auto' columns — run all in parallel
21
+ const hasAutoColumns = element.columns.some(c => c.width === 'auto');
22
+ let naturalWidths;
23
+ if (hasAutoColumns) {
24
+ naturalWidths = new Array(element.columns.length).fill(0);
25
+ const jobs = [];
26
+ for (let rowIdx = 0; rowIdx < element.rows.length; rowIdx++) {
27
+ const row = element.rows[rowIdx];
28
+ let colIdx = 0;
29
+ for (const cell of row.cells) {
30
+ while (spanGrid.has(`${rowIdx},${colIdx}`))
31
+ colIdx++;
32
+ const cs = cell.colspan ?? 1;
33
+ if (element.columns[colIdx]?.width === 'auto') {
34
+ jobs.push({
35
+ colIdx, cs,
36
+ fontWeight: (cell.fontWeight ?? (row.isHeader ? 700 : 400)),
37
+ cellFontSize: cell.fontSize ?? fontSize,
38
+ cellFamily: cell.fontFamily ?? baseFontFamily,
39
+ text: cell.text,
40
+ });
41
+ }
42
+ colIdx += cs;
43
+ }
44
+ }
45
+ // Measure all auto cells in parallel
46
+ const widths = await Promise.all(jobs.map(j => measureNaturalTextWidth(j.text, j.cellFontSize, j.cellFamily, j.fontWeight)));
47
+ // Assign results back
48
+ for (let i = 0; i < jobs.length; i++) {
49
+ const { colIdx, cs } = jobs[i];
50
+ const cellNaturalWidth = widths[i] + 2 * cellPaddingH;
51
+ const perColumn = cellNaturalWidth / cs;
52
+ for (let si = colIdx; si < colIdx + cs && si < element.columns.length; si++) {
53
+ if (element.columns[si]?.width === 'auto') {
54
+ naturalWidths[si] = Math.max(naturalWidths[si], perColumn);
55
+ }
56
+ }
57
+ }
58
+ }
59
+ // Resolve column widths (passes naturalWidths for 'auto' columns)
60
+ const columnWidths = resolveColumnWidths(element.columns, contentWidth, cellPaddingH, borderWidth, naturalWidths);
61
+ // Determine header row count
62
+ const headerRowCount = element.headerRows !== undefined
63
+ ? element.headerRows
64
+ : element.rows.filter(r => r.isHeader).length;
65
+ const allCellMeta = [];
66
+ for (let rowIdx = 0; rowIdx < element.rows.length; rowIdx++) {
67
+ const row = element.rows[rowIdx];
68
+ let colStart = 0;
69
+ for (const cell of row.cells) {
70
+ while (spanGrid.has(`${rowIdx},${colStart}`))
71
+ colStart++;
72
+ const cs = cell.colspan ?? 1;
73
+ const rs = cell.rowspan ?? 1;
74
+ const col = element.columns[colStart];
75
+ let mergedWidth = 0;
76
+ for (let si = colStart; si < colStart + cs && si < columnWidths.length; si++) {
77
+ mergedWidth += columnWidths[si];
78
+ if (si < colStart + cs - 1)
79
+ mergedWidth += borderWidth;
80
+ }
81
+ const fontWeight = (cell.fontWeight ?? (row.isHeader ? 700 : 400));
82
+ const fontFamily = cell.fontFamily ?? baseFontFamily;
83
+ const cellFontSize = cell.fontSize ?? fontSize;
84
+ const cellLineHeight = doc.defaultLineHeight ?? (cellFontSize * LINE_HEIGHT_BODY);
85
+ const cellFontKey = buildFontKey(fontFamily, fontWeight, 'normal');
86
+ const textWidth = mergedWidth - 2 * cellPaddingH - borderWidth;
87
+ const cellDir = (cell.dir ?? element.dir ?? 'auto');
88
+ allCellMeta.push({ cell, row, rowIdx, colStart, cs, rs, col, mergedWidth, fontWeight, fontFamily, cellFontSize, cellLineHeight, cellFontKey, textWidth, cellDir });
89
+ colStart += cs;
90
+ }
91
+ }
92
+ // Step 2: Run all RTL detection + text measurement in parallel across the whole table
93
+ const cellResults = await Promise.all(allCellMeta.map(async (m) => {
94
+ const { visual: cellVisualText, isRTL: cellIsRTL } = await detectAndReorderRTL(m.cell.text, m.cellDir);
95
+ const lines = await measureText(cellVisualText, m.cellFontSize, m.fontFamily, m.fontWeight, Math.max(m.textWidth, 1), m.cellLineHeight, hyphenatorOpts, wordWidthCache);
96
+ return { cellVisualText, cellIsRTL, lines };
97
+ }));
98
+ const cellByKey = new Map();
99
+ for (let i = 0; i < allCellMeta.length; i++) {
100
+ const m = allCellMeta[i];
101
+ cellByKey.set(`${m.rowIdx},${m.colStart}`, { meta: m, result: cellResults[i] });
102
+ }
103
+ // Sub-pass 3a: Compute raw row heights from non-spanning cells only
104
+ const rowHeights = new Array(element.rows.length).fill(0);
105
+ for (const { meta: m, result } of cellByKey.values()) {
106
+ if (m.rs === 1) {
107
+ const cellContentHeight = Math.max(result.lines.length, 1) * m.cellLineHeight;
108
+ rowHeights[m.rowIdx] = Math.max(rowHeights[m.rowIdx], cellContentHeight);
109
+ }
110
+ }
111
+ for (let ri = 0; ri < rowHeights.length; ri++) {
112
+ rowHeights[ri] = (rowHeights[ri] ?? 0) + 2 * cellPaddingV;
113
+ }
114
+ // Sub-pass 3b: Expand last spanned row if spanning cell needs more space
115
+ for (const { meta: m, result } of cellByKey.values()) {
116
+ if (m.rs > 1) {
117
+ const cellContentHeight = Math.max(result.lines.length, 1) * m.cellLineHeight + 2 * cellPaddingV;
118
+ let spanHeight = 0;
119
+ for (let r2 = m.rowIdx; r2 < m.rowIdx + m.rs && r2 < rowHeights.length; r2++) {
120
+ spanHeight += rowHeights[r2];
121
+ }
122
+ if (cellContentHeight > spanHeight) {
123
+ const lastRowIdx = Math.min(m.rowIdx + m.rs - 1, rowHeights.length - 1);
124
+ rowHeights[lastRowIdx] += cellContentHeight - spanHeight;
125
+ }
126
+ }
127
+ }
128
+ // Sub-pass 3c: Build measuredRows, inserting placeholder cells for rowspan continuations
129
+ const measuredRows = [];
130
+ const numColumns = element.columns.length;
131
+ for (let rowIdx = 0; rowIdx < element.rows.length; rowIdx++) {
132
+ const row = element.rows[rowIdx];
133
+ const rowHeight = rowHeights[rowIdx];
134
+ const measuredCells = [];
135
+ let hasRowspan = false;
136
+ let colCursor = 0;
137
+ while (colCursor < numColumns) {
138
+ const spanEntry = spanGrid.get(`${rowIdx},${colCursor}`);
139
+ if (spanEntry) {
140
+ // Only insert ONE placeholder per span group (at the leftmost column of the span)
141
+ if (colCursor === spanEntry.originColStart) {
142
+ const originCell = cellByKey.get(`${spanEntry.originRowIdx},${spanEntry.originColStart}`);
143
+ const pw = originCell?.meta.mergedWidth ?? (columnWidths[colCursor] ?? 0);
144
+ measuredCells.push({
145
+ lines: [], fontSize: 0, lineHeight: 0, fontKey: '', fontFamily: '',
146
+ align: 'left', color: '#000000',
147
+ colspan: spanEntry.colspan, mergedWidth: pw,
148
+ isSpanPlaceholder: true,
149
+ });
150
+ colCursor += spanEntry.colspan;
151
+ }
152
+ else {
153
+ // Mid-span column not at origin — advance past the full span group
154
+ colCursor += spanEntry.colspan;
155
+ }
156
+ }
157
+ else {
158
+ const cellAtCol = cellByKey.get(`${rowIdx},${colCursor}`);
159
+ if (!cellAtCol) {
160
+ colCursor++;
161
+ continue;
162
+ }
163
+ const { meta: m, result: { cellIsRTL, lines } } = cellAtCol;
164
+ let spanHeight;
165
+ if (m.rs > 1) {
166
+ spanHeight = 0;
167
+ for (let r2 = rowIdx; r2 < rowIdx + m.rs && r2 < rowHeights.length; r2++) {
168
+ spanHeight += rowHeights[r2];
169
+ }
170
+ hasRowspan = true;
171
+ }
172
+ const align = m.cell.align ?? m.col.align ?? (cellIsRTL ? 'right' : 'left');
173
+ const measuredCell = {
174
+ lines,
175
+ fontSize: m.cellFontSize,
176
+ lineHeight: m.cellLineHeight,
177
+ fontKey: m.cellFontKey,
178
+ fontFamily: m.fontFamily,
179
+ align,
180
+ color: m.cell.color ?? '#000000',
181
+ colspan: m.cs,
182
+ mergedWidth: m.mergedWidth,
183
+ isRTL: cellIsRTL,
184
+ ...(m.cell.tabularNumbers !== undefined && { tabularNumbers: m.cell.tabularNumbers }),
185
+ ...(m.rs > 1 ? { rowspan: m.rs } : {}),
186
+ ...(spanHeight !== undefined ? { spanHeight } : {}),
187
+ };
188
+ if (m.cell.bgColor !== undefined)
189
+ measuredCell.bgColor = m.cell.bgColor;
190
+ measuredCells.push(measuredCell);
191
+ colCursor += m.cs;
192
+ }
193
+ }
194
+ const activeBoundaries = computeActiveBoundaries(measuredCells, numColumns);
195
+ measuredRows.push({
196
+ cells: measuredCells,
197
+ height: rowHeight,
198
+ isHeader: row.isHeader ?? false,
199
+ activeBoundaries,
200
+ ...(hasRowspan ? { hasRowspan: true } : {}),
201
+ });
202
+ }
203
+ // Header rows are the first N rows
204
+ const headerRows = measuredRows.slice(0, headerRowCount);
205
+ const headerRowHeight = headerRows.reduce((sum, r) => sum + r.height, 0);
206
+ // Total table height = sum of all row heights
207
+ const totalHeight = measuredRows.reduce((sum, r) => sum + r.height, 0);
208
+ const tableData = {
209
+ columnWidths,
210
+ rows: measuredRows,
211
+ headerRowCount,
212
+ headerRowHeight,
213
+ cellPaddingH,
214
+ cellPaddingV,
215
+ borderWidth,
216
+ borderColor,
217
+ headerBgColor,
218
+ };
219
+ return {
220
+ element,
221
+ height: totalHeight,
222
+ lines: [],
223
+ fontSize: 0,
224
+ lineHeight: 0,
225
+ fontKey: '',
226
+ spaceAfter: element.spaceAfter ?? 0,
227
+ spaceBefore: element.spaceBefore ?? 0,
228
+ tableData,
229
+ };
230
+ }
231
+ //# sourceMappingURL=measure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.js","sourceRoot":"","sources":["../../../src/measure-blocks/table/measure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * measure-blocks/table/spans.ts — Table span-grid construction and active-boundary
3
+ * computation. Pure synchronous helpers.
4
+ */
5
+ import type { TableRow } from '../../types.js';
6
+ export type SpanEntry = {
7
+ originRowIdx: number;
8
+ originColStart: number;
9
+ colspan: number;
10
+ rowspan: number;
11
+ };
12
+ /** Build a map from "rowIdx,colIdx" → span origin info for all positions occupied by a rowspan cell from an earlier row. */
13
+ export declare function buildSpanGrid(rows: TableRow[]): Map<string, SpanEntry>;
14
+ /**
15
+ * Compute which column boundaries have visible vertical lines.
16
+ * A boundary is "active" (visible) if it's not spanned by any merged cell.
17
+ * Returns array of boundary indices (0 = between col 0 and 1, 1 = between col 1 and 2, etc.)
18
+ * where vertical lines should be drawn.
19
+ *
20
+ * Example: 3 columns with a cell spanning cols 0-1 → active boundaries are [1] (only between cols 1-2)
21
+ */
22
+ export declare function computeActiveBoundaries(cells: Array<{
23
+ colspan?: number;
24
+ }>, colCount: number): number[];
25
+ //# sourceMappingURL=spans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spans.d.ts","sourceRoot":"","sources":["../../../src/measure-blocks/table/spans.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,4HAA4H;AAC5H,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAiBtE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBtG"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * measure-blocks/table/spans.ts — Table span-grid construction and active-boundary
3
+ * computation. Pure synchronous helpers.
4
+ */
5
+ /** Build a map from "rowIdx,colIdx" → span origin info for all positions occupied by a rowspan cell from an earlier row. */
6
+ export function buildSpanGrid(rows) {
7
+ const grid = new Map();
8
+ for (let ri = 0; ri < rows.length; ri++) {
9
+ let ci = 0;
10
+ for (const cell of rows[ri].cells) {
11
+ while (grid.has(`${ri},${ci}`))
12
+ ci++;
13
+ const cs = cell.colspan ?? 1;
14
+ const rs = cell.rowspan ?? 1;
15
+ for (let r2 = ri + 1; r2 < ri + rs; r2++) {
16
+ for (let c2 = ci; c2 < ci + cs; c2++) {
17
+ grid.set(`${r2},${c2}`, { originRowIdx: ri, originColStart: ci, colspan: cs, rowspan: rs });
18
+ }
19
+ }
20
+ ci += cs;
21
+ }
22
+ }
23
+ return grid;
24
+ }
25
+ /**
26
+ * Compute which column boundaries have visible vertical lines.
27
+ * A boundary is "active" (visible) if it's not spanned by any merged cell.
28
+ * Returns array of boundary indices (0 = between col 0 and 1, 1 = between col 1 and 2, etc.)
29
+ * where vertical lines should be drawn.
30
+ *
31
+ * Example: 3 columns with a cell spanning cols 0-1 → active boundaries are [1] (only between cols 1-2)
32
+ */
33
+ export function computeActiveBoundaries(cells, colCount) {
34
+ // Track which boundaries are "spanned" (internal to a merged cell)
35
+ const spannedBoundaries = new Set();
36
+ let colIdx = 0;
37
+ for (const cell of cells) {
38
+ const cs = cell.colspan ?? 1;
39
+ // Boundaries internal to this cell's span are: colIdx to colIdx + cs - 1
40
+ // The internal boundaries are colIdx, colIdx+1, ..., colIdx+cs-2
41
+ for (let b = colIdx; b < colIdx + cs - 1; b++) {
42
+ spannedBoundaries.add(b);
43
+ }
44
+ colIdx += cs;
45
+ }
46
+ // Active boundaries are all boundaries (0 to colCount-2) that are NOT spanned
47
+ const activeBoundaries = [];
48
+ for (let b = 0; b < colCount - 1; b++) {
49
+ if (!spannedBoundaries.has(b)) {
50
+ activeBoundaries.push(b);
51
+ }
52
+ }
53
+ return activeBoundaries;
54
+ }
55
+ //# sourceMappingURL=spans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spans.js","sourceRoot":"","sources":["../../../src/measure-blocks/table/spans.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,4HAA4H;AAC5H,MAAM,UAAU,aAAa,CAAC,IAAgB;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAqB,CAAA;IACzC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QACxC,IAAI,EAAE,GAAG,CAAC,CAAA;QACV,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,EAAE,CAAE,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;gBAAE,EAAE,EAAE,CAAA;YACpC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;YAC5B,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;gBACzC,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;oBACrC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;gBAC7F,CAAC;YACH,CAAC;YACD,EAAE,IAAI,EAAE,CAAA;QACV,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAkC,EAAE,QAAgB;IAC1F,mEAAmE;IACnE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAA;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAA;IAEd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;QAC5B,yEAAyE;QACzE,iEAAiE;QACjE,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;QACD,MAAM,IAAI,EAAE,CAAA;IACd,CAAC;IAED,8EAA8E;IAC9E,MAAM,gBAAgB,GAAa,EAAE,CAAA;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAA;AACzB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * measure-blocks/text-blocks.ts — Measurement helpers for text-bearing element
3
+ * types: paragraph, heading, blockquote, callout, code.
4
+ *
5
+ * Each helper is extracted from the original switch-statement body in
6
+ * measureBlock(). Behavior is identical — only the location changed.
7
+ */
8
+ import type { PdfDocument } from '../types.js';
9
+ import type { ParagraphElement, HeadingElement, BlockquoteElement, CalloutElement, CodeBlockElement } from '../types.js';
10
+ import type { MeasuredBlock } from '../types-internal.js';
11
+ import type { HyphenatorOpts } from '../measure-text.js';
12
+ export declare function measureParagraph(element: ParagraphElement, contentWidth: number, doc: PdfDocument, baseFontSize: number, baseFont: string, hyphenatorOpts?: HyphenatorOpts, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
13
+ export declare function measureHeading(element: HeadingElement, contentWidth: number, doc: PdfDocument, baseFontSize: number, baseFont: string, hyphenatorOpts?: HyphenatorOpts, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
14
+ export declare function measureBlockquote(element: BlockquoteElement, contentWidth: number, doc: PdfDocument, baseFontSize: number, baseFont: string, hyphenatorOpts?: HyphenatorOpts, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
15
+ export declare function measureCallout(element: CalloutElement, contentWidth: number, _doc: PdfDocument, baseFontSize: number, baseFont: string, hyphenatorOpts?: HyphenatorOpts, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
16
+ export declare function measureCode(element: CodeBlockElement, contentWidth: number, _doc: PdfDocument, baseFontSize: number, wordWidthCache?: Map<string, number>): Promise<MeasuredBlock>;
17
+ //# sourceMappingURL=text-blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-blocks.d.ts","sourceRoot":"","sources":["../../src/measure-blocks/text-blocks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EACV,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EACnD,cAAc,EAAE,gBAAgB,EACjC,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,sBAAsB,CAAA;AAItE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAKxD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,EACzB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,cAAc,EAC/B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CAwFxB;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,cAAc,EAC/B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CA2CxB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,iBAAiB,EAC1B,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,cAAc,EAC/B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CAwCxB;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,cAAc,EAC/B,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CA6CxB;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,EACzB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC,CAuCxB"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * measure-blocks/text-blocks.ts — Measurement helpers for text-bearing element
3
+ * types: paragraph, heading, blockquote, callout, code.
4
+ *
5
+ * Each helper is extracted from the original switch-statement body in
6
+ * measureBlock(). Behavior is identical — only the location changed.
7
+ */
8
+ import { PretextPdfError } from '../errors.js';
9
+ import { buildFontKey } from '../measure.js';
10
+ import { measureText, detectAndReorderRTL } from '../measure-text.js';
11
+ import { LINE_HEIGHT_BODY, LINE_HEIGHT_COMPACT } from '../render-utils.js';
12
+ import { HEADING_DEFAULTS, resolveCalloutColors } from './helpers.js';
13
+ import { tokenizeCodeForHighlighting } from './highlight.js';
14
+ export async function measureParagraph(element, contentWidth, doc, baseFontSize, baseFont, hyphenatorOpts, wordWidthCache) {
15
+ // Detect and reorder RTL text
16
+ const { visual: visualText, isRTL, logical: logicalText } = await detectAndReorderRTL(element.text, element.dir);
17
+ const fontSize = element.fontSize ?? doc.defaultParagraphStyle?.fontSize ?? baseFontSize;
18
+ // smallCaps renders at 80% of fontSize — measure at the same size to avoid
19
+ // overestimating block height and wasting vertical space
20
+ const effectiveFontSize = element.smallCaps === true ? fontSize * 0.8 : fontSize;
21
+ const lineHeight = element.lineHeight ?? doc.defaultParagraphStyle?.lineHeight ?? doc.defaultLineHeight ?? (effectiveFontSize * LINE_HEIGHT_BODY);
22
+ const fontFamily = element.fontFamily ?? doc.defaultParagraphStyle?.fontFamily ?? baseFont;
23
+ const fontWeight = element.fontWeight ?? doc.defaultParagraphStyle?.fontWeight ?? 400;
24
+ const fontKey = buildFontKey(fontFamily, fontWeight, 'normal');
25
+ const columns = element.columns ?? 1;
26
+ const columnGap = element.columnGap ?? 24;
27
+ let measureWidth = contentWidth;
28
+ let columnData;
29
+ // Multi-column layout
30
+ let computedColumnWidth = contentWidth;
31
+ if (columns > 1) {
32
+ if (columns > 6) {
33
+ throw new PretextPdfError('VALIDATION_ERROR', `columns must be 1–6, got ${columns}`);
34
+ }
35
+ computedColumnWidth = (contentWidth - (columns - 1) * columnGap) / columns;
36
+ if (computedColumnWidth < 50) {
37
+ throw new PretextPdfError('COLUMN_WIDTH_TOO_NARROW', `Column width would be ${computedColumnWidth.toFixed(1)}pt, which is below the minimum 50pt. Reduce columns, increase columnGap, or increase page width.`);
38
+ }
39
+ measureWidth = computedColumnWidth;
40
+ }
41
+ const opts = hyphenatorOpts && element.hyphenate !== false ? hyphenatorOpts : undefined;
42
+ // Compensate for letterSpacing: render adds `spacing` pts after each character,
43
+ // but pretext doesn't know about it. Reduce measureWidth so line-breaks happen
44
+ // before the rendered text would overflow. Formula: scale by avgCharWidth /
45
+ // (avgCharWidth + spacing), where avgCharWidth ≈ 0.5 * effectiveFontSize.
46
+ const letterSpacingValue = element.letterSpacing ?? doc.defaultParagraphStyle?.letterSpacing ?? 0;
47
+ if (letterSpacingValue > 0) {
48
+ const avgCharWidth = effectiveFontSize * 0.5;
49
+ measureWidth = Math.max(10, measureWidth * avgCharWidth / (avgCharWidth + letterSpacingValue));
50
+ }
51
+ // Measure post-reorder (visual-order) text because the renderer draws characters in
52
+ // visual order; measuring the logical string for an RTL run would pick break points
53
+ // that don't match what is actually drawn, producing wrong line widths.
54
+ //
55
+ // smallCaps uppercases at render time. Measure the same uppercase text so
56
+ // line-break widths match what the renderer actually draws.
57
+ const measureText_ = element.smallCaps === true ? visualText.toUpperCase() : visualText;
58
+ const lines = await measureText(measureText_, effectiveFontSize, fontFamily, fontWeight, measureWidth, lineHeight, opts, wordWidthCache);
59
+ if (columns > 1) {
60
+ const linesPerColumn = Math.max(1, Math.ceil(lines.length / columns));
61
+ columnData = { columnCount: columns, columnGap, columnWidth: computedColumnWidth, linesPerColumn };
62
+ }
63
+ // Construct result with or without columnData depending on columns value
64
+ const paraSpaceAfter = element.spaceAfter ?? doc.defaultParagraphStyle?.spaceAfter ?? 0;
65
+ const paraSpaceBefore = element.spaceBefore ?? doc.defaultParagraphStyle?.spaceBefore ?? 0;
66
+ if (columnData) {
67
+ return {
68
+ element,
69
+ height: columnData.linesPerColumn * lineHeight,
70
+ lines,
71
+ fontSize,
72
+ lineHeight,
73
+ fontKey,
74
+ spaceAfter: paraSpaceAfter,
75
+ spaceBefore: paraSpaceBefore,
76
+ columnData,
77
+ isRTL,
78
+ ...(isRTL && { logicalText }), // NEW: Only store logical text when RTL
79
+ };
80
+ }
81
+ else {
82
+ return {
83
+ element,
84
+ height: lines.length * lineHeight,
85
+ lines,
86
+ fontSize,
87
+ lineHeight,
88
+ fontKey,
89
+ spaceAfter: paraSpaceAfter,
90
+ spaceBefore: paraSpaceBefore,
91
+ isRTL,
92
+ ...(isRTL && { logicalText }), // NEW: Only store logical text when RTL
93
+ };
94
+ }
95
+ }
96
+ export async function measureHeading(element, contentWidth, doc, baseFontSize, baseFont, hyphenatorOpts, wordWidthCache) {
97
+ // Detect and reorder RTL text
98
+ const { visual: visualText, isRTL, logical: logicalText } = await detectAndReorderRTL(element.text, element.dir);
99
+ const defaults = HEADING_DEFAULTS[element.level];
100
+ const baseHeadingFontSize = doc.defaultParagraphStyle?.fontSize ?? baseFontSize;
101
+ const fontSize = element.fontSize ?? (baseHeadingFontSize * defaults.sizeMultiplier);
102
+ // smallCaps renders at 80% — measure at effective size
103
+ const effectiveFontSize = element.smallCaps === true ? fontSize * 0.8 : fontSize;
104
+ const lineHeight = element.lineHeight ?? doc.defaultParagraphStyle?.lineHeight ?? doc.defaultLineHeight ?? (effectiveFontSize * LINE_HEIGHT_COMPACT);
105
+ const fontFamily = element.fontFamily ?? doc.defaultParagraphStyle?.fontFamily ?? baseFont;
106
+ const fontWeight = element.fontWeight ?? doc.defaultParagraphStyle?.fontWeight ?? defaults.fontWeight;
107
+ const fontKey = buildFontKey(fontFamily, fontWeight, 'normal');
108
+ const opts = hyphenatorOpts && element.hyphenate !== false ? hyphenatorOpts : undefined;
109
+ // Compensate for letterSpacing (same logic as paragraph above)
110
+ const headingLetterSpacing = element.letterSpacing ?? doc.defaultParagraphStyle?.letterSpacing ?? 0;
111
+ const headingMeasureWidth = headingLetterSpacing > 0
112
+ ? Math.max(10, contentWidth * (effectiveFontSize * 0.5) / (effectiveFontSize * 0.5 + headingLetterSpacing))
113
+ : contentWidth;
114
+ // Measure post-reorder (visual-order) text because the renderer draws characters in
115
+ // visual order; measuring the logical string for an RTL run would pick break points
116
+ // that don't match what is actually drawn, producing wrong line widths.
117
+ //
118
+ // smallCaps uppercases at render time. Measure the same uppercase text so
119
+ // line-break widths match what the renderer actually draws.
120
+ const headingMeasureText = element.smallCaps === true ? visualText.toUpperCase() : visualText;
121
+ const lines = await measureText(headingMeasureText, effectiveFontSize, fontFamily, fontWeight, headingMeasureWidth, lineHeight, opts, wordWidthCache);
122
+ return {
123
+ element,
124
+ height: lines.length * lineHeight,
125
+ lines,
126
+ fontSize,
127
+ lineHeight,
128
+ fontKey,
129
+ spaceAfter: element.spaceAfter ?? doc.defaultParagraphStyle?.spaceAfter ?? defaults.spaceAfter,
130
+ spaceBefore: element.spaceBefore ?? doc.defaultParagraphStyle?.spaceBefore ?? defaults.spaceBefore,
131
+ isRTL,
132
+ ...(isRTL && { logicalText }), // NEW: Only store logical text when RTL
133
+ };
134
+ }
135
+ export async function measureBlockquote(element, contentWidth, doc, baseFontSize, baseFont, hyphenatorOpts, wordWidthCache) {
136
+ // Detect and reorder RTL text
137
+ const { visual: visualText, isRTL, logical: logicalText } = await detectAndReorderRTL(element.text, element.dir);
138
+ const fontSize = element.fontSize ?? baseFontSize;
139
+ const lineHeight = element.lineHeight ?? doc.defaultLineHeight ?? (fontSize * LINE_HEIGHT_BODY);
140
+ const fontFamily = element.fontFamily ?? baseFont;
141
+ const fontWeight = element.fontWeight ?? 400;
142
+ const fontStyle = element.fontStyle ?? 'normal';
143
+ const fontKey = buildFontKey(fontFamily, fontWeight, fontStyle);
144
+ const borderWidth = element.borderWidth ?? 3;
145
+ const paddingH = element.paddingH ?? element.padding ?? 16;
146
+ const paddingV = element.paddingV ?? element.padding ?? 10;
147
+ // Text area excludes left border + horizontal padding on both sides
148
+ const textWidth = contentWidth - borderWidth - 2 * paddingH;
149
+ // Measure post-reorder (visual-order) text because the renderer draws characters in
150
+ // visual order; measuring the logical string for an RTL run would pick break points
151
+ // that don't match what is actually drawn, producing wrong line widths.
152
+ const lines = await measureText(visualText, fontSize, fontFamily, fontWeight, Math.max(textWidth, 1), lineHeight, hyphenatorOpts, wordWidthCache);
153
+ // height = lines * lineHeight + padding top + padding bottom
154
+ const height = (lines.length || 1) * lineHeight + 2 * paddingV;
155
+ return {
156
+ element,
157
+ height,
158
+ lines,
159
+ fontSize,
160
+ lineHeight,
161
+ fontKey,
162
+ spaceAfter: element.spaceAfter ?? 12,
163
+ spaceBefore: element.spaceBefore ?? 0,
164
+ blockquotePaddingV: paddingV,
165
+ blockquotePaddingH: paddingH,
166
+ blockquoteBorderWidth: borderWidth,
167
+ isRTL,
168
+ ...(isRTL && { logicalText }), // NEW: Only store logical text when RTL
169
+ };
170
+ }
171
+ export async function measureCallout(element, contentWidth, _doc, baseFontSize, baseFont, hyphenatorOpts, wordWidthCache) {
172
+ const el = element;
173
+ const fs = el.fontSize ?? baseFontSize;
174
+ const lh = el.lineHeight ?? (fs * LINE_HEIGHT_BODY);
175
+ const ph = el.paddingH ?? el.padding ?? 16;
176
+ const pv = el.paddingV ?? el.padding ?? 10;
177
+ const family = el.fontFamily ?? baseFont;
178
+ const colors = resolveCalloutColors(el.style);
179
+ const borderColor = el.borderColor ?? colors.border;
180
+ const backgroundColor = el.backgroundColor ?? colors.bg;
181
+ const color = el.color ?? '#1F2937';
182
+ const titleColor = el.titleColor ?? borderColor;
183
+ // Measure title height (one line assumed, bold)
184
+ let titleHeight = 0;
185
+ if (el.title) {
186
+ titleHeight = fs * LINE_HEIGHT_COMPACT + 4; // compact line height + 4pt separator
187
+ }
188
+ // Measure content text
189
+ const innerWidth = contentWidth - ph * 2;
190
+ const lines = await measureText(el.content, fs, family, el.fontWeight ?? 400, Math.max(innerWidth, 1), lh, hyphenatorOpts, wordWidthCache);
191
+ const contentTextHeight = lines.length * lh;
192
+ const totalHeight = pv + titleHeight + contentTextHeight + pv;
193
+ // Construct calloutData via a typed literal so TypeScript enforces the
194
+ // full contract at the producer site (every field present, correct type).
195
+ const calloutData = {
196
+ titleHeight, paddingH: ph, paddingV: pv,
197
+ borderColor, backgroundColor, titleColor, color,
198
+ ...(el.title !== undefined ? { titleText: el.title } : {}),
199
+ };
200
+ return {
201
+ element,
202
+ height: totalHeight,
203
+ lines,
204
+ fontSize: fs,
205
+ lineHeight: lh,
206
+ fontKey: buildFontKey(family, el.fontWeight ?? 400, 'normal'),
207
+ spaceAfter: el.spaceAfter ?? 12,
208
+ spaceBefore: el.spaceBefore ?? 0,
209
+ calloutData,
210
+ };
211
+ }
212
+ export async function measureCode(element, contentWidth, _doc, baseFontSize, wordWidthCache) {
213
+ const fontSize = element.fontSize ?? Math.max(baseFontSize - 2, 8);
214
+ const lineHeight = element.lineHeight ?? (fontSize * LINE_HEIGHT_COMPACT);
215
+ const padding = element.padding ?? 8;
216
+ // Text area is narrower by padding on both sides
217
+ const textWidth = contentWidth - 2 * padding;
218
+ // Code blocks: never hyphenate — breaks would corrupt source code meaning
219
+ // Code blocks: always measure in logical (LTR) order — reordering breaks syntax
220
+ const lines = await measureText(element.text, fontSize, element.fontFamily, 400, Math.max(textWidth, 1), lineHeight, undefined, wordWidthCache);
221
+ // height = lines * lineHeight + padding top + padding bottom
222
+ const height = (lines.length || 1) * lineHeight + 2 * padding;
223
+ // Syntax highlighting: tokenize if language is set
224
+ let codeHighlightTokens;
225
+ if (element.language) {
226
+ codeHighlightTokens = await tokenizeCodeForHighlighting(element.text, element.language, element.color ?? '#24292f', lines.length, element.highlightTheme);
227
+ }
228
+ return {
229
+ element,
230
+ height,
231
+ lines,
232
+ fontSize,
233
+ lineHeight,
234
+ fontKey: buildFontKey(element.fontFamily, 400, 'normal'),
235
+ spaceAfter: element.spaceAfter ?? 12,
236
+ spaceBefore: element.spaceBefore ?? 12,
237
+ codePadding: padding,
238
+ ...(codeHighlightTokens ? { codeHighlightTokens } : {}),
239
+ isRTL: false, // Code blocks always LTR
240
+ };
241
+ }
242
+ //# sourceMappingURL=text-blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-blocks.js","sourceRoot":"","sources":["../../src/measure-blocks/text-blocks.ts"],"names":[],"mappings":"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"}