postext 1.19.2 → 1.20.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 (251) hide show
  1. package/dist/__tests__/comics/art.test.d.ts +2 -0
  2. package/dist/__tests__/comics/art.test.d.ts.map +1 -0
  3. package/dist/__tests__/comics/art.test.js +96 -0
  4. package/dist/__tests__/comics/art.test.js.map +1 -0
  5. package/dist/__tests__/comics/build.test.d.ts +2 -0
  6. package/dist/__tests__/comics/build.test.d.ts.map +1 -0
  7. package/dist/__tests__/comics/build.test.js +215 -0
  8. package/dist/__tests__/comics/build.test.js.map +1 -0
  9. package/dist/__tests__/comics/canvas.test.d.ts +2 -0
  10. package/dist/__tests__/comics/canvas.test.d.ts.map +1 -0
  11. package/dist/__tests__/comics/canvas.test.js +161 -0
  12. package/dist/__tests__/comics/canvas.test.js.map +1 -0
  13. package/dist/__tests__/comics/config.test.d.ts +2 -0
  14. package/dist/__tests__/comics/config.test.d.ts.map +1 -0
  15. package/dist/__tests__/comics/config.test.js +97 -0
  16. package/dist/__tests__/comics/config.test.js.map +1 -0
  17. package/dist/__tests__/comics/geometry.test.d.ts +2 -0
  18. package/dist/__tests__/comics/geometry.test.d.ts.map +1 -0
  19. package/dist/__tests__/comics/geometry.test.js +118 -0
  20. package/dist/__tests__/comics/geometry.test.js.map +1 -0
  21. package/dist/__tests__/comics/html.test.d.ts +2 -0
  22. package/dist/__tests__/comics/html.test.d.ts.map +1 -0
  23. package/dist/__tests__/comics/html.test.js +253 -0
  24. package/dist/__tests__/comics/html.test.js.map +1 -0
  25. package/dist/__tests__/comics/lettering.test.d.ts +2 -0
  26. package/dist/__tests__/comics/lettering.test.d.ts.map +1 -0
  27. package/dist/__tests__/comics/lettering.test.js +241 -0
  28. package/dist/__tests__/comics/lettering.test.js.map +1 -0
  29. package/dist/__tests__/comics/script.test.d.ts +2 -0
  30. package/dist/__tests__/comics/script.test.d.ts.map +1 -0
  31. package/dist/__tests__/comics/script.test.js +147 -0
  32. package/dist/__tests__/comics/script.test.js.map +1 -0
  33. package/dist/__tests__/comics/split.test.d.ts +2 -0
  34. package/dist/__tests__/comics/split.test.d.ts.map +1 -0
  35. package/dist/__tests__/comics/split.test.js +120 -0
  36. package/dist/__tests__/comics/split.test.js.map +1 -0
  37. package/dist/__tests__/comics/spread.test.d.ts +2 -0
  38. package/dist/__tests__/comics/spread.test.d.ts.map +1 -0
  39. package/dist/__tests__/comics/spread.test.js +161 -0
  40. package/dist/__tests__/comics/spread.test.js.map +1 -0
  41. package/dist/__tests__/comics/strip.test.d.ts +2 -0
  42. package/dist/__tests__/comics/strip.test.d.ts.map +1 -0
  43. package/dist/__tests__/comics/strip.test.js +231 -0
  44. package/dist/__tests__/comics/strip.test.js.map +1 -0
  45. package/dist/__tests__/exports.test.js +89 -0
  46. package/dist/__tests__/exports.test.js.map +1 -1
  47. package/dist/__tests__/parse/containers.test.js +1 -1
  48. package/dist/__tests__/parse/containers.test.js.map +1 -1
  49. package/dist/canvas-backend/comic.d.ts +32 -0
  50. package/dist/canvas-backend/comic.d.ts.map +1 -0
  51. package/dist/canvas-backend/comic.js +216 -0
  52. package/dist/canvas-backend/comic.js.map +1 -0
  53. package/dist/canvas-backend/headerFooter.d.ts +4 -1
  54. package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
  55. package/dist/canvas-backend/headerFooter.js +3 -1
  56. package/dist/canvas-backend/headerFooter.js.map +1 -1
  57. package/dist/canvas-backend/index.d.ts.map +1 -1
  58. package/dist/canvas-backend/index.js +7 -1
  59. package/dist/canvas-backend/index.js.map +1 -1
  60. package/dist/comics/art.d.ts +72 -0
  61. package/dist/comics/art.d.ts.map +1 -0
  62. package/dist/comics/art.js +154 -0
  63. package/dist/comics/art.js.map +1 -0
  64. package/dist/comics/fonts.d.ts +20 -0
  65. package/dist/comics/fonts.d.ts.map +1 -0
  66. package/dist/comics/fonts.js +42 -0
  67. package/dist/comics/fonts.js.map +1 -0
  68. package/dist/comics/geometry.d.ts +87 -0
  69. package/dist/comics/geometry.d.ts.map +1 -0
  70. package/dist/comics/geometry.js +272 -0
  71. package/dist/comics/geometry.js.map +1 -0
  72. package/dist/comics/index.d.ts +29 -0
  73. package/dist/comics/index.d.ts.map +1 -0
  74. package/dist/comics/index.js +18 -0
  75. package/dist/comics/index.js.map +1 -0
  76. package/dist/comics/layoutPage.d.ts +156 -0
  77. package/dist/comics/layoutPage.d.ts.map +1 -0
  78. package/dist/comics/layoutPage.js +697 -0
  79. package/dist/comics/layoutPage.js.map +1 -0
  80. package/dist/comics/lettering/__tests__/harness.test.d.ts +2 -0
  81. package/dist/comics/lettering/__tests__/harness.test.d.ts.map +1 -0
  82. package/dist/comics/lettering/__tests__/harness.test.js +273 -0
  83. package/dist/comics/lettering/__tests__/harness.test.js.map +1 -0
  84. package/dist/comics/lettering/__tests__/letterPanel.test.d.ts +2 -0
  85. package/dist/comics/lettering/__tests__/letterPanel.test.d.ts.map +1 -0
  86. package/dist/comics/lettering/__tests__/letterPanel.test.js +224 -0
  87. package/dist/comics/lettering/__tests__/letterPanel.test.js.map +1 -0
  88. package/dist/comics/lettering/__tests__/polish.test.d.ts +2 -0
  89. package/dist/comics/lettering/__tests__/polish.test.d.ts.map +1 -0
  90. package/dist/comics/lettering/__tests__/polish.test.js +357 -0
  91. package/dist/comics/lettering/__tests__/polish.test.js.map +1 -0
  92. package/dist/comics/lettering/__tests__/round2.test.d.ts +2 -0
  93. package/dist/comics/lettering/__tests__/round2.test.d.ts.map +1 -0
  94. package/dist/comics/lettering/__tests__/round2.test.js +289 -0
  95. package/dist/comics/lettering/__tests__/round2.test.js.map +1 -0
  96. package/dist/comics/lettering/__tests__/shapeText.test.d.ts +2 -0
  97. package/dist/comics/lettering/__tests__/shapeText.test.d.ts.map +1 -0
  98. package/dist/comics/lettering/__tests__/shapeText.test.js +98 -0
  99. package/dist/comics/lettering/__tests__/shapeText.test.js.map +1 -0
  100. package/dist/comics/lettering/__tests__/shapes.test.d.ts +2 -0
  101. package/dist/comics/lettering/__tests__/shapes.test.d.ts.map +1 -0
  102. package/dist/comics/lettering/__tests__/shapes.test.js +137 -0
  103. package/dist/comics/lettering/__tests__/shapes.test.js.map +1 -0
  104. package/dist/comics/lettering/__tests__/stubMeasure.d.ts +5 -0
  105. package/dist/comics/lettering/__tests__/stubMeasure.d.ts.map +1 -0
  106. package/dist/comics/lettering/__tests__/stubMeasure.js +47 -0
  107. package/dist/comics/lettering/__tests__/stubMeasure.js.map +1 -0
  108. package/dist/comics/lettering/__tests__/text.test.d.ts +2 -0
  109. package/dist/comics/lettering/__tests__/text.test.d.ts.map +1 -0
  110. package/dist/comics/lettering/__tests__/text.test.js +86 -0
  111. package/dist/comics/lettering/__tests__/text.test.js.map +1 -0
  112. package/dist/comics/lettering/geom.d.ts +78 -0
  113. package/dist/comics/lettering/geom.d.ts.map +1 -0
  114. package/dist/comics/lettering/geom.js +376 -0
  115. package/dist/comics/lettering/geom.js.map +1 -0
  116. package/dist/comics/lettering/index.d.ts +7 -0
  117. package/dist/comics/lettering/index.d.ts.map +1 -0
  118. package/dist/comics/lettering/index.js +8 -0
  119. package/dist/comics/lettering/index.js.map +1 -0
  120. package/dist/comics/lettering/letter.d.ts +7 -0
  121. package/dist/comics/lettering/letter.d.ts.map +1 -0
  122. package/dist/comics/lettering/letter.js +397 -0
  123. package/dist/comics/lettering/letter.js.map +1 -0
  124. package/dist/comics/lettering/placement.d.ts +117 -0
  125. package/dist/comics/lettering/placement.d.ts.map +1 -0
  126. package/dist/comics/lettering/placement.js +889 -0
  127. package/dist/comics/lettering/placement.js.map +1 -0
  128. package/dist/comics/lettering/presets.d.ts +15 -0
  129. package/dist/comics/lettering/presets.d.ts.map +1 -0
  130. package/dist/comics/lettering/presets.js +61 -0
  131. package/dist/comics/lettering/presets.js.map +1 -0
  132. package/dist/comics/lettering/shape-text.d.ts +72 -0
  133. package/dist/comics/lettering/shape-text.d.ts.map +1 -0
  134. package/dist/comics/lettering/shape-text.js +550 -0
  135. package/dist/comics/lettering/shape-text.js.map +1 -0
  136. package/dist/comics/lettering/shapes.d.ts +83 -0
  137. package/dist/comics/lettering/shapes.d.ts.map +1 -0
  138. package/dist/comics/lettering/shapes.js +512 -0
  139. package/dist/comics/lettering/shapes.js.map +1 -0
  140. package/dist/comics/lettering/text.d.ts +79 -0
  141. package/dist/comics/lettering/text.d.ts.map +1 -0
  142. package/dist/comics/lettering/text.js +488 -0
  143. package/dist/comics/lettering/text.js.map +1 -0
  144. package/dist/comics/lettering/types.d.ts +270 -0
  145. package/dist/comics/lettering/types.d.ts.map +1 -0
  146. package/dist/comics/lettering/types.js +9 -0
  147. package/dist/comics/lettering/types.js.map +1 -0
  148. package/dist/comics/page.d.ts +37 -0
  149. package/dist/comics/page.d.ts.map +1 -0
  150. package/dist/comics/page.js +285 -0
  151. package/dist/comics/page.js.map +1 -0
  152. package/dist/comics/paint.d.ts +65 -0
  153. package/dist/comics/paint.d.ts.map +1 -0
  154. package/dist/comics/paint.js +219 -0
  155. package/dist/comics/paint.js.map +1 -0
  156. package/dist/comics/script.d.ts +42 -0
  157. package/dist/comics/script.d.ts.map +1 -0
  158. package/dist/comics/script.js +302 -0
  159. package/dist/comics/script.js.map +1 -0
  160. package/dist/comics/split.d.ts +135 -0
  161. package/dist/comics/split.d.ts.map +1 -0
  162. package/dist/comics/split.js +514 -0
  163. package/dist/comics/split.js.map +1 -0
  164. package/dist/comics/spread.d.ts +36 -0
  165. package/dist/comics/spread.d.ts.map +1 -0
  166. package/dist/comics/spread.js +172 -0
  167. package/dist/comics/spread.js.map +1 -0
  168. package/dist/comics/strip.d.ts +77 -0
  169. package/dist/comics/strip.d.ts.map +1 -0
  170. package/dist/comics/strip.js +89 -0
  171. package/dist/comics/strip.js.map +1 -0
  172. package/dist/comics/transform.d.ts +37 -0
  173. package/dist/comics/transform.d.ts.map +1 -0
  174. package/dist/comics/transform.js +161 -0
  175. package/dist/comics/transform.js.map +1 -0
  176. package/dist/comics/types.d.ts +143 -0
  177. package/dist/comics/types.d.ts.map +1 -0
  178. package/dist/comics/types.js +13 -0
  179. package/dist/comics/types.js.map +1 -0
  180. package/dist/comics/warnings.d.ts +14 -0
  181. package/dist/comics/warnings.d.ts.map +1 -0
  182. package/dist/comics/warnings.js +94 -0
  183. package/dist/comics/warnings.js.map +1 -0
  184. package/dist/configWarnings.d.ts.map +1 -1
  185. package/dist/configWarnings.js +42 -0
  186. package/dist/configWarnings.js.map +1 -1
  187. package/dist/defaults/comics.d.ts +51 -0
  188. package/dist/defaults/comics.d.ts.map +1 -0
  189. package/dist/defaults/comics.js +385 -0
  190. package/dist/defaults/comics.js.map +1 -0
  191. package/dist/defaults/index.d.ts +1 -0
  192. package/dist/defaults/index.d.ts.map +1 -1
  193. package/dist/defaults/index.js +9 -0
  194. package/dist/defaults/index.js.map +1 -1
  195. package/dist/design/layout.d.ts +13 -1
  196. package/dist/design/layout.d.ts.map +1 -1
  197. package/dist/design/layout.js +17 -0
  198. package/dist/design/layout.js.map +1 -1
  199. package/dist/html-backend.d.ts +3 -0
  200. package/dist/html-backend.d.ts.map +1 -1
  201. package/dist/html-backend.js +44 -8
  202. package/dist/html-backend.js.map +1 -1
  203. package/dist/htmlComic.d.ts +69 -0
  204. package/dist/htmlComic.d.ts.map +1 -0
  205. package/dist/htmlComic.js +179 -0
  206. package/dist/htmlComic.js.map +1 -0
  207. package/dist/index.d.ts +8 -2
  208. package/dist/index.d.ts.map +1 -1
  209. package/dist/index.js +4 -0
  210. package/dist/index.js.map +1 -1
  211. package/dist/parse/blockParser.d.ts.map +1 -1
  212. package/dist/parse/blockParser.js +25 -1
  213. package/dist/parse/blockParser.js.map +1 -1
  214. package/dist/parse/indexMarks.d.ts.map +1 -1
  215. package/dist/parse/indexMarks.js +3 -0
  216. package/dist/parse/indexMarks.js.map +1 -1
  217. package/dist/parse/types.d.ts +7 -1
  218. package/dist/parse/types.d.ts.map +1 -1
  219. package/dist/pipeline/build.d.ts.map +1 -1
  220. package/dist/pipeline/build.js +251 -9
  221. package/dist/pipeline/build.js.map +1 -1
  222. package/dist/pipeline/config.d.ts.map +1 -1
  223. package/dist/pipeline/config.js +4 -1
  224. package/dist/pipeline/config.js.map +1 -1
  225. package/dist/pipeline/contentWarnings.d.ts.map +1 -1
  226. package/dist/pipeline/contentWarnings.js +58 -0
  227. package/dist/pipeline/contentWarnings.js.map +1 -1
  228. package/dist/pipeline/floatSlots.js +1 -1
  229. package/dist/pipeline/floatSlots.js.map +1 -1
  230. package/dist/pipeline/headerFooter.d.ts +6 -2
  231. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  232. package/dist/pipeline/headerFooter.js +11 -3
  233. package/dist/pipeline/headerFooter.js.map +1 -1
  234. package/dist/pipeline/pageRoles.d.ts +1 -0
  235. package/dist/pipeline/pageRoles.d.ts.map +1 -1
  236. package/dist/pipeline/pageRoles.js +3 -0
  237. package/dist/pipeline/pageRoles.js.map +1 -1
  238. package/dist/pipeline/placement.d.ts +3 -3
  239. package/dist/pipeline/placement.d.ts.map +1 -1
  240. package/dist/pipeline/placement.js +4 -4
  241. package/dist/pipeline/placement.js.map +1 -1
  242. package/dist/types.d.ts +338 -1
  243. package/dist/types.d.ts.map +1 -1
  244. package/dist/vdt.d.ts +271 -2
  245. package/dist/vdt.d.ts.map +1 -1
  246. package/dist/vdt.js.map +1 -1
  247. package/dist/worker/fonts.d.ts +2 -1
  248. package/dist/worker/fonts.d.ts.map +1 -1
  249. package/dist/worker/fonts.js +11 -1
  250. package/dist/worker/fonts.js.map +1 -1
  251. package/package.json +1 -1
@@ -0,0 +1,270 @@
1
+ import type { InlineSpan } from '../../parse/types';
2
+ import type { BoundingBox, VDTComicBalloon, VDTPoint } from '../../vdt';
3
+ import type { CjkLineBreakLevel } from '../../measure/cjkClasses';
4
+ import type { CjkRegion } from '../../types';
5
+ /** A point in page px. */
6
+ export type Point = VDTPoint;
7
+ /** An axis-aligned rectangle in page px. */
8
+ export type Rect = BoundingBox;
9
+ /** The outline of a balloon body (SPEC D3.2). `none` sets the text alone
10
+ * (sound effects, loose lettering), with an optional halo. */
11
+ export type BalloonShapeKind = 'oval' | 'rounded' | 'rectangle' | 'cloud' | 'burst' | 'wavy' | 'electric' | 'none';
12
+ /** The tail of a balloon (SPEC D3.2). */
13
+ export type BalloonTailKind = 'curved' | 'wedge' | 'bubbles' | 'zigzag' | 'none';
14
+ /** A corner or edge of the panel a caption (or any balloon) is butted
15
+ * against. `start` / `end` follow the panel's reading direction. */
16
+ export type LetteringPosition = 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end' | 'top' | 'bottom';
17
+ /** A panel side, for an off-panel speaker (`tail=<side>`). `start` / `end`
18
+ * follow the panel's reading direction. */
19
+ export type PanelSide = 'top' | 'bottom' | 'start' | 'end';
20
+ /**
21
+ * A balloon style with every length resolved to page px: the resolved
22
+ * `BalloonStyleConfig` merged with the book's `LetteringConfig` (SPEC D4).
23
+ * The font size already carries the style's `fontScale`.
24
+ */
25
+ export interface LetteringStyle {
26
+ /** The style id (`speech`, `thought`, `whisper`, `shout`, `caption`,
27
+ * `sfx`…); echoed as `ComicBalloonOut.style`. */
28
+ id: string;
29
+ shape: BalloonShapeKind;
30
+ /** Body fill (hex). */
31
+ fill: string;
32
+ /** Outline colour (hex). */
33
+ stroke: string;
34
+ /** Visible outline width, px (0: no outline). */
35
+ strokeWidth: number;
36
+ /** A dashed outline (whisper): `true` takes dashes of 3 stroke widths
37
+ * apart by 2; an array gives the dash pattern in px. */
38
+ dash?: boolean | number[];
39
+ /** A second outline outside the first (`double`), `gap` px apart. */
40
+ double?: boolean;
41
+ doubleGap?: number;
42
+ /** Seeded hand-drawn wobble of the outline, as a fraction of the radius
43
+ * (0 = none; 0.02–0.05 reads as hand drawn). */
44
+ wobble?: number;
45
+ /** Superellipse exponent of an oval (2 = ellipse; 2.2 default; 3–4 is a
46
+ * "loaf" or TV balloon). */
47
+ roundness?: number;
48
+ /** Burst: number of spikes (0 or absent: from the perimeter). */
49
+ burstPoints?: number;
50
+ /** Burst: spike length, px. Absent: `burstDepthRatio` of the body's
51
+ * mean radius (the config's unitless `burstDepth`), else 1.1 em. */
52
+ burstDepth?: number;
53
+ burstDepthRatio?: number;
54
+ /** Air between the text and the outline, px, constant all round. */
55
+ padding: number;
56
+ /** Target width / height of the text block (horizontal text); vertical
57
+ * text reads it as height / width. Absent: 1.5 horizontal, 1.3 vertical. */
58
+ aspect?: number;
59
+ tail: BalloonTailKind;
60
+ /** Width of the tail where it leaves the body, px. */
61
+ tailWidth: number;
62
+ /** How far the tail runs toward its target, as a fraction of the gap
63
+ * from the body edge to the target (default 0.55). */
64
+ tailReach?: number;
65
+ /** The tip never comes closer to its target than this, px (default
66
+ * 0.5 em). */
67
+ tailGap?: number;
68
+ /** What the tail aims at: the speaker's mouth, or the head (thought). */
69
+ target?: 'mouth' | 'head';
70
+ /** Default position (captions: a corner); `auto` = placed freely. */
71
+ position?: 'auto' | LetteringPosition;
72
+ /** Flush against the panel border (captions): no inset from the border
73
+ * at a corner or edge position. */
74
+ butt?: boolean;
75
+ /** Corner radius of a `rounded` body, px (absent: 0.6 em). */
76
+ radius?: number;
77
+ fontFamily: string;
78
+ fontSizePx: number;
79
+ /** Leading as a multiplier of the font size. */
80
+ lineHeight: number;
81
+ fontWeight?: number;
82
+ italic?: boolean;
83
+ color: string;
84
+ textTransform?: 'none' | 'uppercase';
85
+ /** Tracking, px (never applied to joining scripts). */
86
+ letterSpacing?: number;
87
+ align?: 'center' | 'start';
88
+ /** How `*emphasis*` prints: bold italic (the comics convention; bold only
89
+ * in scripts without italics), or as written. Default `bold-italic`. */
90
+ emphasis?: 'bold-italic' | 'as-written';
91
+ /** Latin text may be hyphenated (default never). */
92
+ hyphenate?: boolean;
93
+ /** Writing mode of this style: `auto` follows the panel (vertical in
94
+ * vertical locales); sound effects may force `horizontal`. */
95
+ writingMode?: 'auto' | 'horizontal' | 'vertical';
96
+ /** Vertical text: most characters per column (default 8). */
97
+ maxColumnChars?: number;
98
+ /** House rules (SPEC D3.1). `dropFinalStop`: drop a final 。 (ja / zh);
99
+ * `doubleDash`: em dash → `--` (US comics). Default: from the locale
100
+ * for `dropFinalStop`, off for `doubleDash`. */
101
+ dropFinalStop?: boolean;
102
+ doubleDash?: boolean;
103
+ /** Outline around the glyphs, under them (sound effects, text on art),
104
+ * px; 0 / absent: none. */
105
+ halo?: number;
106
+ haloColor?: string;
107
+ /** Default rotation in degrees (sound effects), clockwise. */
108
+ rotate?: number;
109
+ }
110
+ /** Text of a lettering item: plain text (a newline or U+2028 is a forced
111
+ * line break), or inline spans as the Markdown parser gives them
112
+ * (`parseInlineFormatting` / `parseInlineSnippetSpans`). Bold, italic,
113
+ * superscript and subscript, and in vertical text `:tcy` / `:upright` /
114
+ * `:sideways` are set; ruby is set at half size over its base (beside a
115
+ * column), on lines the bidi algorithm reorders too, unless the base is
116
+ * itself right to left; `:ltr` / `:rtl` isolate their run; other
117
+ * annotations print as their plain text. */
118
+ export type LetteringText = string | readonly InlineSpan[];
119
+ /** One balloon, caption, sound effect or note of a panel's script. */
120
+ export interface LetteringItem {
121
+ /** Stable id; seeds every jittered outline (determinism). */
122
+ id: string;
123
+ /** Reading order within the page (the script order). */
124
+ order: number;
125
+ kind: 'balloon' | 'caption' | 'sfx' | 'note';
126
+ /** Speaker id: matches `LetteringPanel.anchors[].id`. */
127
+ speaker?: string;
128
+ text: LetteringText;
129
+ /** Source offsets of each character of the item's plain text (the
130
+ * concatenated span texts), for click-to-source. */
131
+ sourceMap?: readonly number[];
132
+ sourceStart: number;
133
+ sourceEnd: number;
134
+ style: LetteringStyle;
135
+ /** Pinned centre of the balloon (`at="x% y%"`), page px. */
136
+ pin?: Point;
137
+ /** Pinned to a corner / edge (`at=top-start`…). */
138
+ position?: LetteringPosition;
139
+ /** Tail target override: a page point (`to=`), or a panel side for an
140
+ * off-panel speaker (`tail=<side>`). */
141
+ tailTarget?: Point | PanelSide;
142
+ /** `none` drops the tail; `auto` (default) aims it at the speaker. */
143
+ tail?: 'auto' | 'none';
144
+ /** Join with the previous balloon of the same speaker: `true` takes the
145
+ * default mode, `false` forbids it; absent: `LetteringEnv.joinSameSpeaker`. */
146
+ join?: boolean | 'butt' | 'connector';
147
+ /** May cross the panel border (fallback before covering avoid zones). */
148
+ breakBorder?: boolean;
149
+ /** Rotation in degrees (sound effects), clockwise; else the style's. */
150
+ rotate?: number;
151
+ /** Scale of the lettering size (sound effects, `size=`). */
152
+ sizeScale?: number;
153
+ /** The line's own writing mode (`vertical` / `horizontal`), over the
154
+ * style's and the panel's: an untranslated ドン kept in a column in a
155
+ * horizontal edition. A column of Japanese or Chinese in a book of
156
+ * another language is set by the rules of the language its text is in
157
+ * (kana: Japanese). */
158
+ writingMode?: 'vertical' | 'horizontal';
159
+ }
160
+ /** A point of the art a balloon can aim at or must keep clear of. */
161
+ export interface LetteringAnchor {
162
+ /** Speaker id (or any point id; `sfx` is where a sound effect goes). */
163
+ id: string;
164
+ /** Speech target (page px). */
165
+ mouth: Point;
166
+ /** Thought target (page px); else the mouth. */
167
+ head?: Point;
168
+ /** Region never covered by a balloon (page px). */
169
+ face?: Rect;
170
+ /** Whether the mouth is inside the visible panel (not cropped away). */
171
+ visible: boolean;
172
+ }
173
+ /** One panel as the lettering sees it. */
174
+ export interface LetteringPanel {
175
+ /** Index of the panel on its page; echoed as `ComicBalloonOut.panelIndex`. */
176
+ index: number;
177
+ /** The cell polygon (convex), page px, clockwise or not. */
178
+ polygon: readonly Point[];
179
+ bbox: Rect;
180
+ /** Keep-out from the panel border for balloons (`lettering.inset`), px. */
181
+ insetPx: number;
182
+ /** Reading direction of the page. */
183
+ direction: 'ltr' | 'rtl';
184
+ /** Writing mode the balloons of this panel default to. */
185
+ writingMode: 'horizontal' | 'vertical';
186
+ /** Locale of the text (BCP 47). */
187
+ locale: string;
188
+ anchors: readonly LetteringAnchor[];
189
+ /** Regions balloons must not cover (hands, key objects), page px. */
190
+ avoid?: readonly Rect[];
191
+ /** Regions no lettering ever covers, page px, whatever its fallbacks
192
+ * or its pin: the fold of a spread (a balloon there is cut in two, or
193
+ * lost in the binding). A pinned balloon slides off them. */
194
+ keepOut?: readonly Rect[];
195
+ /** Regions better left uncovered, page px: a balloon over them costs a
196
+ * little per area, but is never a fault (the picture's safe area, when
197
+ * the art marks no face and no avoid zone); `weight` scales the cost
198
+ * (default 1). */
199
+ softAvoid?: readonly (Rect & {
200
+ weight?: number;
201
+ })[];
202
+ dpi: number;
203
+ /** The other panels of the page (their boxes, px): a balloon that runs
204
+ * out of its panel must never run into one of them. */
205
+ neighbours?: readonly Rect[];
206
+ /** The live area of the page (the comic's frame, px): lettering keeps
207
+ * inside it — a panel that bleeds is lettered in its part inside it —
208
+ * unless it breaks the border on purpose (`breakBorder`, a pin). */
209
+ limit?: Rect;
210
+ /** The trim of the sheet, px: a balloon that breaks its border on
211
+ * purpose may leave the live area, never the trim (less `insetPx`).
212
+ * Default: `limit`. */
213
+ trim?: Rect;
214
+ /** How far a sound effect that breaks its border on purpose may run,
215
+ * px: the trim, and the bleed on the sides the panel bleeds to (drawn
216
+ * sound runs off the page with the art). Default: `trim`. */
217
+ sheet?: Rect;
218
+ /** The balloons other panels of the page set already (their boxes, px):
219
+ * a balloon that leaves its panel never covers one. */
220
+ foreign?: readonly Rect[];
221
+ /** Width of the panel's border, px (centred on the polygon): a butted
222
+ * caption sits against its inner edge, its outline over the border. */
223
+ borderPx?: number;
224
+ }
225
+ /** Measuring context and book-wide settings. Text is measured through the
226
+ * engine's measurer (`measureTextWidth`: the canvas in a browser, a stub
227
+ * in tests), as every design text is. */
228
+ export interface LetteringEnv {
229
+ /** Join consecutive balloons of one speaker (SPEC D4
230
+ * `lettering.joinSameSpeaker`); default `butt`. */
231
+ joinSameSpeaker?: 'butt' | 'connector' | 'none';
232
+ /** CJK line-break level; default `ja-very-strict` for Japanese, `gb`
233
+ * for Chinese. */
234
+ cjkLineBreak?: CjkLineBreakLevel;
235
+ /** CJK region for vertical cells; default from the locale. */
236
+ cjkRegion?: CjkRegion;
237
+ /** Local improvement passes after the greedy placement (default 3). */
238
+ passes?: number;
239
+ /** First join-group number of this panel's balloons (group numbers run
240
+ * on across the panels of a page); default 0. */
241
+ groupBase?: number;
242
+ /** Mirror flag of the frame the text is painted in (balloons are painted
243
+ * on the sheet: false). */
244
+ mirrored?: boolean;
245
+ }
246
+ /** Why a balloon could not be placed cleanly (warning
247
+ * `comicBalloonOverflow`). */
248
+ export interface LetteringDiagnostic {
249
+ itemId: string;
250
+ panelIndex: number;
251
+ sourceStart: number;
252
+ sourceEnd: number;
253
+ /** What it still does wrong: covers a face, overlaps another balloon,
254
+ * runs outside the panel, covers an avoid zone or an anchor. */
255
+ reasons: ('face' | 'balloon' | 'outside' | 'avoid' | 'anchor')[];
256
+ /** Which fallbacks were taken (SPEC D3.3 step 5). */
257
+ fallbacks: ('breakBorder' | 'coverAvoid' | 'reshape')[];
258
+ }
259
+ /** A lettered balloon, caption or sound effect: the VDT's
260
+ * `VDTComicBalloon` (SPEC D5). Its `shape` is one compound path (page px;
261
+ * M L C Z only) painted Comicraft's way: stroked at twice `strokeWidth`,
262
+ * then filled, so overlapping subpaths (joined bodies, the tail) merge
263
+ * into one outline. */
264
+ export type ComicBalloonOut = VDTComicBalloon;
265
+ /** `letterPanel` with its diagnostics. */
266
+ export interface LetteringResult {
267
+ balloons: ComicBalloonOut[];
268
+ diagnostics: LetteringDiagnostic[];
269
+ }
270
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/comics/lettering/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ // Inputs and outputs of the comics lettering (SPEC D3, D5): engine-made
2
+ // speech balloons, captions and sound effects laid over one panel.
3
+ //
4
+ // The lettering is self-contained: the page layout resolves the panel
5
+ // geometry, the speaker anchors and the balloon styles (all in page px)
6
+ // and calls `letterPanel`; it gets back balloons shaped like
7
+ // `VDTComicBalloon` (SPEC D5), whose text is ordinary design text.
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/comics/lettering/types.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,mEAAmE;AACnE,EAAE;AACF,sEAAsE;AACtE,wEAAwE;AACxE,6DAA6D;AAC7D,mEAAmE"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The body of a comic page (`:::page{…}` … `:::`, #555): a raw-body block
3
+ * the block parser hands over whole, read here into panels and their
4
+ * script. `:::strip` (a comic in the text flow) has the same body and will
5
+ * reuse {@link parseComicFence}.
6
+ *
7
+ * ```md
8
+ * :::page{split="30 [30 | 20 | *] / *" gutter=4mm}
9
+ * ::panel{art=p1-wide}
10
+ * caption: Lyon, 1943.
11
+ * ana: Did you hear that?
12
+ * ::panel{art=p1-door}
13
+ * sfx{at="62% 40%" rotate=-8}: KRAK
14
+ * :::
15
+ * ```
16
+ */
17
+ import type { ComicPageSource } from './types';
18
+ /** The fence names whose body is a comic. */
19
+ export declare const COMIC_FENCES: ReadonlySet<string>;
20
+ /** Whether a trimmed line opens a comic block (`:::page{…}`). */
21
+ export declare function isComicFence(trimmed: string, kind?: 'page' | 'strip'): boolean;
22
+ /**
23
+ * Read a comic block whose fence line starts at `fenceStart` in `markdown`.
24
+ * The body runs to the first bare `:::` line (or to the end of the text,
25
+ * `closed: false`). Returns undefined when the line at `fenceStart` is not a
26
+ * comic fence. `end` is the offset just past the closing fence line (or the
27
+ * text's end), where the next block starts.
28
+ */
29
+ export declare function parseComicFence(markdown: string, fenceStart: number): {
30
+ source: ComicPageSource;
31
+ end: number;
32
+ } | undefined;
33
+ /** Every offset of a comic source mapped through `toOriginal` (the block
34
+ * parser reads a text with its index marks taken out, then maps every
35
+ * offset back to the original). Mutates `source`. */
36
+ export declare function remapComicSource(source: ComicPageSource, toOriginal: (offset: number) => number): void;
37
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/comics/page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAsC,MAAM,SAAS,CAAC;AASnF,6CAA6C;AAC7C,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,CAA8B,CAAC;AAE5E,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,OAAgB,GAAG,OAAO,CAGtF;AAQD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CA+I1H;AAwCD;;sDAEsD;AACtD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CA8CtG"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * The body of a comic page (`:::page{…}` … `:::`, #555): a raw-body block
3
+ * the block parser hands over whole, read here into panels and their
4
+ * script. `:::strip` (a comic in the text flow) has the same body and will
5
+ * reuse {@link parseComicFence}.
6
+ *
7
+ * ```md
8
+ * :::page{split="30 [30 | 20 | *] / *" gutter=4mm}
9
+ * ::panel{art=p1-wide}
10
+ * caption: Lyon, 1943.
11
+ * ana: Did you hear that?
12
+ * ::panel{art=p1-door}
13
+ * sfx{at="62% 40%" rotate=-8}: KRAK
14
+ * :::
15
+ * ```
16
+ */
17
+ import { parseDirectiveAttrs } from '../parse/attrs';
18
+ import { attrValueSources, parseComicScript } from './script';
19
+ import { parseComicSplit } from './split';
20
+ /** `:::page` / `:::strip` with an optional attribute block. */
21
+ const COMIC_FENCE_RE = /^:::\s*(page|strip)\s*(?:\{([^}]*)\})?\s*$/;
22
+ /** `::panel` with an optional attribute block, alone on its line. */
23
+ const PANEL_RE = /^::panel\s*(?:\{([^}]*)\})?\s*$/;
24
+ /** The bare `:::` that closes the page. */
25
+ const CLOSE_RE = /^:::\s*$/;
26
+ /** The fence names whose body is a comic. */
27
+ export const COMIC_FENCES = new Set(['page', 'strip']);
28
+ /** Whether a trimmed line opens a comic block (`:::page{…}`). */
29
+ export function isComicFence(trimmed, kind = 'page') {
30
+ const m = COMIC_FENCE_RE.exec(trimmed);
31
+ return m !== null && m[1] === kind;
32
+ }
33
+ /** Blank out `<!-- … -->` comments (spaces of the same length, line feeds
34
+ * kept), so offsets stay put. */
35
+ function blankComments(text) {
36
+ return text.replace(/<!--[\s\S]*?(?:-->|$)/g, (c) => c.replace(/[^\n]/g, ' '));
37
+ }
38
+ /**
39
+ * Read a comic block whose fence line starts at `fenceStart` in `markdown`.
40
+ * The body runs to the first bare `:::` line (or to the end of the text,
41
+ * `closed: false`). Returns undefined when the line at `fenceStart` is not a
42
+ * comic fence. `end` is the offset just past the closing fence line (or the
43
+ * text's end), where the next block starts.
44
+ */
45
+ export function parseComicFence(markdown, fenceStart) {
46
+ const lineEnd = (at) => {
47
+ const nl = markdown.indexOf('\n', at);
48
+ return nl < 0 ? markdown.length : nl;
49
+ };
50
+ const fenceEnd = lineEnd(fenceStart);
51
+ const fenceLine = markdown.slice(fenceStart, fenceEnd);
52
+ const m = COMIC_FENCE_RE.exec(fenceLine.trim());
53
+ if (!m)
54
+ return undefined;
55
+ const kind = m[1];
56
+ const blob = m[2];
57
+ let attrsStart;
58
+ let attrsEnd;
59
+ let attrSources = {};
60
+ if (blob !== undefined) {
61
+ attrsStart = fenceStart + fenceLine.indexOf('{') + 1;
62
+ attrsEnd = attrsStart + blob.length;
63
+ attrSources = attrValueSources(blob, attrsStart);
64
+ }
65
+ else {
66
+ attrsStart = fenceStart + fenceLine.indexOf(kind) + kind.length;
67
+ attrsEnd = attrsStart;
68
+ }
69
+ const attrs = parseDirectiveAttrs(blob ?? '');
70
+ // The body's lines, comments blanked, up to the closing fence.
71
+ const lines = [];
72
+ let at = fenceEnd + 1;
73
+ let closed = false;
74
+ let end = markdown.length;
75
+ // Comments may span lines: blank the body as a whole first.
76
+ let bodyEnd = markdown.length;
77
+ {
78
+ let k = at;
79
+ while (k <= markdown.length) {
80
+ const e = lineEnd(k);
81
+ if (CLOSE_RE.test(markdown.slice(k, e).trim())) {
82
+ bodyEnd = k;
83
+ closed = true;
84
+ end = e;
85
+ break;
86
+ }
87
+ if (e >= markdown.length)
88
+ break;
89
+ k = e + 1;
90
+ }
91
+ }
92
+ if (at > markdown.length)
93
+ at = markdown.length;
94
+ const body = blankComments(markdown.slice(at, Math.max(at, bodyEnd)));
95
+ let off = 0;
96
+ for (const text of body.split('\n')) {
97
+ lines.push({ text, start: at + off });
98
+ off += text.length + 1;
99
+ }
100
+ // A body ending with a line feed leaves an empty last line: harmless.
101
+ // Split the lines into panels.
102
+ const panels = [];
103
+ const stray = [];
104
+ const before = [];
105
+ let current;
106
+ const finish = () => {
107
+ if (!current)
108
+ return;
109
+ current.panel.items = parseComicScript(markdown, current.lines);
110
+ const last = [...current.lines].reverse().find((l) => l.text.trim() !== '');
111
+ current.panel.sourceEnd = last ? last.start + last.text.trimEnd().length : current.panel.lineEnd;
112
+ panels.push(current.panel);
113
+ current = undefined;
114
+ };
115
+ for (const line of lines) {
116
+ const trimmed = line.text.trim();
117
+ const pm = PANEL_RE.exec(trimmed);
118
+ if (pm) {
119
+ finish();
120
+ const lead = line.text.length - line.text.trimStart().length;
121
+ const lineStart = line.start + lead;
122
+ const lineEndAt = line.start + line.text.trimEnd().length;
123
+ const pblob = pm[1];
124
+ const pAttrsStart = pblob !== undefined ? line.start + line.text.indexOf('{') + 1 : lineEndAt;
125
+ current = {
126
+ panel: {
127
+ index: panels.length,
128
+ attrs: parseDirectiveAttrs(pblob ?? ''),
129
+ attrSources: pblob !== undefined ? attrValueSources(pblob, pAttrsStart) : {},
130
+ sourceStart: lineStart,
131
+ sourceEnd: lineEndAt,
132
+ lineStart,
133
+ lineEnd: lineEndAt,
134
+ items: [],
135
+ },
136
+ lines: [],
137
+ };
138
+ continue;
139
+ }
140
+ if (current)
141
+ current.lines.push(line);
142
+ else {
143
+ before.push(line);
144
+ if (trimmed !== '') {
145
+ const lead = line.text.length - line.text.trimStart().length;
146
+ stray.push({ start: line.start + lead, end: line.start + line.text.trimEnd().length });
147
+ }
148
+ }
149
+ }
150
+ finish();
151
+ // Text before the first panel goes to the first panel (or to a panel of
152
+ // its own when the page has none), each item marked stray.
153
+ if (stray.length > 0) {
154
+ const items = parseComicScript(markdown, before).map((it) => ({ ...it, stray: true }));
155
+ if (panels.length > 0)
156
+ panels[0].items = [...items, ...panels[0].items];
157
+ else {
158
+ const first = stray[0];
159
+ const last = stray[stray.length - 1];
160
+ panels.push({ index: 0, attrs: {}, attrSources: {}, sourceStart: first.start, sourceEnd: last.end, lineStart: first.start, lineEnd: first.start, implicit: true, items });
161
+ }
162
+ }
163
+ const splitRange = attrSources.split;
164
+ const split = attrs.split;
165
+ // Without a `split` the panels of a page stack in equal tiers; those of
166
+ // a strip sit side by side (a daily strip).
167
+ const splitParse = parseComicSplit(split ?? Array.from({ length: Math.max(1, panels.length) }, () => '*').join(kind === 'strip' ? ' | ' : ' / '));
168
+ if (split === undefined) {
169
+ // No offsets into a value that is not written.
170
+ splitParse.issues = [];
171
+ pinSplit(splitParse.tree, attrsEnd);
172
+ }
173
+ else if (splitRange) {
174
+ shiftSplit(splitParse, splitRange.start);
175
+ }
176
+ return {
177
+ source: {
178
+ kind,
179
+ attrs,
180
+ attrSources,
181
+ attrsStart,
182
+ attrsEnd,
183
+ ...(split !== undefined ? { split } : {}),
184
+ splitParse,
185
+ panels,
186
+ stray,
187
+ closed,
188
+ sourceStart: fenceStart,
189
+ sourceEnd: closed ? end : markdown.length,
190
+ },
191
+ end: closed ? end : markdown.length,
192
+ };
193
+ }
194
+ /** Point every offset of a split that is not written (the default stack of
195
+ * tiers) at `at`, where a `split` attribute would be inserted. */
196
+ function pinSplit(list, at) {
197
+ list.sourceStart = at;
198
+ list.sourceEnd = at;
199
+ for (const item of list.items) {
200
+ item.sourceStart = at;
201
+ item.sourceEnd = at;
202
+ item.size.sourceStart = at;
203
+ item.size.sourceEnd = at;
204
+ if (item.children)
205
+ pinSplit(item.children, at);
206
+ }
207
+ }
208
+ /** Make the offsets of a parsed split value absolute. */
209
+ function shiftSplit(parse, by) {
210
+ const seen = new Set();
211
+ const walk = (list) => {
212
+ list.sourceStart += by;
213
+ list.sourceEnd += by;
214
+ for (const item of list.items) {
215
+ item.sourceStart += by;
216
+ item.sourceEnd += by;
217
+ if (!seen.has(item.size)) {
218
+ seen.add(item.size);
219
+ item.size.sourceStart += by;
220
+ item.size.sourceEnd += by;
221
+ }
222
+ if (item.children)
223
+ walk(item.children);
224
+ }
225
+ };
226
+ walk(parse.tree);
227
+ for (const issue of parse.issues) {
228
+ issue.sourceStart += by;
229
+ issue.sourceEnd += by;
230
+ }
231
+ }
232
+ /** Every offset of a comic source mapped through `toOriginal` (the block
233
+ * parser reads a text with its index marks taken out, then maps every
234
+ * offset back to the original). Mutates `source`. */
235
+ export function remapComicSource(source, toOriginal) {
236
+ const range = (r) => {
237
+ r.start = toOriginal(r.start);
238
+ r.end = toOriginal(r.end);
239
+ };
240
+ source.sourceStart = toOriginal(source.sourceStart);
241
+ source.sourceEnd = toOriginal(source.sourceEnd);
242
+ source.attrsStart = toOriginal(source.attrsStart);
243
+ source.attrsEnd = toOriginal(source.attrsEnd);
244
+ Object.values(source.attrSources).forEach(range);
245
+ source.stray.forEach(range);
246
+ const seen = new Set();
247
+ const walk = (list) => {
248
+ list.sourceStart = toOriginal(list.sourceStart);
249
+ list.sourceEnd = toOriginal(list.sourceEnd);
250
+ for (const item of list.items) {
251
+ item.sourceStart = toOriginal(item.sourceStart);
252
+ item.sourceEnd = toOriginal(item.sourceEnd);
253
+ if (!seen.has(item.size)) {
254
+ seen.add(item.size);
255
+ item.size.sourceStart = toOriginal(item.size.sourceStart);
256
+ item.size.sourceEnd = toOriginal(item.size.sourceEnd);
257
+ }
258
+ if (item.children)
259
+ walk(item.children);
260
+ }
261
+ };
262
+ walk(source.splitParse.tree);
263
+ for (const issue of source.splitParse.issues) {
264
+ issue.sourceStart = toOriginal(issue.sourceStart);
265
+ issue.sourceEnd = toOriginal(issue.sourceEnd);
266
+ }
267
+ for (const panel of source.panels) {
268
+ panel.sourceStart = toOriginal(panel.sourceStart);
269
+ panel.sourceEnd = toOriginal(panel.sourceEnd);
270
+ panel.lineStart = toOriginal(panel.lineStart);
271
+ panel.lineEnd = toOriginal(panel.lineEnd);
272
+ Object.values(panel.attrSources).forEach(range);
273
+ for (const item of panel.items) {
274
+ for (const k of ['sourceStart', 'sourceEnd', 'keyStart', 'keyEnd', 'textStart', 'textEnd', 'attrsStart', 'attrsEnd']) {
275
+ const v = item[k];
276
+ if (v !== undefined)
277
+ item[k] = toOriginal(v);
278
+ }
279
+ Object.values(item.attrSources).forEach(range);
280
+ for (let i = 0; i < item.sourceMap.length; i++)
281
+ item.sourceMap[i] = toOriginal(item.sourceMap[i]);
282
+ }
283
+ }
284
+ }
285
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/comics/page.ts"],"names":[],"mappings":"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"}