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.
- package/dist/__bench__/cjkChapter.bench.test.d.ts +2 -0
- package/dist/__bench__/cjkChapter.bench.test.d.ts.map +1 -0
- package/dist/__bench__/cjkChapter.bench.test.js +71 -0
- package/dist/__bench__/cjkChapter.bench.test.js.map +1 -0
- package/dist/__tests__/bundle.test.js +16 -0
- package/dist/__tests__/bundle.test.js.map +1 -1
- package/dist/__tests__/canvasDirection.test.d.ts +2 -0
- package/dist/__tests__/canvasDirection.test.d.ts.map +1 -0
- package/dist/__tests__/canvasDirection.test.js +45 -0
- package/dist/__tests__/canvasDirection.test.js.map +1 -0
- package/dist/__tests__/chineseLocale.test.d.ts +2 -0
- package/dist/__tests__/chineseLocale.test.d.ts.map +1 -0
- package/dist/__tests__/chineseLocale.test.js +253 -0
- package/dist/__tests__/chineseLocale.test.js.map +1 -0
- package/dist/__tests__/chineseNumbering.test.d.ts +2 -0
- package/dist/__tests__/chineseNumbering.test.d.ts.map +1 -0
- package/dist/__tests__/chineseNumbering.test.js +376 -0
- package/dist/__tests__/chineseNumbering.test.js.map +1 -0
- package/dist/__tests__/cjk/annotations.test.d.ts +2 -0
- package/dist/__tests__/cjk/annotations.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/annotations.test.js +483 -0
- package/dist/__tests__/cjk/annotations.test.js.map +1 -0
- package/dist/__tests__/cjk/annotationsRender.test.d.ts +2 -0
- package/dist/__tests__/cjk/annotationsRender.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/annotationsRender.test.js +263 -0
- package/dist/__tests__/cjk/annotationsRender.test.js.map +1 -0
- package/dist/__tests__/cjk/composer.test.d.ts +2 -0
- package/dist/__tests__/cjk/composer.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/composer.test.js +237 -0
- package/dist/__tests__/cjk/composer.test.js.map +1 -0
- package/dist/__tests__/cjk/composerEdges.test.d.ts +2 -0
- package/dist/__tests__/cjk/composerEdges.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/composerEdges.test.js +352 -0
- package/dist/__tests__/cjk/composerEdges.test.js.map +1 -0
- package/dist/__tests__/cjk/dashRule.test.d.ts +2 -0
- package/dist/__tests__/cjk/dashRule.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/dashRule.test.js +261 -0
- package/dist/__tests__/cjk/dashRule.test.js.map +1 -0
- package/dist/__tests__/cjk/fuzz.test.d.ts +2 -0
- package/dist/__tests__/cjk/fuzz.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/fuzz.test.js +102 -0
- package/dist/__tests__/cjk/fuzz.test.js.map +1 -0
- package/dist/__tests__/cjk/grid.test.d.ts +2 -0
- package/dist/__tests__/cjk/grid.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/grid.test.js +261 -0
- package/dist/__tests__/cjk/grid.test.js.map +1 -0
- package/dist/__tests__/cjk/justifyRender.test.d.ts +2 -0
- package/dist/__tests__/cjk/justifyRender.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/justifyRender.test.js +139 -0
- package/dist/__tests__/cjk/justifyRender.test.js.map +1 -0
- package/dist/__tests__/cjk/latinFastPath.test.d.ts +2 -0
- package/dist/__tests__/cjk/latinFastPath.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/latinFastPath.test.js +208 -0
- package/dist/__tests__/cjk/latinFastPath.test.js.map +1 -0
- package/dist/__tests__/cjk/markCutsLatin.test.d.ts +2 -0
- package/dist/__tests__/cjk/markCutsLatin.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/markCutsLatin.test.js +69 -0
- package/dist/__tests__/cjk/markCutsLatin.test.js.map +1 -0
- package/dist/__tests__/cjk/markRuns.test.d.ts +2 -0
- package/dist/__tests__/cjk/markRuns.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/markRuns.test.js +347 -0
- package/dist/__tests__/cjk/markRuns.test.js.map +1 -0
- package/dist/__tests__/cjk/punctuation.test.d.ts +2 -0
- package/dist/__tests__/cjk/punctuation.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/punctuation.test.js +440 -0
- package/dist/__tests__/cjk/punctuation.test.js.map +1 -0
- package/dist/__tests__/cjk/punctuationRender.test.d.ts +2 -0
- package/dist/__tests__/cjk/punctuationRender.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/punctuationRender.test.js +135 -0
- package/dist/__tests__/cjk/punctuationRender.test.js.map +1 -0
- package/dist/__tests__/cjk/rubyDescenders.test.d.ts +2 -0
- package/dist/__tests__/cjk/rubyDescenders.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/rubyDescenders.test.js +77 -0
- package/dist/__tests__/cjk/rubyDescenders.test.js.map +1 -0
- package/dist/__tests__/cjk/runt.test.d.ts +2 -0
- package/dist/__tests__/cjk/runt.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/runt.test.js +103 -0
- package/dist/__tests__/cjk/runt.test.js.map +1 -0
- package/dist/__tests__/cjk/sharedMarks.test.d.ts +2 -0
- package/dist/__tests__/cjk/sharedMarks.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/sharedMarks.test.js +347 -0
- package/dist/__tests__/cjk/sharedMarks.test.js.map +1 -0
- package/dist/__tests__/cjk/uprightDots.test.d.ts +2 -0
- package/dist/__tests__/cjk/uprightDots.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/uprightDots.test.js +47 -0
- package/dist/__tests__/cjk/uprightDots.test.js.map +1 -0
- package/dist/__tests__/cjk/wordJoiner.test.d.ts +2 -0
- package/dist/__tests__/cjk/wordJoiner.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/wordJoiner.test.js +47 -0
- package/dist/__tests__/cjk/wordJoiner.test.js.map +1 -0
- package/dist/__tests__/cjk/zhuyinTones.test.d.ts +2 -0
- package/dist/__tests__/cjk/zhuyinTones.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/zhuyinTones.test.js +72 -0
- package/dist/__tests__/cjk/zhuyinTones.test.js.map +1 -0
- package/dist/__tests__/contentLocale.test.d.ts +2 -0
- package/dist/__tests__/contentLocale.test.d.ts.map +1 -0
- package/dist/__tests__/contentLocale.test.js +167 -0
- package/dist/__tests__/contentLocale.test.js.map +1 -0
- package/dist/__tests__/defaults/cjk.test.d.ts +2 -0
- package/dist/__tests__/defaults/cjk.test.d.ts.map +1 -0
- package/dist/__tests__/defaults/cjk.test.js +70 -0
- package/dist/__tests__/defaults/cjk.test.js.map +1 -0
- package/dist/__tests__/design/designTextRender.test.js +31 -0
- package/dist/__tests__/design/designTextRender.test.js.map +1 -1
- package/dist/__tests__/design/imageAltText.test.d.ts +2 -0
- package/dist/__tests__/design/imageAltText.test.d.ts.map +1 -0
- package/dist/__tests__/design/imageAltText.test.js +126 -0
- package/dist/__tests__/design/imageAltText.test.js.map +1 -0
- package/dist/__tests__/exports.test.js +61 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/headingLetterSpacing.test.js +1 -1
- package/dist/__tests__/headingLetterSpacing.test.js.map +1 -1
- package/dist/__tests__/indexChinese.test.d.ts +2 -0
- package/dist/__tests__/indexChinese.test.d.ts.map +1 -0
- package/dist/__tests__/indexChinese.test.js +190 -0
- package/dist/__tests__/indexChinese.test.js.map +1 -0
- package/dist/__tests__/parse/annotations.test.d.ts +2 -0
- package/dist/__tests__/parse/annotations.test.d.ts.map +1 -0
- package/dist/__tests__/parse/annotations.test.js +175 -0
- package/dist/__tests__/parse/annotations.test.js.map +1 -0
- package/dist/__tests__/parse/attrQuoting.test.js +10 -8
- package/dist/__tests__/parse/attrQuoting.test.js.map +1 -1
- package/dist/__tests__/parse/chineseText.test.d.ts +2 -0
- package/dist/__tests__/parse/chineseText.test.d.ts.map +1 -0
- package/dist/__tests__/parse/chineseText.test.js +352 -0
- package/dist/__tests__/parse/chineseText.test.js.map +1 -0
- package/dist/__tests__/parts.test.js +25 -0
- package/dist/__tests__/parts.test.js.map +1 -1
- package/dist/__tests__/pipeline/colonListRoom.test.js +20 -0
- package/dist/__tests__/pipeline/colonListRoom.test.js.map +1 -1
- package/dist/__tests__/presets/hongloumeng.test.d.ts +2 -0
- package/dist/__tests__/presets/hongloumeng.test.d.ts.map +1 -0
- package/dist/__tests__/presets/hongloumeng.test.js +485 -0
- package/dist/__tests__/presets/hongloumeng.test.js.map +1 -0
- package/dist/__tests__/vertical/canvasPaint.test.d.ts +2 -0
- package/dist/__tests__/vertical/canvasPaint.test.d.ts.map +1 -0
- package/dist/__tests__/vertical/canvasPaint.test.js +229 -0
- package/dist/__tests__/vertical/canvasPaint.test.js.map +1 -0
- package/dist/__tests__/vertical/compositionPaint.test.d.ts +2 -0
- package/dist/__tests__/vertical/compositionPaint.test.d.ts.map +1 -0
- package/dist/__tests__/vertical/compositionPaint.test.js +538 -0
- package/dist/__tests__/vertical/compositionPaint.test.js.map +1 -0
- package/dist/__tests__/vertical/geometry.test.d.ts +2 -0
- package/dist/__tests__/vertical/geometry.test.d.ts.map +1 -0
- package/dist/__tests__/vertical/geometry.test.js +276 -0
- package/dist/__tests__/vertical/geometry.test.js.map +1 -0
- package/dist/__tests__/vertical/htmlSmoke.test.d.ts +2 -0
- package/dist/__tests__/vertical/htmlSmoke.test.d.ts.map +1 -0
- package/dist/__tests__/vertical/htmlSmoke.test.js +25 -0
- package/dist/__tests__/vertical/htmlSmoke.test.js.map +1 -0
- package/dist/__tests__/vertical/htmlTurnedCells.test.d.ts +2 -0
- package/dist/__tests__/vertical/htmlTurnedCells.test.d.ts.map +1 -0
- package/dist/__tests__/vertical/htmlTurnedCells.test.js +99 -0
- package/dist/__tests__/vertical/htmlTurnedCells.test.js.map +1 -0
- package/dist/__tests__/vertical/htmlVertical.test.d.ts +2 -0
- package/dist/__tests__/vertical/htmlVertical.test.d.ts.map +1 -0
- package/dist/__tests__/vertical/htmlVertical.test.js +145 -0
- package/dist/__tests__/vertical/htmlVertical.test.js.map +1 -0
- package/dist/__tests__/vertical/lineAxis.test.d.ts +2 -0
- package/dist/__tests__/vertical/lineAxis.test.d.ts.map +1 -0
- package/dist/__tests__/vertical/lineAxis.test.js +128 -0
- package/dist/__tests__/vertical/lineAxis.test.js.map +1 -0
- package/dist/__tests__/vertical/measurePaint.test.d.ts +2 -0
- package/dist/__tests__/vertical/measurePaint.test.d.ts.map +1 -0
- package/dist/__tests__/vertical/measurePaint.test.js +259 -0
- package/dist/__tests__/vertical/measurePaint.test.js.map +1 -0
- package/dist/__tests__/vertical/orientation.test.d.ts +2 -0
- package/dist/__tests__/vertical/orientation.test.d.ts.map +1 -0
- package/dist/__tests__/vertical/orientation.test.js +153 -0
- package/dist/__tests__/vertical/orientation.test.js.map +1 -0
- package/dist/__tests__/vertical/stub.d.ts +8 -0
- package/dist/__tests__/vertical/stub.d.ts.map +1 -0
- package/dist/__tests__/vertical/stub.js +37 -0
- package/dist/__tests__/vertical/stub.js.map +1 -0
- package/dist/__tests__/vertical/tateChuYoko.test.d.ts +2 -0
- package/dist/__tests__/vertical/tateChuYoko.test.d.ts.map +1 -0
- package/dist/__tests__/vertical/tateChuYoko.test.js +270 -0
- package/dist/__tests__/vertical/tateChuYoko.test.js.map +1 -0
- package/dist/__tests__/vertical/uprightResources.test.d.ts +2 -0
- package/dist/__tests__/vertical/uprightResources.test.d.ts.map +1 -0
- package/dist/__tests__/vertical/uprightResources.test.js +182 -0
- package/dist/__tests__/vertical/uprightResources.test.js.map +1 -0
- package/dist/__tests__/vertical/verticalDesignText.test.d.ts +2 -0
- package/dist/__tests__/vertical/verticalDesignText.test.d.ts.map +1 -0
- package/dist/__tests__/vertical/verticalDesignText.test.js +190 -0
- package/dist/__tests__/vertical/verticalDesignText.test.js.map +1 -0
- package/dist/__tests__/vertical/verticalSpans.d.ts +25 -0
- package/dist/__tests__/vertical/verticalSpans.d.ts.map +1 -0
- package/dist/__tests__/vertical/verticalSpans.js +39 -0
- package/dist/__tests__/vertical/verticalSpans.js.map +1 -0
- package/dist/__tests__/vertical/verticalTwins.test.d.ts +2 -0
- package/dist/__tests__/vertical/verticalTwins.test.d.ts.map +1 -0
- package/dist/__tests__/vertical/verticalTwins.test.js +71 -0
- package/dist/__tests__/vertical/verticalTwins.test.js.map +1 -0
- package/dist/bundle/adapters.d.ts +14 -5
- package/dist/bundle/adapters.d.ts.map +1 -1
- package/dist/bundle/adapters.js +4 -3
- package/dist/bundle/adapters.js.map +1 -1
- package/dist/bundle/codec.d.ts.map +1 -1
- package/dist/bundle/codec.js +27 -4
- package/dist/bundle/codec.js.map +1 -1
- package/dist/bundle/index.d.ts +1 -1
- package/dist/bundle/index.d.ts.map +1 -1
- package/dist/bundle/manifest.d.ts +6 -4
- package/dist/bundle/manifest.d.ts.map +1 -1
- package/dist/bundle/manifest.js +31 -32
- package/dist/bundle/manifest.js.map +1 -1
- package/dist/bundle/types.d.ts +7 -2
- package/dist/bundle/types.d.ts.map +1 -1
- package/dist/canvas-backend/annotations.d.ts +31 -0
- package/dist/canvas-backend/annotations.d.ts.map +1 -0
- package/dist/canvas-backend/annotations.js +120 -0
- package/dist/canvas-backend/annotations.js.map +1 -0
- package/dist/canvas-backend/blockRender.d.ts.map +1 -1
- package/dist/canvas-backend/blockRender.js +195 -15
- package/dist/canvas-backend/blockRender.js.map +1 -1
- package/dist/canvas-backend/decorations.d.ts +5 -0
- package/dist/canvas-backend/decorations.d.ts.map +1 -1
- package/dist/canvas-backend/decorations.js +27 -0
- package/dist/canvas-backend/decorations.js.map +1 -1
- package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
- package/dist/canvas-backend/headerFooter.js +32 -16
- package/dist/canvas-backend/headerFooter.js.map +1 -1
- package/dist/canvas-backend/index.d.ts +2 -0
- package/dist/canvas-backend/index.d.ts.map +1 -1
- package/dist/canvas-backend/index.js +62 -2
- package/dist/canvas-backend/index.js.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.js +42 -5
- package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
- package/dist/canvas-backend/segmentText.d.ts +23 -0
- package/dist/canvas-backend/segmentText.d.ts.map +1 -0
- package/dist/canvas-backend/segmentText.js +41 -0
- package/dist/canvas-backend/segmentText.js.map +1 -0
- package/dist/canvas-backend/verticalText.d.ts +113 -0
- package/dist/canvas-backend/verticalText.d.ts.map +1 -0
- package/dist/canvas-backend/verticalText.js +437 -0
- package/dist/canvas-backend/verticalText.js.map +1 -0
- package/dist/chineseNumerals.d.ts +39 -0
- package/dist/chineseNumerals.d.ts.map +1 -0
- package/dist/chineseNumerals.js +192 -0
- package/dist/chineseNumerals.js.map +1 -0
- package/dist/cjkMarks.d.ts +61 -0
- package/dist/cjkMarks.d.ts.map +1 -0
- package/dist/cjkMarks.js +441 -0
- package/dist/cjkMarks.js.map +1 -0
- package/dist/columnClip.d.ts +13 -4
- package/dist/columnClip.d.ts.map +1 -1
- package/dist/columnClip.js +33 -5
- package/dist/columnClip.js.map +1 -1
- package/dist/configWarnings.d.ts.map +1 -1
- package/dist/configWarnings.js +18 -3
- package/dist/configWarnings.js.map +1 -1
- package/dist/defaults/bodyText.d.ts +4 -1
- package/dist/defaults/bodyText.d.ts.map +1 -1
- package/dist/defaults/bodyText.js +27 -5
- package/dist/defaults/bodyText.js.map +1 -1
- package/dist/defaults/calloutStyles.js +1 -1
- package/dist/defaults/calloutStyles.js.map +1 -1
- package/dist/defaults/captionStyle.d.ts.map +1 -1
- package/dist/defaults/captionStyle.js +14 -0
- package/dist/defaults/captionStyle.js.map +1 -1
- package/dist/defaults/cjk.d.ts +33 -0
- package/dist/defaults/cjk.d.ts.map +1 -0
- package/dist/defaults/cjk.js +234 -0
- package/dist/defaults/cjk.js.map +1 -0
- package/dist/defaults/headerFooter.d.ts.map +1 -1
- package/dist/defaults/headerFooter.js +2 -0
- package/dist/defaults/headerFooter.js.map +1 -1
- package/dist/defaults/headingStyles.d.ts.map +1 -1
- package/dist/defaults/headingStyles.js +4 -0
- package/dist/defaults/headingStyles.js.map +1 -1
- package/dist/defaults/headings.d.ts.map +1 -1
- package/dist/defaults/headings.js +13 -6
- package/dist/defaults/headings.js.map +1 -1
- package/dist/defaults/index.d.ts +1 -0
- package/dist/defaults/index.d.ts.map +1 -1
- package/dist/defaults/index.js +10 -1
- package/dist/defaults/index.js.map +1 -1
- package/dist/defaults/indexConfig.d.ts +2 -1
- package/dist/defaults/indexConfig.d.ts.map +1 -1
- package/dist/defaults/indexConfig.js +5 -0
- package/dist/defaults/indexConfig.js.map +1 -1
- package/dist/defaults/layout.d.ts.map +1 -1
- package/dist/defaults/layout.js +7 -0
- package/dist/defaults/layout.js.map +1 -1
- package/dist/defaults/orderedLists.d.ts +5 -2
- package/dist/defaults/orderedLists.d.ts.map +1 -1
- package/dist/defaults/orderedLists.js +20 -5
- package/dist/defaults/orderedLists.js.map +1 -1
- package/dist/defaults/page.d.ts +8 -2
- package/dist/defaults/page.d.ts.map +1 -1
- package/dist/defaults/page.js +24 -7
- package/dist/defaults/page.js.map +1 -1
- package/dist/defaults/resourceTypes.d.ts +3 -3
- package/dist/defaults/resourceTypes.d.ts.map +1 -1
- package/dist/defaults/resourceTypes.js +23 -9
- package/dist/defaults/resourceTypes.js.map +1 -1
- package/dist/defaults/tableStyle.d.ts.map +1 -1
- package/dist/defaults/tableStyle.js +8 -5
- package/dist/defaults/tableStyle.js.map +1 -1
- package/dist/design/layout.d.ts +33 -0
- package/dist/design/layout.d.ts.map +1 -1
- package/dist/design/layout.js +124 -18
- package/dist/design/layout.js.map +1 -1
- package/dist/design/placeholders.d.ts.map +1 -1
- package/dist/design/placeholders.js +5 -1
- package/dist/design/placeholders.js.map +1 -1
- package/dist/design/richText.d.ts +24 -4
- package/dist/design/richText.d.ts.map +1 -1
- package/dist/design/richText.js +77 -16
- package/dist/design/richText.js.map +1 -1
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +635 -25
- package/dist/html-backend.js.map +1 -1
- package/dist/htmlAnnotations.d.ts +29 -0
- package/dist/htmlAnnotations.d.ts.map +1 -0
- package/dist/htmlAnnotations.js +86 -0
- package/dist/htmlAnnotations.js.map +1 -0
- package/dist/hyphenate.js +2 -1
- package/dist/hyphenate.js.map +1 -1
- package/dist/index.d.ts +28 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -8
- package/dist/index.js.map +1 -1
- package/dist/knuthPlass/pretextAdapter.d.ts +4 -1
- package/dist/knuthPlass/pretextAdapter.d.ts.map +1 -1
- package/dist/knuthPlass/pretextAdapter.js +9 -5
- package/dist/knuthPlass/pretextAdapter.js.map +1 -1
- package/dist/knuthPlass/richAdapter.d.ts +15 -2
- package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
- package/dist/knuthPlass/richAdapter.js +16 -6
- package/dist/knuthPlass/richAdapter.js.map +1 -1
- package/dist/knuthPlass/tracking.d.ts +1 -1
- package/dist/knuthPlass/tracking.d.ts.map +1 -1
- package/dist/knuthPlass/tracking.js +4 -3
- package/dist/knuthPlass/tracking.js.map +1 -1
- package/dist/knuthPlass/types.d.ts +3 -0
- package/dist/knuthPlass/types.d.ts.map +1 -1
- package/dist/lineInk.d.ts +13 -0
- package/dist/lineInk.d.ts.map +1 -1
- package/dist/lineInk.js +28 -1
- package/dist/lineInk.js.map +1 -1
- package/dist/locale.d.ts +91 -3
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +245 -1
- package/dist/locale.js.map +1 -1
- package/dist/looseLines.d.ts +11 -1
- package/dist/looseLines.d.ts.map +1 -1
- package/dist/looseLines.js +26 -1
- package/dist/looseLines.js.map +1 -1
- package/dist/measure/cache.d.ts.map +1 -1
- package/dist/measure/cache.js +51 -3
- package/dist/measure/cache.js.map +1 -1
- package/dist/measure/canvas.d.ts +25 -0
- package/dist/measure/canvas.d.ts.map +1 -1
- package/dist/measure/canvas.js +90 -1
- package/dist/measure/canvas.js.map +1 -1
- package/dist/measure/cjk.d.ts +8 -13
- package/dist/measure/cjk.d.ts.map +1 -1
- package/dist/measure/cjk.js +29 -53
- package/dist/measure/cjk.js.map +1 -1
- package/dist/measure/cjkAnnotate.d.ts +96 -0
- package/dist/measure/cjkAnnotate.d.ts.map +1 -0
- package/dist/measure/cjkAnnotate.js +237 -0
- package/dist/measure/cjkAnnotate.js.map +1 -0
- package/dist/measure/cjkClasses.d.ts +133 -0
- package/dist/measure/cjkClasses.d.ts.map +1 -0
- package/dist/measure/cjkClasses.js +273 -0
- package/dist/measure/cjkClasses.js.map +1 -0
- package/dist/measure/cjkCompose.d.ts +86 -0
- package/dist/measure/cjkCompose.d.ts.map +1 -0
- package/dist/measure/cjkCompose.js +2022 -0
- package/dist/measure/cjkCompose.js.map +1 -0
- package/dist/measure/cjkPunctuation.d.ts +248 -0
- package/dist/measure/cjkPunctuation.d.ts.map +1 -0
- package/dist/measure/cjkPunctuation.js +492 -0
- package/dist/measure/cjkPunctuation.js.map +1 -0
- package/dist/measure/graphemes.d.ts +13 -0
- package/dist/measure/graphemes.d.ts.map +1 -0
- package/dist/measure/graphemes.js +38 -0
- package/dist/measure/graphemes.js.map +1 -0
- package/dist/measure/index.d.ts +3 -0
- package/dist/measure/index.d.ts.map +1 -1
- package/dist/measure/index.js +2 -0
- package/dist/measure/index.js.map +1 -1
- package/dist/measure/links.d.ts +6 -2
- package/dist/measure/links.d.ts.map +1 -1
- package/dist/measure/links.js +15 -5
- package/dist/measure/links.js.map +1 -1
- package/dist/measure/markCuts.d.ts +37 -0
- package/dist/measure/markCuts.d.ts.map +1 -0
- package/dist/measure/markCuts.js +77 -0
- package/dist/measure/markCuts.js.map +1 -0
- package/dist/measure/plain.d.ts.map +1 -1
- package/dist/measure/plain.js +33 -11
- package/dist/measure/plain.js.map +1 -1
- package/dist/measure/rich.d.ts +88 -1
- package/dist/measure/rich.d.ts.map +1 -1
- package/dist/measure/rich.js +233 -111
- package/dist/measure/rich.js.map +1 -1
- package/dist/measure/rubyLift.d.ts +11 -0
- package/dist/measure/rubyLift.d.ts.map +1 -0
- package/dist/measure/rubyLift.js +57 -0
- package/dist/measure/rubyLift.js.map +1 -0
- package/dist/measure/spaces.d.ts +12 -2
- package/dist/measure/spaces.d.ts.map +1 -1
- package/dist/measure/spaces.js +21 -7
- package/dist/measure/spaces.js.map +1 -1
- package/dist/measure/types.d.ts +20 -1
- package/dist/measure/types.d.ts.map +1 -1
- package/dist/measure/types.js.map +1 -1
- package/dist/measure/vertical.d.ts +104 -0
- package/dist/measure/vertical.d.ts.map +1 -0
- package/dist/measure/vertical.js +184 -0
- package/dist/measure/vertical.js.map +1 -0
- package/dist/numberWords.d.ts +3 -10
- package/dist/numberWords.d.ts.map +1 -1
- package/dist/numberWords.js +21 -9
- package/dist/numberWords.js.map +1 -1
- package/dist/numbering.d.ts +23 -5
- package/dist/numbering.d.ts.map +1 -1
- package/dist/numbering.js +99 -14
- package/dist/numbering.js.map +1 -1
- package/dist/parse/annotations.d.ts +101 -0
- package/dist/parse/annotations.d.ts.map +1 -0
- package/dist/parse/annotations.js +556 -0
- package/dist/parse/annotations.js.map +1 -0
- package/dist/parse/attrs.d.ts +48 -1
- package/dist/parse/attrs.d.ts.map +1 -1
- package/dist/parse/attrs.js +121 -8
- package/dist/parse/attrs.js.map +1 -1
- package/dist/parse/blockParser.d.ts.map +1 -1
- package/dist/parse/blockParser.js +50 -24
- package/dist/parse/blockParser.js.map +1 -1
- package/dist/parse/index.d.ts +3 -1
- package/dist/parse/index.d.ts.map +1 -1
- package/dist/parse/index.js +1 -0
- package/dist/parse/index.js.map +1 -1
- package/dist/parse/injectSpans.d.ts +3 -1
- package/dist/parse/injectSpans.d.ts.map +1 -1
- package/dist/parse/injectSpans.js +29 -8
- package/dist/parse/injectSpans.js.map +1 -1
- package/dist/parse/inlineFormatting.d.ts +38 -6
- package/dist/parse/inlineFormatting.d.ts.map +1 -1
- package/dist/parse/inlineFormatting.js +139 -26
- package/dist/parse/inlineFormatting.js.map +1 -1
- package/dist/parse/inlineSnippet.d.ts +2 -1
- package/dist/parse/inlineSnippet.d.ts.map +1 -1
- package/dist/parse/inlineSnippet.js +6 -2
- package/dist/parse/inlineSnippet.js.map +1 -1
- package/dist/parse/orientationMarks.d.ts +49 -0
- package/dist/parse/orientationMarks.d.ts.map +1 -0
- package/dist/parse/orientationMarks.js +138 -0
- package/dist/parse/orientationMarks.js.map +1 -0
- package/dist/parse/softBreaks.d.ts +56 -0
- package/dist/parse/softBreaks.d.ts.map +1 -0
- package/dist/parse/softBreaks.js +271 -0
- package/dist/parse/softBreaks.js.map +1 -0
- package/dist/parse/sourceMapping.d.ts.map +1 -1
- package/dist/parse/sourceMapping.js +41 -0
- package/dist/parse/sourceMapping.js.map +1 -1
- package/dist/parse/types.d.ts +84 -0
- package/dist/parse/types.d.ts.map +1 -1
- package/dist/pipeline/annotations.d.ts +56 -0
- package/dist/pipeline/annotations.d.ts.map +1 -0
- package/dist/pipeline/annotations.js +181 -0
- package/dist/pipeline/annotations.js.map +1 -0
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +158 -47
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/buildBlockKind.d.ts +3 -0
- package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
- package/dist/pipeline/buildBlockKind.js +5 -3
- package/dist/pipeline/buildBlockKind.js.map +1 -1
- package/dist/pipeline/buildHelpers.d.ts +36 -6
- package/dist/pipeline/buildHelpers.d.ts.map +1 -1
- package/dist/pipeline/buildHelpers.js +55 -8
- package/dist/pipeline/buildHelpers.js.map +1 -1
- package/dist/pipeline/buildMeasurement.d.ts +4 -0
- package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
- package/dist/pipeline/buildMeasurement.js +3 -1
- package/dist/pipeline/buildMeasurement.js.map +1 -1
- package/dist/pipeline/calloutLayout.d.ts.map +1 -1
- package/dist/pipeline/calloutLayout.js +25 -11
- package/dist/pipeline/calloutLayout.js.map +1 -1
- package/dist/pipeline/cjkGrid.d.ts +133 -0
- package/dist/pipeline/cjkGrid.d.ts.map +1 -0
- package/dist/pipeline/cjkGrid.js +191 -0
- package/dist/pipeline/cjkGrid.js.map +1 -0
- package/dist/pipeline/config.d.ts +13 -9
- package/dist/pipeline/config.d.ts.map +1 -1
- package/dist/pipeline/config.js +43 -18
- package/dist/pipeline/config.js.map +1 -1
- package/dist/pipeline/contentWarnings.d.ts +10 -0
- package/dist/pipeline/contentWarnings.d.ts.map +1 -1
- package/dist/pipeline/contentWarnings.js +174 -2
- package/dist/pipeline/contentWarnings.js.map +1 -1
- package/dist/pipeline/floatPlacement.d.ts +9 -3
- package/dist/pipeline/floatPlacement.d.ts.map +1 -1
- package/dist/pipeline/floatPlacement.js +17 -6
- package/dist/pipeline/floatPlacement.js.map +1 -1
- package/dist/pipeline/headerFooter.d.ts +5 -2
- package/dist/pipeline/headerFooter.d.ts.map +1 -1
- package/dist/pipeline/headerFooter.js +123 -28
- package/dist/pipeline/headerFooter.js.map +1 -1
- package/dist/pipeline/headingDesignCuts.d.ts.map +1 -1
- package/dist/pipeline/headingDesignCuts.js +3 -1
- package/dist/pipeline/headingDesignCuts.js.map +1 -1
- package/dist/pipeline/headingStyles.d.ts +9 -3
- package/dist/pipeline/headingStyles.d.ts.map +1 -1
- package/dist/pipeline/headingStyles.js +23 -5
- package/dist/pipeline/headingStyles.js.map +1 -1
- package/dist/pipeline/indexDirective.d.ts.map +1 -1
- package/dist/pipeline/indexDirective.js +64 -20
- package/dist/pipeline/indexDirective.js.map +1 -1
- package/dist/pipeline/indexGroups.d.ts +55 -0
- package/dist/pipeline/indexGroups.d.ts.map +1 -0
- package/dist/pipeline/indexGroups.js +151 -0
- package/dist/pipeline/indexGroups.js.map +1 -0
- package/dist/pipeline/lists.d.ts +17 -0
- package/dist/pipeline/lists.d.ts.map +1 -1
- package/dist/pipeline/lists.js +43 -51
- package/dist/pipeline/lists.js.map +1 -1
- package/dist/pipeline/measureContentBlock.d.ts +3 -0
- package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
- package/dist/pipeline/measureContentBlock.js +31 -4
- package/dist/pipeline/measureContentBlock.js.map +1 -1
- package/dist/pipeline/outline.d.ts.map +1 -1
- package/dist/pipeline/outline.js +13 -8
- package/dist/pipeline/outline.js.map +1 -1
- package/dist/pipeline/parts.d.ts +6 -3
- package/dist/pipeline/parts.d.ts.map +1 -1
- package/dist/pipeline/parts.js +28 -5
- package/dist/pipeline/parts.js.map +1 -1
- package/dist/pipeline/placeholders.d.ts +11 -0
- package/dist/pipeline/placeholders.d.ts.map +1 -1
- package/dist/pipeline/placeholders.js +48 -18
- package/dist/pipeline/placeholders.js.map +1 -1
- package/dist/pipeline/placement.d.ts +10 -6
- package/dist/pipeline/placement.d.ts.map +1 -1
- package/dist/pipeline/placement.js +33 -16
- package/dist/pipeline/placement.js.map +1 -1
- package/dist/pipeline/resourceLayout.d.ts +18 -1
- package/dist/pipeline/resourceLayout.d.ts.map +1 -1
- package/dist/pipeline/resourceLayout.js +109 -21
- package/dist/pipeline/resourceLayout.js.map +1 -1
- package/dist/pipeline/toc.d.ts.map +1 -1
- package/dist/pipeline/toc.js +6 -5
- package/dist/pipeline/toc.js.map +1 -1
- package/dist/pipeline/verticalMetrics.d.ts +14 -0
- package/dist/pipeline/verticalMetrics.d.ts.map +1 -0
- package/dist/pipeline/verticalMetrics.js +154 -0
- package/dist/pipeline/verticalMetrics.js.map +1 -0
- package/dist/types.d.ts +344 -13
- package/dist/types.d.ts.map +1 -1
- package/dist/vdt.d.ts +396 -6
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js +49 -0
- package/dist/vdt.js.map +1 -1
- package/dist/writingMode.d.ts +156 -0
- package/dist/writingMode.d.ts.map +1 -0
- package/dist/writingMode.js +291 -0
- package/dist/writingMode.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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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"}
|