postext 1.23.0 → 1.24.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 (253) hide show
  1. package/dist/__tests__/bundle/bitmapInfo.test.d.ts +2 -0
  2. package/dist/__tests__/bundle/bitmapInfo.test.d.ts.map +1 -0
  3. package/dist/__tests__/bundle/bitmapInfo.test.js +78 -0
  4. package/dist/__tests__/bundle/bitmapInfo.test.js.map +1 -0
  5. package/dist/__tests__/bundle/designOverflowPin.test.d.ts +2 -0
  6. package/dist/__tests__/bundle/designOverflowPin.test.d.ts.map +1 -0
  7. package/dist/__tests__/bundle/designOverflowPin.test.js +87 -0
  8. package/dist/__tests__/bundle/designOverflowPin.test.js.map +1 -0
  9. package/dist/__tests__/bundle.test.js +1 -1
  10. package/dist/__tests__/bundle.test.js.map +1 -1
  11. package/dist/__tests__/codeBlocks.test.js +1 -1
  12. package/dist/__tests__/codeBlocks.test.js.map +1 -1
  13. package/dist/__tests__/design/designTextOverflow.test.d.ts +2 -0
  14. package/dist/__tests__/design/designTextOverflow.test.d.ts.map +1 -0
  15. package/dist/__tests__/design/designTextOverflow.test.js +102 -0
  16. package/dist/__tests__/design/designTextOverflow.test.js.map +1 -0
  17. package/dist/__tests__/exports.test.js +11 -0
  18. package/dist/__tests__/exports.test.js.map +1 -1
  19. package/dist/__tests__/frontmatterInvalid.test.d.ts +2 -0
  20. package/dist/__tests__/frontmatterInvalid.test.d.ts.map +1 -0
  21. package/dist/__tests__/frontmatterInvalid.test.js +101 -0
  22. package/dist/__tests__/frontmatterInvalid.test.js.map +1 -0
  23. package/dist/__tests__/hardBreaks.test.js +1 -1
  24. package/dist/__tests__/hardBreaks.test.js.map +1 -1
  25. package/dist/__tests__/headingFirstLineIndent.test.d.ts +2 -0
  26. package/dist/__tests__/headingFirstLineIndent.test.d.ts.map +1 -0
  27. package/dist/__tests__/headingFirstLineIndent.test.js +185 -0
  28. package/dist/__tests__/headingFirstLineIndent.test.js.map +1 -0
  29. package/dist/__tests__/headingInlineMarks.test.js +1 -1
  30. package/dist/__tests__/headingInlineMarks.test.js.map +1 -1
  31. package/dist/__tests__/headingLetterSpacing.test.js +1 -1
  32. package/dist/__tests__/headingLetterSpacing.test.js.map +1 -1
  33. package/dist/__tests__/mathSizeMigration.test.js +2 -2
  34. package/dist/__tests__/mathSizeMigration.test.js.map +1 -1
  35. package/dist/__tests__/pipeline/bitmapResolution.test.d.ts +2 -0
  36. package/dist/__tests__/pipeline/bitmapResolution.test.d.ts.map +1 -0
  37. package/dist/__tests__/pipeline/bitmapResolution.test.js +139 -0
  38. package/dist/__tests__/pipeline/bitmapResolution.test.js.map +1 -0
  39. package/dist/__tests__/pipeline/calloutInlineResourceGap.test.js +1 -1
  40. package/dist/__tests__/pipeline/calloutInlineResourceGap.test.js.map +1 -1
  41. package/dist/__tests__/pipeline/calloutSplitMinLinesChild.test.js +1 -1
  42. package/dist/__tests__/pipeline/calloutSplitMinLinesChild.test.js.map +1 -1
  43. package/dist/__tests__/pipeline/colonListRoom.test.js +1 -1
  44. package/dist/__tests__/pipeline/colonListRoom.test.js.map +1 -1
  45. package/dist/__tests__/pipeline/compoundBreaks.test.js +1 -1
  46. package/dist/__tests__/pipeline/compoundBreaks.test.js.map +1 -1
  47. package/dist/__tests__/pipeline/dashBreaks.test.js +1 -1
  48. package/dist/__tests__/pipeline/dashBreaks.test.js.map +1 -1
  49. package/dist/__tests__/pipeline/designTextTruncated.test.d.ts +2 -0
  50. package/dist/__tests__/pipeline/designTextTruncated.test.d.ts.map +1 -0
  51. package/dist/__tests__/pipeline/designTextTruncated.test.js +116 -0
  52. package/dist/__tests__/pipeline/designTextTruncated.test.js.map +1 -0
  53. package/dist/__tests__/pipeline/floatPlacement.test.js +3 -3
  54. package/dist/__tests__/pipeline/floatPlacement.test.js.map +1 -1
  55. package/dist/__tests__/pipeline/floatShrink.test.d.ts +2 -0
  56. package/dist/__tests__/pipeline/floatShrink.test.d.ts.map +1 -0
  57. package/dist/__tests__/pipeline/floatShrink.test.js +298 -0
  58. package/dist/__tests__/pipeline/floatShrink.test.js.map +1 -0
  59. package/dist/__tests__/pipeline/headingSplitOrphans.test.js +1 -1
  60. package/dist/__tests__/pipeline/headingSplitOrphans.test.js.map +1 -1
  61. package/dist/__tests__/pipeline/inlineFigureSpace.test.js +1 -1
  62. package/dist/__tests__/pipeline/inlineFigureSpace.test.js.map +1 -1
  63. package/dist/__tests__/pipeline/paragraphContainerTail.test.js +1 -1
  64. package/dist/__tests__/pipeline/paragraphContainerTail.test.js.map +1 -1
  65. package/dist/__tests__/pipeline/raggedOptimal.test.js +1 -1
  66. package/dist/__tests__/pipeline/raggedOptimal.test.js.map +1 -1
  67. package/dist/__tests__/pipeline/textWrap.test.d.ts +2 -0
  68. package/dist/__tests__/pipeline/textWrap.test.d.ts.map +1 -0
  69. package/dist/__tests__/pipeline/textWrap.test.js +453 -0
  70. package/dist/__tests__/pipeline/textWrap.test.js.map +1 -0
  71. package/dist/__tests__/preflight.test.js +30 -1
  72. package/dist/__tests__/preflight.test.js.map +1 -1
  73. package/dist/__tests__/presets/showcaseDesignOverflow.test.d.ts +2 -0
  74. package/dist/__tests__/presets/showcaseDesignOverflow.test.d.ts.map +1 -0
  75. package/dist/__tests__/presets/showcaseDesignOverflow.test.js +58 -0
  76. package/dist/__tests__/presets/showcaseDesignOverflow.test.js.map +1 -0
  77. package/dist/__tests__/table/booktabs.test.d.ts +2 -0
  78. package/dist/__tests__/table/booktabs.test.d.ts.map +1 -0
  79. package/dist/__tests__/table/booktabs.test.js +290 -0
  80. package/dist/__tests__/table/booktabs.test.js.map +1 -0
  81. package/dist/__tests__/textWrapMeasure.test.d.ts +2 -0
  82. package/dist/__tests__/textWrapMeasure.test.d.ts.map +1 -0
  83. package/dist/__tests__/textWrapMeasure.test.js +162 -0
  84. package/dist/__tests__/textWrapMeasure.test.js.map +1 -0
  85. package/dist/__tests__/verseLines.test.js +134 -4
  86. package/dist/__tests__/verseLines.test.js.map +1 -1
  87. package/dist/bitmapResolution.d.ts +42 -0
  88. package/dist/bitmapResolution.d.ts.map +1 -0
  89. package/dist/bitmapResolution.js +82 -0
  90. package/dist/bitmapResolution.js.map +1 -0
  91. package/dist/bundle/codec.d.ts +9 -2
  92. package/dist/bundle/codec.d.ts.map +1 -1
  93. package/dist/bundle/codec.js +24 -2
  94. package/dist/bundle/codec.js.map +1 -1
  95. package/dist/bundle/configVersion.d.ts +49 -8
  96. package/dist/bundle/configVersion.d.ts.map +1 -1
  97. package/dist/bundle/configVersion.js +161 -6
  98. package/dist/bundle/configVersion.js.map +1 -1
  99. package/dist/bundle/index.d.ts +3 -3
  100. package/dist/bundle/index.d.ts.map +1 -1
  101. package/dist/bundle/index.js +2 -2
  102. package/dist/bundle/index.js.map +1 -1
  103. package/dist/bundle/manifest.d.ts +12 -2
  104. package/dist/bundle/manifest.d.ts.map +1 -1
  105. package/dist/bundle/manifest.js +132 -6
  106. package/dist/bundle/manifest.js.map +1 -1
  107. package/dist/bundle/types.d.ts +28 -2
  108. package/dist/bundle/types.d.ts.map +1 -1
  109. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  110. package/dist/canvas-backend/blockRender.js +6 -4
  111. package/dist/canvas-backend/blockRender.js.map +1 -1
  112. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  113. package/dist/canvas-backend/renderResourceBlock.js +15 -1
  114. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  115. package/dist/configWarnings.js +29 -2
  116. package/dist/configWarnings.js.map +1 -1
  117. package/dist/defaults/headerFooter.d.ts +21 -6
  118. package/dist/defaults/headerFooter.d.ts.map +1 -1
  119. package/dist/defaults/headerFooter.js +37 -14
  120. package/dist/defaults/headerFooter.js.map +1 -1
  121. package/dist/defaults/headings.d.ts +5 -4
  122. package/dist/defaults/headings.d.ts.map +1 -1
  123. package/dist/defaults/headings.js +15 -4
  124. package/dist/defaults/headings.js.map +1 -1
  125. package/dist/defaults/index.d.ts +1 -1
  126. package/dist/defaults/index.d.ts.map +1 -1
  127. package/dist/defaults/index.js +1 -1
  128. package/dist/defaults/index.js.map +1 -1
  129. package/dist/defaults/layout.d.ts +30 -1
  130. package/dist/defaults/layout.d.ts.map +1 -1
  131. package/dist/defaults/layout.js +105 -1
  132. package/dist/defaults/layout.js.map +1 -1
  133. package/dist/defaults/parts.js +4 -4
  134. package/dist/defaults/parts.js.map +1 -1
  135. package/dist/defaults/tableStyle.d.ts.map +1 -1
  136. package/dist/defaults/tableStyle.js +44 -0
  137. package/dist/defaults/tableStyle.js.map +1 -1
  138. package/dist/defaults/toc.js +2 -2
  139. package/dist/defaults/verse.d.ts +2 -1
  140. package/dist/defaults/verse.d.ts.map +1 -1
  141. package/dist/defaults/verse.js +6 -1
  142. package/dist/defaults/verse.js.map +1 -1
  143. package/dist/design/layout.d.ts +15 -1
  144. package/dist/design/layout.d.ts.map +1 -1
  145. package/dist/design/layout.js +28 -4
  146. package/dist/design/layout.js.map +1 -1
  147. package/dist/frontmatter.d.ts +20 -0
  148. package/dist/frontmatter.d.ts.map +1 -1
  149. package/dist/frontmatter.js +69 -3
  150. package/dist/frontmatter.js.map +1 -1
  151. package/dist/html-backend.d.ts.map +1 -1
  152. package/dist/html-backend.js +22 -4
  153. package/dist/html-backend.js.map +1 -1
  154. package/dist/index.d.ts +13 -8
  155. package/dist/index.d.ts.map +1 -1
  156. package/dist/index.js +6 -3
  157. package/dist/index.js.map +1 -1
  158. package/dist/measure/bidiLines.d.ts +4 -3
  159. package/dist/measure/bidiLines.d.ts.map +1 -1
  160. package/dist/measure/bidiLines.js +12 -7
  161. package/dist/measure/bidiLines.js.map +1 -1
  162. package/dist/measure/cjkCompose.d.ts.map +1 -1
  163. package/dist/measure/cjkCompose.js +7 -3
  164. package/dist/measure/cjkCompose.js.map +1 -1
  165. package/dist/measure/hardBreaks.d.ts.map +1 -1
  166. package/dist/measure/hardBreaks.js +13 -1
  167. package/dist/measure/hardBreaks.js.map +1 -1
  168. package/dist/measure/index.d.ts +3 -3
  169. package/dist/measure/index.d.ts.map +1 -1
  170. package/dist/measure/index.js +4 -4
  171. package/dist/measure/index.js.map +1 -1
  172. package/dist/measure/plain.d.ts.map +1 -1
  173. package/dist/measure/plain.js +11 -7
  174. package/dist/measure/plain.js.map +1 -1
  175. package/dist/measure/rich.d.ts.map +1 -1
  176. package/dist/measure/rich.js +9 -6
  177. package/dist/measure/rich.js.map +1 -1
  178. package/dist/measure/types.d.ts +49 -3
  179. package/dist/measure/types.d.ts.map +1 -1
  180. package/dist/measure/types.js +67 -3
  181. package/dist/measure/types.js.map +1 -1
  182. package/dist/pipeline/build.d.ts.map +1 -1
  183. package/dist/pipeline/build.js +488 -31
  184. package/dist/pipeline/build.js.map +1 -1
  185. package/dist/pipeline/buildBlockKind.d.ts +5 -0
  186. package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
  187. package/dist/pipeline/buildBlockKind.js +14 -1
  188. package/dist/pipeline/buildBlockKind.js.map +1 -1
  189. package/dist/pipeline/buildMeasurement.js +1 -1
  190. package/dist/pipeline/buildMeasurement.js.map +1 -1
  191. package/dist/pipeline/columnBalancing.d.ts.map +1 -1
  192. package/dist/pipeline/columnBalancing.js +5 -0
  193. package/dist/pipeline/columnBalancing.js.map +1 -1
  194. package/dist/pipeline/contentWarnings.d.ts +16 -0
  195. package/dist/pipeline/contentWarnings.d.ts.map +1 -1
  196. package/dist/pipeline/contentWarnings.js +113 -17
  197. package/dist/pipeline/contentWarnings.js.map +1 -1
  198. package/dist/pipeline/floatPlacement.d.ts +34 -4
  199. package/dist/pipeline/floatPlacement.d.ts.map +1 -1
  200. package/dist/pipeline/floatPlacement.js +35 -5
  201. package/dist/pipeline/floatPlacement.js.map +1 -1
  202. package/dist/pipeline/floatSlots.d.ts +7 -0
  203. package/dist/pipeline/floatSlots.d.ts.map +1 -1
  204. package/dist/pipeline/floatSlots.js.map +1 -1
  205. package/dist/pipeline/headerFooter.d.ts +4 -1
  206. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  207. package/dist/pipeline/headerFooter.js +19 -5
  208. package/dist/pipeline/headerFooter.js.map +1 -1
  209. package/dist/pipeline/measureContentBlock.d.ts +7 -0
  210. package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
  211. package/dist/pipeline/measureContentBlock.js +15 -6
  212. package/dist/pipeline/measureContentBlock.js.map +1 -1
  213. package/dist/pipeline/placement.d.ts.map +1 -1
  214. package/dist/pipeline/placement.js +7 -0
  215. package/dist/pipeline/placement.js.map +1 -1
  216. package/dist/pipeline/resourceLayout.d.ts +15 -0
  217. package/dist/pipeline/resourceLayout.d.ts.map +1 -1
  218. package/dist/pipeline/resourceLayout.js +95 -15
  219. package/dist/pipeline/resourceLayout.js.map +1 -1
  220. package/dist/pipeline/styles.d.ts.map +1 -1
  221. package/dist/pipeline/styles.js +8 -5
  222. package/dist/pipeline/styles.js.map +1 -1
  223. package/dist/pipeline/textWrap.d.ts +94 -0
  224. package/dist/pipeline/textWrap.d.ts.map +1 -0
  225. package/dist/pipeline/textWrap.js +188 -0
  226. package/dist/pipeline/textWrap.js.map +1 -0
  227. package/dist/pipeline/verseLines.d.ts +22 -2
  228. package/dist/pipeline/verseLines.d.ts.map +1 -1
  229. package/dist/pipeline/verseLines.js +52 -4
  230. package/dist/pipeline/verseLines.js.map +1 -1
  231. package/dist/preflight.d.ts +46 -1
  232. package/dist/preflight.d.ts.map +1 -1
  233. package/dist/preflight.js +42 -7
  234. package/dist/preflight.js.map +1 -1
  235. package/dist/table/booktabs.d.ts +37 -0
  236. package/dist/table/booktabs.d.ts.map +1 -0
  237. package/dist/table/booktabs.js +82 -0
  238. package/dist/table/booktabs.js.map +1 -0
  239. package/dist/types.d.ts +227 -8
  240. package/dist/types.d.ts.map +1 -1
  241. package/dist/vdt.d.ts +131 -6
  242. package/dist/vdt.d.ts.map +1 -1
  243. package/dist/vdt.js +3 -2
  244. package/dist/vdt.js.map +1 -1
  245. package/dist/word/index.d.ts +1 -1
  246. package/dist/word/index.d.ts.map +1 -1
  247. package/dist/word/index.js +1 -1
  248. package/dist/word/index.js.map +1 -1
  249. package/dist/word/toMarkdown.d.ts +10 -0
  250. package/dist/word/toMarkdown.d.ts.map +1 -1
  251. package/dist/word/toMarkdown.js +16 -1
  252. package/dist/word/toMarkdown.js.map +1 -1
  253. package/package.json +1 -1
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Text wrap (#627): text running beside a picture or a box narrower than
3
+ * its column.
4
+ *
5
+ * The wrapped item is first placed as it would be without wrapping: an
6
+ * inline figure atomically at the cursor, a float in its band at the head
7
+ * or foot of its column. When the next block can run beside it (a
8
+ * paragraph, a quotation, a list item), the band is given back to the flow
9
+ * and recorded as an exclusion of the column (`VDTColumn.exclusions`): the
10
+ * flow's cursor may then run beside it, and every text block that takes
11
+ * lines next to it is broken with those lines set short
12
+ * (`MeasureBlockOptions.lineInsets`, `wrapInsetSteps`). A block that cannot
13
+ * run beside it (a heading, a display formula, a figure, a box, a table)
14
+ * settles the column first: below a picture at the head of the text, the
15
+ * cursor goes under it; above one at the column's foot, the column ends at
16
+ * its top. So does leaving the column. A block that never meets a wrap is
17
+ * set exactly as before.
18
+ *
19
+ * This module holds the pure parts: the settings as a resource reads them,
20
+ * the exclusions still open in each column (per pass: columns are created
21
+ * afresh by every placement pass) and the line insets they ask of a block.
22
+ */
23
+ import { lineInsetsAt } from '../measure/types';
24
+ import { dimensionToPx } from '../units';
25
+ import { wrapWidthOf } from '../defaults/layout';
26
+ import { parseLengthText } from '../defaults/tabStops';
27
+ /** A `wrap` value as a side of the flow: `'start'` is `'left'`, `'end'` is
28
+ * `'right'`; `'none'` and anything else are no wrap. */
29
+ export function wrapSideOf(value) {
30
+ if (value === 'left' || value === 'start')
31
+ return 'left';
32
+ if (value === 'right' || value === 'end')
33
+ return 'right';
34
+ return undefined;
35
+ }
36
+ /** The wrap a resource asks for: its own placement, then its type's
37
+ * `defaultPlacement`. `undefined` when it does not wrap. */
38
+ export function resolveResourceWrap(resource, type, settings) {
39
+ const side = wrapSideOf(resource.placement?.wrap ?? type?.defaultPlacement?.wrap);
40
+ if (!side)
41
+ return undefined;
42
+ const width = wrapWidthOf(resource.placement?.width ?? type?.defaultPlacement?.width) ?? settings.defaultWidth;
43
+ const gap = resource.placement?.wrapGap ?? type?.defaultPlacement?.wrapGap ?? settings.gap;
44
+ return { side, width, ...(gap ? { gap } : {}) };
45
+ }
46
+ /** The gap of a wrap in px: its own, else one body line (`floatGapPx`). */
47
+ export function wrapGapPx(gap, dpi, bodyFontSizePx, floatGapPx) {
48
+ return gap ? Math.max(0, dimensionToPx(gap, dpi, bodyFontSizePx)) : floatGapPx;
49
+ }
50
+ /** `layout.wrap.minTextWidth` in px for a column `columnWidth` wide. */
51
+ export function minTextWidthPx(min, columnWidth, dpi, bodyFontSizePx) {
52
+ return typeof min === 'number' ? min * columnWidth : dimensionToPx(min, dpi, bodyFontSizePx);
53
+ }
54
+ /** Whether a block may run beside a wrapped item: running text that splits
55
+ * line by line (a paragraph, a quotation, a list item). A poem, a
56
+ * contents or index row, a heading, a formula and every atomic block
57
+ * clear it. */
58
+ export function runsBesideWrap(block) {
59
+ if (block.toc !== undefined || block.index !== undefined)
60
+ return false;
61
+ if (block.type === 'paragraph')
62
+ return block.verse === undefined;
63
+ return block.type === 'blockquote' || block.type === 'listItem';
64
+ }
65
+ /** Whether a block takes nothing from the flow on its own and leaves an
66
+ * open wrap as it is: the markers of a `:::paragraphs` group and a
67
+ * numbering change. */
68
+ export function transparentToWrap(block) {
69
+ if (block.type === 'containerStart' || block.type === 'containerEnd') {
70
+ const name = block.containerName;
71
+ return name !== 'callout' && name !== 'part' && name !== 'paper';
72
+ }
73
+ return block.type === 'directive' && block.directiveName === 'numbering';
74
+ }
75
+ const openWraps = new WeakMap();
76
+ /** Record an exclusion of `col` and open it to the flow. */
77
+ export function openColumnWrap(col, ex, kind) {
78
+ (col.exclusions ??= []).push(ex);
79
+ const list = openWraps.get(col);
80
+ if (list)
81
+ list.push({ ex, kind });
82
+ else
83
+ openWraps.set(col, [{ ex, kind }]);
84
+ }
85
+ /** The exclusions of `col` the flow may still run beside. */
86
+ export function openColumnWraps(col) {
87
+ return openWraps.get(col) ?? [];
88
+ }
89
+ /** The flow's cursor in `col` (page y of the next block's top, before its
90
+ * spacing). */
91
+ export function columnCursorY(col) {
92
+ return col.bbox.y + col.bbox.height - col.availableHeight;
93
+ }
94
+ /**
95
+ * Close the open exclusions of `col`: under one that starts at or above
96
+ * the cursor the flow goes on below it; above one at the column's foot the
97
+ * column ends at its top. Returns whether the cursor moved down (the
98
+ * space the text was owing is then taken by the wrap's own gap).
99
+ */
100
+ export function settleColumnWraps(col) {
101
+ const list = openWraps.get(col);
102
+ if (!list || list.length === 0)
103
+ return false;
104
+ openWraps.delete(col);
105
+ const before = col.availableHeight;
106
+ const colBottom = col.bbox.y + col.bbox.height;
107
+ for (const { ex, kind } of list) {
108
+ const y = columnCursorY(col);
109
+ if (kind === 'top') {
110
+ const bottom = ex.y + ex.height;
111
+ if (y < bottom - 0.01)
112
+ col.availableHeight = Math.max(0, Math.min(col.availableHeight, colBottom - bottom));
113
+ }
114
+ else {
115
+ col.availableHeight = Math.max(0, Math.min(col.availableHeight, ex.y - y));
116
+ }
117
+ }
118
+ return col.availableHeight < before - 0.01;
119
+ }
120
+ /**
121
+ * The lines of a text block set short by the open exclusions of `col`
122
+ * when its first line's top is at `y0` and its lines are `lineHeight`
123
+ * apart: a line that meets an exclusion on a grid line (even in part) is
124
+ * beside it. Line numbers count from `firstLine` (the lines of the block
125
+ * already placed elsewhere). The insets are the exclusions' widths, from
126
+ * the column's sides: they add to the block's own indents.
127
+ */
128
+ export function wrapInsetSteps(col, y0, lineHeight, firstLine) {
129
+ const steps = [];
130
+ if (!(lineHeight > 0))
131
+ return steps;
132
+ for (const { ex } of openColumnWraps(col)) {
133
+ const top = ex.y;
134
+ const bottom = ex.y + ex.height;
135
+ if (bottom <= y0 + 0.01)
136
+ continue;
137
+ const from = Math.max(0, Math.floor((top - y0 + 0.01) / lineHeight));
138
+ const to = Math.ceil((bottom - y0 - 0.01) / lineHeight) - 1;
139
+ if (to < from)
140
+ continue;
141
+ steps.push({
142
+ fromLine: firstLine + from,
143
+ toLine: firstLine + to,
144
+ startInsetPx: ex.side === 'left' ? ex.width : 0,
145
+ endInsetPx: ex.side === 'right' ? ex.width : 0,
146
+ });
147
+ }
148
+ return steps;
149
+ }
150
+ /** The steps of `steps` for the lines before `line`, cut there. */
151
+ export function insetsBefore(steps, line) {
152
+ const out = [];
153
+ for (const s of steps) {
154
+ if (s.fromLine >= line)
155
+ continue;
156
+ const to = s.toLine === undefined ? line - 1 : Math.min(s.toLine, line - 1);
157
+ out.push({ ...s, toLine: to });
158
+ }
159
+ return out;
160
+ }
161
+ /** Whether two sets of insets set every line from `line` on alike. */
162
+ export function sameInsetsFrom(a, b, line) {
163
+ let last = line;
164
+ for (const s of [...a, ...b])
165
+ last = Math.max(last, s.toLine ?? s.fromLine);
166
+ for (let li = line; li <= last; li++) {
167
+ const x = lineInsetsAt(a, li);
168
+ const y = lineInsetsAt(b, li);
169
+ if (Math.abs(x.start - y.start) > 0.01 || Math.abs(x.end - y.end) > 0.01)
170
+ return false;
171
+ }
172
+ return true;
173
+ }
174
+ /** The wrap a box asks for with its fence's attributes (#627):
175
+ * `wrap="left|right|start|end"`, `width` (a share of the column, 0 to 1;
176
+ * else `layout.wrap.defaultWidth`) and `wrapGap` (a length, `6pt`).
177
+ * `undefined` when it does not wrap. */
178
+ export function resolveCalloutWrap(attrs, settings) {
179
+ const side = wrapSideOf(attrs.wrap?.trim().toLowerCase());
180
+ if (!side)
181
+ return undefined;
182
+ const raw = attrs.width !== undefined ? Number(attrs.width.trim()) : undefined;
183
+ const width = wrapWidthOf(raw) ?? settings.defaultWidth;
184
+ const gap = attrs.wrapGap !== undefined ? parseLengthText(attrs.wrapGap) : undefined;
185
+ const ownGap = gap && gap.value >= 0 ? gap : settings.gap;
186
+ return { side, width, ...(ownGap ? { gap: ownGap } : {}) };
187
+ }
188
+ //# sourceMappingURL=textWrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textWrap.js","sourceRoot":"","sources":["../../src/pipeline/textWrap.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,11 @@
12
12
  * - A line's indent is its leading spaces × `indentStep` (a tab counts
13
13
  * four spaces, an ideographic space two). A stepped line (`+ …`) starts
14
14
  * where the line above ended, a word space on.
15
- * - A line wider than the measure turns over: `turnover="hang"` sets the
15
+ * - A line a little wider than the measure tightens its word spaces, down
16
+ * to `bodyText.minWordSpacing` of their natural width (the shrink limit
17
+ * of justified text), and stays on one line (`tighten`, default on); the
18
+ * segments carry the tighter spaces, so every renderer paints them.
19
+ * - A line still wider than the measure turns over: `turnover="hang"` sets the
16
20
  * rest on the line after it, `hang` (the style's `hangingIndent`, else
17
21
  * `bodyText.verse.hang`) in from the line's own start; `turnover="right"`
18
22
  * sets it flush with the end side behind an opening bracket
@@ -31,7 +35,7 @@
31
35
  */
32
36
  import type { ContentBlock, InlineSpan } from '../parse';
33
37
  import type { DirectiveAttrs } from '../parse/types';
34
- import type { ResolvedConfig } from '../vdt';
38
+ import type { ResolvedConfig, VDTLineSegment } from '../vdt';
35
39
  import type { MeasuredBlock, MeasurementCache } from '../measure';
36
40
  import type { BlockStyle } from './styles';
37
41
  /** A poem's line-layout settings, read from its fence over
@@ -48,6 +52,9 @@ export interface VerseLinesSettings {
48
52
  /** Stanzas of this many lines or fewer stay whole; 0: off. */
49
53
  keepStanzas: number;
50
54
  align: 'center' | 'start';
55
+ /** Whether a line too wide for the measure tightens its word spaces
56
+ * (down to `bodyText.minWordSpacing`) before it turns over. */
57
+ tighten: boolean;
51
58
  }
52
59
  /** Whether a stanza block is set line by line: a stanza of the line layout,
53
60
  * unless the fence named no layout and the configuration was stored
@@ -71,8 +78,21 @@ export interface VerseLinesInput {
71
78
  /** The poem's direction and its frame's. */
72
79
  direction: 'ltr' | 'rtl';
73
80
  frameDirection: 'ltr' | 'rtl';
81
+ /** `bodyText.minWordSpacing`: how far a word space may tighten, as a
82
+ * share of its natural width. */
83
+ minWordSpacing: number;
74
84
  cache?: MeasurementCache;
75
85
  }
86
+ /** A line's word spaces tightened, down to `minWordSpacing` of their
87
+ * natural width each and in proportion to what each can give, so the
88
+ * line comes to `excess` px narrower; undefined when they cannot give
89
+ * that much. Fixed spaces (a `keepSpaces` caesura) are text and never
90
+ * tighten, nor does a CJK autospace. The segments are copies: the
91
+ * measured line stays as the cache holds it. */
92
+ export declare function tightenedSegments(segments: readonly VDTLineSegment[], excess: number, minWordSpacing: number): {
93
+ segments: VDTLineSegment[];
94
+ ratio: number;
95
+ } | undefined;
76
96
  /** Lay a stanza out (see the module comment). */
77
97
  export declare function measureVerseLines(input: VerseLinesInput): MeasuredBlock;
78
98
  //# sourceMappingURL=verseLines.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verseLines.d.ts","sourceRoot":"","sources":["../../src/pipeline/verseLines.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,QAAQ,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAuB,MAAM,YAAY,CAAC;AASvF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAM3C;wBACwB;AACxB,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC3B;AAED;;;gEAGgE;AAChE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAGrF;AA6BD,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,GAAG,cAAc,CAAC,EACtD,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,OAAO,GAChB,kBAAkB,CAepB;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,EAAE,CAYvE;AAED,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,YAAY,EAAE,YAAY,CAAC;IAC3B;8EAC0E;IAC1E,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,uBAAuB;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,4CAA4C;IAC5C,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB,cAAc,EAAE,KAAK,GAAG,KAAK,CAAC;IAC9B,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,CAiIvE"}
1
+ {"version":3,"file":"verseLines.d.ts","sourceRoot":"","sources":["../../src/pipeline/verseLines.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAW,cAAc,EAAE,MAAM,QAAQ,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAuB,MAAM,YAAY,CAAC;AASvF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAM3C;wBACwB;AACxB,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B;oEACgE;IAChE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;gEAGgE;AAChE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAGrF;AAoCD,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,GAAG,cAAc,CAAC,EACtD,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,OAAO,GAChB,kBAAkB,CAgBpB;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,EAAE,CAYvE;AAED,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,YAAY,EAAE,YAAY,CAAC;IAC3B;8EAC0E;IAC1E,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,uBAAuB;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,4CAA4C;IAC5C,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB,cAAc,EAAE,KAAK,GAAG,KAAK,CAAC;IAC9B;sCACkC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED;;;;;iDAKiD;AACjD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAmBxK;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,CA4IvE"}
@@ -12,7 +12,11 @@
12
12
  * - A line's indent is its leading spaces × `indentStep` (a tab counts
13
13
  * four spaces, an ideographic space two). A stepped line (`+ …`) starts
14
14
  * where the line above ended, a word space on.
15
- * - A line wider than the measure turns over: `turnover="hang"` sets the
15
+ * - A line a little wider than the measure tightens its word spaces, down
16
+ * to `bodyText.minWordSpacing` of their natural width (the shrink limit
17
+ * of justified text), and stays on one line (`tighten`, default on); the
18
+ * segments carry the tighter spaces, so every renderer paints them.
19
+ * - A line still wider than the measure turns over: `turnover="hang"` sets the
16
20
  * rest on the line after it, `hang` (the style's `hangingIndent`, else
17
21
  * `bodyText.verse.hang`) in from the line's own start; `turnover="right"`
18
22
  * sets it flush with the end side behind an opening bracket
@@ -48,6 +52,12 @@ export function versesLineByLine(raw, resolved) {
48
52
  const stanza = raw.verse?.stanza;
49
53
  return stanza !== undefined && !(stanza.auto && resolved.bodyText.verse.layout === 'bayt');
50
54
  }
55
+ /** `tighten=false` / `tighten=true` on a fence; undefined when absent or
56
+ * neither. */
57
+ function switchAttr(value) {
58
+ const v = value?.trim().toLowerCase();
59
+ return v === 'true' || v === '' ? true : v === 'false' ? false : undefined;
60
+ }
51
61
  /** A whole number of lines or none (`keepStanzas=5`). */
52
62
  function countAttr(value) {
53
63
  const m = /^\s*(\d+)\s*$/.exec(value ?? '');
@@ -91,6 +101,7 @@ export function verseLinesSettings(attrs, style, resolved, vertical) {
91
101
  stanzaSpacePx: Math.max(0, stanzaSpaceAttr(attrs.stanzaSpace, style.lineHeightPx, dpi, em) ?? cfg.stanzaSpace * style.lineHeightPx),
92
102
  keepStanzas: countAttr(attrs.keepStanzas) ?? cfg.keepStanzas,
93
103
  align: align === 'start' || align === 'center' ? align : vertical ? 'start' : 'center',
104
+ tighten: switchAttr(attrs.tighten) ?? cfg.tighten,
94
105
  };
95
106
  }
96
107
  /** A stanza's lines of verse: its spans cut at the line feeds. */
@@ -110,6 +121,33 @@ export function stanzaRows(spans) {
110
121
  }
111
122
  return rows;
112
123
  }
124
+ /** A line's word spaces tightened, down to `minWordSpacing` of their
125
+ * natural width each and in proportion to what each can give, so the
126
+ * line comes to `excess` px narrower; undefined when they cannot give
127
+ * that much. Fixed spaces (a `keepSpaces` caesura) are text and never
128
+ * tighten, nor does a CJK autospace. The segments are copies: the
129
+ * measured line stays as the cache holds it. */
130
+ export function tightenedSegments(segments, excess, minWordSpacing) {
131
+ const floor = Math.max(0, Math.min(1, minWordSpacing));
132
+ const give = (seg) => (seg.kind === 'space' && !seg.autospace && !seg.labelTab ? Math.max(0, seg.width * (1 - floor)) : 0);
133
+ let natural = 0;
134
+ let shrinkable = 0;
135
+ for (const seg of segments) {
136
+ const g = give(seg);
137
+ if (g > 0) {
138
+ natural += seg.width;
139
+ shrinkable += g;
140
+ }
141
+ }
142
+ if (excess <= 0 || shrinkable <= 0 || excess > shrinkable + 1e-6)
143
+ return undefined;
144
+ const share = Math.min(1, excess / shrinkable);
145
+ const out = segments.map((seg) => {
146
+ const g = give(seg);
147
+ return g > 0 ? { ...seg, width: seg.width - g * share } : seg;
148
+ });
149
+ return { segments: out, ratio: (natural - shrinkable * share) / natural };
150
+ }
113
151
  /** Lay a stanza out (see the module comment). */
114
152
  export function measureVerseLines(input) {
115
153
  const { contentBlock, style, measureMaxWidth: measure, settings, direction } = input;
@@ -165,12 +203,18 @@ export function measureVerseLines(input) {
165
203
  continue;
166
204
  stanzaRows(block.spans).forEach((spans, i) => {
167
205
  const info = st.lines[i] ?? { indent: 0 };
168
- const width = widthOf(measureSpans(spans, ONE_LINE, base)[0]);
206
+ const line = measureSpans(spans, ONE_LINE, base)[0];
207
+ let width = widthOf(line);
169
208
  // An indent past half the measure would leave its turnovers no room.
170
209
  let indent = Math.min(info.indent * settings.indentStepPx, measure / 2);
171
210
  if (info.stepped && rows.length > 0)
172
211
  indent = Math.max(0, Math.min(prevEnd + space, measure - width));
173
- rows.push({ spans, width, indent, stanza: st.index });
212
+ const tight = settings.tighten && line && indent + width > measure + 0.01
213
+ ? tightenedSegments(line.segments ?? [], indent + width - measure, input.minWordSpacing)
214
+ : undefined;
215
+ if (tight)
216
+ width = measure - indent;
217
+ rows.push({ spans, line, width, indent, stanza: st.index, ...(tight ? { tight } : {}) });
174
218
  prevEnd = indent + width <= measure + 0.01 ? indent + width : endOfTurnover(spans, indent);
175
219
  });
176
220
  }
@@ -204,8 +248,12 @@ export function measureVerseLines(input) {
204
248
  if (row.stanza !== stanza.index)
205
249
  return;
206
250
  const verseLine = (turnover) => ({ stanza: stanza.index, line: i, turnover, ...(!turnover && row.indent > 0 ? { indent: row.indent } : {}) });
251
+ if (row.tight && row.line) {
252
+ push(row.line, row.tight.segments, x0 + row.indent, { ...verseLine(false), spaceRatio: row.tight.ratio });
253
+ return;
254
+ }
207
255
  if (row.indent + row.width <= measure + 0.01) {
208
- const [line] = measureSpans(row.spans, ONE_LINE, base);
256
+ const line = row.line;
209
257
  if (line)
210
258
  push(line, line.segments ?? [], x0 + row.indent, verseLine(false));
211
259
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"verseLines.js","sourceRoot":"","sources":["../../src/pipeline/verseLines.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verseLines.js","sourceRoot":"","sources":["../../src/pipeline/verseLines.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,9 @@
7
7
  * - Pictures whose effective resolution at their printed size (pixels per
8
8
  * inch, crop included) falls under `print.preflight.minImageResolution`
9
9
  * (critical under `criticalImageResolution`): figures, table-cell
10
- * pictures, design images, comic panels.
10
+ * pictures, design images, comic panels. The pixels are the file's when
11
+ * the host knows them (`imageSize`), else the resource's declaration.
12
+ * - Bitmaps whose declared pixel size and file disagree (#631).
11
13
  * - RGB pictures in a CMYK job (converted on export, or kept RGB by a
12
14
  * PDF/X-4 that does not convert them), when the host says which
13
15
  * pictures are RGB (`imageColor`).
@@ -36,6 +38,23 @@ export type PreflightIssue = {
36
38
  resourceId?: string;
37
39
  ppi: number;
38
40
  minimum: number;
41
+ }
42
+ /** A bitmap that declares a pixel size its file does not have (more
43
+ * than a pixel off either way): its print size and resolution are
44
+ * worked out from the declaration. Reported once, where it is first
45
+ * placed; `warning` when the declaration exceeds the file. */
46
+ | {
47
+ kind: 'declaredPixelsMismatch';
48
+ fileId: string;
49
+ resourceId?: string;
50
+ declared: {
51
+ width: number;
52
+ height: number;
53
+ };
54
+ actual: {
55
+ width: number;
56
+ height: number;
57
+ };
39
58
  } | {
40
59
  kind: 'rgbImage';
41
60
  fileId: string;
@@ -79,11 +98,37 @@ export interface PreflightOptions {
79
98
  * coverage exactly. Without it a neutral counts one ink and any other
80
99
  * colour three, and coverage is not checked. */
81
100
  transform?: OutputTransform;
101
+ /** The real pixel size of a bitmap's file (the decoded image, or
102
+ * `bitmapInfo` on its bytes), when the host knows it: the resolution is
103
+ * worked out from it, and a declaration that disagrees is reported
104
+ * (`declaredPixelsMismatch`). */
105
+ imageSize?: (fileId: string) => {
106
+ width: number;
107
+ height: number;
108
+ } | undefined;
82
109
  /** Whether a picture's file is RGB, CMYK or gray (from its bytes). */
83
110
  imageColor?: (fileId: string) => 'rgb' | 'cmyk' | 'gray' | undefined;
84
111
  /** The job is CMYK (a PDF/X standard, or a CMYK PDF). Defaults to true
85
112
  * when a PDF/X standard is set. */
86
113
  cmyk?: boolean;
87
114
  }
115
+ /** One placed bitmap and its effective resolution there (#631): the
116
+ * file's pixels shown (crop and safe area counted) over its printed size
117
+ * in inches, the smaller of the two axes. */
118
+ export interface PlacedImageResolution {
119
+ fileId: string;
120
+ resourceId?: string;
121
+ /** Book-absolute page index. */
122
+ pageIndex: number;
123
+ ppi: number;
124
+ /** Printed size, layout px. */
125
+ width: number;
126
+ height: number;
127
+ }
128
+ /** Every bitmap placed in `doc` with its effective resolution: figures,
129
+ * table-cell pictures, design images and comic panels, one entry per
130
+ * placement. Uses `options.resources` and `options.imageSize` as
131
+ * {@link preflightDocument} does; runs whether or not preflight is on. */
132
+ export declare function placedImageResolutions(doc: VDTDocument, options?: Pick<PreflightOptions, 'resources' | 'imageSize'>): PlacedImageResolution[];
88
133
  export declare function preflightDocument(doc: VDTDocument, options?: PreflightOptions): PreflightIssue[];
89
134
  //# sourceMappingURL=preflight.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAe,mBAAmB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAA+B,WAAW,EAAW,MAAM,OAAO,CAAC;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKzD,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,CACA;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;CAAE,CACjF,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B;4CACwC;IACxC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B;8DAC0D;IAC1D,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAChC;;qDAEiD;IACjD,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,sEAAsE;IACtE,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrE;wCACoC;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAqCD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,GAAE,gBAAqB,GAAG,cAAc,EAAE,CAkPpG"}
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAe,mBAAmB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAA+B,WAAW,EAAW,MAAM,OAAO,CAAC;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKzD,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,CACA;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACnG;;;+DAG+D;GAC7D;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC/J;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;CAAE,CACjF,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B;4CACwC;IACxC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B;8DAC0D;IAC1D,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAChC;;qDAEiD;IACjD,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B;;;sCAGkC;IAClC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAC9E,sEAAsE;IACtE,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrE;wCACoC;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAqCD;;8CAE8C;AAC9C,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;2EAG2E;AAC3E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,GAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,GAAG,WAAW,CAAM,GAAG,qBAAqB,EAAE,CAIjJ;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,GAAE,gBAAqB,GAAG,cAAc,EAAE,CAEpG"}
package/dist/preflight.js CHANGED
@@ -7,7 +7,9 @@
7
7
  * - Pictures whose effective resolution at their printed size (pixels per
8
8
  * inch, crop included) falls under `print.preflight.minImageResolution`
9
9
  * (critical under `criticalImageResolution`): figures, table-cell
10
- * pictures, design images, comic panels.
10
+ * pictures, design images, comic panels. The pixels are the file's when
11
+ * the host knows them (`imageSize`), else the resource's declaration.
12
+ * - Bitmaps whose declared pixel size and file disagree (#631).
11
13
  * - RGB pictures in a CMYK job (converted on export, or kept RGB by a
12
14
  * PDF/X-4 that does not convert them), when the host says which
13
15
  * pictures are RGB (`imageColor`).
@@ -59,10 +61,22 @@ function bitmapSizes(doc, resources) {
59
61
  note(f.resourceBlock?.resource);
60
62
  return out;
61
63
  }
64
+ /** Every bitmap placed in `doc` with its effective resolution: figures,
65
+ * table-cell pictures, design images and comic panels, one entry per
66
+ * placement. Uses `options.resources` and `options.imageSize` as
67
+ * {@link preflightDocument} does; runs whether or not preflight is on. */
68
+ export function placedImageResolutions(doc, options = {}) {
69
+ const placed = [];
70
+ runPreflight(doc, { ...options, print: undefined }, placed);
71
+ return placed;
72
+ }
62
73
  export function preflightDocument(doc, options = {}) {
74
+ return runPreflight(doc, options);
75
+ }
76
+ function runPreflight(doc, options, placed) {
63
77
  const print = options.print ?? doc.config.print ?? resolvePrintConfig();
64
78
  const pf = print.preflight;
65
- if (!pf.enabled)
79
+ if (!pf.enabled && !placed)
66
80
  return [];
67
81
  const dpi = doc.config.page.dpi;
68
82
  const pxToPt = (px) => (px / dpi) * 72;
@@ -112,14 +126,31 @@ export function preflightDocument(doc, options = {}) {
112
126
  out.push({ kind: 'inkLimit', severity: 'warning', pageIndex, color: hex, coverage: Math.round(coverage), limit: print.inkLimit, ...(rect ? { rect } : {}) });
113
127
  }
114
128
  };
129
+ // The file's pixels against the declaration, once per file.
130
+ const mismatchSeen = new Set();
115
131
  const checkImage = (fileId, placedW, placedH, fracW, fracH, pageIndex, rect, resourceId, src) => {
116
132
  if (!fileId)
117
133
  return;
118
- const size = sizes.get(fileId);
134
+ const declared = sizes.get(fileId);
135
+ const real = options.imageSize?.(fileId);
136
+ const actual = real && real.width > 0 && real.height > 0 ? { w: real.width, h: real.height } : undefined;
137
+ const size = actual ?? declared;
119
138
  const source = src?.start !== undefined ? { sourceStart: src.start, ...(src.end !== undefined ? { sourceEnd: src.end } : {}) } : {};
120
- const rid = resourceId ?? size?.id;
139
+ const rid = resourceId ?? declared?.id;
140
+ if (pf.enabled && declared && actual && !mismatchSeen.has(fileId) && (Math.abs(declared.w - actual.w) > 1 || Math.abs(declared.h - actual.h) > 1)) {
141
+ mismatchSeen.add(fileId);
142
+ const over = declared.w > actual.w + 1 || declared.h > actual.h + 1;
143
+ out.push({
144
+ kind: 'declaredPixelsMismatch', severity: over ? 'warning' : 'info', pageIndex, rect, fileId,
145
+ declared: { width: declared.w, height: declared.h }, actual: { width: actual.w, height: actual.h },
146
+ ...(rid ? { resourceId: rid } : {}), ...source,
147
+ });
148
+ }
121
149
  if (size && placedW > 0 && placedH > 0) {
122
150
  const ppi = Math.min((size.w * fracW) / (placedW / dpi), (size.h * fracH) / (placedH / dpi));
151
+ placed?.push({ fileId, ...(rid ? { resourceId: rid } : {}), pageIndex, ppi, width: placedW, height: placedH });
152
+ if (!pf.enabled)
153
+ return;
123
154
  if (ppi < pf.minImageResolution - EPS) {
124
155
  out.push({
125
156
  kind: 'lowImageResolution',
@@ -129,7 +160,7 @@ export function preflightDocument(doc, options = {}) {
129
160
  });
130
161
  }
131
162
  }
132
- if (cmykJob && options.imageColor?.(fileId) === 'rgb') {
163
+ if (pf.enabled && cmykJob && options.imageColor?.(fileId) === 'rgb') {
133
164
  const converted = print.standard === 'pdfx1a' || print.convertImages;
134
165
  out.push({ kind: 'rgbImage', severity: converted ? 'info' : 'warning', pageIndex, rect, fileId, converted, ...(rid ? { resourceId: rid } : {}), ...source });
135
166
  }
@@ -288,8 +319,12 @@ export function preflightDocument(doc, options = {}) {
288
319
  }
289
320
  const table = rb.table;
290
321
  if (table) {
291
- if (table.borderWidthPx > 0)
292
- checkRule(table.borderWidthPx, table.borderColor, pageIndex, body);
322
+ // Booktabs strokes (#625) have their own widths: the thinnest counts.
323
+ const rulePx = table.strokes
324
+ ? table.strokes.reduce((min, s) => Math.min(min, s.widthPx), Infinity)
325
+ : table.borderWidthPx;
326
+ if (rulePx > 0 && Number.isFinite(rulePx))
327
+ checkRule(rulePx, table.borderColor, pageIndex, body);
293
328
  for (const cell of table.cells ?? []) {
294
329
  const img = cell.image;
295
330
  if (img && img.kind === 'bitmap')