postext 1.39.0 → 1.40.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 (125) hide show
  1. package/dist/__tests__/comics/frames.test.js +0 -8
  2. package/dist/__tests__/comics/frames.test.js.map +1 -1
  3. package/dist/__tests__/comics/textPanelsStripsSpreads.test.d.ts +2 -0
  4. package/dist/__tests__/comics/textPanelsStripsSpreads.test.d.ts.map +1 -0
  5. package/dist/__tests__/comics/textPanelsStripsSpreads.test.js +277 -0
  6. package/dist/__tests__/comics/textPanelsStripsSpreads.test.js.map +1 -0
  7. package/dist/__tests__/composed/fit.test.js +77 -0
  8. package/dist/__tests__/composed/fit.test.js.map +1 -1
  9. package/dist/__tests__/composed/frameModesChain.test.d.ts +2 -0
  10. package/dist/__tests__/composed/frameModesChain.test.d.ts.map +1 -0
  11. package/dist/__tests__/composed/frameModesChain.test.js +69 -0
  12. package/dist/__tests__/composed/frameModesChain.test.js.map +1 -0
  13. package/dist/__tests__/composed/framePictures.test.d.ts +2 -0
  14. package/dist/__tests__/composed/framePictures.test.d.ts.map +1 -0
  15. package/dist/__tests__/composed/framePictures.test.js +121 -0
  16. package/dist/__tests__/composed/framePictures.test.js.map +1 -0
  17. package/dist/__tests__/composed/frameWritingMode.test.js +79 -3
  18. package/dist/__tests__/composed/frameWritingMode.test.js.map +1 -1
  19. package/dist/__tests__/composed/labels.test.js +19 -0
  20. package/dist/__tests__/composed/labels.test.js.map +1 -1
  21. package/dist/__tests__/composed/labelsMirrored.test.d.ts +2 -0
  22. package/dist/__tests__/composed/labelsMirrored.test.d.ts.map +1 -0
  23. package/dist/__tests__/composed/labelsMirrored.test.js +128 -0
  24. package/dist/__tests__/composed/labelsMirrored.test.js.map +1 -0
  25. package/dist/__tests__/composed/measureMemo.test.d.ts +2 -0
  26. package/dist/__tests__/composed/measureMemo.test.d.ts.map +1 -0
  27. package/dist/__tests__/composed/measureMemo.test.js +45 -0
  28. package/dist/__tests__/composed/measureMemo.test.js.map +1 -0
  29. package/dist/__tests__/composedTemplates.test.js +5 -2
  30. package/dist/__tests__/composedTemplates.test.js.map +1 -1
  31. package/dist/__tests__/exports.test.js +3 -0
  32. package/dist/__tests__/exports.test.js.map +1 -1
  33. package/dist/__tests__/migrate/labelsOnPictures.test.js +49 -1
  34. package/dist/__tests__/migrate/labelsOnPictures.test.js.map +1 -1
  35. package/dist/canvas-backend/composed.d.ts +2 -2
  36. package/dist/canvas-backend/composed.d.ts.map +1 -1
  37. package/dist/canvas-backend/composed.js +11 -2
  38. package/dist/canvas-backend/composed.js.map +1 -1
  39. package/dist/canvas-backend/index.d.ts.map +1 -1
  40. package/dist/canvas-backend/index.js +10 -1
  41. package/dist/canvas-backend/index.js.map +1 -1
  42. package/dist/canvas-backend/mirrorFrame.d.ts +19 -0
  43. package/dist/canvas-backend/mirrorFrame.d.ts.map +1 -1
  44. package/dist/canvas-backend/mirrorFrame.js +47 -0
  45. package/dist/canvas-backend/mirrorFrame.js.map +1 -1
  46. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  47. package/dist/canvas-backend/renderResourceBlock.js +35 -26
  48. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  49. package/dist/comics/frames.d.ts +5 -0
  50. package/dist/comics/frames.d.ts.map +1 -1
  51. package/dist/comics/frames.js +7 -0
  52. package/dist/comics/frames.js.map +1 -1
  53. package/dist/comics/layoutPage.d.ts +5 -0
  54. package/dist/comics/layoutPage.d.ts.map +1 -1
  55. package/dist/comics/layoutPage.js +9 -0
  56. package/dist/comics/layoutPage.js.map +1 -1
  57. package/dist/comics/sourceMap.d.ts.map +1 -1
  58. package/dist/comics/sourceMap.js +6 -4
  59. package/dist/comics/sourceMap.js.map +1 -1
  60. package/dist/comics/spread.d.ts +6 -1
  61. package/dist/comics/spread.d.ts.map +1 -1
  62. package/dist/comics/spread.js +15 -1
  63. package/dist/comics/spread.js.map +1 -1
  64. package/dist/comics/textPanels.d.ts +30 -6
  65. package/dist/comics/textPanels.d.ts.map +1 -1
  66. package/dist/comics/textPanels.js +226 -69
  67. package/dist/comics/textPanels.js.map +1 -1
  68. package/dist/comics/transform.d.ts.map +1 -1
  69. package/dist/comics/transform.js +4 -2
  70. package/dist/comics/transform.js.map +1 -1
  71. package/dist/composed/labels.d.ts +9 -0
  72. package/dist/composed/labels.d.ts.map +1 -1
  73. package/dist/composed/labels.js +36 -4
  74. package/dist/composed/labels.js.map +1 -1
  75. package/dist/composed/paint.d.ts +10 -6
  76. package/dist/composed/paint.d.ts.map +1 -1
  77. package/dist/composed/paint.js +38 -7
  78. package/dist/composed/paint.js.map +1 -1
  79. package/dist/composed/sourceMap.d.ts.map +1 -1
  80. package/dist/composed/sourceMap.js +7 -1
  81. package/dist/composed/sourceMap.js.map +1 -1
  82. package/dist/composed/templates.d.ts.map +1 -1
  83. package/dist/composed/templates.js +9 -4
  84. package/dist/composed/templates.js.map +1 -1
  85. package/dist/composed/types.d.ts +9 -4
  86. package/dist/composed/types.d.ts.map +1 -1
  87. package/dist/html-backend.d.ts.map +1 -1
  88. package/dist/html-backend.js +36 -14
  89. package/dist/html-backend.js.map +1 -1
  90. package/dist/index.d.ts +2 -2
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +2 -2
  93. package/dist/index.js.map +1 -1
  94. package/dist/migrate/pageDesign.d.ts +6 -1
  95. package/dist/migrate/pageDesign.d.ts.map +1 -1
  96. package/dist/migrate/pageDesign.js +26 -10
  97. package/dist/migrate/pageDesign.js.map +1 -1
  98. package/dist/migrate/textToMarkdown.js +4 -3
  99. package/dist/migrate/textToMarkdown.js.map +1 -1
  100. package/dist/pipeline/build.d.ts.map +1 -1
  101. package/dist/pipeline/build.js +67 -10
  102. package/dist/pipeline/build.js.map +1 -1
  103. package/dist/pipeline/calloutLayout.d.ts +11 -0
  104. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  105. package/dist/pipeline/calloutLayout.js +20 -1
  106. package/dist/pipeline/calloutLayout.js.map +1 -1
  107. package/dist/pipeline/composedLayout.d.ts.map +1 -1
  108. package/dist/pipeline/composedLayout.js +103 -24
  109. package/dist/pipeline/composedLayout.js.map +1 -1
  110. package/dist/pipeline/frameLayout.d.ts +5 -1
  111. package/dist/pipeline/frameLayout.d.ts.map +1 -1
  112. package/dist/pipeline/frameLayout.js +1 -0
  113. package/dist/pipeline/frameLayout.js.map +1 -1
  114. package/dist/pipeline/measureMemo.d.ts +39 -0
  115. package/dist/pipeline/measureMemo.d.ts.map +1 -0
  116. package/dist/pipeline/measureMemo.js +61 -0
  117. package/dist/pipeline/measureMemo.js.map +1 -0
  118. package/dist/pipeline/mirrorFrame.d.ts +2 -1
  119. package/dist/pipeline/mirrorFrame.d.ts.map +1 -1
  120. package/dist/pipeline/mirrorFrame.js +31 -5
  121. package/dist/pipeline/mirrorFrame.js.map +1 -1
  122. package/dist/vdt.d.ts +17 -0
  123. package/dist/vdt.d.ts.map +1 -1
  124. package/dist/vdt.js.map +1 -1
  125. package/package.json +1 -1
@@ -10,7 +10,7 @@
10
10
  * the right page's sheet set against it so that the two trim boxes meet at
11
11
  * the spine.
12
12
  */
13
- import type { ResolvedConfig, VDTComicPage } from '../vdt';
13
+ import type { BoundingBox, ResolvedConfig, VDTComicPage } from '../vdt';
14
14
  import type { Resource } from '../types';
15
15
  import { type ComicPageContext } from './layoutPage';
16
16
  import type { ComicPageSource } from './types';
@@ -26,6 +26,11 @@ export interface ComicSpreadContext {
26
26
  left: ComicSpreadPage;
27
27
  right: ComicSpreadPage;
28
28
  }
29
+ /** The band about the spine that lettering and text keep out of, on a
30
+ * half of a spread laid out by {@link layoutComicSpread} (the half of a
31
+ * gutter 8 mm wide that lies on its sheet, sheet px); undefined for
32
+ * anything else. */
33
+ export declare function comicSpreadGutter(comic: Pick<VDTComicPage, 'spread' | 'frame'>, dpi: number, sheetHeight: number): BoundingBox | undefined;
29
34
  /**
30
35
  * Lay out a spread over two facing pages: `[left, right]`, each on its own
31
36
  * sheet. Reading direction, gutters, panel styles and bleed work as on a
@@ -1 +1 @@
1
- {"version":3,"file":"spread.d.ts","sourceRoot":"","sources":["../../src/comics/spread.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAe,cAAc,EAAE,YAAY,EAA6C,MAAM,QAAQ,CAAC;AACnH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAsG,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIzJ,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAMtF;AAED,uDAAuD;AACvD,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,eAAe,GAAG,YAAY,CAAC,CAAC;AAEvH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,eAAe,CAAC;CACxB;AA0CD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,kBAAkB,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAqGlH"}
1
+ {"version":3,"file":"spread.d.ts","sourceRoot":"","sources":["../../src/comics/spread.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAA6C,MAAM,QAAQ,CAAC;AACnH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAA6H,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIhL,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAMtF;AAED,uDAAuD;AACvD,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,eAAe,GAAG,YAAY,CAAC,CAAC;AAEvH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED;;;qBAGqB;AACrB,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAO1I;AA0CD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,kBAAkB,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAsGlH"}
@@ -11,7 +11,7 @@
11
11
  * the spine.
12
12
  */
13
13
  import { clipPolygon, polygonBBox } from './geometry';
14
- import { comicPageFrame, comicPageLayoutWarnings, comicViewerLeaf, layoutComicFrame, setComicLayoutWarnings } from './layoutPage';
14
+ import { comicPageFrame, comicPageLayoutWarnings, comicViewerLeaf, copyComicPanelSources, layoutComicFrame, setComicLayoutWarnings } from './layoutPage';
15
15
  import { resolvedComics } from '../defaults/comics';
16
16
  import { translateComicBalloon, translateComicPanel, translateComicSplitter } from './transform';
17
17
  import { comicFramesFor } from './frames';
@@ -25,6 +25,19 @@ export function isComicSpread(source) {
25
25
  const t = v.trim().toLowerCase();
26
26
  return !(t === 'false' || t === 'no' || t === '0' || t === 'none');
27
27
  }
28
+ /** The band about the spine that lettering and text keep out of, on a
29
+ * half of a spread laid out by {@link layoutComicSpread} (the half of a
30
+ * gutter 8 mm wide that lies on its sheet, sheet px); undefined for
31
+ * anything else. */
32
+ export function comicSpreadGutter(comic, dpi, sheetHeight) {
33
+ if (!comic.spread)
34
+ return undefined;
35
+ const half = (4 / 25.4) * dpi;
36
+ const reach = half + 2 * SPINE_OVERRUN;
37
+ return comic.spread === 'left'
38
+ ? { x: comic.frame.x + comic.frame.width - half, y: 0, width: reach, height: sheetHeight }
39
+ : { x: comic.frame.x - 2 * SPINE_OVERRUN, y: 0, width: reach, height: sheetHeight };
40
+ }
28
41
  /** Past the sheet's edge at the spine: a panel crossing the spine is cut
29
42
  * this far beyond the sheet, so its border is never stroked along the
30
43
  * spine and its picture runs into the gutter bleed. */
@@ -162,6 +175,7 @@ export function layoutComicSpread(source, given) {
162
175
  balloons,
163
176
  ...(whole.id ? { id: whole.id } : {}),
164
177
  };
178
+ copyComicPanelSources(whole, comic);
165
179
  // The frames of the panels the page shows, cut and moved as they are.
166
180
  const frames = comicFramesFor(whole, panels);
167
181
  if (frames)
@@ -1 +1 @@
1
- {"version":3,"file":"spread.js","sourceRoot":"","sources":["../../src/comics/spread.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spread.js","sourceRoot":"","sources":["../../src/comics/spread.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,eAAe,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,sBAAsB,EAAyB,MAAM,cAAc,CAAC;AAChL,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,kEAAkE;AAClE,MAAM,UAAU,aAAa,CAAC,MAA+C;IAC3E,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;IAC9B,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;AAcD;;;qBAGqB;AACrB,MAAM,UAAU,iBAAiB,CAAC,KAA6C,EAAE,GAAW,EAAE,WAAmB;IAC/G,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,aAAa,CAAC;IACvC,OAAO,KAAK,CAAC,MAAM,KAAK,MAAM;QAC5B,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE;QAC1F,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACxF,CAAC;AAED;;wDAEwD;AACxD,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB;2EAC2E;AAC3E,SAAS,SAAS,CAAC,KAAoB,EAAE,IAAsB,EAAE,EAAU;IACzE,MAAM,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5F,IAAI,MAAM;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,KAAK,MAAM;QAC1B,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACrD,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACtC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IAC5D,uEAAuE;IACvE,WAAW;IACX,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,wEAAwE;AACxE,SAAS,YAAY,CAAC,CAAmB,EAAE,IAAY,EAAE,IAAY;IACnE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI;YAAE,OAAO,SAAS,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7B,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACpC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC;IACxC,CAAC;IACD,MAAM,EAAE,GAAG,CAAC,CAAS,EAAY,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpF,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAuB,EAAE,KAAyB;IAClF,oEAAoE;IACpE,+CAA+C;IAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,CAAC,CAAkB,EAAE,IAA+B,EAAmB,EAAE,CACtF,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;IACpG,MAAM,GAAG,GAAuB,KAAK,IAAI,KAAK;QAC5C,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;QACrK,CAAC,CAAC,KAAK,CAAC;IACV,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IACtC,MAAM,SAAS,GAAG,cAAc,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,cAAc,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC1D,sEAAsE;IACtE,4DAA4D;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAClD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;IACjD,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAgB;QACzB,CAAC,EAAE,SAAS,CAAC,CAAC;QACd,CAAC,EAAE,GAAG;QACN,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;QAC5D,MAAM,EAAE,MAAM,GAAG,GAAG;KACrB,CAAC;IACF,MAAM,QAAQ,GAAgB;QAC5B,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9C,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;KACjJ,CAAC;IACF,MAAM,OAAO,GAAgB;QAC3B,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;KAC3I,CAAC;IACF,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE;QACrC,QAAQ;QACR,KAAK;QACL,QAAQ;QACR,OAAO;QACP,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,GAAG,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;QAC1B,uEAAuE;QACvE,wEAAwE;QACxE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;KAClG,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,CAAC,KAAa,EAAoB,EAAE;QACtD,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACtE,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,IAAsB,EAAgB,EAAE;QACpD,MAAM,IAAI,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACtD,MAAM,EAAE,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACxC,kEAAkE;QAClE,MAAM,IAAI,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,aAAa,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC1E,MAAM,GAAG,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;aACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;aACnC,MAAM,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;aAClD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;aACpG,MAAM,CAAC,CAAC,CAAC,EAAyB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;aACrD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;aAC1E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,IAAI,KAAK,MAAM;YAC9B,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;YACvF,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAChH,MAAM,KAAK,GAAiB;YAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,IAAI;YACZ,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5E,MAAM;YACN,SAAS;YACT,QAAQ;YACR,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtC,CAAC;QACF,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACpC,sEAAsE;QACtE,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,oEAAoE;QACpE,iCAAiC;QACjC,sBAAsB,CAAC,KAAK,EAAE,QAAQ;aACnC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,IAAI,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;aAC/H,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACvC,CAAC"}
@@ -10,14 +10,15 @@
10
10
  * in its panel's frame with the composed pages' frame layout
11
11
  * (`layoutComposedPage`, one frame filling the panel's text area), so a
12
12
  * text panel has real paragraphs: selectable, searchable, read in order by
13
- * tagged PDF and EPUB. Where a frame cannot take the text (a strip, a
14
- * spread, a page whose flow is turned or mirrored), the blocks stay
15
- * unwrapped and are set in the flow after the comic, never lost
16
- * (`comicPanelFrame`).
13
+ * tagged PDF and EPUB. A strip's text frames are laid once the strip has
14
+ * its place on the page ({@link layoutStripTextFrames}), a spread's on its
15
+ * two pages; a comic inside a container keeps its text in the flow after
16
+ * the comic, never lost.
17
17
  */
18
18
  import type { ContentBlock } from '../parse/types';
19
19
  import type { ResolvedCalloutStyleConfig } from '../types';
20
20
  import type { ContentWarning, ResolvedConfig, VDTBlock, VDTComicPage, VDTPage } from '../vdt';
21
+ import { type BoundingBox } from '../vdt';
21
22
  import type { ResolvedFrame } from '../composed/types';
22
23
  import type { BoxExclusion, PlannedCallout } from '../pipeline/calloutLayout';
23
24
  import type { FrameLayoutPass } from '../pipeline/frameLayout';
@@ -36,8 +37,10 @@ export declare const comicTextStoryKey: (panelIndex: number) => string;
36
37
  * vertical page). Kept for the callers that ask. */
37
38
  export declare function comicTextPanelsSupported(resolved?: Pick<ResolvedConfig, 'layout'> & Parameters<typeof resolvedDirection>[0]): boolean;
38
39
  /** Why a text panel's Markdown is set in the flow instead of its frame:
39
- * the comic is a strip or a spread, or the document's flow is turned or
40
- * mirrored. Undefined when its frame takes it. */
40
+ * never since postext 1.40 (#959: strips and spreads take their text in
41
+ * the frames too); `'flow'` only for a caller that passes `supported`
42
+ * false. Undefined when its frame takes it. Kept for the callers that
43
+ * ask; `source` is read no more. */
41
44
  export declare function comicTextPanelFallback(source: Pick<ComicPageSource, 'kind' | 'attrs'>, supported: boolean): 'strip' | 'spread' | 'flow' | undefined;
42
45
  /**
43
46
  * `blocks` with the Markdown of every text panel of a comic page set in
@@ -71,6 +74,12 @@ export interface ComicTextFramesInput {
71
74
  mirrored: boolean;
72
75
  pushGapPx: number;
73
76
  locale?: string;
77
+ /** Only the text panels with these source indexes are laid (a spread
78
+ * gives each panel to one of its two pages); all when unset. */
79
+ only?: ReadonlySet<number>;
80
+ /** Boxes on the sheet the text keeps off (a spread's gutter), each set
81
+ * short where it crosses a line. */
82
+ avoid?: readonly BoundingBox[];
74
83
  }
75
84
  export interface ComicTextFramesLayout {
76
85
  /** The frames' boxes and content, for `page.floats` and `doc.blocks`. */
@@ -86,8 +95,23 @@ export interface ComicTextFramesLayout {
86
95
  * area is the panel's box inside its border and the lettering's inset;
87
96
  * with a `box` style, the panel's box (the style's padding keeps the text
88
97
  * off its edges).
98
+ *
99
+ * `comic` is on the sheet of `page`: a comic page, a half of a spread, or
100
+ * a strip moved there ({@link layoutStripTextFrames}).
89
101
  */
90
102
  export declare function layoutComicTextFrames(input: ComicTextFramesInput): ComicTextFramesLayout;
103
+ /**
104
+ * The text panels of a strip (`:::strip`, #959), laid once the strip's block
105
+ * has its place on the page: the strip's comic stands relative to its block
106
+ * (`VDTBlock.comic`), so it is moved onto the sheet where the block sits
107
+ * ({@link flowRectToPage}), its text set there in the page's flow frame, and
108
+ * what the frames came to (blocks, overflow, scale, warnings) written back
109
+ * on the block's comic, which keeps moving with the block. `input.comic` is
110
+ * ignored; `block` is the strip.
111
+ */
112
+ export declare function layoutStripTextFrames(input: Omit<ComicTextFramesInput, 'comic'> & {
113
+ block: Pick<VDTBlock, 'bbox' | 'comic'>;
114
+ }): ComicTextFramesLayout;
91
115
  /** The least scale a text panel's `shrink` attribute lets its text take
92
116
  * (#909): `shrink` alone, 0.5; `shrink=0.7` (or `70%`), that, kept
93
117
  * between 0.25 and 1; undefined without it (or `shrink=false`). */
@@ -1 +1 @@
1
- {"version":3,"file":"textPanels.d.ts","sourceRoot":"","sources":["../../src/comics/textPanels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"textPanels.d.ts","sourceRoot":"","sources":["../../src/comics/textPanels.ts"],"names":[],"mappings":"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"}
@@ -10,20 +10,21 @@
10
10
  * in its panel's frame with the composed pages' frame layout
11
11
  * (`layoutComposedPage`, one frame filling the panel's text area), so a
12
12
  * text panel has real paragraphs: selectable, searchable, read in order by
13
- * tagged PDF and EPUB. Where a frame cannot take the text (a strip, a
14
- * spread, a page whose flow is turned or mirrored), the blocks stay
15
- * unwrapped and are set in the flow after the comic, never lost
16
- * (`comicPanelFrame`).
13
+ * tagged PDF and EPUB. A strip's text frames are laid once the strip has
14
+ * its place on the page ({@link layoutStripTextFrames}), a spread's on its
15
+ * two pages; a comic inside a container keeps its text in the flow after
16
+ * the comic, never lost.
17
17
  */
18
- import { pageRectToFlow, pageToFlow } from '../vdt';
18
+ import { flowRectToPage, pageRectToFlow, pageToFlow } from '../vdt';
19
19
  import { FRAME_ATTR, FRAME_STYLE_ID } from '../composed/wrap';
20
20
  import { normalizeFrame } from '../composed/templates';
21
21
  import { composedStories, layoutComposedPage } from '../pipeline/composedLayout';
22
+ import { SPAN_EMBED_STYLE_ID } from '../pipeline/spanEmbeds';
22
23
  import { dimensionToPx } from '../units';
23
24
  import { resolvedComics } from '../defaults/comics';
24
- import { isComicSpread } from './spread';
25
25
  import { comicBoxStyle, isComicTextPanel } from './frames';
26
- import { comicPanelSources, setComicLayoutWarnings, comicPageLayoutWarnings } from './layoutPage';
26
+ import { translateComicPage } from './transform';
27
+ import { comicPanelSources, copyComicPanelSources, setComicLayoutWarnings, comicPageLayoutWarnings } from './layoutPage';
27
28
  /** `containerAttrs` key of a text panel's story box: the panel's index in
28
29
  * its page's source (`ComicPanelSource.index`). */
29
30
  export const COMIC_PANEL_ATTR = '__comicPanel';
@@ -42,16 +43,13 @@ export function comicTextPanelsSupported(resolved) {
42
43
  return true;
43
44
  }
44
45
  /** Why a text panel's Markdown is set in the flow instead of its frame:
45
- * the comic is a strip or a spread, or the document's flow is turned or
46
- * mirrored. Undefined when its frame takes it. */
46
+ * never since postext 1.40 (#959: strips and spreads take their text in
47
+ * the frames too); `'flow'` only for a caller that passes `supported`
48
+ * false. Undefined when its frame takes it. Kept for the callers that
49
+ * ask; `source` is read no more. */
47
50
  export function comicTextPanelFallback(source, supported) {
48
- if (source.kind === 'strip')
49
- return 'strip';
50
- if (isComicSpread(source))
51
- return 'spread';
52
- if (!supported)
53
- return 'flow';
54
- return undefined;
51
+ void source;
52
+ return supported ? undefined : 'flow';
55
53
  }
56
54
  /**
57
55
  * `blocks` with the Markdown of every text panel of a comic page set in
@@ -120,9 +118,16 @@ export function planComicTextPanels(blocks, plans) {
120
118
  if (b.type !== 'directive' || !b.comic)
121
119
  continue;
122
120
  let end = i;
121
+ // A page-wide strip set where it stands is boxed (`wrapPageSpanEmbeds`):
122
+ // its stories follow the box's closing marker.
123
+ const prev = blocks[i - 1];
124
+ const next = blocks[i + 1];
125
+ if (prev?.type === 'containerStart' && prev.containerAttrs?.type === SPAN_EMBED_STYLE_ID && next?.type === 'containerEnd' && next.containerId === prev.containerId)
126
+ end = i + 1;
127
+ const lead = end;
123
128
  for (let plan = plans.get(end + 1); plan && plan.attrs[COMIC_PANEL_ATTR] !== undefined; plan = plans.get(end + 1))
124
129
  end = plan.endIdx;
125
- if (end === i)
130
+ if (end === lead)
126
131
  continue;
127
132
  const stories = composedStories(i, end + 1, plans);
128
133
  const list = [...stories.values()];
@@ -137,6 +142,14 @@ export function planComicTextPanels(blocks, plans) {
137
142
  return out;
138
143
  }
139
144
  const px = (v) => ({ value: v, unit: 'px' });
145
+ /** The first block of a laid story that sets text: where its text starts,
146
+ * which moves with the frame's vertical alignment. */
147
+ function firstTextY(blocks) {
148
+ for (const b of blocks)
149
+ if (b.type !== 'callout' && !b.hidden && b.lines.length > 0)
150
+ return b.bbox.y;
151
+ return undefined;
152
+ }
140
153
  /**
141
154
  * Set the text panels of a laid-out comic page in their frames: each text
142
155
  * frame of `comic.frames` gets the blocks its story was set in
@@ -145,6 +158,9 @@ const px = (v) => ({ value: v, unit: 'px' });
145
158
  * area is the panel's box inside its border and the lettering's inset;
146
159
  * with a `box` style, the panel's box (the style's padding keeps the text
147
160
  * off its edges).
161
+ *
162
+ * `comic` is on the sheet of `page`: a comic page, a half of a spread, or
163
+ * a strip moved there ({@link layoutStripTextFrames}).
148
164
  */
149
165
  export function layoutComicTextFrames(input) {
150
166
  const { comic, page, plan, resolved, dpi } = input;
@@ -156,76 +172,152 @@ export function layoutComicTextFrames(input) {
156
172
  const insetPx = dimensionToPx(resolvedComics(resolved).lettering.inset, dpi);
157
173
  const warnings = [];
158
174
  const fence = Number(/^cm(\d+)$/.exec(comic.id ?? '')?.[1] ?? 0);
175
+ // The sheet's boxes to keep off, in the page's flow frame.
176
+ const avoid = (input.avoid ?? []).map((r) => {
177
+ const f = page.flow ? pageRectToFlow(page, r) : r;
178
+ return { x: f.x, y: f.y, width: f.width, height: f.height };
179
+ });
159
180
  comic.frames.forEach((frame, fi) => {
160
181
  const panelIndex = frame.panel ?? fi;
161
182
  const src = sources[panelIndex];
162
183
  if (!src || !isComicTextPanel(src))
163
184
  return;
185
+ if (input.only && !input.only.has(src.index))
186
+ return;
164
187
  const key = comicTextStoryKey(src.index);
165
188
  const story = plan.stories.get(key);
166
189
  if (!story)
167
190
  return;
168
- const panel = comic.panels[panelIndex];
191
+ const panel = comic.panels.find((q) => q.index === panelIndex) ?? comic.panels[panelIndex];
192
+ if (!panel)
193
+ return;
169
194
  const box = comicBoxStyle(resolved, src.attrs.box);
170
195
  const edge = box ? 0 : panel.border.width + insetPx;
171
196
  const valign = src.attrs.valign?.trim().toLowerCase();
197
+ const aligned = valign === 'middle' || valign === 'bottom';
172
198
  // A slanted cell: frameless text set from the top takes the whole cell,
173
- // each line set short where a slant crosses it (#909); a box drawn round
174
- // the text, or text set to the middle or the foot, keeps to the widest
175
- // box with straight sides inside the outline.
176
- const follows = !!frame.polygon && !box && valign !== 'middle' && valign !== 'bottom';
177
- const r = frame.polygon && !follows ? innerBox(frame.polygon, panel.bbox) : panel.bbox;
178
- const onSheet = { x: r.x + edge, y: r.y + edge, width: Math.max(1, r.width - 2 * edge), height: Math.max(1, r.height - 2 * edge) };
179
- // The comic stands on the sheet; the text is set in the page's flow
180
- // frame (#909), mirrored on a right-to-left page and turned on a
181
- // vertical one (where it is set vertically).
182
- const area = page.flow ? pageRectToFlow(page, onSheet) : onSheet;
199
+ // each line set short where a slant crosses it (#909). Text set to the
200
+ // middle or the foot follows the slant too, laid again with the slant
201
+ // moved by the room above it (#959); a box drawn round the text keeps
202
+ // to the widest box with straight sides inside the outline.
203
+ const follows = !!frame.polygon && !box;
183
204
  const outline = follows ? (page.flow ? frame.polygon.map((q) => pageToFlow(page, q.x, q.y)) : frame.polygon) : undefined;
184
- const slants = outline ? slantExclusions(outline, area, edge) : [];
205
+ const areaOf = (r) => {
206
+ const onSheet = { x: r.x + edge, y: r.y + edge, width: Math.max(1, r.width - 2 * edge), height: Math.max(1, r.height - 2 * edge) };
207
+ // The comic stands on the sheet; the text is set in the page's flow
208
+ // frame (#909), mirrored on a right-to-left page and turned on a
209
+ // vertical one (where it is set vertically).
210
+ return page.flow ? pageRectToFlow(page, onSheet) : onSheet;
211
+ };
185
212
  // `shrink` (#909): the text set smaller until it fits, down to half
186
213
  // its size or the `shrink=` given; else the frames' least, 90 %.
187
214
  const minScale = shrinkScale(src.attrs.shrink);
188
215
  const padding = box ? undefined : { top: px(0), right: px(0), bottom: px(0), left: px(0) };
189
- const resolvedFrame = normalizeFrame({
190
- name: frame.name,
191
- width: 'fill',
192
- height: 'fill',
193
- ...(box ? { style: box.id } : {}),
194
- ...(valign === 'middle' || valign === 'bottom' ? { verticalAlign: valign } : {}),
195
- ...(padding ? { padding } : {}),
196
- ...(minScale !== undefined ? { fit: { shrinkText: true, minScale } } : {}),
197
- });
198
- const template = {
199
- id: comic.id ?? 'comic',
200
- area: 'content',
201
- frames: [resolvedFrame],
202
- groups: [],
203
- decoration: { elements: [] },
204
- decorationPaths: [],
205
- spread: false,
206
- gutter: px(0),
207
- role: 'comic',
208
- chain: [comic.id ?? 'comic'],
209
- configPath: '',
216
+ const lay = (area, shapes, verticalAlign) => {
217
+ const resolvedFrame = normalizeFrame({
218
+ name: frame.name,
219
+ width: 'fill',
220
+ height: 'fill',
221
+ ...(box ? { style: box.id } : {}),
222
+ ...(verticalAlign && verticalAlign !== 'top' ? { verticalAlign } : {}),
223
+ ...(padding ? { padding } : {}),
224
+ ...(minScale !== undefined ? { fit: { shrinkText: true, minScale } } : {}),
225
+ });
226
+ const template = {
227
+ id: comic.id ?? 'comic',
228
+ area: 'content',
229
+ frames: [resolvedFrame],
230
+ groups: [],
231
+ decoration: { elements: [] },
232
+ decorationPaths: [],
233
+ spread: false,
234
+ gutter: px(0),
235
+ role: 'comic',
236
+ chain: [comic.id ?? 'comic'],
237
+ configPath: '',
238
+ };
239
+ const around = [...avoid, ...shapes];
240
+ return layoutComposedPage({
241
+ pass: input.pass,
242
+ page,
243
+ template,
244
+ fence: { template: template.id, spread: false, attrs: {}, attrSources: {}, fenceIndex: fence, colons: 4 },
245
+ startIdx: plan.startIdx,
246
+ endIdx: plan.endIdx,
247
+ stories: new Map([[frame.name, story]]),
248
+ styleOf: input.styleOf,
249
+ areas: { area, page: area, bleed: area },
250
+ dpi,
251
+ emPx: input.emPx,
252
+ bodyOffset: input.bodyOffset,
253
+ mirrored: input.mirrored,
254
+ pushGapPx: input.pushGapPx,
255
+ ...(around.length > 0 ? { frameExclusions: new Map([[frame.name, around]]) } : {}),
256
+ ...(input.locale ? { locale: input.locale } : {}),
257
+ });
210
258
  };
211
- const out = layoutComposedPage({
212
- pass: input.pass,
213
- page,
214
- template,
215
- fence: { template: template.id, spread: false, attrs: {}, attrSources: {}, fenceIndex: fence, colons: 4 },
216
- startIdx: plan.startIdx,
217
- endIdx: plan.endIdx,
218
- stories: new Map([[frame.name, story]]),
219
- styleOf: input.styleOf,
220
- areas: { area, page: area, bleed: area },
221
- dpi,
222
- emPx: input.emPx,
223
- bodyOffset: input.bodyOffset,
224
- mirrored: input.mirrored,
225
- pushGapPx: input.pushGapPx,
226
- ...(slants.length > 0 ? { frameExclusions: new Map([[frame.name, slants]]) } : {}),
227
- ...(input.locale ? { locale: input.locale } : {}),
228
- });
259
+ let area;
260
+ let out;
261
+ const wholeCell = () => {
262
+ area = areaOf(panel.bbox);
263
+ if (!aligned) {
264
+ out = lay(area, slantExclusions(outline, area, edge), undefined);
265
+ return true;
266
+ }
267
+ // The alignment depends on how many lines the slant leaves and the
268
+ // slant on where the text stands: the room the lines have at a height
269
+ // is the outline's there, so the slant is laid as if the text stood
270
+ // `shift` lower, and the shift is sought where the text lands (the
271
+ // lower the text stands, the narrower a slanted foot leaves it, the
272
+ // taller it is: bisection). A layout is kept only when every line lies
273
+ // inside the outline; none does: the straight box inside the cell.
274
+ const base = slantExclusions(outline, area, edge);
275
+ const top = firstTextY(lay(area, base, undefined).blocks);
276
+ if (top === undefined) {
277
+ out = lay(area, base, valign);
278
+ return true;
279
+ }
280
+ const align = valign;
281
+ const attempt = (shift) => {
282
+ const moved = outline.map((q) => ({ x: q.x, y: q.y - shift }));
283
+ const result = lay(area, slantExclusions(moved, area, edge), align);
284
+ const at = firstTextY(result.blocks);
285
+ return { result, landed: at === undefined ? shift : at - top };
286
+ };
287
+ let bestResult;
288
+ let bestGap = Infinity;
289
+ const consider = (shift, t) => {
290
+ const gap = Math.abs(t.landed - shift);
291
+ if (gap < bestGap && linesInsideOutline(t.result.blocks, outline, edge)) {
292
+ bestResult = t.result;
293
+ bestGap = gap;
294
+ }
295
+ };
296
+ const first = attempt(0);
297
+ consider(0, first);
298
+ if (first.landed > 1) {
299
+ let lo = 0;
300
+ let hi = area.height;
301
+ for (let round = 0; round < 9 && bestGap > 1; round++) {
302
+ const mid = (lo + hi) / 2;
303
+ const t = attempt(mid);
304
+ consider(mid, t);
305
+ if (t.landed > mid)
306
+ lo = mid;
307
+ else
308
+ hi = mid;
309
+ }
310
+ }
311
+ if (!bestResult || bestGap > 3 * input.emPx)
312
+ return false;
313
+ out = bestResult;
314
+ return true;
315
+ };
316
+ if (!follows || !wholeCell()) {
317
+ const r = frame.polygon ? innerBox(frame.polygon, panel.bbox) : panel.bbox;
318
+ area = areaOf(r);
319
+ out = lay(area, [], aligned ? valign : undefined);
320
+ }
229
321
  const set = out.composed.frames[0];
230
322
  if (!set || !out.laid.has(frame.name))
231
323
  return;
@@ -264,6 +356,67 @@ export function layoutComicTextFrames(input) {
264
356
  setComicLayoutWarnings(comic, [...comicPageLayoutWarnings(comic), ...warnings]);
265
357
  return { blocks, laid };
266
358
  }
359
+ /** Whether every line of the text blocks lies inside a convex outline,
360
+ * `edge` in from it (the lines of a text laid in a slanted cell). */
361
+ function linesInsideOutline(blocks, outline, edge) {
362
+ for (const b of blocks) {
363
+ if (b.type === 'callout' || b.hidden)
364
+ continue;
365
+ for (const l of b.lines) {
366
+ const span = l.measure ?? { x: l.bbox.x, width: l.bbox.width };
367
+ // A line the room cannot take at all: the text did not settle.
368
+ if (span.width < 1)
369
+ return false;
370
+ for (const y of [l.bbox.y + 0.5, l.bbox.y + l.bbox.height - 0.5]) {
371
+ const c = crossing(outline, 'y', y);
372
+ if (!c)
373
+ return false;
374
+ if (span.x < c[0] + edge - 1 || span.x + span.width > c[1] - edge + 1)
375
+ return false;
376
+ }
377
+ }
378
+ }
379
+ return true;
380
+ }
381
+ /**
382
+ * The text panels of a strip (`:::strip`, #959), laid once the strip's block
383
+ * has its place on the page: the strip's comic stands relative to its block
384
+ * (`VDTBlock.comic`), so it is moved onto the sheet where the block sits
385
+ * ({@link flowRectToPage}), its text set there in the page's flow frame, and
386
+ * what the frames came to (blocks, overflow, scale, warnings) written back
387
+ * on the block's comic, which keeps moving with the block. `input.comic` is
388
+ * ignored; `block` is the strip.
389
+ */
390
+ export function layoutStripTextFrames(input) {
391
+ const own = input.block.comic;
392
+ if (!own?.frames)
393
+ return { blocks: [], laid: new Set() };
394
+ const at = flowRectToPage(input.page, input.block.bbox);
395
+ const onSheet = translateComicPage(own, at.x, at.y);
396
+ copyComicPanelSources(own, onSheet);
397
+ const out = layoutComicTextFrames({ ...input, comic: onSheet });
398
+ if (out.laid.size === 0)
399
+ return out;
400
+ // The frames' results are position-free: they go back to the block's
401
+ // comic as they are.
402
+ own.frames = own.frames.map((f, i) => {
403
+ const laidFrame = onSheet.frames?.[i];
404
+ if (!laidFrame || laidFrame.blockIds.length === 0)
405
+ return f;
406
+ return {
407
+ ...f,
408
+ blockIds: [...laidFrame.blockIds],
409
+ overflowPx: laidFrame.overflowPx,
410
+ scale: laidFrame.scale,
411
+ ...(laidFrame.imageScale !== undefined ? { imageScale: laidFrame.imageScale } : {}),
412
+ ...(laidFrame.styleId !== undefined ? { styleId: laidFrame.styleId } : {}),
413
+ };
414
+ });
415
+ const added = comicPageLayoutWarnings(onSheet);
416
+ if (added.length > 0)
417
+ setComicLayoutWarnings(own, [...comicPageLayoutWarnings(own), ...added]);
418
+ return out;
419
+ }
267
420
  /** The least scale a text panel's `shrink` attribute lets its text take
268
421
  * (#909): `shrink` alone, 0.5; `shrink=0.7` (or `70%`), that, kept
269
422
  * between 0.25 and 1; undefined without it (or `shrink=false`). */
@@ -303,8 +456,12 @@ export function slantExclusions(poly, area, edge) {
303
456
  lo = Math.max(lo, c[0] + edge);
304
457
  hi = Math.min(hi, c[1] - edge);
305
458
  }
306
- if (!Number.isFinite(lo) || !Number.isFinite(hi))
459
+ // A band the outline does not reach (text laid as if it stood lower,
460
+ // past the cell's foot): no room at all.
461
+ if (!Number.isFinite(lo) || !Number.isFinite(hi)) {
462
+ left.push({ y, height: h, left: x0, right: x1 });
307
463
  continue;
464
+ }
308
465
  if (lo > x0 + 0.5)
309
466
  left.push({ y, height: h, left: x0, right: Math.min(x1, lo) });
310
467
  if (hi < x1 - 0.5)