postext 1.8.6 → 1.9.1

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 (565) hide show
  1. package/dist/__bench__/cjkChapter.bench.test.d.ts +2 -0
  2. package/dist/__bench__/cjkChapter.bench.test.d.ts.map +1 -0
  3. package/dist/__bench__/cjkChapter.bench.test.js +71 -0
  4. package/dist/__bench__/cjkChapter.bench.test.js.map +1 -0
  5. package/dist/__tests__/bundle.test.js +16 -0
  6. package/dist/__tests__/bundle.test.js.map +1 -1
  7. package/dist/__tests__/canvasDirection.test.d.ts +2 -0
  8. package/dist/__tests__/canvasDirection.test.d.ts.map +1 -0
  9. package/dist/__tests__/canvasDirection.test.js +45 -0
  10. package/dist/__tests__/canvasDirection.test.js.map +1 -0
  11. package/dist/__tests__/chineseLocale.test.d.ts +2 -0
  12. package/dist/__tests__/chineseLocale.test.d.ts.map +1 -0
  13. package/dist/__tests__/chineseLocale.test.js +253 -0
  14. package/dist/__tests__/chineseLocale.test.js.map +1 -0
  15. package/dist/__tests__/chineseNumbering.test.d.ts +2 -0
  16. package/dist/__tests__/chineseNumbering.test.d.ts.map +1 -0
  17. package/dist/__tests__/chineseNumbering.test.js +376 -0
  18. package/dist/__tests__/chineseNumbering.test.js.map +1 -0
  19. package/dist/__tests__/cjk/annotations.test.d.ts +2 -0
  20. package/dist/__tests__/cjk/annotations.test.d.ts.map +1 -0
  21. package/dist/__tests__/cjk/annotations.test.js +483 -0
  22. package/dist/__tests__/cjk/annotations.test.js.map +1 -0
  23. package/dist/__tests__/cjk/annotationsRender.test.d.ts +2 -0
  24. package/dist/__tests__/cjk/annotationsRender.test.d.ts.map +1 -0
  25. package/dist/__tests__/cjk/annotationsRender.test.js +263 -0
  26. package/dist/__tests__/cjk/annotationsRender.test.js.map +1 -0
  27. package/dist/__tests__/cjk/composer.test.d.ts +2 -0
  28. package/dist/__tests__/cjk/composer.test.d.ts.map +1 -0
  29. package/dist/__tests__/cjk/composer.test.js +237 -0
  30. package/dist/__tests__/cjk/composer.test.js.map +1 -0
  31. package/dist/__tests__/cjk/composerEdges.test.d.ts +2 -0
  32. package/dist/__tests__/cjk/composerEdges.test.d.ts.map +1 -0
  33. package/dist/__tests__/cjk/composerEdges.test.js +352 -0
  34. package/dist/__tests__/cjk/composerEdges.test.js.map +1 -0
  35. package/dist/__tests__/cjk/dashRule.test.d.ts +2 -0
  36. package/dist/__tests__/cjk/dashRule.test.d.ts.map +1 -0
  37. package/dist/__tests__/cjk/dashRule.test.js +261 -0
  38. package/dist/__tests__/cjk/dashRule.test.js.map +1 -0
  39. package/dist/__tests__/cjk/fuzz.test.d.ts +2 -0
  40. package/dist/__tests__/cjk/fuzz.test.d.ts.map +1 -0
  41. package/dist/__tests__/cjk/fuzz.test.js +102 -0
  42. package/dist/__tests__/cjk/fuzz.test.js.map +1 -0
  43. package/dist/__tests__/cjk/grid.test.d.ts +2 -0
  44. package/dist/__tests__/cjk/grid.test.d.ts.map +1 -0
  45. package/dist/__tests__/cjk/grid.test.js +261 -0
  46. package/dist/__tests__/cjk/grid.test.js.map +1 -0
  47. package/dist/__tests__/cjk/justifyRender.test.d.ts +2 -0
  48. package/dist/__tests__/cjk/justifyRender.test.d.ts.map +1 -0
  49. package/dist/__tests__/cjk/justifyRender.test.js +139 -0
  50. package/dist/__tests__/cjk/justifyRender.test.js.map +1 -0
  51. package/dist/__tests__/cjk/latinFastPath.test.d.ts +2 -0
  52. package/dist/__tests__/cjk/latinFastPath.test.d.ts.map +1 -0
  53. package/dist/__tests__/cjk/latinFastPath.test.js +208 -0
  54. package/dist/__tests__/cjk/latinFastPath.test.js.map +1 -0
  55. package/dist/__tests__/cjk/markCutsLatin.test.d.ts +2 -0
  56. package/dist/__tests__/cjk/markCutsLatin.test.d.ts.map +1 -0
  57. package/dist/__tests__/cjk/markCutsLatin.test.js +69 -0
  58. package/dist/__tests__/cjk/markCutsLatin.test.js.map +1 -0
  59. package/dist/__tests__/cjk/markRuns.test.d.ts +2 -0
  60. package/dist/__tests__/cjk/markRuns.test.d.ts.map +1 -0
  61. package/dist/__tests__/cjk/markRuns.test.js +347 -0
  62. package/dist/__tests__/cjk/markRuns.test.js.map +1 -0
  63. package/dist/__tests__/cjk/punctuation.test.d.ts +2 -0
  64. package/dist/__tests__/cjk/punctuation.test.d.ts.map +1 -0
  65. package/dist/__tests__/cjk/punctuation.test.js +440 -0
  66. package/dist/__tests__/cjk/punctuation.test.js.map +1 -0
  67. package/dist/__tests__/cjk/punctuationRender.test.d.ts +2 -0
  68. package/dist/__tests__/cjk/punctuationRender.test.d.ts.map +1 -0
  69. package/dist/__tests__/cjk/punctuationRender.test.js +135 -0
  70. package/dist/__tests__/cjk/punctuationRender.test.js.map +1 -0
  71. package/dist/__tests__/cjk/rubyDescenders.test.d.ts +2 -0
  72. package/dist/__tests__/cjk/rubyDescenders.test.d.ts.map +1 -0
  73. package/dist/__tests__/cjk/rubyDescenders.test.js +77 -0
  74. package/dist/__tests__/cjk/rubyDescenders.test.js.map +1 -0
  75. package/dist/__tests__/cjk/runt.test.d.ts +2 -0
  76. package/dist/__tests__/cjk/runt.test.d.ts.map +1 -0
  77. package/dist/__tests__/cjk/runt.test.js +103 -0
  78. package/dist/__tests__/cjk/runt.test.js.map +1 -0
  79. package/dist/__tests__/cjk/sharedMarks.test.d.ts +2 -0
  80. package/dist/__tests__/cjk/sharedMarks.test.d.ts.map +1 -0
  81. package/dist/__tests__/cjk/sharedMarks.test.js +347 -0
  82. package/dist/__tests__/cjk/sharedMarks.test.js.map +1 -0
  83. package/dist/__tests__/cjk/uprightDots.test.d.ts +2 -0
  84. package/dist/__tests__/cjk/uprightDots.test.d.ts.map +1 -0
  85. package/dist/__tests__/cjk/uprightDots.test.js +47 -0
  86. package/dist/__tests__/cjk/uprightDots.test.js.map +1 -0
  87. package/dist/__tests__/cjk/wordJoiner.test.d.ts +2 -0
  88. package/dist/__tests__/cjk/wordJoiner.test.d.ts.map +1 -0
  89. package/dist/__tests__/cjk/wordJoiner.test.js +47 -0
  90. package/dist/__tests__/cjk/wordJoiner.test.js.map +1 -0
  91. package/dist/__tests__/cjk/zhuyinTones.test.d.ts +2 -0
  92. package/dist/__tests__/cjk/zhuyinTones.test.d.ts.map +1 -0
  93. package/dist/__tests__/cjk/zhuyinTones.test.js +72 -0
  94. package/dist/__tests__/cjk/zhuyinTones.test.js.map +1 -0
  95. package/dist/__tests__/contentLocale.test.d.ts +2 -0
  96. package/dist/__tests__/contentLocale.test.d.ts.map +1 -0
  97. package/dist/__tests__/contentLocale.test.js +167 -0
  98. package/dist/__tests__/contentLocale.test.js.map +1 -0
  99. package/dist/__tests__/defaults/cjk.test.d.ts +2 -0
  100. package/dist/__tests__/defaults/cjk.test.d.ts.map +1 -0
  101. package/dist/__tests__/defaults/cjk.test.js +70 -0
  102. package/dist/__tests__/defaults/cjk.test.js.map +1 -0
  103. package/dist/__tests__/design/designTextRender.test.js +31 -0
  104. package/dist/__tests__/design/designTextRender.test.js.map +1 -1
  105. package/dist/__tests__/design/imageAltText.test.d.ts +2 -0
  106. package/dist/__tests__/design/imageAltText.test.d.ts.map +1 -0
  107. package/dist/__tests__/design/imageAltText.test.js +126 -0
  108. package/dist/__tests__/design/imageAltText.test.js.map +1 -0
  109. package/dist/__tests__/exports.test.js +61 -0
  110. package/dist/__tests__/exports.test.js.map +1 -1
  111. package/dist/__tests__/headingLetterSpacing.test.js +1 -1
  112. package/dist/__tests__/headingLetterSpacing.test.js.map +1 -1
  113. package/dist/__tests__/indexChinese.test.d.ts +2 -0
  114. package/dist/__tests__/indexChinese.test.d.ts.map +1 -0
  115. package/dist/__tests__/indexChinese.test.js +190 -0
  116. package/dist/__tests__/indexChinese.test.js.map +1 -0
  117. package/dist/__tests__/parse/annotations.test.d.ts +2 -0
  118. package/dist/__tests__/parse/annotations.test.d.ts.map +1 -0
  119. package/dist/__tests__/parse/annotations.test.js +175 -0
  120. package/dist/__tests__/parse/annotations.test.js.map +1 -0
  121. package/dist/__tests__/parse/attrQuoting.test.js +10 -8
  122. package/dist/__tests__/parse/attrQuoting.test.js.map +1 -1
  123. package/dist/__tests__/parse/chineseText.test.d.ts +2 -0
  124. package/dist/__tests__/parse/chineseText.test.d.ts.map +1 -0
  125. package/dist/__tests__/parse/chineseText.test.js +352 -0
  126. package/dist/__tests__/parse/chineseText.test.js.map +1 -0
  127. package/dist/__tests__/parts.test.js +25 -0
  128. package/dist/__tests__/parts.test.js.map +1 -1
  129. package/dist/__tests__/pipeline/colonListRoom.test.js +20 -0
  130. package/dist/__tests__/pipeline/colonListRoom.test.js.map +1 -1
  131. package/dist/__tests__/presets/hongloumeng.test.d.ts +2 -0
  132. package/dist/__tests__/presets/hongloumeng.test.d.ts.map +1 -0
  133. package/dist/__tests__/presets/hongloumeng.test.js +485 -0
  134. package/dist/__tests__/presets/hongloumeng.test.js.map +1 -0
  135. package/dist/__tests__/vertical/canvasPaint.test.d.ts +2 -0
  136. package/dist/__tests__/vertical/canvasPaint.test.d.ts.map +1 -0
  137. package/dist/__tests__/vertical/canvasPaint.test.js +229 -0
  138. package/dist/__tests__/vertical/canvasPaint.test.js.map +1 -0
  139. package/dist/__tests__/vertical/compositionPaint.test.d.ts +2 -0
  140. package/dist/__tests__/vertical/compositionPaint.test.d.ts.map +1 -0
  141. package/dist/__tests__/vertical/compositionPaint.test.js +538 -0
  142. package/dist/__tests__/vertical/compositionPaint.test.js.map +1 -0
  143. package/dist/__tests__/vertical/geometry.test.d.ts +2 -0
  144. package/dist/__tests__/vertical/geometry.test.d.ts.map +1 -0
  145. package/dist/__tests__/vertical/geometry.test.js +276 -0
  146. package/dist/__tests__/vertical/geometry.test.js.map +1 -0
  147. package/dist/__tests__/vertical/htmlSmoke.test.d.ts +2 -0
  148. package/dist/__tests__/vertical/htmlSmoke.test.d.ts.map +1 -0
  149. package/dist/__tests__/vertical/htmlSmoke.test.js +25 -0
  150. package/dist/__tests__/vertical/htmlSmoke.test.js.map +1 -0
  151. package/dist/__tests__/vertical/htmlTurnedCells.test.d.ts +2 -0
  152. package/dist/__tests__/vertical/htmlTurnedCells.test.d.ts.map +1 -0
  153. package/dist/__tests__/vertical/htmlTurnedCells.test.js +99 -0
  154. package/dist/__tests__/vertical/htmlTurnedCells.test.js.map +1 -0
  155. package/dist/__tests__/vertical/htmlVertical.test.d.ts +2 -0
  156. package/dist/__tests__/vertical/htmlVertical.test.d.ts.map +1 -0
  157. package/dist/__tests__/vertical/htmlVertical.test.js +145 -0
  158. package/dist/__tests__/vertical/htmlVertical.test.js.map +1 -0
  159. package/dist/__tests__/vertical/lineAxis.test.d.ts +2 -0
  160. package/dist/__tests__/vertical/lineAxis.test.d.ts.map +1 -0
  161. package/dist/__tests__/vertical/lineAxis.test.js +128 -0
  162. package/dist/__tests__/vertical/lineAxis.test.js.map +1 -0
  163. package/dist/__tests__/vertical/measurePaint.test.d.ts +2 -0
  164. package/dist/__tests__/vertical/measurePaint.test.d.ts.map +1 -0
  165. package/dist/__tests__/vertical/measurePaint.test.js +259 -0
  166. package/dist/__tests__/vertical/measurePaint.test.js.map +1 -0
  167. package/dist/__tests__/vertical/orientation.test.d.ts +2 -0
  168. package/dist/__tests__/vertical/orientation.test.d.ts.map +1 -0
  169. package/dist/__tests__/vertical/orientation.test.js +153 -0
  170. package/dist/__tests__/vertical/orientation.test.js.map +1 -0
  171. package/dist/__tests__/vertical/stub.d.ts +8 -0
  172. package/dist/__tests__/vertical/stub.d.ts.map +1 -0
  173. package/dist/__tests__/vertical/stub.js +37 -0
  174. package/dist/__tests__/vertical/stub.js.map +1 -0
  175. package/dist/__tests__/vertical/tateChuYoko.test.d.ts +2 -0
  176. package/dist/__tests__/vertical/tateChuYoko.test.d.ts.map +1 -0
  177. package/dist/__tests__/vertical/tateChuYoko.test.js +270 -0
  178. package/dist/__tests__/vertical/tateChuYoko.test.js.map +1 -0
  179. package/dist/__tests__/vertical/uprightResources.test.d.ts +2 -0
  180. package/dist/__tests__/vertical/uprightResources.test.d.ts.map +1 -0
  181. package/dist/__tests__/vertical/uprightResources.test.js +182 -0
  182. package/dist/__tests__/vertical/uprightResources.test.js.map +1 -0
  183. package/dist/__tests__/vertical/verticalDesignText.test.d.ts +2 -0
  184. package/dist/__tests__/vertical/verticalDesignText.test.d.ts.map +1 -0
  185. package/dist/__tests__/vertical/verticalDesignText.test.js +190 -0
  186. package/dist/__tests__/vertical/verticalDesignText.test.js.map +1 -0
  187. package/dist/__tests__/vertical/verticalSpans.d.ts +25 -0
  188. package/dist/__tests__/vertical/verticalSpans.d.ts.map +1 -0
  189. package/dist/__tests__/vertical/verticalSpans.js +39 -0
  190. package/dist/__tests__/vertical/verticalSpans.js.map +1 -0
  191. package/dist/__tests__/vertical/verticalTwins.test.d.ts +2 -0
  192. package/dist/__tests__/vertical/verticalTwins.test.d.ts.map +1 -0
  193. package/dist/__tests__/vertical/verticalTwins.test.js +71 -0
  194. package/dist/__tests__/vertical/verticalTwins.test.js.map +1 -0
  195. package/dist/bundle/adapters.d.ts +14 -5
  196. package/dist/bundle/adapters.d.ts.map +1 -1
  197. package/dist/bundle/adapters.js +4 -3
  198. package/dist/bundle/adapters.js.map +1 -1
  199. package/dist/bundle/codec.d.ts.map +1 -1
  200. package/dist/bundle/codec.js +27 -4
  201. package/dist/bundle/codec.js.map +1 -1
  202. package/dist/bundle/index.d.ts +1 -1
  203. package/dist/bundle/index.d.ts.map +1 -1
  204. package/dist/bundle/manifest.d.ts +6 -4
  205. package/dist/bundle/manifest.d.ts.map +1 -1
  206. package/dist/bundle/manifest.js +31 -32
  207. package/dist/bundle/manifest.js.map +1 -1
  208. package/dist/bundle/types.d.ts +7 -2
  209. package/dist/bundle/types.d.ts.map +1 -1
  210. package/dist/canvas-backend/annotations.d.ts +31 -0
  211. package/dist/canvas-backend/annotations.d.ts.map +1 -0
  212. package/dist/canvas-backend/annotations.js +120 -0
  213. package/dist/canvas-backend/annotations.js.map +1 -0
  214. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  215. package/dist/canvas-backend/blockRender.js +195 -15
  216. package/dist/canvas-backend/blockRender.js.map +1 -1
  217. package/dist/canvas-backend/decorations.d.ts +5 -0
  218. package/dist/canvas-backend/decorations.d.ts.map +1 -1
  219. package/dist/canvas-backend/decorations.js +27 -0
  220. package/dist/canvas-backend/decorations.js.map +1 -1
  221. package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
  222. package/dist/canvas-backend/headerFooter.js +32 -16
  223. package/dist/canvas-backend/headerFooter.js.map +1 -1
  224. package/dist/canvas-backend/index.d.ts +2 -0
  225. package/dist/canvas-backend/index.d.ts.map +1 -1
  226. package/dist/canvas-backend/index.js +62 -2
  227. package/dist/canvas-backend/index.js.map +1 -1
  228. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  229. package/dist/canvas-backend/renderResourceBlock.js +42 -5
  230. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  231. package/dist/canvas-backend/segmentText.d.ts +23 -0
  232. package/dist/canvas-backend/segmentText.d.ts.map +1 -0
  233. package/dist/canvas-backend/segmentText.js +41 -0
  234. package/dist/canvas-backend/segmentText.js.map +1 -0
  235. package/dist/canvas-backend/verticalText.d.ts +113 -0
  236. package/dist/canvas-backend/verticalText.d.ts.map +1 -0
  237. package/dist/canvas-backend/verticalText.js +437 -0
  238. package/dist/canvas-backend/verticalText.js.map +1 -0
  239. package/dist/chineseNumerals.d.ts +39 -0
  240. package/dist/chineseNumerals.d.ts.map +1 -0
  241. package/dist/chineseNumerals.js +192 -0
  242. package/dist/chineseNumerals.js.map +1 -0
  243. package/dist/cjkMarks.d.ts +61 -0
  244. package/dist/cjkMarks.d.ts.map +1 -0
  245. package/dist/cjkMarks.js +441 -0
  246. package/dist/cjkMarks.js.map +1 -0
  247. package/dist/columnClip.d.ts +13 -4
  248. package/dist/columnClip.d.ts.map +1 -1
  249. package/dist/columnClip.js +33 -5
  250. package/dist/columnClip.js.map +1 -1
  251. package/dist/configWarnings.d.ts.map +1 -1
  252. package/dist/configWarnings.js +18 -3
  253. package/dist/configWarnings.js.map +1 -1
  254. package/dist/defaults/bodyText.d.ts +4 -1
  255. package/dist/defaults/bodyText.d.ts.map +1 -1
  256. package/dist/defaults/bodyText.js +27 -5
  257. package/dist/defaults/bodyText.js.map +1 -1
  258. package/dist/defaults/calloutStyles.js +1 -1
  259. package/dist/defaults/calloutStyles.js.map +1 -1
  260. package/dist/defaults/captionStyle.d.ts.map +1 -1
  261. package/dist/defaults/captionStyle.js +14 -0
  262. package/dist/defaults/captionStyle.js.map +1 -1
  263. package/dist/defaults/cjk.d.ts +33 -0
  264. package/dist/defaults/cjk.d.ts.map +1 -0
  265. package/dist/defaults/cjk.js +234 -0
  266. package/dist/defaults/cjk.js.map +1 -0
  267. package/dist/defaults/headerFooter.d.ts.map +1 -1
  268. package/dist/defaults/headerFooter.js +2 -0
  269. package/dist/defaults/headerFooter.js.map +1 -1
  270. package/dist/defaults/headingStyles.d.ts.map +1 -1
  271. package/dist/defaults/headingStyles.js +4 -0
  272. package/dist/defaults/headingStyles.js.map +1 -1
  273. package/dist/defaults/headings.d.ts.map +1 -1
  274. package/dist/defaults/headings.js +13 -6
  275. package/dist/defaults/headings.js.map +1 -1
  276. package/dist/defaults/index.d.ts +1 -0
  277. package/dist/defaults/index.d.ts.map +1 -1
  278. package/dist/defaults/index.js +10 -1
  279. package/dist/defaults/index.js.map +1 -1
  280. package/dist/defaults/indexConfig.d.ts +2 -1
  281. package/dist/defaults/indexConfig.d.ts.map +1 -1
  282. package/dist/defaults/indexConfig.js +5 -0
  283. package/dist/defaults/indexConfig.js.map +1 -1
  284. package/dist/defaults/layout.d.ts.map +1 -1
  285. package/dist/defaults/layout.js +7 -0
  286. package/dist/defaults/layout.js.map +1 -1
  287. package/dist/defaults/orderedLists.d.ts +5 -2
  288. package/dist/defaults/orderedLists.d.ts.map +1 -1
  289. package/dist/defaults/orderedLists.js +20 -5
  290. package/dist/defaults/orderedLists.js.map +1 -1
  291. package/dist/defaults/page.d.ts +8 -2
  292. package/dist/defaults/page.d.ts.map +1 -1
  293. package/dist/defaults/page.js +24 -7
  294. package/dist/defaults/page.js.map +1 -1
  295. package/dist/defaults/resourceTypes.d.ts +3 -3
  296. package/dist/defaults/resourceTypes.d.ts.map +1 -1
  297. package/dist/defaults/resourceTypes.js +23 -9
  298. package/dist/defaults/resourceTypes.js.map +1 -1
  299. package/dist/defaults/tableStyle.d.ts.map +1 -1
  300. package/dist/defaults/tableStyle.js +8 -5
  301. package/dist/defaults/tableStyle.js.map +1 -1
  302. package/dist/design/layout.d.ts +33 -0
  303. package/dist/design/layout.d.ts.map +1 -1
  304. package/dist/design/layout.js +124 -18
  305. package/dist/design/layout.js.map +1 -1
  306. package/dist/design/placeholders.d.ts.map +1 -1
  307. package/dist/design/placeholders.js +5 -1
  308. package/dist/design/placeholders.js.map +1 -1
  309. package/dist/design/richText.d.ts +24 -4
  310. package/dist/design/richText.d.ts.map +1 -1
  311. package/dist/design/richText.js +77 -16
  312. package/dist/design/richText.js.map +1 -1
  313. package/dist/html-backend.d.ts.map +1 -1
  314. package/dist/html-backend.js +635 -25
  315. package/dist/html-backend.js.map +1 -1
  316. package/dist/htmlAnnotations.d.ts +29 -0
  317. package/dist/htmlAnnotations.d.ts.map +1 -0
  318. package/dist/htmlAnnotations.js +86 -0
  319. package/dist/htmlAnnotations.js.map +1 -0
  320. package/dist/hyphenate.js +2 -1
  321. package/dist/hyphenate.js.map +1 -1
  322. package/dist/index.d.ts +28 -14
  323. package/dist/index.d.ts.map +1 -1
  324. package/dist/index.js +16 -8
  325. package/dist/index.js.map +1 -1
  326. package/dist/knuthPlass/pretextAdapter.d.ts +4 -1
  327. package/dist/knuthPlass/pretextAdapter.d.ts.map +1 -1
  328. package/dist/knuthPlass/pretextAdapter.js +9 -5
  329. package/dist/knuthPlass/pretextAdapter.js.map +1 -1
  330. package/dist/knuthPlass/richAdapter.d.ts +15 -2
  331. package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
  332. package/dist/knuthPlass/richAdapter.js +16 -6
  333. package/dist/knuthPlass/richAdapter.js.map +1 -1
  334. package/dist/knuthPlass/tracking.d.ts +1 -1
  335. package/dist/knuthPlass/tracking.d.ts.map +1 -1
  336. package/dist/knuthPlass/tracking.js +4 -3
  337. package/dist/knuthPlass/tracking.js.map +1 -1
  338. package/dist/knuthPlass/types.d.ts +3 -0
  339. package/dist/knuthPlass/types.d.ts.map +1 -1
  340. package/dist/lineInk.d.ts +13 -0
  341. package/dist/lineInk.d.ts.map +1 -1
  342. package/dist/lineInk.js +28 -1
  343. package/dist/lineInk.js.map +1 -1
  344. package/dist/locale.d.ts +91 -3
  345. package/dist/locale.d.ts.map +1 -1
  346. package/dist/locale.js +245 -1
  347. package/dist/locale.js.map +1 -1
  348. package/dist/looseLines.d.ts +11 -1
  349. package/dist/looseLines.d.ts.map +1 -1
  350. package/dist/looseLines.js +26 -1
  351. package/dist/looseLines.js.map +1 -1
  352. package/dist/measure/cache.d.ts.map +1 -1
  353. package/dist/measure/cache.js +51 -3
  354. package/dist/measure/cache.js.map +1 -1
  355. package/dist/measure/canvas.d.ts +25 -0
  356. package/dist/measure/canvas.d.ts.map +1 -1
  357. package/dist/measure/canvas.js +90 -1
  358. package/dist/measure/canvas.js.map +1 -1
  359. package/dist/measure/cjk.d.ts +8 -13
  360. package/dist/measure/cjk.d.ts.map +1 -1
  361. package/dist/measure/cjk.js +29 -53
  362. package/dist/measure/cjk.js.map +1 -1
  363. package/dist/measure/cjkAnnotate.d.ts +96 -0
  364. package/dist/measure/cjkAnnotate.d.ts.map +1 -0
  365. package/dist/measure/cjkAnnotate.js +237 -0
  366. package/dist/measure/cjkAnnotate.js.map +1 -0
  367. package/dist/measure/cjkClasses.d.ts +133 -0
  368. package/dist/measure/cjkClasses.d.ts.map +1 -0
  369. package/dist/measure/cjkClasses.js +273 -0
  370. package/dist/measure/cjkClasses.js.map +1 -0
  371. package/dist/measure/cjkCompose.d.ts +86 -0
  372. package/dist/measure/cjkCompose.d.ts.map +1 -0
  373. package/dist/measure/cjkCompose.js +2022 -0
  374. package/dist/measure/cjkCompose.js.map +1 -0
  375. package/dist/measure/cjkPunctuation.d.ts +248 -0
  376. package/dist/measure/cjkPunctuation.d.ts.map +1 -0
  377. package/dist/measure/cjkPunctuation.js +492 -0
  378. package/dist/measure/cjkPunctuation.js.map +1 -0
  379. package/dist/measure/graphemes.d.ts +13 -0
  380. package/dist/measure/graphemes.d.ts.map +1 -0
  381. package/dist/measure/graphemes.js +38 -0
  382. package/dist/measure/graphemes.js.map +1 -0
  383. package/dist/measure/index.d.ts +3 -0
  384. package/dist/measure/index.d.ts.map +1 -1
  385. package/dist/measure/index.js +2 -0
  386. package/dist/measure/index.js.map +1 -1
  387. package/dist/measure/links.d.ts +6 -2
  388. package/dist/measure/links.d.ts.map +1 -1
  389. package/dist/measure/links.js +15 -5
  390. package/dist/measure/links.js.map +1 -1
  391. package/dist/measure/markCuts.d.ts +37 -0
  392. package/dist/measure/markCuts.d.ts.map +1 -0
  393. package/dist/measure/markCuts.js +77 -0
  394. package/dist/measure/markCuts.js.map +1 -0
  395. package/dist/measure/plain.d.ts.map +1 -1
  396. package/dist/measure/plain.js +33 -11
  397. package/dist/measure/plain.js.map +1 -1
  398. package/dist/measure/rich.d.ts +88 -1
  399. package/dist/measure/rich.d.ts.map +1 -1
  400. package/dist/measure/rich.js +233 -111
  401. package/dist/measure/rich.js.map +1 -1
  402. package/dist/measure/rubyLift.d.ts +11 -0
  403. package/dist/measure/rubyLift.d.ts.map +1 -0
  404. package/dist/measure/rubyLift.js +57 -0
  405. package/dist/measure/rubyLift.js.map +1 -0
  406. package/dist/measure/spaces.d.ts +12 -2
  407. package/dist/measure/spaces.d.ts.map +1 -1
  408. package/dist/measure/spaces.js +21 -7
  409. package/dist/measure/spaces.js.map +1 -1
  410. package/dist/measure/types.d.ts +20 -1
  411. package/dist/measure/types.d.ts.map +1 -1
  412. package/dist/measure/types.js.map +1 -1
  413. package/dist/measure/vertical.d.ts +104 -0
  414. package/dist/measure/vertical.d.ts.map +1 -0
  415. package/dist/measure/vertical.js +184 -0
  416. package/dist/measure/vertical.js.map +1 -0
  417. package/dist/numberWords.d.ts +3 -10
  418. package/dist/numberWords.d.ts.map +1 -1
  419. package/dist/numberWords.js +21 -9
  420. package/dist/numberWords.js.map +1 -1
  421. package/dist/numbering.d.ts +23 -5
  422. package/dist/numbering.d.ts.map +1 -1
  423. package/dist/numbering.js +99 -14
  424. package/dist/numbering.js.map +1 -1
  425. package/dist/parse/annotations.d.ts +101 -0
  426. package/dist/parse/annotations.d.ts.map +1 -0
  427. package/dist/parse/annotations.js +556 -0
  428. package/dist/parse/annotations.js.map +1 -0
  429. package/dist/parse/attrs.d.ts +48 -1
  430. package/dist/parse/attrs.d.ts.map +1 -1
  431. package/dist/parse/attrs.js +121 -8
  432. package/dist/parse/attrs.js.map +1 -1
  433. package/dist/parse/blockParser.d.ts.map +1 -1
  434. package/dist/parse/blockParser.js +50 -24
  435. package/dist/parse/blockParser.js.map +1 -1
  436. package/dist/parse/index.d.ts +3 -1
  437. package/dist/parse/index.d.ts.map +1 -1
  438. package/dist/parse/index.js +1 -0
  439. package/dist/parse/index.js.map +1 -1
  440. package/dist/parse/injectSpans.d.ts +3 -1
  441. package/dist/parse/injectSpans.d.ts.map +1 -1
  442. package/dist/parse/injectSpans.js +29 -8
  443. package/dist/parse/injectSpans.js.map +1 -1
  444. package/dist/parse/inlineFormatting.d.ts +38 -6
  445. package/dist/parse/inlineFormatting.d.ts.map +1 -1
  446. package/dist/parse/inlineFormatting.js +139 -26
  447. package/dist/parse/inlineFormatting.js.map +1 -1
  448. package/dist/parse/inlineSnippet.d.ts +2 -1
  449. package/dist/parse/inlineSnippet.d.ts.map +1 -1
  450. package/dist/parse/inlineSnippet.js +6 -2
  451. package/dist/parse/inlineSnippet.js.map +1 -1
  452. package/dist/parse/orientationMarks.d.ts +49 -0
  453. package/dist/parse/orientationMarks.d.ts.map +1 -0
  454. package/dist/parse/orientationMarks.js +138 -0
  455. package/dist/parse/orientationMarks.js.map +1 -0
  456. package/dist/parse/softBreaks.d.ts +56 -0
  457. package/dist/parse/softBreaks.d.ts.map +1 -0
  458. package/dist/parse/softBreaks.js +271 -0
  459. package/dist/parse/softBreaks.js.map +1 -0
  460. package/dist/parse/sourceMapping.d.ts.map +1 -1
  461. package/dist/parse/sourceMapping.js +41 -0
  462. package/dist/parse/sourceMapping.js.map +1 -1
  463. package/dist/parse/types.d.ts +84 -0
  464. package/dist/parse/types.d.ts.map +1 -1
  465. package/dist/pipeline/annotations.d.ts +56 -0
  466. package/dist/pipeline/annotations.d.ts.map +1 -0
  467. package/dist/pipeline/annotations.js +181 -0
  468. package/dist/pipeline/annotations.js.map +1 -0
  469. package/dist/pipeline/build.d.ts.map +1 -1
  470. package/dist/pipeline/build.js +158 -47
  471. package/dist/pipeline/build.js.map +1 -1
  472. package/dist/pipeline/buildBlockKind.d.ts +3 -0
  473. package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
  474. package/dist/pipeline/buildBlockKind.js +5 -3
  475. package/dist/pipeline/buildBlockKind.js.map +1 -1
  476. package/dist/pipeline/buildHelpers.d.ts +36 -6
  477. package/dist/pipeline/buildHelpers.d.ts.map +1 -1
  478. package/dist/pipeline/buildHelpers.js +55 -8
  479. package/dist/pipeline/buildHelpers.js.map +1 -1
  480. package/dist/pipeline/buildMeasurement.d.ts +4 -0
  481. package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
  482. package/dist/pipeline/buildMeasurement.js +3 -1
  483. package/dist/pipeline/buildMeasurement.js.map +1 -1
  484. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  485. package/dist/pipeline/calloutLayout.js +25 -11
  486. package/dist/pipeline/calloutLayout.js.map +1 -1
  487. package/dist/pipeline/cjkGrid.d.ts +133 -0
  488. package/dist/pipeline/cjkGrid.d.ts.map +1 -0
  489. package/dist/pipeline/cjkGrid.js +191 -0
  490. package/dist/pipeline/cjkGrid.js.map +1 -0
  491. package/dist/pipeline/config.d.ts +13 -9
  492. package/dist/pipeline/config.d.ts.map +1 -1
  493. package/dist/pipeline/config.js +43 -18
  494. package/dist/pipeline/config.js.map +1 -1
  495. package/dist/pipeline/contentWarnings.d.ts +10 -0
  496. package/dist/pipeline/contentWarnings.d.ts.map +1 -1
  497. package/dist/pipeline/contentWarnings.js +174 -2
  498. package/dist/pipeline/contentWarnings.js.map +1 -1
  499. package/dist/pipeline/floatPlacement.d.ts +9 -3
  500. package/dist/pipeline/floatPlacement.d.ts.map +1 -1
  501. package/dist/pipeline/floatPlacement.js +17 -6
  502. package/dist/pipeline/floatPlacement.js.map +1 -1
  503. package/dist/pipeline/headerFooter.d.ts +5 -2
  504. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  505. package/dist/pipeline/headerFooter.js +123 -28
  506. package/dist/pipeline/headerFooter.js.map +1 -1
  507. package/dist/pipeline/headingDesignCuts.d.ts.map +1 -1
  508. package/dist/pipeline/headingDesignCuts.js +3 -1
  509. package/dist/pipeline/headingDesignCuts.js.map +1 -1
  510. package/dist/pipeline/headingStyles.d.ts +9 -3
  511. package/dist/pipeline/headingStyles.d.ts.map +1 -1
  512. package/dist/pipeline/headingStyles.js +23 -5
  513. package/dist/pipeline/headingStyles.js.map +1 -1
  514. package/dist/pipeline/indexDirective.d.ts.map +1 -1
  515. package/dist/pipeline/indexDirective.js +64 -20
  516. package/dist/pipeline/indexDirective.js.map +1 -1
  517. package/dist/pipeline/indexGroups.d.ts +55 -0
  518. package/dist/pipeline/indexGroups.d.ts.map +1 -0
  519. package/dist/pipeline/indexGroups.js +151 -0
  520. package/dist/pipeline/indexGroups.js.map +1 -0
  521. package/dist/pipeline/lists.d.ts +17 -0
  522. package/dist/pipeline/lists.d.ts.map +1 -1
  523. package/dist/pipeline/lists.js +43 -51
  524. package/dist/pipeline/lists.js.map +1 -1
  525. package/dist/pipeline/measureContentBlock.d.ts +3 -0
  526. package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
  527. package/dist/pipeline/measureContentBlock.js +31 -4
  528. package/dist/pipeline/measureContentBlock.js.map +1 -1
  529. package/dist/pipeline/outline.d.ts.map +1 -1
  530. package/dist/pipeline/outline.js +13 -8
  531. package/dist/pipeline/outline.js.map +1 -1
  532. package/dist/pipeline/parts.d.ts +6 -3
  533. package/dist/pipeline/parts.d.ts.map +1 -1
  534. package/dist/pipeline/parts.js +28 -5
  535. package/dist/pipeline/parts.js.map +1 -1
  536. package/dist/pipeline/placeholders.d.ts +11 -0
  537. package/dist/pipeline/placeholders.d.ts.map +1 -1
  538. package/dist/pipeline/placeholders.js +48 -18
  539. package/dist/pipeline/placeholders.js.map +1 -1
  540. package/dist/pipeline/placement.d.ts +10 -6
  541. package/dist/pipeline/placement.d.ts.map +1 -1
  542. package/dist/pipeline/placement.js +33 -16
  543. package/dist/pipeline/placement.js.map +1 -1
  544. package/dist/pipeline/resourceLayout.d.ts +18 -1
  545. package/dist/pipeline/resourceLayout.d.ts.map +1 -1
  546. package/dist/pipeline/resourceLayout.js +109 -21
  547. package/dist/pipeline/resourceLayout.js.map +1 -1
  548. package/dist/pipeline/toc.d.ts.map +1 -1
  549. package/dist/pipeline/toc.js +6 -5
  550. package/dist/pipeline/toc.js.map +1 -1
  551. package/dist/pipeline/verticalMetrics.d.ts +14 -0
  552. package/dist/pipeline/verticalMetrics.d.ts.map +1 -0
  553. package/dist/pipeline/verticalMetrics.js +154 -0
  554. package/dist/pipeline/verticalMetrics.js.map +1 -0
  555. package/dist/types.d.ts +344 -13
  556. package/dist/types.d.ts.map +1 -1
  557. package/dist/vdt.d.ts +396 -6
  558. package/dist/vdt.d.ts.map +1 -1
  559. package/dist/vdt.js +49 -0
  560. package/dist/vdt.js.map +1 -1
  561. package/dist/writingMode.d.ts +156 -0
  562. package/dist/writingMode.d.ts.map +1 -0
  563. package/dist/writingMode.js +291 -0
  564. package/dist/writingMode.js.map +1 -0
  565. package/package.json +1 -1
@@ -0,0 +1,182 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { buildDocument } from '../../pipeline';
3
+ import { flowRectToPage, flowToPage, resourceBlockToPage } from '../../vdt';
4
+ import { installSizedStub } from './stub';
5
+ installSizedStub();
6
+ const pt = (value) => ({ value, unit: 'pt' });
7
+ const HLM = '此開卷第一回也。作者自云:因曾歷過一番夢幻之後,故將真事隱去,而借「通靈」之說,撰此《石頭記》一書也。故曰「甄士隱」云云。';
8
+ const text = (n) => Array.from({ length: n }, () => HLM).join('\n\n');
9
+ const config = (layout = {}) => ({
10
+ page: { width: pt(300), height: pt(420), margins: { top: pt(40), right: pt(30), bottom: pt(40), left: pt(30) } },
11
+ bodyText: { fontSize: pt(10), lineHeight: pt(16) },
12
+ layout: { writingMode: 'vertical-rl', ...layout },
13
+ locale: 'zh-Hant',
14
+ });
15
+ const figure = (id, w, h, placement) => ({
16
+ id,
17
+ typeId: 'figure',
18
+ kind: 'bitmap',
19
+ caption: '寶玉與黛玉初見',
20
+ createdAt: 0,
21
+ updatedAt: 0,
22
+ bitmap: { fileId: `${id}.png`, format: 'png', width: w, height: h },
23
+ ...(placement ? { placement } : {}),
24
+ });
25
+ const table = {
26
+ id: 't1',
27
+ typeId: 'table',
28
+ kind: 'table',
29
+ caption: '賈府人物',
30
+ createdAt: 0,
31
+ updatedAt: 0,
32
+ table: { model: { rows: [[{ content: '名' }, { content: '字' }], [{ content: '賈寶玉' }, { content: '怡紅公子' }], [{ content: '林黛玉' }, { content: '瀟湘妃子' }]] } },
33
+ };
34
+ /** A resource block's upright frame on the sheet: its corners mapped
35
+ * through the block's rotation, then the page's flow frame. */
36
+ function sheetFrame(page, blk) {
37
+ const rb = blk.resourceBlock;
38
+ const rot = rb.rotation;
39
+ const map = (x, y) => {
40
+ const f = resourceBlockToPage(rb, x, y);
41
+ return flowToPage(page, f.x, f.y);
42
+ };
43
+ return { origin: map(0, 0), xStep: map(10, 0), yStep: map(0, 10), far: map(rot.width, rot.height) };
44
+ }
45
+ function resourceBlocks(doc) {
46
+ const out = [];
47
+ for (const page of doc.pages) {
48
+ for (const b of [...page.columns.flatMap((c) => c.blocks), ...(page.floats ?? [])]) {
49
+ if (b.resourceBlock)
50
+ out.push({ page, blk: b });
51
+ }
52
+ }
53
+ return out;
54
+ }
55
+ describe('upright resources in a vertical flow', () => {
56
+ it('a floated figure stands upright: its frame maps onto the sheet without a turn', () => {
57
+ const doc = buildDocument({ markdown: `${text(2)}見圖:ref{id="f1"}。\n\n${text(4)}`, resources: [figure('f1', 800, 600)] }, config());
58
+ const found = resourceBlocks(doc);
59
+ expect(found).toHaveLength(1);
60
+ const { page, blk } = found[0];
61
+ expect(blk.resourceBlock.rotation.direction).toBe('ccw');
62
+ const f = sheetFrame(page, blk);
63
+ // Upright x runs right on the sheet, upright y down.
64
+ expect(f.xStep.x - f.origin.x).toBeCloseTo(10);
65
+ expect(f.xStep.y - f.origin.y).toBeCloseTo(0);
66
+ expect(f.yStep.y - f.origin.y).toBeCloseTo(10);
67
+ expect(f.yStep.x - f.origin.x).toBeCloseTo(0);
68
+ // It lies inside the physical content area, no taller than the tier.
69
+ const area = flowRectToPage(page, page.contentArea);
70
+ expect(f.origin.x).toBeGreaterThanOrEqual(area.x - 0.5);
71
+ expect(f.far.x).toBeLessThanOrEqual(area.x + area.width + 0.5);
72
+ expect(f.origin.y).toBeGreaterThanOrEqual(area.y - 0.5);
73
+ expect(f.far.y).toBeLessThanOrEqual(area.y + area.height + 0.5);
74
+ // The block takes, in the flow, the frame's width: its height there.
75
+ expect(blk.bbox.height).toBeCloseTo(blk.resourceBlock.rotation.width);
76
+ });
77
+ it('fits the picture and its caption into the height of a tier, the caption set horizontally under it', () => {
78
+ const doc = buildDocument({ markdown: `${text(2)}見圖:ref{id="f1"}。\n\n${text(6)}`, resources: [figure('f1', 600, 900)] }, config({ layoutType: 'double', gutterWidth: pt(20) }));
79
+ const { page, blk } = resourceBlocks(doc)[0];
80
+ const rb = blk.resourceBlock;
81
+ const tier = page.columns[0].bbox.width; // a tier's height on the sheet
82
+ expect(rb.rotation.height).toBeLessThanOrEqual(tier + 0.5);
83
+ expect(rb.captionLines.length).toBeGreaterThan(0);
84
+ const cap = rb.captionLines[0];
85
+ // Under the picture in the upright frame, within its width.
86
+ expect(cap.bbox.y).toBeGreaterThanOrEqual(rb.bodyRect.y + rb.bodyRect.height - 0.5);
87
+ expect(cap.bbox.x + cap.bbox.width).toBeLessThanOrEqual(rb.rotation.width + 0.5);
88
+ // The frame is as wide as the picture, not the whole page.
89
+ expect(rb.rotation.width).toBeCloseTo(rb.bodyRect.width, 0);
90
+ });
91
+ describe('a caption that wraps as the frame narrows (#188)', () => {
92
+ const LONG = '寶玉與黛玉初見,一段頗長的圖說文字,看看它如何換行。';
93
+ const build = (w, h, caption, placement) => {
94
+ const doc = buildDocument({ markdown: `${text(2)}見圖:ref{id="f1"}。\n\n${text(8)}`, resources: [{ ...figure('f1', w, h, placement), caption }] }, { ...config({ layoutType: 'double', gutterWidth: pt(20) }), page: { width: pt(300), height: pt(420), dpi: 72, margins: { top: pt(40), right: pt(30), bottom: pt(40), left: pt(30) } } });
95
+ const { page, blk } = resourceBlocks(doc)[0];
96
+ const tiers = page.columns.map((c) => flowRectToPage(page, c.bbox));
97
+ const f = sheetFrame(page, blk);
98
+ const tier = tiers.find((t) => f.origin.y >= t.y - 0.5 && f.origin.y <= t.y + t.height + 0.5);
99
+ return { page, rb: blk.resourceBlock, f, tier, tierLength: page.columns[0].bbox.width };
100
+ };
101
+ it('keeps the picture when half a tier leaves room for one caption line', () => {
102
+ // At the frame's widest the caption takes one line and the picture
103
+ // 37.67 px; set at the picture's width the caption wraps to three
104
+ // lines, and the picture would shrink round after round to nothing.
105
+ const { rb, f, tier } = build(600, 900, '寶玉黛玉初見', { position: 'top', width: 0.5 });
106
+ expect(rb.rotation.height).toBeLessThanOrEqual(80 + 0.5);
107
+ expect(rb.bodyRect.width).toBeGreaterThan(37);
108
+ expect(rb.captionLines).toHaveLength(1);
109
+ // The frame narrows to the caption's line, not the whole flow.
110
+ const capRight = Math.max(...rb.captionLines.map((l) => l.bbox.x + l.bbox.width));
111
+ expect(rb.rotation.width).toBeLessThanOrEqual(capRight + 12);
112
+ expect(rb.rotation.width).toBeGreaterThanOrEqual(capRight - 0.5);
113
+ expect(f.far.y).toBeLessThanOrEqual(tier.y + tier.height + 0.5);
114
+ });
115
+ it('never runs a tall picture with a long caption past its tier', () => {
116
+ // The widest frame gives the picture 22.59 px beside a two-line
117
+ // caption; at that width the caption would take fifteen lines.
118
+ const { rb, f, tier, tierLength } = build(300, 1600, LONG, { position: 'top' });
119
+ expect(rb.rotation.height).toBeLessThanOrEqual(tierLength + 0.5);
120
+ // Three quarters of the picture at least, in a frame well short of
121
+ // the flow's 224 px.
122
+ expect(rb.bodyRect.width).toBeGreaterThanOrEqual(0.75 * 22.59 - 0.01);
123
+ expect(rb.rotation.width).toBeLessThan(120);
124
+ expect(rb.captionLines.length).toBeLessThanOrEqual(3);
125
+ // Inside its own tier on the sheet: it neither crosses the gutter nor
126
+ // leaves the page.
127
+ expect(f.origin.y).toBeGreaterThanOrEqual(tier.y - 0.5);
128
+ expect(f.far.y).toBeLessThanOrEqual(tier.y + tier.height + 0.5);
129
+ // Every caption line within the frame.
130
+ for (const l of rb.captionLines)
131
+ expect(l.bbox.x + l.bbox.width).toBeLessThanOrEqual(rb.rotation.width + 0.5);
132
+ });
133
+ });
134
+ it('an inline figure (`::resource`) stands upright in its column', () => {
135
+ const doc = buildDocument({ markdown: `${text(1)}\n\n::resource{id="f2"}\n\n${text(3)}`, resources: [figure('f2', 400, 300, { position: 'here' })] }, config());
136
+ const { page, blk } = resourceBlocks(doc)[0];
137
+ const f = sheetFrame(page, blk);
138
+ expect(f.xStep.x - f.origin.x).toBeCloseTo(10);
139
+ expect(f.yStep.y - f.origin.y).toBeCloseTo(10);
140
+ // The block's box in the flow is the frame turned: as tall there as the
141
+ // frame is wide.
142
+ expect(blk.bbox.height).toBeCloseTo(blk.resourceBlock.rotation.width);
143
+ const colTop = page.columns[blk.columnIndex].bbox.x;
144
+ expect(blk.resourceBlock.rotation.originX).toBeCloseTo(colTop);
145
+ });
146
+ it('a table stands upright too', () => {
147
+ const doc = buildDocument({ markdown: `${text(1)}見表:ref{id="t1"}。\n\n${text(3)}`, resources: [table] }, config());
148
+ const { page, blk } = resourceBlocks(doc)[0];
149
+ expect(blk.resourceBlock.kind).toBe('table');
150
+ const f = sheetFrame(page, blk);
151
+ expect(f.xStep.x - f.origin.x).toBeCloseTo(10);
152
+ expect(f.yStep.y - f.origin.y).toBeCloseTo(10);
153
+ });
154
+ it('ignores a quarter turn asked for in a vertical flow and says so', () => {
155
+ const doc = buildDocument({ markdown: `${text(1)}見圖:ref{id="f3"}。\n\n${text(3)}`, resources: [figure('f3', 800, 600, { position: 'top', rotate: 'cw' })] }, config());
156
+ const { blk } = resourceBlocks(doc)[0];
157
+ expect(blk.resourceBlock.rotation.direction).toBe('ccw');
158
+ expect(doc.contentWarnings?.some((w) => w.kind === 'rotateIgnoredVertical' && w.resourceId === 'f3')).toBe(true);
159
+ });
160
+ it('turns a figure as asked in a horizontal appendix of a vertical book, and warns only for the vertical part', () => {
161
+ const doc = buildDocument({
162
+ markdown: `${text(1)}見圖:ref{id="f3"}。\n\n${text(2)}\n\n# Appendix {style="appendix"}\n\nSee the map:ref{id="f4"}.\n\n${text(2)}`,
163
+ resources: [figure('f3', 800, 600, { position: 'top', rotate: 'cw' }), figure('f4', 800, 600, { position: 'top', rotate: 'cw' })],
164
+ }, { ...config(), headingStyles: [{ id: 'appendix', breakBefore: { enabled: true, parity: 'any' }, layout: { layoutType: 'single', writingMode: 'horizontal-tb' } }] });
165
+ const blocks = resourceBlocks(doc);
166
+ const f3 = blocks.find((b) => b.blk.resourceBlock.resource.id === 'f3');
167
+ const f4 = blocks.find((b) => b.blk.resourceBlock.resource.id === 'f4');
168
+ expect(f3.page.flow).toBeDefined();
169
+ expect(f3.blk.resourceBlock.rotation.direction).toBe('ccw');
170
+ expect(f4.page.flow).toBeUndefined();
171
+ expect(f4.blk.resourceBlock.rotation.direction).toBe('cw');
172
+ const warned = (doc.contentWarnings ?? []).filter((w) => w.kind === 'rotateIgnoredVertical').map((w) => w.resourceId);
173
+ expect(warned).toEqual(['f3']);
174
+ });
175
+ it('keeps a turn in a horizontal flow, with no warning', () => {
176
+ const doc = buildDocument({ markdown: `${text(1)}見圖:ref{id="f3"}。\n\n${text(3)}`, resources: [figure('f3', 800, 600, { position: 'top', rotate: 'cw' })] }, { ...config(), layout: {} });
177
+ const { blk } = resourceBlocks(doc)[0];
178
+ expect(blk.resourceBlock.rotation.direction).toBe('cw');
179
+ expect(doc.contentWarnings?.some((w) => w.kind === 'rotateIgnoredVertical') ?? false).toBe(false);
180
+ });
181
+ });
182
+ //# sourceMappingURL=uprightResources.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uprightResources.test.js","sourceRoot":"","sources":["../../../src/__tests__/vertical/uprightResources.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=verticalDesignText.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verticalDesignText.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/vertical/verticalDesignText.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,190 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { buildDocument, renderPageToCanvas, renderToHtml } from '../../index';
3
+ import { installSizedStub, stubCharWidth } from './stub';
4
+ installSizedStub();
5
+ // Issue #192: design text elements set vertically (`writingMode:
6
+ // 'vertical-rl'`) in slots laid out on the sheet, and the fore-edge
7
+ // (`anchor.to: 'outer'`).
8
+ const pt = (value) => ({ value, unit: 'pt' });
9
+ const HLM = '此開卷第一回也。作者自云:因曾歷過一番夢幻之後,故將真事隱去,而借「通靈」之說,撰此《石頭記》一書也。';
10
+ /** The fore-edge template: the chapter four characters below the head of
11
+ * the type area, the folio five above its foot. */
12
+ const foreEdge = () => [
13
+ { kind: 'text', id: 'head', content: '{chapterTitle}', writingMode: 'vertical-rl', fontSize: pt(8), overflow: 'clip', placement: { anchor: { to: 'outer', edge: 'top' }, offset: { y: { value: 4, unit: 'em' } } } },
14
+ { kind: 'text', id: 'folio', content: '{pageNumber}', writingMode: 'vertical-rl', fontSize: pt(8), overflow: 'clip', placement: { anchor: { to: 'outer', edge: 'bottom' }, offset: { y: { value: -5, unit: 'em' } } } },
15
+ ];
16
+ const config = (extra = {}) => ({
17
+ locale: 'zh-Hant',
18
+ page: { width: pt(300), height: pt(420), dpi: 72, margins: { top: pt(40), bottom: pt(40), left: pt(30), right: pt(50), mirror: true } },
19
+ bodyText: { fontFamily: 'Test Serif', fontSize: pt(10), lineHeight: pt(16) },
20
+ layout: { writingMode: 'vertical-rl', layoutType: 'single' },
21
+ headings: { levels: [{ level: 1, breakBefore: { enabled: false } }] },
22
+ header: { elements: foreEdge() },
23
+ footer: { elements: [] },
24
+ ...extra,
25
+ });
26
+ function headOf(page, index = 0) {
27
+ return page.header.blocks.filter((b) => b.kind === 'text')[index];
28
+ }
29
+ describe('vertical running heads down the fore-edge (#192)', () => {
30
+ const doc = buildDocument({ markdown: `# 第一回\n\n${Array.from({ length: 16 }, () => HLM).join('\n\n')}` }, config());
31
+ it('sets the head in the outer margin: the left of an odd page, the right of an even one, in a right-bound book', () => {
32
+ expect(doc.binding).toBe('right');
33
+ expect(doc.pages.length).toBeGreaterThanOrEqual(2);
34
+ for (const page of doc.pages.slice(0, 2)) {
35
+ const head = headOf(page);
36
+ expect(head.vertical).toBeDefined();
37
+ const area = { x: page.width - (page.contentArea.y + page.contentArea.height), y: page.contentArea.x, w: page.contentArea.height, h: page.contentArea.width };
38
+ const recto = page.index % 2 === 0;
39
+ if (recto)
40
+ expect(head.bbox.x + head.bbox.width).toBeLessThanOrEqual(area.x + 1e-6);
41
+ else
42
+ expect(head.bbox.x).toBeGreaterThanOrEqual(area.x + area.w - 1e-6);
43
+ // Four characters below the head of the type area.
44
+ expect(head.bbox.y).toBeCloseTo(area.y + 4 * 8, 6);
45
+ // A box as tall as its line: one cell per character.
46
+ expect(head.bbox.height).toBeCloseTo(head.lines[0].text.length * 8, 6);
47
+ }
48
+ });
49
+ it('prints the folio five characters above the foot, in the document’s numerals', () => {
50
+ const numbered = buildDocument({ markdown: HLM }, config({
51
+ page: { width: pt(300), height: pt(420), dpi: 72, margins: { top: pt(40), bottom: pt(40), left: pt(30), right: pt(50), mirror: true }, pageNumbering: { format: 'trad-chinese-informal', startAt: 103 } },
52
+ }));
53
+ const page = numbered.pages[0];
54
+ const folio = headOf(page, 1);
55
+ expect(folio.lines[0].text).toBe('一百零三');
56
+ const foot = page.contentArea.x + page.contentArea.width;
57
+ expect(folio.bbox.y + folio.bbox.height).toBeCloseTo(foot - 5 * 8, 6);
58
+ const decimal = buildDocument({ markdown: HLM }, config({
59
+ page: { width: pt(300), height: pt(420), dpi: 72, margins: { top: pt(40), bottom: pt(40), left: pt(30), right: pt(50), mirror: true }, pageNumbering: { format: 'cjk-decimal', startAt: 103 } },
60
+ }));
61
+ expect(headOf(decimal.pages[0], 1).lines[0].text).toBe('一〇三');
62
+ });
63
+ it('paints the head upright, one cell under the other, down the fore-edge', () => {
64
+ const page = doc.pages[0];
65
+ const head = headOf(page);
66
+ const painted = [];
67
+ let m = [1, 0, 0, 1, 0, 0];
68
+ const stack = [];
69
+ const mul = (a, b) => [a[0] * b[0] + a[2] * b[1], a[1] * b[0] + a[3] * b[1], a[0] * b[2] + a[2] * b[3], a[1] * b[2] + a[3] * b[3], a[0] * b[4] + a[2] * b[5] + a[4], a[1] * b[4] + a[3] * b[5] + a[5]];
70
+ const state = { font: '8px Test', letterSpacing: '0px', textBaseline: 'alphabetic', textAlign: 'start' };
71
+ const api = {
72
+ save: () => stack.push(m),
73
+ restore: () => { m = stack.pop() ?? m; },
74
+ transform: (a, b, c, d, e, f) => { m = mul(m, [a, b, c, d, e, f]); },
75
+ translate: (x, y) => { m = mul(m, [1, 0, 0, 1, x, y]); },
76
+ scale: (x, y) => { m = mul(m, [x, 0, 0, y, 0, 0]); },
77
+ rotate: (t) => { m = mul(m, [Math.cos(t), Math.sin(t), -Math.sin(t), Math.cos(t), 0, 0]); },
78
+ fillText: (text, x, y) => painted.push({ text, x: m[0] * x + m[2] * y + m[4], y: m[1] * x + m[3] * y + m[5], ax: Math.round(m[0]) }),
79
+ measureText: (s) => ({ width: [...s].reduce((w, ch) => w + stubCharWidth(ch, Number(/(\d*\.?\d+)px/.exec(String(state.font))?.[1] ?? 8)), 0) }),
80
+ };
81
+ const ctx = new Proxy(state, {
82
+ get: (t, k) => (typeof k === 'string' && k in api ? api[k] : k in t ? t[k] : () => undefined),
83
+ set: (t, k, v) => { t[k] = v; return true; },
84
+ });
85
+ renderPageToCanvas(page, doc, { width: 0, height: 0, getContext: () => ctx });
86
+ const chars = painted.filter((p) => head.lines[0].text.includes(p.text) && p.x > head.bbox.x - 1 && p.x < head.bbox.x + head.bbox.width + 1);
87
+ expect(chars.length).toBe(head.lines[0].text.length);
88
+ // Upright, each a cell below the one before.
89
+ expect(chars.every((c) => c.ax === 1)).toBe(true);
90
+ for (let i = 1; i < chars.length; i++)
91
+ expect(chars[i].y - chars[i - 1].y).toBeCloseTo(8, 6);
92
+ });
93
+ it('writes the head as a vertical box in the HTML at the same rectangle', () => {
94
+ const html = renderToHtml(doc, { mode: 'single' });
95
+ const head = headOf(doc.pages[0]);
96
+ expect(html).toContain(`left:${head.bbox.x}px;top:${head.bbox.y}px;width:${head.bbox.width}px;height:${head.bbox.height}px;`);
97
+ expect(html).toContain('transform:rotate(90deg)');
98
+ });
99
+ it('sets a vertical title beside a horizontal chapter (an opener slot)', () => {
100
+ const horizontal = buildDocument({ markdown: `# 第一回\n\n${HLM}` }, config({
101
+ layout: { writingMode: 'horizontal-tb', layoutType: 'single' },
102
+ header: { elements: [] },
103
+ headings: { levels: [{ level: 1, span: 'page', advancedDesign: { enabled: true, slot: { elements: [
104
+ { kind: 'text', id: 't', content: '{titleText}', writingMode: 'vertical-rl', fontSize: pt(20), overflow: 'wrap', placement: { anchor: { to: 'container', edge: 'top-right' } } },
105
+ ] } } }] },
106
+ }));
107
+ const band = horizontal.pages[0].openerBand ?? horizontal.pages[0].columns[0].blocks[0].designOverlay;
108
+ const title = band.blocks.find((b) => b.kind === 'text');
109
+ expect(title.vertical).toBeDefined();
110
+ // Three characters down: three cells of 20 pt; one line across.
111
+ expect(title.bbox.height).toBeCloseTo(60, 6);
112
+ expect(title.lines).toHaveLength(1);
113
+ });
114
+ it('leaves horizontal elements as they were', () => {
115
+ const plain = buildDocument({ markdown: HLM }, config({ header: { elements: [{ kind: 'text', id: 'h', content: '紅樓夢', fontSize: pt(8), overflow: 'clip', placement: { anchor: { to: 'container', edge: 'bottom-left' } } }] } }));
116
+ expect(headOf(plain.pages[0]).vertical).toBeUndefined();
117
+ });
118
+ });
119
+ describe('orientation marks in vertical design text (#190, #192 review)', () => {
120
+ const marked = (content, extra = {}) => ({
121
+ kind: 'text', id: 'h', content, inlineMarks: true, writingMode: 'vertical-rl', fontSize: pt(8), overflow: 'clip',
122
+ placement: { anchor: { to: 'outer', edge: 'top' } },
123
+ ...extra,
124
+ });
125
+ const CONTENT = '第:tcy[3.0]回:upright[GDP]**粗**';
126
+ it('lays out :tcy as one cell and :upright as a cell per letter, the runs flagged', () => {
127
+ const doc = buildDocument({ markdown: HLM }, config({ header: { elements: [marked(CONTENT)] } }));
128
+ const head = headOf(doc.pages[0]);
129
+ const runs = head.lines[0].runs;
130
+ expect(runs.map((r) => [r.text, r.tcy, r.orientation])).toEqual([
131
+ ['第', undefined, undefined], ['3.0', true, undefined], ['回', undefined, undefined], ['GDP', undefined, 'upright'], ['粗', undefined, undefined],
132
+ ]);
133
+ expect(runs.find((r) => r.tcy).width).toBeCloseTo(8, 6);
134
+ expect(runs.find((r) => r.orientation).width).toBeCloseTo(24, 6);
135
+ // Seven cells down the fore-edge.
136
+ expect(head.bbox.height).toBeCloseTo(7 * 8, 6);
137
+ });
138
+ it('never breaks a line inside an oriented run', () => {
139
+ const doc = buildDocument({ markdown: HLM }, config({ header: { elements: [marked('第一:upright[GDP]回', { overflow: 'wrap', placement: { anchor: { to: 'outer', edge: 'top' }, size: { height: pt(32) } } })] } }));
140
+ expect(headOf(doc.pages[0]).lines.map((l) => l.text)).toEqual(['第一', 'GDP回']);
141
+ });
142
+ it('paints the cell squeezed upright and the letters upright on the canvas', () => {
143
+ const doc = buildDocument({ markdown: HLM }, config({ header: { elements: [marked(CONTENT)] } }));
144
+ const page = doc.pages[0];
145
+ const painted = [];
146
+ let m = [1, 0, 0, 1, 0, 0];
147
+ const stack = [];
148
+ const mul = (a, b) => [a[0] * b[0] + a[2] * b[1], a[1] * b[0] + a[3] * b[1], a[0] * b[2] + a[2] * b[3], a[1] * b[2] + a[3] * b[3], a[0] * b[4] + a[2] * b[5] + a[4], a[1] * b[4] + a[3] * b[5] + a[5]];
149
+ const state = { font: '8px Test', letterSpacing: '0px', textBaseline: 'alphabetic', textAlign: 'start' };
150
+ const api = {
151
+ save: () => stack.push(m),
152
+ restore: () => { m = stack.pop() ?? m; },
153
+ transform: (a, b, c, d, e, f) => { m = mul(m, [a, b, c, d, e, f]); },
154
+ translate: (x, y) => { m = mul(m, [1, 0, 0, 1, x, y]); },
155
+ scale: (x, y) => { m = mul(m, [x, 0, 0, y, 0, 0]); },
156
+ rotate: (t) => { m = mul(m, [Math.cos(t), Math.sin(t), -Math.sin(t), Math.cos(t), 0, 0]); },
157
+ fillText: (text) => painted.push({ text, a: Math.round(m[0] * 1000) / 1000, b: Math.round(m[1] * 1000) / 1000 }),
158
+ measureText: (s) => ({ width: [...s].reduce((w, ch) => w + stubCharWidth(ch, Number(/(\d*\.?\d+)px/.exec(String(state.font))?.[1] ?? 8)), 0) }),
159
+ };
160
+ const ctx = new Proxy(state, {
161
+ get: (t, k) => (typeof k === 'string' && k in api ? api[k] : k in t ? t[k] : () => undefined),
162
+ set: (t, k, v) => { t[k] = v; return true; },
163
+ });
164
+ renderPageToCanvas(page, doc, { width: 0, height: 0, getContext: () => ctx });
165
+ // 3.0 (a stub width of 1.5 em) squeezed across to one em, upright.
166
+ const cell = painted.find((p) => p.text === '3.0');
167
+ expect(cell.a).toBeCloseTo(8 / 12, 3);
168
+ expect(cell.b).toBeCloseTo(0, 6);
169
+ // G, D and P each upright in a cell of its own.
170
+ for (const letter of ['G', 'D', 'P']) {
171
+ const p = painted.find((q) => q.text === letter);
172
+ expect(p, letter).toBeDefined();
173
+ expect(p.a).toBeCloseTo(1, 6);
174
+ }
175
+ });
176
+ it('writes the cell and the upright letters in the HTML', () => {
177
+ const doc = buildDocument({ markdown: HLM }, config({ header: { elements: [marked(CONTENT)] } }));
178
+ const html = renderToHtml(doc, { mode: 'single' });
179
+ expect(html).toContain('<span style="text-combine-upright:all;">3.0</span>');
180
+ expect(html).toContain('<span style="text-orientation:upright;">GDP</span>');
181
+ });
182
+ it('ignores the marks in horizontal design text', () => {
183
+ const horizontal = (content) => {
184
+ const doc = buildDocument({ markdown: HLM }, config({ header: { elements: [marked(content, { writingMode: undefined })] } }));
185
+ return headOf(doc.pages[0]).lines.map((l) => ({ text: l.text, width: l.width, runs: l.runs?.map((r) => [r.text, r.width, r.tcy, r.orientation]) }));
186
+ };
187
+ expect(horizontal(CONTENT)).toEqual(horizontal('第3.0回GDP**粗**'));
188
+ });
189
+ });
190
+ //# sourceMappingURL=verticalDesignText.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verticalDesignText.test.js","sourceRoot":"","sources":["../../../src/__tests__/vertical/verticalDesignText.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The runs of a vertical line's upright box in the HTML, with the line
3
+ * height the browser uses for each: declarations of one `style` apply in
4
+ * order, and a `font` shorthand resets `line-height` to `normal` unless it
5
+ * carries one (`16px/2 Serif`). A run's em boxes are centred across the
6
+ * column at `right + lineHeight / 2` from the box's flow top, so a run whose
7
+ * line height is `normal` has no axis (NaN).
8
+ */
9
+ export interface VerticalSpan {
10
+ /** Along the line, px. */
11
+ top: number;
12
+ /** The run's axis from the box's flow top (the physical right edge), px. */
13
+ axis: number;
14
+ /** The line height in effect, px (NaN when `normal`). */
15
+ lineHeight: number;
16
+ /** The font size its own `font` sets, px (undefined: inherited). */
17
+ size?: number;
18
+ /** Its text, tags stripped. */
19
+ text: string;
20
+ }
21
+ /** The line height a `style` attribute leaves in effect. */
22
+ export declare function effectiveLineHeight(style: string): string | undefined;
23
+ /** Every absolutely placed run (`top` + `right`) of `html`. */
24
+ export declare function verticalSpans(html: string): VerticalSpan[];
25
+ //# sourceMappingURL=verticalSpans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verticalSpans.d.ts","sourceRoot":"","sources":["../../../src/__tests__/vertical/verticalSpans.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAcrE;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAkB1D"}
@@ -0,0 +1,39 @@
1
+ /** The line height a `style` attribute leaves in effect. */
2
+ export function effectiveLineHeight(style) {
3
+ let lh;
4
+ for (const decl of style.split(';')) {
5
+ const at = decl.indexOf(':');
6
+ if (at < 0)
7
+ continue;
8
+ const prop = decl.slice(0, at).trim();
9
+ const value = decl.slice(at + 1).trim();
10
+ if (prop === 'line-height')
11
+ lh = value;
12
+ else if (prop === 'font') {
13
+ const m = /\d*\.?\d+px\s*\/\s*([^\s]+)/.exec(value);
14
+ lh = m ? m[1] : 'normal';
15
+ }
16
+ }
17
+ return lh;
18
+ }
19
+ /** Every absolutely placed run (`top` + `right`) of `html`. */
20
+ export function verticalSpans(html) {
21
+ const out = [];
22
+ for (const m of html.matchAll(/<span(?: aria-hidden="true")? style="(position:absolute;top:[^"]*right:[^"]*)">(.*?)<\/span>(?=<span|<\/span>|<\/div>|$)/g)) {
23
+ const style = m[1];
24
+ const top = parseFloat(/top:(-?[\d.]+)px/.exec(style)[1]);
25
+ const right = parseFloat(/right:(-?[\d.]+)(?:px)?/.exec(style)[1]);
26
+ const lh = effectiveLineHeight(style);
27
+ const lineHeight = lh !== undefined && /px$/.test(lh) ? parseFloat(lh) : Number.NaN;
28
+ const size = /(?:^|;)font:[^;]*?(\d*\.?\d+)px/.exec(style);
29
+ out.push({
30
+ top,
31
+ axis: right + lineHeight / 2,
32
+ lineHeight,
33
+ ...(size ? { size: parseFloat(size[1]) } : {}),
34
+ text: m[2].replace(/<[^>]*>/g, ''),
35
+ });
36
+ }
37
+ return out;
38
+ }
39
+ //# sourceMappingURL=verticalSpans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verticalSpans.js","sourceRoot":"","sources":["../../../src/__tests__/vertical/verticalSpans.ts"],"names":[],"mappings":"AAqBA,4DAA4D;AAC5D,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,IAAI,EAAsB,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,GAAG,CAAC;YAAE,SAAS;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,IAAI,KAAK,aAAa;YAAE,EAAE,GAAG,KAAK,CAAC;aAClC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpD,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,2HAA2H,CAAC,EAAE,CAAC;QAC3J,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACpB,MAAM,GAAG,GAAG,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC,CAAC,CAAE,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,UAAU,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC,CAAC,CAAE,CAAC,CAAC;QACrE,MAAM,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,EAAE,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACpF,MAAM,IAAI,GAAG,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,GAAG,CAAC,IAAI,CAAC;YACP,GAAG;YACH,IAAI,EAAE,KAAK,GAAG,UAAU,GAAG,CAAC;YAC5B,UAAU;YACV,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=verticalTwins.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verticalTwins.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/vertical/verticalTwins.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,71 @@
1
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
2
+ import { loadVerticalAlternates, unregisterVerticalAlternates, verticalAlternatesOf } from '../../canvas-backend/verticalText';
3
+ // A browser stand-in: `document.fonts` keeps the faces added to it, and a
4
+ // canvas measures the probe brackets with other ink in a twin face (the
5
+ // feature applied).
6
+ const added = new Set();
7
+ let release;
8
+ class FakeFontFace {
9
+ family;
10
+ source;
11
+ descriptors;
12
+ constructor(family, source, descriptors) {
13
+ this.family = family;
14
+ this.source = source;
15
+ this.descriptors = descriptors;
16
+ }
17
+ }
18
+ class FakeCtx {
19
+ font = '';
20
+ measureText() {
21
+ const twin = this.font.includes('postext-vert');
22
+ return { actualBoundingBoxLeft: 0, actualBoundingBoxRight: twin ? 30 : 50, actualBoundingBoxAscent: 80, actualBoundingBoxDescent: 10 };
23
+ }
24
+ }
25
+ describe('vertical alternates: a family loaded again (#188 review)', () => {
26
+ const g = globalThis;
27
+ beforeAll(() => {
28
+ g.FontFace = FakeFontFace;
29
+ g.OffscreenCanvas = class {
30
+ getContext() { return new FakeCtx(); }
31
+ };
32
+ g.document = {
33
+ fonts: {
34
+ add: (f) => added.add(f),
35
+ delete: (f) => added.delete(f),
36
+ // Held until the test lets it go, when `release` is armed.
37
+ load: () => (release ? new Promise((r) => { const prev = release; release = () => { prev(); r(); }; }) : Promise.resolve([])),
38
+ },
39
+ };
40
+ });
41
+ afterAll(() => {
42
+ unregisterVerticalAlternates();
43
+ delete g.FontFace;
44
+ delete g.OffscreenCanvas;
45
+ delete g.document;
46
+ });
47
+ it('drops the faces of a twin it forgets, and loads the new file under a fresh name', async () => {
48
+ expect(await loadVerticalAlternates('Book Serif', [{ source: new ArrayBuffer(8) }])).toBe(true);
49
+ expect(verticalAlternatesOf('Book Serif')).toBe('Book Serif postext-vert');
50
+ expect(added.size).toBe(1);
51
+ unregisterVerticalAlternates('Book Serif');
52
+ expect(verticalAlternatesOf('Book Serif')).toBeUndefined();
53
+ expect(added.size).toBe(0);
54
+ expect(await loadVerticalAlternates('Book Serif', [{ source: new ArrayBuffer(16) }])).toBe(true);
55
+ expect(verticalAlternatesOf('Book Serif')).toMatch(/^Book Serif postext-vert \d+$/);
56
+ expect(added.size).toBe(1);
57
+ unregisterVerticalAlternates('Book Serif');
58
+ });
59
+ it('keeps no twin from a load that was dropped while it waited for its faces', async () => {
60
+ release = () => { };
61
+ const stale = loadVerticalAlternates('Old Serif', [{ source: new ArrayBuffer(8) }]);
62
+ unregisterVerticalAlternates('Old Serif');
63
+ const go = release;
64
+ release = undefined;
65
+ go();
66
+ expect(await stale).toBe(false);
67
+ expect(verticalAlternatesOf('Old Serif')).toBeUndefined();
68
+ expect([...added].some((f) => f.family.startsWith('Old Serif'))).toBe(false);
69
+ });
70
+ });
71
+ //# sourceMappingURL=verticalTwins.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verticalTwins.test.js","sourceRoot":"","sources":["../../../src/__tests__/vertical/verticalTwins.test.ts"],"names":[],"mappings":"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"}