postext 1.36.0 → 1.38.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 (300) hide show
  1. package/dist/__tests__/comics/frames.test.d.ts +2 -0
  2. package/dist/__tests__/comics/frames.test.d.ts.map +1 -0
  3. package/dist/__tests__/comics/frames.test.js +251 -0
  4. package/dist/__tests__/comics/frames.test.js.map +1 -0
  5. package/dist/__tests__/composed/continuation.test.d.ts +2 -0
  6. package/dist/__tests__/composed/continuation.test.d.ts.map +1 -0
  7. package/dist/__tests__/composed/continuation.test.js +352 -0
  8. package/dist/__tests__/composed/continuation.test.js.map +1 -0
  9. package/dist/__tests__/composed/continuationRules.test.d.ts +2 -0
  10. package/dist/__tests__/composed/continuationRules.test.d.ts.map +1 -0
  11. package/dist/__tests__/composed/continuationRules.test.js +389 -0
  12. package/dist/__tests__/composed/continuationRules.test.js.map +1 -0
  13. package/dist/__tests__/composed/contrast.test.d.ts +2 -0
  14. package/dist/__tests__/composed/contrast.test.d.ts.map +1 -0
  15. package/dist/__tests__/composed/contrast.test.js +124 -0
  16. package/dist/__tests__/composed/contrast.test.js.map +1 -0
  17. package/dist/__tests__/composed/corpus.test.js +7 -1
  18. package/dist/__tests__/composed/corpus.test.js.map +1 -1
  19. package/dist/__tests__/composed/coverImages.test.d.ts +2 -0
  20. package/dist/__tests__/composed/coverImages.test.d.ts.map +1 -0
  21. package/dist/__tests__/composed/coverImages.test.js +75 -0
  22. package/dist/__tests__/composed/coverImages.test.js.map +1 -0
  23. package/dist/__tests__/composed/decorationSize.test.d.ts +2 -0
  24. package/dist/__tests__/composed/decorationSize.test.d.ts.map +1 -0
  25. package/dist/__tests__/composed/decorationSize.test.js +79 -0
  26. package/dist/__tests__/composed/decorationSize.test.js.map +1 -0
  27. package/dist/__tests__/composed/emptyFrames.test.d.ts +2 -0
  28. package/dist/__tests__/composed/emptyFrames.test.d.ts.map +1 -0
  29. package/dist/__tests__/composed/emptyFrames.test.js +129 -0
  30. package/dist/__tests__/composed/emptyFrames.test.js.map +1 -0
  31. package/dist/__tests__/composed/fit.test.js +19 -10
  32. package/dist/__tests__/composed/fit.test.js.map +1 -1
  33. package/dist/__tests__/composed/groups.test.js +34 -0
  34. package/dist/__tests__/composed/groups.test.js.map +1 -1
  35. package/dist/__tests__/composed/headingDesigns.test.d.ts +2 -0
  36. package/dist/__tests__/composed/headingDesigns.test.d.ts.map +1 -0
  37. package/dist/__tests__/composed/headingDesigns.test.js +262 -0
  38. package/dist/__tests__/composed/headingDesigns.test.js.map +1 -0
  39. package/dist/__tests__/composed/labels.test.d.ts +2 -0
  40. package/dist/__tests__/composed/labels.test.d.ts.map +1 -0
  41. package/dist/__tests__/composed/labels.test.js +326 -0
  42. package/dist/__tests__/composed/labels.test.js.map +1 -0
  43. package/dist/__tests__/composed/outsidePrint.test.js +5 -2
  44. package/dist/__tests__/composed/outsidePrint.test.js.map +1 -1
  45. package/dist/__tests__/composed/ruledFrames.test.d.ts +2 -0
  46. package/dist/__tests__/composed/ruledFrames.test.d.ts.map +1 -0
  47. package/dist/__tests__/composed/ruledFrames.test.js +93 -0
  48. package/dist/__tests__/composed/ruledFrames.test.js.map +1 -0
  49. package/dist/__tests__/composed/sourceMap.test.js +26 -0
  50. package/dist/__tests__/composed/sourceMap.test.js.map +1 -1
  51. package/dist/__tests__/composed/spread.test.js +82 -0
  52. package/dist/__tests__/composed/spread.test.js.map +1 -1
  53. package/dist/__tests__/composed/spreadLabels.test.d.ts +2 -0
  54. package/dist/__tests__/composed/spreadLabels.test.d.ts.map +1 -0
  55. package/dist/__tests__/composed/spreadLabels.test.js +131 -0
  56. package/dist/__tests__/composed/spreadLabels.test.js.map +1 -0
  57. package/dist/__tests__/exports.test.js +23 -0
  58. package/dist/__tests__/exports.test.js.map +1 -1
  59. package/dist/__tests__/migrate/fixtures/textbookPort.d.ts +14 -0
  60. package/dist/__tests__/migrate/fixtures/textbookPort.d.ts.map +1 -0
  61. package/dist/__tests__/migrate/fixtures/textbookPort.js +116 -0
  62. package/dist/__tests__/migrate/fixtures/textbookPort.js.map +1 -0
  63. package/dist/__tests__/migrate/labelsOnPictures.test.d.ts +2 -0
  64. package/dist/__tests__/migrate/labelsOnPictures.test.d.ts.map +1 -0
  65. package/dist/__tests__/migrate/labelsOnPictures.test.js +114 -0
  66. package/dist/__tests__/migrate/labelsOnPictures.test.js.map +1 -0
  67. package/dist/__tests__/migrate/textToMarkdown.test.d.ts +2 -0
  68. package/dist/__tests__/migrate/textToMarkdown.test.d.ts.map +1 -0
  69. package/dist/__tests__/migrate/textToMarkdown.test.js +268 -0
  70. package/dist/__tests__/migrate/textToMarkdown.test.js.map +1 -0
  71. package/dist/__tests__/paragraphDropCap.test.js +38 -0
  72. package/dist/__tests__/paragraphDropCap.test.js.map +1 -1
  73. package/dist/__tests__/paragraphStyleLetterSpacing.test.d.ts +2 -0
  74. package/dist/__tests__/paragraphStyleLetterSpacing.test.d.ts.map +1 -0
  75. package/dist/__tests__/paragraphStyleLetterSpacing.test.js +89 -0
  76. package/dist/__tests__/paragraphStyleLetterSpacing.test.js.map +1 -0
  77. package/dist/__tests__/pictureBelowPrintSize.test.d.ts +2 -0
  78. package/dist/__tests__/pictureBelowPrintSize.test.d.ts.map +1 -0
  79. package/dist/__tests__/pictureBelowPrintSize.test.js +82 -0
  80. package/dist/__tests__/pictureBelowPrintSize.test.js.map +1 -0
  81. package/dist/__tests__/pipeline/paragraphStyleFaces.test.js +1 -1
  82. package/dist/__tests__/pipeline/paragraphStyleFaces.test.js.map +1 -1
  83. package/dist/__tests__/resourceTypePartial.test.d.ts +2 -0
  84. package/dist/__tests__/resourceTypePartial.test.d.ts.map +1 -0
  85. package/dist/__tests__/resourceTypePartial.test.js +60 -0
  86. package/dist/__tests__/resourceTypePartial.test.js.map +1 -0
  87. package/dist/canvas-backend/composed.d.ts +8 -2
  88. package/dist/canvas-backend/composed.d.ts.map +1 -1
  89. package/dist/canvas-backend/composed.js +52 -29
  90. package/dist/canvas-backend/composed.js.map +1 -1
  91. package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
  92. package/dist/canvas-backend/headerFooter.js +13 -0
  93. package/dist/canvas-backend/headerFooter.js.map +1 -1
  94. package/dist/canvas-backend/index.d.ts.map +1 -1
  95. package/dist/canvas-backend/index.js +53 -24
  96. package/dist/canvas-backend/index.js.map +1 -1
  97. package/dist/canvas-backend/renderResourceBlock.d.ts +5 -1
  98. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  99. package/dist/canvas-backend/renderResourceBlock.js +60 -1
  100. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  101. package/dist/comics/frames.d.ts +82 -0
  102. package/dist/comics/frames.d.ts.map +1 -0
  103. package/dist/comics/frames.js +182 -0
  104. package/dist/comics/frames.js.map +1 -0
  105. package/dist/comics/index.d.ts +4 -1
  106. package/dist/comics/index.d.ts.map +1 -1
  107. package/dist/comics/index.js +3 -1
  108. package/dist/comics/index.js.map +1 -1
  109. package/dist/comics/layoutPage.d.ts +9 -0
  110. package/dist/comics/layoutPage.d.ts.map +1 -1
  111. package/dist/comics/layoutPage.js +53 -68
  112. package/dist/comics/layoutPage.js.map +1 -1
  113. package/dist/comics/page.d.ts.map +1 -1
  114. package/dist/comics/page.js +10 -1
  115. package/dist/comics/page.js.map +1 -1
  116. package/dist/comics/sourceMap.d.ts +60 -0
  117. package/dist/comics/sourceMap.d.ts.map +1 -0
  118. package/dist/comics/sourceMap.js +166 -0
  119. package/dist/comics/sourceMap.js.map +1 -0
  120. package/dist/comics/spread.d.ts.map +1 -1
  121. package/dist/comics/spread.js +6 -0
  122. package/dist/comics/spread.js.map +1 -1
  123. package/dist/comics/textPanels.d.ts +113 -0
  124. package/dist/comics/textPanels.d.ts.map +1 -0
  125. package/dist/comics/textPanels.js +327 -0
  126. package/dist/comics/textPanels.js.map +1 -0
  127. package/dist/comics/transform.d.ts +6 -2
  128. package/dist/comics/transform.d.ts.map +1 -1
  129. package/dist/comics/transform.js +14 -1
  130. package/dist/comics/transform.js.map +1 -1
  131. package/dist/comics/types.d.ts +10 -0
  132. package/dist/comics/types.d.ts.map +1 -1
  133. package/dist/composed/continuation.d.ts +152 -0
  134. package/dist/composed/continuation.d.ts.map +1 -0
  135. package/dist/composed/continuation.js +189 -0
  136. package/dist/composed/continuation.js.map +1 -0
  137. package/dist/composed/groups.d.ts +3 -0
  138. package/dist/composed/groups.d.ts.map +1 -1
  139. package/dist/composed/groups.js +34 -4
  140. package/dist/composed/groups.js.map +1 -1
  141. package/dist/composed/labels.d.ts +154 -0
  142. package/dist/composed/labels.d.ts.map +1 -0
  143. package/dist/composed/labels.js +524 -0
  144. package/dist/composed/labels.js.map +1 -0
  145. package/dist/composed/pageMemo.d.ts +3 -2
  146. package/dist/composed/pageMemo.d.ts.map +1 -1
  147. package/dist/composed/pageMemo.js +3 -1
  148. package/dist/composed/pageMemo.js.map +1 -1
  149. package/dist/composed/paint.d.ts +28 -3
  150. package/dist/composed/paint.d.ts.map +1 -1
  151. package/dist/composed/paint.js +48 -2
  152. package/dist/composed/paint.js.map +1 -1
  153. package/dist/composed/reflowLog.d.ts +3 -1
  154. package/dist/composed/reflowLog.d.ts.map +1 -1
  155. package/dist/composed/reflowLog.js +20 -6
  156. package/dist/composed/reflowLog.js.map +1 -1
  157. package/dist/composed/rules.d.ts +31 -0
  158. package/dist/composed/rules.d.ts.map +1 -0
  159. package/dist/composed/rules.js +45 -0
  160. package/dist/composed/rules.js.map +1 -0
  161. package/dist/composed/slotChecks.d.ts +2 -1
  162. package/dist/composed/slotChecks.d.ts.map +1 -1
  163. package/dist/composed/slotChecks.js +56 -2
  164. package/dist/composed/slotChecks.js.map +1 -1
  165. package/dist/composed/sourceMap.d.ts +0 -21
  166. package/dist/composed/sourceMap.d.ts.map +1 -1
  167. package/dist/composed/sourceMap.js +102 -8
  168. package/dist/composed/sourceMap.js.map +1 -1
  169. package/dist/composed/spread.d.ts +23 -5
  170. package/dist/composed/spread.d.ts.map +1 -1
  171. package/dist/composed/spread.js +52 -27
  172. package/dist/composed/spread.js.map +1 -1
  173. package/dist/composed/templates.d.ts +11 -0
  174. package/dist/composed/templates.d.ts.map +1 -1
  175. package/dist/composed/templates.js +51 -2
  176. package/dist/composed/templates.js.map +1 -1
  177. package/dist/composed/types.d.ts +43 -3
  178. package/dist/composed/types.d.ts.map +1 -1
  179. package/dist/composed/validate.d.ts.map +1 -1
  180. package/dist/composed/validate.js +5 -3
  181. package/dist/composed/validate.js.map +1 -1
  182. package/dist/configWarnings.d.ts +15 -0
  183. package/dist/configWarnings.d.ts.map +1 -1
  184. package/dist/configWarnings.js +40 -18
  185. package/dist/configWarnings.js.map +1 -1
  186. package/dist/contrast.d.ts +5 -3
  187. package/dist/contrast.d.ts.map +1 -1
  188. package/dist/contrast.js +46 -5
  189. package/dist/contrast.js.map +1 -1
  190. package/dist/defaults/headerFooter.d.ts.map +1 -1
  191. package/dist/defaults/headerFooter.js +4 -0
  192. package/dist/defaults/headerFooter.js.map +1 -1
  193. package/dist/defaults/paragraphStyles.d.ts +1 -1
  194. package/dist/defaults/paragraphStyles.d.ts.map +1 -1
  195. package/dist/defaults/paragraphStyles.js +5 -1
  196. package/dist/defaults/paragraphStyles.js.map +1 -1
  197. package/dist/defaults/resourceTypes.d.ts +15 -0
  198. package/dist/defaults/resourceTypes.d.ts.map +1 -1
  199. package/dist/defaults/resourceTypes.js +39 -1
  200. package/dist/defaults/resourceTypes.js.map +1 -1
  201. package/dist/design/layout.d.ts +7 -0
  202. package/dist/design/layout.d.ts.map +1 -1
  203. package/dist/design/layout.js +109 -16
  204. package/dist/design/layout.js.map +1 -1
  205. package/dist/design/slots.d.ts +12 -10
  206. package/dist/design/slots.d.ts.map +1 -1
  207. package/dist/design/slots.js +26 -2
  208. package/dist/design/slots.js.map +1 -1
  209. package/dist/fonts/faces.d.ts.map +1 -1
  210. package/dist/fonts/faces.js +6 -0
  211. package/dist/fonts/faces.js.map +1 -1
  212. package/dist/highlightMarks.d.ts.map +1 -1
  213. package/dist/highlightMarks.js +6 -0
  214. package/dist/highlightMarks.js.map +1 -1
  215. package/dist/html-backend.d.ts.map +1 -1
  216. package/dist/html-backend.js +83 -7
  217. package/dist/html-backend.js.map +1 -1
  218. package/dist/htmlComic.d.ts +3 -0
  219. package/dist/htmlComic.d.ts.map +1 -1
  220. package/dist/htmlComic.js +2 -0
  221. package/dist/htmlComic.js.map +1 -1
  222. package/dist/index.d.ts +12 -8
  223. package/dist/index.d.ts.map +1 -1
  224. package/dist/index.js +7 -3
  225. package/dist/index.js.map +1 -1
  226. package/dist/migrate/markdownRuns.d.ts +70 -0
  227. package/dist/migrate/markdownRuns.d.ts.map +1 -0
  228. package/dist/migrate/markdownRuns.js +215 -0
  229. package/dist/migrate/markdownRuns.js.map +1 -0
  230. package/dist/migrate/pageDesign.d.ts +152 -0
  231. package/dist/migrate/pageDesign.d.ts.map +1 -0
  232. package/dist/migrate/pageDesign.js +573 -0
  233. package/dist/migrate/pageDesign.js.map +1 -0
  234. package/dist/migrate/textToMarkdown.d.ts +156 -0
  235. package/dist/migrate/textToMarkdown.d.ts.map +1 -0
  236. package/dist/migrate/textToMarkdown.js +913 -0
  237. package/dist/migrate/textToMarkdown.js.map +1 -0
  238. package/dist/parse/blockParser.js +26 -0
  239. package/dist/parse/blockParser.js.map +1 -1
  240. package/dist/pipeline/build.d.ts.map +1 -1
  241. package/dist/pipeline/build.js +388 -41
  242. package/dist/pipeline/build.js.map +1 -1
  243. package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
  244. package/dist/pipeline/buildMeasurement.js +12 -1
  245. package/dist/pipeline/buildMeasurement.js.map +1 -1
  246. package/dist/pipeline/calloutLayout.d.ts +25 -1
  247. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  248. package/dist/pipeline/calloutLayout.js +100 -2
  249. package/dist/pipeline/calloutLayout.js.map +1 -1
  250. package/dist/pipeline/composedLayout.d.ts +16 -2
  251. package/dist/pipeline/composedLayout.d.ts.map +1 -1
  252. package/dist/pipeline/composedLayout.js +337 -70
  253. package/dist/pipeline/composedLayout.js.map +1 -1
  254. package/dist/pipeline/contentWarnings.d.ts +15 -0
  255. package/dist/pipeline/contentWarnings.d.ts.map +1 -1
  256. package/dist/pipeline/contentWarnings.js +106 -1
  257. package/dist/pipeline/contentWarnings.js.map +1 -1
  258. package/dist/pipeline/dropCap.d.ts +5 -0
  259. package/dist/pipeline/dropCap.d.ts.map +1 -1
  260. package/dist/pipeline/dropCap.js +23 -2
  261. package/dist/pipeline/dropCap.js.map +1 -1
  262. package/dist/pipeline/frameLayout.d.ts +21 -3
  263. package/dist/pipeline/frameLayout.d.ts.map +1 -1
  264. package/dist/pipeline/frameLayout.js +52 -4
  265. package/dist/pipeline/frameLayout.js.map +1 -1
  266. package/dist/pipeline/headerFooter.d.ts +11 -1
  267. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  268. package/dist/pipeline/headerFooter.js +210 -68
  269. package/dist/pipeline/headerFooter.js.map +1 -1
  270. package/dist/pipeline/measureContentBlock.d.ts +1 -1
  271. package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
  272. package/dist/pipeline/measureContentBlock.js +4 -1
  273. package/dist/pipeline/measureContentBlock.js.map +1 -1
  274. package/dist/pipeline/mirrorFrame.d.ts.map +1 -1
  275. package/dist/pipeline/mirrorFrame.js +25 -2
  276. package/dist/pipeline/mirrorFrame.js.map +1 -1
  277. package/dist/pipeline/resourceLayout.d.ts +28 -0
  278. package/dist/pipeline/resourceLayout.d.ts.map +1 -1
  279. package/dist/pipeline/resourceLayout.js +21 -0
  280. package/dist/pipeline/resourceLayout.js.map +1 -1
  281. package/dist/pipeline/resourceNumbering.d.ts.map +1 -1
  282. package/dist/pipeline/resourceNumbering.js +13 -4
  283. package/dist/pipeline/resourceNumbering.js.map +1 -1
  284. package/dist/pipeline/styles.d.ts +1 -1
  285. package/dist/pipeline/styles.d.ts.map +1 -1
  286. package/dist/pipeline/styles.js +4 -0
  287. package/dist/pipeline/styles.js.map +1 -1
  288. package/dist/preflight.js +5 -1
  289. package/dist/preflight.js.map +1 -1
  290. package/dist/types.d.ts +45 -2
  291. package/dist/types.d.ts.map +1 -1
  292. package/dist/vdt.d.ts +228 -9
  293. package/dist/vdt.d.ts.map +1 -1
  294. package/dist/vdt.js.map +1 -1
  295. package/dist/word/toDocx.d.ts.map +1 -1
  296. package/dist/word/toDocx.js +14 -0
  297. package/dist/word/toDocx.js.map +1 -1
  298. package/dist/word/word.test.js +11 -1
  299. package/dist/word/word.test.js.map +1 -1
  300. package/package.json +1 -1
@@ -0,0 +1,182 @@
1
+ /**
2
+ * One page model (#885, DESIGN §7): a comic page's `split` is a shorthand
3
+ * that generates frames. Each cell of the split tree (after its panel's
4
+ * `pad`) is a frame, and so is each `inset` panel (laid over the frame
5
+ * before it, one layer up); the frame holds the panel (its art, border and
6
+ * background) and, for a text panel (`::panel{text}`), the Markdown its
7
+ * body pours into it. The lettering stays positioned by the comics code,
8
+ * panel by panel, as before.
9
+ *
10
+ * The frames are those of a composed page (`VDTFrame`) with what a cut of
11
+ * the split needs besides: a `polygon` when a slanted line cuts the cell,
12
+ * and `panel`, the index of the panel the frame holds. Ids follow the
13
+ * composed pages' rule (#857): built from the comic fence's ordinal in its
14
+ * chapter and the names the Markdown gives (`cm<n>:<name>`, a panel's
15
+ * `id`, else `p<k>`), never from the layout, so they are the same in every
16
+ * locale and across relayouts.
17
+ */
18
+ import { clipPolygon, polygonBBox } from './geometry';
19
+ /** A comic (page, spread or strip): `cm<n>`, `n` the ordinal of its fence
20
+ * among the comic fences of its chapter. */
21
+ export function comicElementId(fenceIndex) {
22
+ return `cm${fenceIndex}`;
23
+ }
24
+ /** A frame of a comic: `cm<n>:<name>`. */
25
+ export function comicFrameElementId(fenceIndex, name) {
26
+ return `cm${fenceIndex}:${name}`;
27
+ }
28
+ /** A balloon, caption or sound effect of a panel: `<frame id>:b<order>`,
29
+ * `order` its line's place in the panel's script. */
30
+ export function comicBalloonElementId(frameId, order) {
31
+ return `${frameId}:b${order}`;
32
+ }
33
+ /** The name of the frame of the panel laid `index`-th (0-based): the
34
+ * panel's `id` when it has one no frame before took, else `p<index + 1>`. */
35
+ export function comicFrameName(panel, index, taken) {
36
+ const own = panel?.attrs.id?.trim();
37
+ if (own && !taken.has(own) && !/[\s:]/.test(own))
38
+ return own;
39
+ return `p${index + 1}`;
40
+ }
41
+ /** Whether a panel's body is Markdown text (`::panel{text}`) rather than a
42
+ * lettering script. */
43
+ export function isComicTextPanel(panel) {
44
+ const v = panel?.attrs.text;
45
+ if (v === undefined)
46
+ return false;
47
+ const t = v.trim().toLowerCase();
48
+ return !(t === 'false' || t === 'no' || t === '0' || t === 'none');
49
+ }
50
+ /** The callout style a panel's `box` names (#885), or undefined (unset,
51
+ * or no such style: `comicPanelFrame`, reason `unknownBox`). */
52
+ export function comicBoxStyle(resolved, value) {
53
+ const id = value?.trim();
54
+ if (!id)
55
+ return undefined;
56
+ return resolved.calloutStyles.find((s) => s.id === id);
57
+ }
58
+ /** A cell inset by its panel's `pad`. */
59
+ export function padComicCell(cell, pad) {
60
+ if (!pad || (pad.top === 0 && pad.right === 0 && pad.bottom === 0 && pad.left === 0))
61
+ return cell;
62
+ const b = cell.bbox;
63
+ const x0 = b.x + pad.left;
64
+ const x1 = Math.max(x0, b.x + b.width - pad.right);
65
+ const y0 = b.y + pad.top;
66
+ const y1 = Math.max(y0, b.y + b.height - pad.bottom);
67
+ let poly = cell.polygon;
68
+ poly = clipPolygon(poly, { nx: -1, ny: 0, c: -x0 });
69
+ poly = clipPolygon(poly, { nx: 1, ny: 0, c: x1 });
70
+ poly = clipPolygon(poly, { nx: 0, ny: -1, c: -y0 });
71
+ poly = clipPolygon(poly, { nx: 0, ny: 1, c: y1 });
72
+ return { polygon: poly, bbox: polygonBBox(poly), rect: cell.rect };
73
+ }
74
+ /** `inset="x y w h"`: percentages (or fractions) of the previous panel's
75
+ * box. */
76
+ export function comicInsetBox(value, of) {
77
+ if (!value)
78
+ return undefined;
79
+ const parts = value.trim().split(/[\s,]+/).map((p) => Number(p.replace('%', '')));
80
+ if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n)))
81
+ return undefined;
82
+ const fractions = !value.includes('%') && parts.every((n) => n <= 1);
83
+ const [x, y, w, h] = parts.map((n) => (fractions ? n : n / 100));
84
+ if (w <= 0 || h <= 0)
85
+ return undefined;
86
+ return { x: of.x + x * of.width, y: of.y + y * of.height, width: w * of.width, height: h * of.height };
87
+ }
88
+ /**
89
+ * The frames a split generates, in panel order: the cells of the split tree
90
+ * in reading order, each taking the next panel that is not an inset (or
91
+ * none), and every inset panel laid over the frame laid before it (the
92
+ * insets that come before a panel in the source follow the frame before
93
+ * that panel). `padOf` gives a panel's `pad` for the box it pads.
94
+ */
95
+ export function comicFrameSpecs(panels, cells, padOf) {
96
+ const flowPanels = panels.filter((p) => !p.attrs.inset);
97
+ const out = [];
98
+ const taken = new Set();
99
+ const add = (cell, panel, inset) => {
100
+ const padded = padComicCell(cell, padOf(panel, cell.bbox));
101
+ const name = comicFrameName(panel, out.length, taken);
102
+ taken.add(name);
103
+ out.push({ name, polygon: padded.polygon, bbox: padded.bbox, rect: padded.rect, ...(panel ? { panel } : {}), inset, layer: inset ? 2 : 1 });
104
+ };
105
+ const layInset = (p) => {
106
+ const prev = out[out.length - 1];
107
+ const box = prev ? comicInsetBox(p.attrs.inset, prev.bbox) : undefined;
108
+ if (!box)
109
+ return;
110
+ const polygon = [
111
+ { x: box.x, y: box.y },
112
+ { x: box.x + box.width, y: box.y },
113
+ { x: box.x + box.width, y: box.y + box.height },
114
+ { x: box.x, y: box.y + box.height },
115
+ ];
116
+ add({ polygon, bbox: polygonBBox(polygon), rect: true }, p, true);
117
+ };
118
+ let flowIndex = 0;
119
+ const pending = [...panels];
120
+ for (const cell of cells) {
121
+ while (pending.length > 0 && pending[0].attrs.inset)
122
+ layInset(pending.shift());
123
+ const p = flowPanels[flowIndex];
124
+ if (p && pending[0] === p)
125
+ pending.shift();
126
+ flowIndex++;
127
+ add(cell, p, false);
128
+ }
129
+ while (pending.length > 0 && pending[0].attrs.inset)
130
+ layInset(pending.shift());
131
+ return out;
132
+ }
133
+ /** The frame of a laid-out panel: its box and outline, its id and source. */
134
+ export function comicPanelFrame(panel, name, layer) {
135
+ return {
136
+ id: panel.frameId ?? name,
137
+ name,
138
+ rect: { ...panel.bbox },
139
+ rotate: 0,
140
+ layer,
141
+ scale: 1,
142
+ overflowPx: 0,
143
+ blockIds: [],
144
+ configPath: '',
145
+ sourceStart: panel.sourceStart,
146
+ sourceEnd: panel.sourceEnd,
147
+ ...(isAxisRect(panel.polygon, panel.bbox) ? {} : { polygon: panel.polygon.map((p) => ({ ...p })) }),
148
+ panel: panel.index,
149
+ };
150
+ }
151
+ /** Whether a polygon is its own bounding box. */
152
+ function isAxisRect(poly, box) {
153
+ if (poly.length !== 4)
154
+ return false;
155
+ const eps = 0.01;
156
+ const onX = (x) => Math.abs(x - box.x) < eps || Math.abs(x - box.x - box.width) < eps;
157
+ const onY = (y) => Math.abs(y - box.y) < eps || Math.abs(y - box.y - box.height) < eps;
158
+ return poly.every((p) => onX(p.x) && onY(p.y));
159
+ }
160
+ /** The frames of a comic whose panels were moved or cut (a spread's half,
161
+ * #567): each frame of `whole` whose panel `panels` still holds, on that
162
+ * panel's box and outline; a text frame keeps its blocks. */
163
+ export function comicFramesFor(whole, panels) {
164
+ if (!whole.frames)
165
+ return undefined;
166
+ const byPanel = new Map(whole.frames.map((f) => [f.panel, f]));
167
+ const out = [];
168
+ for (const p of panels) {
169
+ const f = byPanel.get(p.index);
170
+ if (!f)
171
+ continue;
172
+ const g = comicPanelFrame(p, f.name, f.layer);
173
+ const cut = { ...f, rect: g.rect };
174
+ if (g.polygon)
175
+ cut.polygon = g.polygon;
176
+ else
177
+ delete cut.polygon;
178
+ out.push(cut);
179
+ }
180
+ return out;
181
+ }
182
+ //# sourceMappingURL=frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.js","sourceRoot":"","sources":["../../src/comics/frames.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAkB,MAAM,YAAY,CAAC;AAGtE;6CAC6C;AAC7C,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,OAAO,KAAK,UAAU,EAAE,CAAC;AAC3B,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,IAAY;IAClE,OAAO,KAAK,UAAU,IAAI,IAAI,EAAE,CAAC;AACnC,CAAC;AAED;sDACsD;AACtD,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,KAAa;IAClE,OAAO,GAAG,OAAO,KAAK,KAAK,EAAE,CAAC;AAChC,CAAC;AAED;8EAC8E;AAC9E,MAAM,UAAU,cAAc,CAAC,KAAkD,EAAE,KAAa,EAAE,KAA0B;IAC1H,MAAM,GAAG,GAAG,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;IACpC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC7D,OAAO,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;AACzB,CAAC;AAED;wBACwB;AACxB,MAAM,UAAU,gBAAgB,CAAC,KAAkD;IACjF,MAAM,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;IAC5B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAClC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC;AACrE,CAAC;AAED;iEACiE;AACjE,MAAM,UAAU,aAAa,CAAC,QAA+C,EAAE,KAAyB;IACtG,MAAM,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,OAAO,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACzD,CAAC;AAuBD,yCAAyC;AACzC,MAAM,UAAU,YAAY,CAAC,IAAkD,EAAE,GAAiB;IAChG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAClG,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;IACxB,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAClD,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AACrE,CAAC;AAED;WACW;AACX,MAAM,UAAU,aAAa,CAAC,KAAyB,EAAE,EAAe;IACtE,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAClF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACnF,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAqC,CAAC;IACrG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;AACzG,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAmC,EACnC,KAA8D,EAC9D,KAA8E;IAE9E,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,GAAG,GAAG,CAAC,IAAkD,EAAE,KAAmC,EAAE,KAAc,EAAQ,EAAE;QAC5H,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACtD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9I,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,CAAmB,EAAQ,EAAE;QAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,OAAO,GAAG;YACd,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;YACtB,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;YAClC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE;YAC/C,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE;SACpC,CAAC;QACF,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC;IACF,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,KAAK;YAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAG,CAAC,CAAC;QACjF,MAAM,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3C,SAAS,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,KAAK;QAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAG,CAAC,CAAC;IACjF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,KAAoB,EAAE,IAAY,EAAE,KAAa;IAC/E,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;QACzB,IAAI;QACJ,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE;QACvB,MAAM,EAAE,CAAC;QACT,KAAK;QACL,KAAK,EAAE,CAAC;QACR,UAAU,EAAE,CAAC;QACb,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACnG,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,iDAAiD;AACjD,SAAS,UAAU,CAAC,IAAyB,EAAE,GAAgB;IAC7D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC;IACjB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;IAC9F,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;IAC/F,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;8DAE8D;AAC9D,MAAM,UAAU,cAAc,CAAC,KAAmC,EAAE,MAAgC;IAClG,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAU,CAAC,CAAC,CAAC;IACxE,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAa,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,CAAC,OAAO;YAAE,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;;YAClC,OAAO,GAAG,CAAC,OAAO,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -20,7 +20,10 @@ export { layoutComicStrip, comicStripPlacement, comicStripExtent, comicStripAspe
20
20
  export type { ComicStripPlacement, ComicStripContext, ComicStripAlign } from './strip';
21
21
  export { layoutComicSpread, isComicSpread } from './spread';
22
22
  export type { ComicSpreadContext, ComicSpreadPage } from './spread';
23
- export { translateComicPage, translateComicPanel, translateComicSplitter, translateComicBalloon, translateSvgPath, comicBlockOnSheet, pageComics } from './transform';
23
+ export { translateComicPage, translateComicPanel, translateComicSplitter, translateComicBalloon, translateComicFrame, translateSvgPath, comicBlockOnSheet, pageComics } from './transform';
24
+ export { comicElementId, comicFrameElementId, comicBalloonElementId, comicFrameName, isComicTextPanel, comicBoxStyle, comicFrameSpecs } from './frames';
25
+ export type { ComicFrameSpec } from './frames';
26
+ export { comicTextPanelsSupported } from './textPanels';
24
27
  export { comicFontFamilies, markdownHasComics } from './fonts';
25
28
  export { COMIC_RESERVED_KEYS } from './types';
26
29
  export type { ComicPageSource, ComicPanelSource, ComicScriptItem, ComicScriptRole, ComicSourceRange, ComicTailSide } from './types';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/comics/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/comics/index.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,9 @@ export { comicSourceWarnings } from './warnings';
11
11
  export { layoutComicFrame, comicPageFrame } from './layoutPage';
12
12
  export { layoutComicStrip, comicStripPlacement, comicStripExtent, comicStripAspect, comicSplitGrid, parseComicAspect, parseComicStripWidth, parseComicStripAlign, comicStripWidth, comicStripOffset } from './strip';
13
13
  export { layoutComicSpread, isComicSpread } from './spread';
14
- export { translateComicPage, translateComicPanel, translateComicSplitter, translateComicBalloon, translateSvgPath, comicBlockOnSheet, pageComics } from './transform';
14
+ export { translateComicPage, translateComicPanel, translateComicSplitter, translateComicBalloon, translateComicFrame, translateSvgPath, comicBlockOnSheet, pageComics } from './transform';
15
+ export { comicElementId, comicFrameElementId, comicBalloonElementId, comicFrameName, isComicTextPanel, comicBoxStyle, comicFrameSpecs } from './frames';
16
+ export { comicTextPanelsSupported } from './textPanels';
15
17
  export { comicFontFamilies, markdownHasComics } from './fonts';
16
18
  export { COMIC_RESERVED_KEYS } from './types';
17
19
  export { comicBalloonKind, comicBalloonText, comicSpeakerName, comicBalloonGroups, comicPanelPathData, comicBorderPathData, comicRoughBorder, polygonPathData, comicPanelContinues, isComicSpreadPartner, joinComicSpread, comicBalloonMatrix, } from './paint';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/comics/index.ts"],"names":[],"mappings":"AAAA;2DAC2D;AAC3D,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9E,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtF,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAE9H,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEtO,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAErN,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE5D,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtK,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/comics/index.ts"],"names":[],"mappings":"AAAA;2DAC2D;AAC3D,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE9E,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtF,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAE9H,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEtO,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAErN,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE5D,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3L,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAExJ,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
@@ -24,6 +24,9 @@ export interface ComicPageContext {
24
24
  /** Added to every source offset of `source` (the frontmatter's length:
25
25
  * VDT offsets are in the whole Markdown). */
26
26
  sourceOffset?: number;
27
+ /** The comic fence's ordinal among the comic fences of its chapter
28
+ * (#885): the stable ids of the comic, its frames and balloons. */
29
+ fenceIndex?: number;
27
30
  /** Whether this page swaps mirrored margins (a verso of a left-bound
28
31
  * book), for `comics.frame.margins` with `mirror`. */
29
32
  mirrorMargins?: boolean;
@@ -70,6 +73,10 @@ export declare function comicPageFrame(ctx: Pick<ComicPageContext, 'resolved' |
70
73
  /** The warnings the layout of a comic page found (`comicPanelLetterbox`,
71
74
  * `comicBalloonOverflow`). */
72
75
  export declare function comicPageLayoutWarnings(comic: VDTComicPage): readonly ContentWarning[];
76
+ /** The source of each panel of a comic laid out by {@link layoutComicFrame}
77
+ * (undefined for an empty cell), in panel order. Internal to the comics
78
+ * modules. */
79
+ export declare function comicPanelSources(comic: VDTComicPage): readonly (ComicPanelSource | undefined)[];
73
80
  /** Set the layout warnings of a comic laid out in parts (each page of a
74
81
  * spread gets those of its panels). Internal to the comics modules. */
75
82
  export declare function setComicLayoutWarnings(comic: VDTComicPage, warnings: readonly ContentWarning[]): void;
@@ -143,6 +150,8 @@ export interface ComicFrameContext {
143
150
  /** Added to every source offset of `source` (see
144
151
  * {@link ComicPageContext.sourceOffset}). */
145
152
  sourceOffset?: number;
153
+ /** See {@link ComicPageContext.fenceIndex}. */
154
+ fenceIndex?: number;
146
155
  /** The page the warnings are reported on. */
147
156
  pageIndex: number;
148
157
  /** Regions no balloon should cover, besides those of the pictures (the
@@ -1 +1 @@
1
- {"version":3,"file":"layoutPage.d.ts","sourceRoot":"","sources":["../../src/comics/layoutPage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"layoutPage.d.ts","sourceRoot":"","sources":["../../src/comics/layoutPage.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,8 @@ import { dimensionToPx } from '../units';
14
14
  import { chineseScriptOf, directionOf, isCjkLanguage, isJapaneseLanguage, presentTag } from '../locale';
15
15
  import { comicReadingDirection, DEFAULT_LETTERING_STATIC, pickBalloonStyle, pickPanelStyle, resolvedComics } from '../defaults/comics';
16
16
  import { comicArtCrop, comicArtPointToPage, comicArtRectToPage } from './art';
17
- import { clipPolygon, comicGeometry, physicalSide, pointInPolygon, polygonBBox } from './geometry';
17
+ import { comicGeometry, physicalSide, pointInPolygon } from './geometry';
18
+ import { comicBalloonElementId, comicBoxStyle, comicElementId, comicFrameElementId, comicFrameSpecs, comicPanelFrame, isComicTextPanel } from './frames';
18
19
  import { parseComicPoint } from './script';
19
20
  import { letterPanelDetailed } from './lettering/letter';
20
21
  /** The leaf a comic page is laid out on when the page is not one
@@ -152,20 +153,6 @@ function pictureOf(resources, id) {
152
153
  return { resource: r, kind: 'svg', fileId: r.svg.fileId, width: r.svg.width ?? 0, height: r.svg.height ?? 0 };
153
154
  return undefined;
154
155
  }
155
- /** `inset="x y w h"`: percentages (or fractions) of the previous panel's
156
- * box. */
157
- function insetBox(value, of) {
158
- if (!value)
159
- return undefined;
160
- const parts = value.trim().split(/[\s,]+/).map((p) => Number(p.replace('%', '')));
161
- if (parts.length !== 4 || parts.some((n) => !Number.isFinite(n)))
162
- return undefined;
163
- const fractions = !value.includes('%') && parts.every((n) => n <= 1);
164
- const [x, y, w, h] = parts.map((n) => (fractions ? n : n / 100));
165
- if (w <= 0 || h <= 0)
166
- return undefined;
167
- return { x: of.x + x * of.width, y: of.y + y * of.height, width: w * of.width, height: h * of.height };
168
- }
169
156
  /** The frame of a page: the content area on the sheet, or the trim inset
170
157
  * by `comics.frame.margins`. */
171
158
  export function comicPageFrame(ctx, comics = resolvedComics(ctx.resolved)) {
@@ -202,6 +189,15 @@ const layoutWarnings = new WeakMap();
202
189
  export function comicPageLayoutWarnings(comic) {
203
190
  return layoutWarnings.get(comic) ?? [];
204
191
  }
192
+ /** The script (or text) each laid-out panel of a comic was set from, by
193
+ * the comic laid out (#885): what fills a text panel's frame. */
194
+ const panelSourcesOf = new WeakMap();
195
+ /** The source of each panel of a comic laid out by {@link layoutComicFrame}
196
+ * (undefined for an empty cell), in panel order. Internal to the comics
197
+ * modules. */
198
+ export function comicPanelSources(comic) {
199
+ return panelSourcesOf.get(comic) ?? [];
200
+ }
205
201
  /** Set the layout warnings of a comic laid out in parts (each page of a
206
202
  * spread gets those of its panels). Internal to the comics modules. */
207
203
  export function setComicLayoutWarnings(comic, warnings) {
@@ -629,6 +625,7 @@ export function layoutComicPage(source, given) {
629
625
  trimBox: ctx.trimBox,
630
626
  resources: ctx.resources,
631
627
  ...(ctx.sourceOffset !== undefined ? { sourceOffset: ctx.sourceOffset } : {}),
628
+ ...(ctx.fenceIndex !== undefined ? { fenceIndex: ctx.fenceIndex } : {}),
632
629
  pageIndex: ctx.page.index,
633
630
  });
634
631
  if (leaf)
@@ -659,23 +656,39 @@ export function layoutComicFrame(source, ctx) {
659
656
  const panels = [];
660
657
  const panelSources = [];
661
658
  const mirrorDefault = comics.mirrorArt && direction !== comics.artDirection;
662
- const buildPanel = (whole, p) => {
659
+ // The split generates the frames (#885): one per cell (its panel's
660
+ // `pad` taken off), and one per inset panel over the frame before it.
661
+ const specs = comicFrameSpecs(source.panels, geometry.cells, (p, box) => comicPanelPadding(p?.attrs.pad, box, direction, dpi));
662
+ const fence = ctx.fenceIndex ?? source.fenceIndex;
663
+ const buildPanel = (cell) => {
664
+ const p = cell.panel;
663
665
  const style = styleOf(p);
664
666
  const attrs = p?.attrs ?? {};
665
- const cell = padCell(whole, comicPanelPadding(attrs.pad, whole.bbox, direction, dpi));
667
+ // A callout style named by `box` (#885) dresses the panel: its
668
+ // background, border and corner radius over the panel style's (the
669
+ // panel's own `border` and `bg` still win). A text panel's box is drawn
670
+ // by its frame, round its text: the panel then draws none.
671
+ const box = comicBoxStyle(resolved, attrs.box);
672
+ const boxDraws = box !== undefined && isComicTextPanel(p);
666
673
  const border = attrs.border?.trim();
667
- const borderWidth = border === 'none' ? 0 : border ? dimensionToPx(parseComicDimension(border) ?? style.borderWidth, dpi) : dimensionToPx(style.borderWidth, dpi);
668
- const bg = attrColor(attrs.bg, resolved.colorPalette) ?? style.background.hex;
674
+ const boxBorder = box ? (box.border.enabled ? dimensionToPx(box.border.width, dpi) : 0) : undefined;
675
+ const borderWidth = boxDraws ? 0
676
+ : border === 'none' ? 0 : border ? dimensionToPx(parseComicDimension(border) ?? style.borderWidth, dpi) : boxBorder ?? dimensionToPx(style.borderWidth, dpi);
677
+ const bg = boxDraws ? undefined
678
+ : attrColor(attrs.bg, resolved.colorPalette) ?? (box ? (box.backgroundEnabled ? box.background.hex : 'transparent') : style.background.hex);
679
+ const borderColor = box && !border ? box.border.color.hex : style.borderColor.hex;
680
+ const radiusPx = dimensionToPx(box ? box.borderRadius : style.borderRadius, dpi);
669
681
  const index = panels.length;
670
682
  const panel = {
671
683
  index,
672
684
  ...(attrs.id ? { id: attrs.id } : {}),
685
+ ...(fence !== undefined ? { frameId: comicFrameElementId(fence, cell.name) } : {}),
673
686
  sourceStart: (p?.sourceStart ?? source.sourceStart) + off,
674
687
  sourceEnd: (p?.sourceEnd ?? source.sourceStart) + off,
675
688
  polygon: cell.polygon,
676
689
  bbox: cell.bbox,
677
- radius: cell.rect ? Math.min(dimensionToPx(style.borderRadius, dpi), cell.bbox.width / 2, cell.bbox.height / 2) : 0,
678
- border: { width: borderWidth, color: style.borderColor.hex, style: borderWidth > 0 ? style.borderStyle : 'none' },
690
+ radius: cell.rect ? Math.min(radiusPx, cell.bbox.width / 2, cell.bbox.height / 2) : 0,
691
+ border: { width: borderWidth, color: borderColor, style: borderWidth > 0 ? (box && !border ? 'solid' : style.borderStyle) : 'none' },
679
692
  ...(bg && bg !== 'transparent' ? { background: bg } : {}),
680
693
  };
681
694
  const fit = attrs.fit === 'contain' || attrs.fit === 'cover' ? attrs.fit : style.fit;
@@ -704,37 +717,11 @@ export function layoutComicFrame(source, ctx) {
704
717
  panel.altText = alt;
705
718
  return panel;
706
719
  };
707
- // Cells take the flow panels in reading order; inset panels sit over the
708
- // panel before them.
709
- let flowIndex = 0;
710
- const pending = [...source.panels];
711
- for (const cell of geometry.cells) {
712
- // Inset panels that come before the next flow panel follow the panel
713
- // laid out last.
714
- while (pending.length > 0 && pending[0].attrs.inset)
715
- layInset(pending.shift());
716
- const p = flowPanels[flowIndex];
717
- if (p && pending[0] === p)
718
- pending.shift();
719
- flowIndex++;
720
- panels.push(buildPanel(cell, p));
721
- panelSources.push(p);
722
- }
723
- while (pending.length > 0 && pending[0].attrs.inset)
724
- layInset(pending.shift());
725
- function layInset(p) {
726
- const prev = panels[panels.length - 1];
727
- const box = prev ? insetBox(p.attrs.inset, prev.bbox) : undefined;
728
- if (!box)
729
- return;
730
- const polygon = [
731
- { x: box.x, y: box.y },
732
- { x: box.x + box.width, y: box.y },
733
- { x: box.x + box.width, y: box.y + box.height },
734
- { x: box.x, y: box.y + box.height },
735
- ];
736
- panels.push(buildPanel({ polygon, bbox: polygonBBox(polygon), rect: true }, p));
737
- panelSources.push(p);
720
+ // Each frame holds its panel: cells take the flow panels in reading
721
+ // order, inset panels sit over the panel before them.
722
+ for (const spec of specs) {
723
+ panels.push(buildPanel(spec));
724
+ panelSources.push(spec.panel);
738
725
  }
739
726
  const splitRange = source.attrSources.split;
740
727
  const valueStart = (splitRange?.start ?? source.attrsEnd) + off;
@@ -751,27 +738,25 @@ export function layoutComicFrame(source, ctx) {
751
738
  };
752
739
  const lettered = letterPanels({ source, panels, panelSources, comics, resolved, resources, direction, sourceOffset: off, pageIndex: ctx.pageIndex, frame, bleedBox: ctx.bleedBox, ...(ctx.trimBox ? { trim: ctx.trimBox } : {}), ...(ctx.avoid ? { avoid: ctx.avoid } : {}) });
753
740
  comic.balloons = lettered.balloons;
741
+ if (fence !== undefined) {
742
+ comic.id = comicElementId(fence);
743
+ comic.frames = panels.map((panel, i) => {
744
+ const f = comicPanelFrame(panel, specs[i].name, specs[i].layer);
745
+ const box = comicBoxStyle(resolved, specs[i].panel?.attrs.box);
746
+ return box ? { ...f, styleId: box.id } : f;
747
+ });
748
+ for (const b of comic.balloons) {
749
+ const owner = panels[b.panelIndex];
750
+ if (owner?.frameId)
751
+ b.elementId = comicBalloonElementId(owner.frameId, b.order);
752
+ }
753
+ }
754
754
  warnings.push(...lettered.warnings);
755
755
  if (warnings.length > 0)
756
756
  layoutWarnings.set(comic, warnings);
757
+ panelSourcesOf.set(comic, panelSources);
757
758
  return comic;
758
759
  }
759
- /** A cell inset by its panel's `pad`. */
760
- function padCell(cell, pad) {
761
- if (!pad || (pad.top === 0 && pad.right === 0 && pad.bottom === 0 && pad.left === 0))
762
- return cell;
763
- const b = cell.bbox;
764
- const x0 = b.x + pad.left;
765
- const x1 = Math.max(x0, b.x + b.width - pad.right);
766
- const y0 = b.y + pad.top;
767
- const y1 = Math.max(y0, b.y + b.height - pad.bottom);
768
- let poly = cell.polygon;
769
- poly = clipPolygon(poly, { nx: -1, ny: 0, c: -x0 });
770
- poly = clipPolygon(poly, { nx: 1, ny: 0, c: x1 });
771
- poly = clipPolygon(poly, { nx: 0, ny: -1, c: -y0 });
772
- poly = clipPolygon(poly, { nx: 0, ny: 1, c: y1 });
773
- return { polygon: poly, bbox: polygonBBox(poly), rect: cell.rect };
774
- }
775
760
  function artOf(art, crop, mirrored) {
776
761
  return {
777
762
  resourceId: art.resource.id,