postext 1.14.0 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/arabic/blockLanguageDigits.test.d.ts +2 -0
- package/dist/__tests__/arabic/blockLanguageDigits.test.d.ts.map +1 -0
- package/dist/__tests__/arabic/blockLanguageDigits.test.js +54 -0
- package/dist/__tests__/arabic/blockLanguageDigits.test.js.map +1 -0
- package/dist/__tests__/arabic/emphasis.test.d.ts +2 -0
- package/dist/__tests__/arabic/emphasis.test.d.ts.map +1 -0
- package/dist/__tests__/arabic/emphasis.test.js +206 -0
- package/dist/__tests__/arabic/emphasis.test.js.map +1 -0
- package/dist/__tests__/arabic/footnotes.test.d.ts +2 -0
- package/dist/__tests__/arabic/footnotes.test.d.ts.map +1 -0
- package/dist/__tests__/arabic/footnotes.test.js +118 -0
- package/dist/__tests__/arabic/footnotes.test.js.map +1 -0
- package/dist/__tests__/arabic/harakat.test.d.ts +2 -0
- package/dist/__tests__/arabic/harakat.test.d.ts.map +1 -0
- package/dist/__tests__/arabic/harakat.test.js +167 -0
- package/dist/__tests__/arabic/harakat.test.js.map +1 -0
- package/dist/__tests__/arabic/ornateBrackets.test.d.ts +2 -0
- package/dist/__tests__/arabic/ornateBrackets.test.d.ts.map +1 -0
- package/dist/__tests__/arabic/ornateBrackets.test.js +71 -0
- package/dist/__tests__/arabic/ornateBrackets.test.js.map +1 -0
- package/dist/__tests__/arabic/tashkil.test.d.ts +2 -0
- package/dist/__tests__/arabic/tashkil.test.d.ts.map +1 -0
- package/dist/__tests__/arabic/tashkil.test.js +106 -0
- package/dist/__tests__/arabic/tashkil.test.js.map +1 -0
- package/dist/__tests__/arabicLocale.test.d.ts +2 -0
- package/dist/__tests__/arabicLocale.test.d.ts.map +1 -0
- package/dist/__tests__/arabicLocale.test.js +232 -0
- package/dist/__tests__/arabicLocale.test.js.map +1 -0
- package/dist/__tests__/arabicNumberWords.test.d.ts +2 -0
- package/dist/__tests__/arabicNumberWords.test.d.ts.map +1 -0
- package/dist/__tests__/arabicNumberWords.test.js +176 -0
- package/dist/__tests__/arabicNumberWords.test.js.map +1 -0
- package/dist/__tests__/arabicNumbering.test.d.ts +2 -0
- package/dist/__tests__/arabicNumbering.test.d.ts.map +1 -0
- package/dist/__tests__/arabicNumbering.test.js +257 -0
- package/dist/__tests__/arabicNumbering.test.js.map +1 -0
- package/dist/__tests__/arabicWords.test.d.ts +2 -0
- package/dist/__tests__/arabicWords.test.d.ts.map +1 -0
- package/dist/__tests__/arabicWords.test.js +302 -0
- package/dist/__tests__/arabicWords.test.js.map +1 -0
- package/dist/__tests__/bidi.test.d.ts +2 -0
- package/dist/__tests__/bidi.test.d.ts.map +1 -0
- package/dist/__tests__/bidi.test.js +282 -0
- package/dist/__tests__/bidi.test.js.map +1 -0
- package/dist/__tests__/blockHints.test.d.ts +2 -0
- package/dist/__tests__/blockHints.test.d.ts.map +1 -0
- package/dist/__tests__/blockHints.test.js +79 -0
- package/dist/__tests__/blockHints.test.js.map +1 -0
- package/dist/__tests__/chineseLocale.test.js +2 -2
- package/dist/__tests__/chineseLocale.test.js.map +1 -1
- package/dist/__tests__/cjk/grid.test.js +2 -2
- package/dist/__tests__/cjk/grid.test.js.map +1 -1
- package/dist/__tests__/cjk/justifyRender.test.js +2 -1
- package/dist/__tests__/cjk/justifyRender.test.js.map +1 -1
- package/dist/__tests__/defaults/folio.test.js +16 -1
- package/dist/__tests__/defaults/folio.test.js.map +1 -1
- package/dist/__tests__/direction.test.d.ts +2 -0
- package/dist/__tests__/direction.test.d.ts.map +1 -0
- package/dist/__tests__/direction.test.js +117 -0
- package/dist/__tests__/direction.test.js.map +1 -0
- package/dist/__tests__/exports.test.js +29 -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__/headingNumberPosition.test.d.ts +2 -0
- package/dist/__tests__/headingNumberPosition.test.d.ts.map +1 -0
- package/dist/__tests__/headingNumberPosition.test.js +87 -0
- package/dist/__tests__/headingNumberPosition.test.js.map +1 -0
- package/dist/__tests__/htmlCopyText.test.d.ts +2 -0
- package/dist/__tests__/htmlCopyText.test.d.ts.map +1 -0
- package/dist/__tests__/htmlCopyText.test.js +153 -0
- package/dist/__tests__/htmlCopyText.test.js.map +1 -0
- package/dist/__tests__/kashida.test.d.ts +2 -0
- package/dist/__tests__/kashida.test.d.ts.map +1 -0
- package/dist/__tests__/kashida.test.js +281 -0
- package/dist/__tests__/kashida.test.js.map +1 -0
- package/dist/__tests__/kashidaPatterns.test.d.ts +2 -0
- package/dist/__tests__/kashidaPatterns.test.d.ts.map +1 -0
- package/dist/__tests__/kashidaPatterns.test.js +143 -0
- package/dist/__tests__/kashidaPatterns.test.js.map +1 -0
- package/dist/__tests__/links.test.js +3 -1
- package/dist/__tests__/links.test.js.map +1 -1
- package/dist/__tests__/parse/containers.test.js +1 -1
- package/dist/__tests__/parse/containers.test.js.map +1 -1
- package/dist/__tests__/rtl/designText.test.d.ts +2 -0
- package/dist/__tests__/rtl/designText.test.d.ts.map +1 -0
- package/dist/__tests__/rtl/designText.test.js +301 -0
- package/dist/__tests__/rtl/designText.test.js.map +1 -0
- package/dist/__tests__/rtl/designTextPaint.test.d.ts +2 -0
- package/dist/__tests__/rtl/designTextPaint.test.d.ts.map +1 -0
- package/dist/__tests__/rtl/designTextPaint.test.js +140 -0
- package/dist/__tests__/rtl/designTextPaint.test.js.map +1 -0
- package/dist/__tests__/rtl/htmlRtl.test.d.ts +2 -0
- package/dist/__tests__/rtl/htmlRtl.test.d.ts.map +1 -0
- package/dist/__tests__/rtl/htmlRtl.test.js +175 -0
- package/dist/__tests__/rtl/htmlRtl.test.js.map +1 -0
- package/dist/__tests__/rtl/mirroredFrame.test.d.ts +2 -0
- package/dist/__tests__/rtl/mirroredFrame.test.d.ts.map +1 -0
- package/dist/__tests__/rtl/mirroredFrame.test.js +313 -0
- package/dist/__tests__/rtl/mirroredFrame.test.js.map +1 -0
- package/dist/__tests__/rtl/mirroredPaint.test.d.ts +2 -0
- package/dist/__tests__/rtl/mirroredPaint.test.d.ts.map +1 -0
- package/dist/__tests__/rtl/mirroredPaint.test.js +116 -0
- package/dist/__tests__/rtl/mirroredPaint.test.js.map +1 -0
- package/dist/__tests__/rtl/oppositeBlocks.test.d.ts +2 -0
- package/dist/__tests__/rtl/oppositeBlocks.test.d.ts.map +1 -0
- package/dist/__tests__/rtl/oppositeBlocks.test.js +273 -0
- package/dist/__tests__/rtl/oppositeBlocks.test.js.map +1 -0
- package/dist/__tests__/rtl/segmentLang.test.d.ts +2 -0
- package/dist/__tests__/rtl/segmentLang.test.d.ts.map +1 -0
- package/dist/__tests__/rtl/segmentLang.test.js +54 -0
- package/dist/__tests__/rtl/segmentLang.test.js.map +1 -0
- package/dist/__tests__/rtlLines.test.d.ts +2 -0
- package/dist/__tests__/rtlLines.test.d.ts.map +1 -0
- package/dist/__tests__/rtlLines.test.js +180 -0
- package/dist/__tests__/rtlLines.test.js.map +1 -0
- package/dist/__tests__/tocNumberColumn.test.d.ts +2 -0
- package/dist/__tests__/tocNumberColumn.test.d.ts.map +1 -0
- package/dist/__tests__/tocNumberColumn.test.js +67 -0
- package/dist/__tests__/tocNumberColumn.test.js.map +1 -0
- package/dist/__tests__/verse.test.d.ts +2 -0
- package/dist/__tests__/verse.test.d.ts.map +1 -0
- package/dist/__tests__/verse.test.js +232 -0
- package/dist/__tests__/verse.test.js.map +1 -0
- package/dist/__tests__/vertical/geometry.test.js +2 -2
- package/dist/__tests__/vertical/geometry.test.js.map +1 -1
- package/dist/__tests__/vertical/htmlTurnedCells.test.js +2 -2
- package/dist/__tests__/vertical/htmlTurnedCells.test.js.map +1 -1
- package/dist/arabicMarks.d.ts +80 -0
- package/dist/arabicMarks.d.ts.map +1 -0
- package/dist/arabicMarks.js +267 -0
- package/dist/arabicMarks.js.map +1 -0
- package/dist/arabicNumberWords.d.ts +43 -0
- package/dist/arabicNumberWords.d.ts.map +1 -0
- package/dist/arabicNumberWords.js +163 -0
- package/dist/arabicNumberWords.js.map +1 -0
- package/dist/arabicNumerals.d.ts +54 -0
- package/dist/arabicNumerals.d.ts.map +1 -0
- package/dist/arabicNumerals.js +143 -0
- package/dist/arabicNumerals.js.map +1 -0
- package/dist/bidi.d.ts +186 -0
- package/dist/bidi.d.ts.map +1 -0
- package/dist/bidi.js +851 -0
- package/dist/bidi.js.map +1 -0
- package/dist/bidiData.d.ts +13 -0
- package/dist/bidiData.d.ts.map +1 -0
- package/dist/bidiData.js +318 -0
- package/dist/bidiData.js.map +1 -0
- package/dist/canvas-backend/blockRender.d.ts.map +1 -1
- package/dist/canvas-backend/blockRender.js +58 -27
- package/dist/canvas-backend/blockRender.js.map +1 -1
- package/dist/canvas-backend/chip.d.ts.map +1 -1
- package/dist/canvas-backend/chip.js +16 -2
- package/dist/canvas-backend/chip.js.map +1 -1
- package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
- package/dist/canvas-backend/headerFooter.js +7 -3
- package/dist/canvas-backend/headerFooter.js.map +1 -1
- package/dist/canvas-backend/index.d.ts.map +1 -1
- package/dist/canvas-backend/index.js +9 -4
- package/dist/canvas-backend/index.js.map +1 -1
- package/dist/canvas-backend/mirrorFrame.d.ts +38 -0
- package/dist/canvas-backend/mirrorFrame.d.ts.map +1 -0
- package/dist/canvas-backend/mirrorFrame.js +129 -0
- package/dist/canvas-backend/mirrorFrame.js.map +1 -0
- package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.js +16 -5
- package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
- package/dist/canvas-backend/runDirection.d.ts +21 -0
- package/dist/canvas-backend/runDirection.d.ts.map +1 -0
- package/dist/canvas-backend/runDirection.js +46 -0
- package/dist/canvas-backend/runDirection.js.map +1 -0
- package/dist/canvas-backend/wordRuns.d.ts +49 -0
- package/dist/canvas-backend/wordRuns.d.ts.map +1 -0
- package/dist/canvas-backend/wordRuns.js +111 -0
- package/dist/canvas-backend/wordRuns.js.map +1 -0
- package/dist/columnClip.d.ts +4 -1
- package/dist/columnClip.d.ts.map +1 -1
- package/dist/columnClip.js +8 -3
- package/dist/columnClip.js.map +1 -1
- package/dist/configWarnings.d.ts +3 -1
- package/dist/configWarnings.d.ts.map +1 -1
- package/dist/configWarnings.js +59 -5
- package/dist/configWarnings.js.map +1 -1
- package/dist/defaults/bodyText.d.ts +28 -6
- package/dist/defaults/bodyText.d.ts.map +1 -1
- package/dist/defaults/bodyText.js +158 -30
- 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.js +5 -5
- package/dist/defaults/captionStyle.js.map +1 -1
- package/dist/defaults/folio.d.ts +4 -0
- package/dist/defaults/folio.d.ts.map +1 -1
- package/dist/defaults/folio.js +12 -1
- package/dist/defaults/folio.js.map +1 -1
- package/dist/defaults/footnotes.d.ts.map +1 -1
- package/dist/defaults/footnotes.js +12 -2
- package/dist/defaults/footnotes.js.map +1 -1
- package/dist/defaults/headerFooter.d.ts.map +1 -1
- package/dist/defaults/headerFooter.js +1 -0
- package/dist/defaults/headerFooter.js.map +1 -1
- package/dist/defaults/headingStyles.d.ts.map +1 -1
- package/dist/defaults/headingStyles.js +2 -1
- package/dist/defaults/headingStyles.js.map +1 -1
- package/dist/defaults/headings.d.ts.map +1 -1
- package/dist/defaults/headings.js +9 -2
- package/dist/defaults/headings.js.map +1 -1
- package/dist/defaults/index.d.ts +1 -1
- package/dist/defaults/index.d.ts.map +1 -1
- package/dist/defaults/index.js +7 -1
- package/dist/defaults/index.js.map +1 -1
- package/dist/defaults/indexConfig.d.ts +6 -2
- package/dist/defaults/indexConfig.d.ts.map +1 -1
- package/dist/defaults/indexConfig.js +25 -5
- package/dist/defaults/indexConfig.js.map +1 -1
- package/dist/defaults/page.d.ts +7 -4
- package/dist/defaults/page.d.ts.map +1 -1
- package/dist/defaults/page.js +10 -7
- package/dist/defaults/page.js.map +1 -1
- package/dist/defaults/paragraphStyles.js +2 -2
- package/dist/defaults/paragraphStyles.js.map +1 -1
- package/dist/defaults/parts.d.ts.map +1 -1
- package/dist/defaults/parts.js +2 -1
- package/dist/defaults/parts.js.map +1 -1
- package/dist/defaults/resourceTypes.d.ts +1 -1
- package/dist/defaults/resourceTypes.d.ts.map +1 -1
- package/dist/defaults/resourceTypes.js +10 -2
- package/dist/defaults/resourceTypes.js.map +1 -1
- package/dist/defaults/shared.d.ts +9 -0
- package/dist/defaults/shared.d.ts.map +1 -1
- package/dist/defaults/shared.js +15 -0
- package/dist/defaults/shared.js.map +1 -1
- package/dist/defaults/tableStyle.d.ts.map +1 -1
- package/dist/defaults/tableStyle.js +5 -1
- package/dist/defaults/tableStyle.js.map +1 -1
- package/dist/design/bidiText.d.ts +89 -0
- package/dist/design/bidiText.d.ts.map +1 -0
- package/dist/design/bidiText.js +165 -0
- package/dist/design/bidiText.js.map +1 -0
- package/dist/design/layout.d.ts +20 -0
- package/dist/design/layout.d.ts.map +1 -1
- package/dist/design/layout.js +46 -5
- package/dist/design/layout.js.map +1 -1
- package/dist/design/placeholders.d.ts +7 -1
- package/dist/design/placeholders.d.ts.map +1 -1
- package/dist/design/placeholders.js +6 -3
- package/dist/design/placeholders.js.map +1 -1
- package/dist/design/richText.d.ts +5 -2
- package/dist/design/richText.d.ts.map +1 -1
- package/dist/design/richText.js +35 -2
- package/dist/design/richText.js.map +1 -1
- package/dist/emphasisOverline.d.ts +27 -0
- package/dist/emphasisOverline.d.ts.map +1 -0
- package/dist/emphasisOverline.js +107 -0
- package/dist/emphasisOverline.js.map +1 -0
- package/dist/frontmatter.d.ts +25 -6
- package/dist/frontmatter.d.ts.map +1 -1
- package/dist/frontmatter.js +51 -10
- package/dist/frontmatter.js.map +1 -1
- package/dist/html-backend.d.ts +4 -1
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +363 -87
- package/dist/html-backend.js.map +1 -1
- package/dist/hyphenate.d.ts.map +1 -1
- package/dist/hyphenate.js +4 -1
- package/dist/hyphenate.js.map +1 -1
- package/dist/index.d.ts +11 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/knuthPlass/breakpoints.d.ts.map +1 -1
- package/dist/knuthPlass/breakpoints.js +3 -0
- package/dist/knuthPlass/breakpoints.js.map +1 -1
- package/dist/knuthPlass/pretextAdapter.d.ts.map +1 -1
- package/dist/knuthPlass/pretextAdapter.js +9 -3
- package/dist/knuthPlass/pretextAdapter.js.map +1 -1
- package/dist/knuthPlass/richAdapter.d.ts +11 -0
- package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
- package/dist/knuthPlass/richAdapter.js +11 -4
- package/dist/knuthPlass/richAdapter.js.map +1 -1
- package/dist/knuthPlass/tracking.d.ts +2 -1
- package/dist/knuthPlass/tracking.d.ts.map +1 -1
- package/dist/knuthPlass/tracking.js +5 -2
- package/dist/knuthPlass/tracking.js.map +1 -1
- package/dist/knuthPlass/types.d.ts +4 -0
- package/dist/knuthPlass/types.d.ts.map +1 -1
- package/dist/locale.d.ts +63 -9
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +129 -12
- package/dist/locale.js.map +1 -1
- package/dist/measure/bidiLines.d.ts +91 -0
- package/dist/measure/bidiLines.d.ts.map +1 -0
- package/dist/measure/bidiLines.js +293 -0
- package/dist/measure/bidiLines.js.map +1 -0
- package/dist/measure/cache.d.ts.map +1 -1
- package/dist/measure/cache.js +10 -4
- package/dist/measure/cache.js.map +1 -1
- package/dist/measure/joining.d.ts +39 -0
- package/dist/measure/joining.d.ts.map +1 -0
- package/dist/measure/joining.js +91 -0
- package/dist/measure/joining.js.map +1 -0
- package/dist/measure/joiningGroups.d.ts +7 -0
- package/dist/measure/joiningGroups.d.ts.map +1 -0
- package/dist/measure/joiningGroups.js +110 -0
- package/dist/measure/joiningGroups.js.map +1 -0
- package/dist/measure/kashida.d.ts +97 -0
- package/dist/measure/kashida.d.ts.map +1 -0
- package/dist/measure/kashida.js +285 -0
- package/dist/measure/kashida.js.map +1 -0
- package/dist/measure/kashidaPatterns.d.ts +109 -0
- package/dist/measure/kashidaPatterns.d.ts.map +1 -0
- package/dist/measure/kashidaPatterns.js +519 -0
- package/dist/measure/kashidaPatterns.js.map +1 -0
- package/dist/measure/links.d.ts.map +1 -1
- package/dist/measure/links.js +5 -2
- package/dist/measure/links.js.map +1 -1
- package/dist/measure/plain.d.ts.map +1 -1
- package/dist/measure/plain.js +31 -0
- package/dist/measure/plain.js.map +1 -1
- package/dist/measure/rich.d.ts +24 -0
- package/dist/measure/rich.d.ts.map +1 -1
- package/dist/measure/rich.js +250 -22
- package/dist/measure/rich.js.map +1 -1
- package/dist/measure/types.d.ts +14 -0
- package/dist/measure/types.d.ts.map +1 -1
- package/dist/measure/types.js.map +1 -1
- package/dist/numberWords.d.ts +17 -4
- package/dist/numberWords.d.ts.map +1 -1
- package/dist/numberWords.js +19 -13
- package/dist/numberWords.js.map +1 -1
- package/dist/numbering.d.ts +49 -11
- package/dist/numbering.d.ts.map +1 -1
- package/dist/numbering.js +117 -21
- package/dist/numbering.js.map +1 -1
- package/dist/parse/annotations.d.ts +6 -3
- package/dist/parse/annotations.d.ts.map +1 -1
- package/dist/parse/annotations.js +31 -7
- package/dist/parse/annotations.js.map +1 -1
- package/dist/parse/attrs.d.ts +3 -3
- package/dist/parse/attrs.d.ts.map +1 -1
- package/dist/parse/attrs.js +5 -4
- package/dist/parse/attrs.js.map +1 -1
- package/dist/parse/blockParser.d.ts.map +1 -1
- package/dist/parse/blockParser.js +158 -14
- package/dist/parse/blockParser.js.map +1 -1
- package/dist/parse/index.d.ts +1 -1
- package/dist/parse/index.d.ts.map +1 -1
- package/dist/parse/index.js.map +1 -1
- package/dist/parse/inlineFormatting.d.ts.map +1 -1
- package/dist/parse/inlineFormatting.js +5 -4
- package/dist/parse/inlineFormatting.js.map +1 -1
- package/dist/parse/types.d.ts +63 -1
- package/dist/parse/types.d.ts.map +1 -1
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +161 -43
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/buildBlockKind.d.ts +2 -0
- package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
- package/dist/pipeline/buildBlockKind.js +67 -2
- package/dist/pipeline/buildBlockKind.js.map +1 -1
- package/dist/pipeline/buildHelpers.d.ts +22 -1
- package/dist/pipeline/buildHelpers.d.ts.map +1 -1
- package/dist/pipeline/buildHelpers.js +55 -5
- package/dist/pipeline/buildHelpers.js.map +1 -1
- package/dist/pipeline/calloutLayout.d.ts +6 -1
- package/dist/pipeline/calloutLayout.d.ts.map +1 -1
- package/dist/pipeline/calloutLayout.js +63 -18
- package/dist/pipeline/calloutLayout.js.map +1 -1
- package/dist/pipeline/citations.d.ts +2 -1
- package/dist/pipeline/citations.d.ts.map +1 -1
- package/dist/pipeline/citations.js +29 -9
- package/dist/pipeline/citations.js.map +1 -1
- package/dist/pipeline/cjkGrid.d.ts +3 -2
- package/dist/pipeline/cjkGrid.d.ts.map +1 -1
- package/dist/pipeline/cjkGrid.js +3 -2
- package/dist/pipeline/cjkGrid.js.map +1 -1
- package/dist/pipeline/config.d.ts +13 -1
- package/dist/pipeline/config.d.ts.map +1 -1
- package/dist/pipeline/config.js +32 -3
- 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 +88 -0
- package/dist/pipeline/contentWarnings.js.map +1 -1
- package/dist/pipeline/continuation.d.ts.map +1 -1
- package/dist/pipeline/continuation.js +1 -1
- package/dist/pipeline/continuation.js.map +1 -1
- package/dist/pipeline/crossRefs.d.ts.map +1 -1
- package/dist/pipeline/crossRefs.js +2 -0
- package/dist/pipeline/crossRefs.js.map +1 -1
- package/dist/pipeline/floatPlacement.d.ts.map +1 -1
- package/dist/pipeline/floatPlacement.js +2 -1
- package/dist/pipeline/floatPlacement.js.map +1 -1
- package/dist/pipeline/footnotes.d.ts +13 -5
- package/dist/pipeline/footnotes.d.ts.map +1 -1
- package/dist/pipeline/footnotes.js +19 -8
- package/dist/pipeline/footnotes.js.map +1 -1
- package/dist/pipeline/headerFooter.d.ts +4 -0
- package/dist/pipeline/headerFooter.d.ts.map +1 -1
- package/dist/pipeline/headerFooter.js +41 -13
- package/dist/pipeline/headerFooter.js.map +1 -1
- package/dist/pipeline/headingDesignCuts.d.ts +1 -1
- package/dist/pipeline/headingDesignCuts.d.ts.map +1 -1
- package/dist/pipeline/headingDesignCuts.js +2 -1
- package/dist/pipeline/headingDesignCuts.js.map +1 -1
- package/dist/pipeline/headingStyles.d.ts +10 -0
- package/dist/pipeline/headingStyles.d.ts.map +1 -1
- package/dist/pipeline/headingStyles.js +46 -0
- package/dist/pipeline/headingStyles.js.map +1 -1
- package/dist/pipeline/indexDirective.d.ts.map +1 -1
- package/dist/pipeline/indexDirective.js +33 -6
- package/dist/pipeline/indexDirective.js.map +1 -1
- package/dist/pipeline/indexGroups.d.ts +23 -1
- package/dist/pipeline/indexGroups.d.ts.map +1 -1
- package/dist/pipeline/indexGroups.js +50 -1
- package/dist/pipeline/indexGroups.js.map +1 -1
- package/dist/pipeline/lists.d.ts +16 -4
- package/dist/pipeline/lists.d.ts.map +1 -1
- package/dist/pipeline/lists.js +51 -12
- package/dist/pipeline/lists.js.map +1 -1
- package/dist/pipeline/measureContentBlock.d.ts +5 -0
- package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
- package/dist/pipeline/measureContentBlock.js +63 -4
- package/dist/pipeline/measureContentBlock.js.map +1 -1
- package/dist/pipeline/mirrorFrame.d.ts +37 -0
- package/dist/pipeline/mirrorFrame.d.ts.map +1 -0
- package/dist/pipeline/mirrorFrame.js +143 -0
- package/dist/pipeline/mirrorFrame.js.map +1 -0
- package/dist/pipeline/outline.d.ts +2 -2
- package/dist/pipeline/outline.d.ts.map +1 -1
- package/dist/pipeline/outline.js +33 -6
- package/dist/pipeline/outline.js.map +1 -1
- package/dist/pipeline/paragraphContainers.d.ts +5 -0
- package/dist/pipeline/paragraphContainers.d.ts.map +1 -1
- package/dist/pipeline/paragraphContainers.js +12 -0
- package/dist/pipeline/paragraphContainers.js.map +1 -1
- package/dist/pipeline/parts.d.ts +1 -1
- package/dist/pipeline/parts.d.ts.map +1 -1
- package/dist/pipeline/parts.js +3 -2
- package/dist/pipeline/parts.js.map +1 -1
- package/dist/pipeline/placeholders.d.ts +13 -6
- package/dist/pipeline/placeholders.d.ts.map +1 -1
- package/dist/pipeline/placeholders.js +15 -11
- package/dist/pipeline/placeholders.js.map +1 -1
- package/dist/pipeline/placement.d.ts +3 -2
- package/dist/pipeline/placement.d.ts.map +1 -1
- package/dist/pipeline/placement.js +18 -6
- package/dist/pipeline/placement.js.map +1 -1
- package/dist/pipeline/resourceLayout.d.ts.map +1 -1
- package/dist/pipeline/resourceLayout.js +70 -7
- package/dist/pipeline/resourceLayout.js.map +1 -1
- package/dist/pipeline/resourceNumbering.d.ts +5 -3
- package/dist/pipeline/resourceNumbering.d.ts.map +1 -1
- package/dist/pipeline/resourceNumbering.js +11 -8
- package/dist/pipeline/resourceNumbering.js.map +1 -1
- package/dist/pipeline/styles.d.ts +6 -1
- package/dist/pipeline/styles.d.ts.map +1 -1
- package/dist/pipeline/styles.js +44 -14
- package/dist/pipeline/styles.js.map +1 -1
- package/dist/pipeline/tashkil.d.ts +27 -0
- package/dist/pipeline/tashkil.d.ts.map +1 -0
- package/dist/pipeline/tashkil.js +161 -0
- package/dist/pipeline/tashkil.js.map +1 -0
- package/dist/pipeline/toc.d.ts +12 -0
- package/dist/pipeline/toc.d.ts.map +1 -1
- package/dist/pipeline/toc.js +64 -4
- package/dist/pipeline/toc.js.map +1 -1
- package/dist/pipeline/verse.d.ts +65 -0
- package/dist/pipeline/verse.d.ts.map +1 -0
- package/dist/pipeline/verse.js +252 -0
- package/dist/pipeline/verse.js.map +1 -0
- package/dist/pipeline/verticalMetrics.d.ts +1 -1
- package/dist/pipeline/verticalMetrics.d.ts.map +1 -1
- package/dist/pipeline/verticalMetrics.js +7 -5
- package/dist/pipeline/verticalMetrics.js.map +1 -1
- package/dist/table/model.d.ts +4 -3
- package/dist/table/model.d.ts.map +1 -1
- package/dist/table/model.js.map +1 -1
- package/dist/types.d.ts +286 -36
- package/dist/types.d.ts.map +1 -1
- package/dist/uprightArabic.d.ts +39 -0
- package/dist/uprightArabic.d.ts.map +1 -0
- package/dist/uprightArabic.js +105 -0
- package/dist/uprightArabic.js.map +1 -0
- package/dist/vdt.d.ts +276 -11
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js +46 -9
- package/dist/vdt.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// Generated by scripts/gen-joining-groups.mjs from the Unicode Character
|
|
2
|
+
// Database (ArabicShaping-18.0.0). Do not edit by hand: re-run the script
|
|
3
|
+
// on a newer UCD instead.
|
|
4
|
+
/** Joining_Group long names, indexed by the values of
|
|
5
|
+
* {@link JOINING_GROUP_RANGES}. */
|
|
6
|
+
export const JOINING_GROUP_NAMES = [
|
|
7
|
+
'Kashmiri_Yeh',
|
|
8
|
+
'Alef',
|
|
9
|
+
'Waw',
|
|
10
|
+
'Yeh',
|
|
11
|
+
'Beh',
|
|
12
|
+
'Teh_Marbuta',
|
|
13
|
+
'Hah',
|
|
14
|
+
'Dal',
|
|
15
|
+
'Reh',
|
|
16
|
+
'Seen',
|
|
17
|
+
'Sad',
|
|
18
|
+
'Tah',
|
|
19
|
+
'Ain',
|
|
20
|
+
'Gaf',
|
|
21
|
+
'Farsi_Yeh',
|
|
22
|
+
'Feh',
|
|
23
|
+
'Qaf',
|
|
24
|
+
'Kaf',
|
|
25
|
+
'Lam',
|
|
26
|
+
'Meem',
|
|
27
|
+
'Noon',
|
|
28
|
+
'Heh',
|
|
29
|
+
'Swash_Kaf',
|
|
30
|
+
'Nya',
|
|
31
|
+
'Knotted_Heh',
|
|
32
|
+
'Heh_Goal',
|
|
33
|
+
'Teh_Marbuta_Goal',
|
|
34
|
+
'Yeh_With_Tail',
|
|
35
|
+
'Yeh_Barree',
|
|
36
|
+
'Alaph',
|
|
37
|
+
'Beth',
|
|
38
|
+
'Gamal',
|
|
39
|
+
'Dalath_Rish',
|
|
40
|
+
'He',
|
|
41
|
+
'Syriac_Waw',
|
|
42
|
+
'Zain',
|
|
43
|
+
'Heth',
|
|
44
|
+
'Teth',
|
|
45
|
+
'Yudh',
|
|
46
|
+
'Yudh_He',
|
|
47
|
+
'Kaph',
|
|
48
|
+
'Lamadh',
|
|
49
|
+
'Mim',
|
|
50
|
+
'Nun',
|
|
51
|
+
'Semkath',
|
|
52
|
+
'Final_Semkath',
|
|
53
|
+
'E',
|
|
54
|
+
'Pe',
|
|
55
|
+
'Reversed_Pe',
|
|
56
|
+
'Sadhe',
|
|
57
|
+
'Qaph',
|
|
58
|
+
'Shin',
|
|
59
|
+
'Taw',
|
|
60
|
+
'Zhain',
|
|
61
|
+
'Khaph',
|
|
62
|
+
'Fe',
|
|
63
|
+
'Burushaski_Yeh_Barree',
|
|
64
|
+
'Malayalam_Nga',
|
|
65
|
+
'Malayalam_Ja',
|
|
66
|
+
'Malayalam_Nya',
|
|
67
|
+
'Malayalam_Tta',
|
|
68
|
+
'Malayalam_Nna',
|
|
69
|
+
'Malayalam_Nnna',
|
|
70
|
+
'Malayalam_Bha',
|
|
71
|
+
'Malayalam_Ra',
|
|
72
|
+
'Malayalam_Lla',
|
|
73
|
+
'Malayalam_Llla',
|
|
74
|
+
'Malayalam_Ssa',
|
|
75
|
+
'Thin_Yeh',
|
|
76
|
+
'Vertical_Tail',
|
|
77
|
+
'Rohingya_Yeh',
|
|
78
|
+
'Straight_Waw',
|
|
79
|
+
'African_Feh',
|
|
80
|
+
'African_Qaf',
|
|
81
|
+
'African_Noon',
|
|
82
|
+
];
|
|
83
|
+
/** Joining_Group of the Arabic blocks (U+0600–08FF): [first, last, group]
|
|
84
|
+
* for every range with a group, merged, in code point order. */
|
|
85
|
+
export const JOINING_GROUP_RANGES = [
|
|
86
|
+
0x620, 0x620, 0, 0x622, 0x623, 1, 0x624, 0x624, 2, 0x625, 0x625, 1, 0x626, 0x626, 3, 0x627, 0x627, 1, 0x628, 0x628, 4, 0x629, 0x629, 5,
|
|
87
|
+
0x62A, 0x62B, 4, 0x62C, 0x62E, 6, 0x62F, 0x630, 7, 0x631, 0x632, 8, 0x633, 0x634, 9, 0x635, 0x636, 10, 0x637, 0x638, 11, 0x639, 0x63A, 12,
|
|
88
|
+
0x63B, 0x63C, 13, 0x63D, 0x63F, 14, 0x641, 0x641, 15, 0x642, 0x642, 16, 0x643, 0x643, 17, 0x644, 0x644, 18, 0x645, 0x645, 19, 0x646, 0x646, 20,
|
|
89
|
+
0x647, 0x647, 21, 0x648, 0x648, 2, 0x649, 0x64A, 3, 0x66E, 0x66E, 4, 0x66F, 0x66F, 16, 0x671, 0x673, 1, 0x675, 0x675, 1, 0x676, 0x677, 2,
|
|
90
|
+
0x678, 0x678, 3, 0x679, 0x680, 4, 0x681, 0x687, 6, 0x688, 0x690, 7, 0x691, 0x699, 8, 0x69A, 0x69C, 9, 0x69D, 0x69E, 10, 0x69F, 0x69F, 11,
|
|
91
|
+
0x6A0, 0x6A0, 12, 0x6A1, 0x6A6, 15, 0x6A7, 0x6A8, 16, 0x6A9, 0x6A9, 13, 0x6AA, 0x6AA, 22, 0x6AB, 0x6AB, 13, 0x6AC, 0x6AE, 17, 0x6AF, 0x6B4, 13,
|
|
92
|
+
0x6B5, 0x6B8, 18, 0x6B9, 0x6BC, 20, 0x6BD, 0x6BD, 23, 0x6BE, 0x6BE, 24, 0x6BF, 0x6BF, 6, 0x6C0, 0x6C0, 5, 0x6C1, 0x6C2, 25, 0x6C3, 0x6C3, 26,
|
|
93
|
+
0x6C4, 0x6CB, 2, 0x6CC, 0x6CC, 14, 0x6CD, 0x6CD, 27, 0x6CE, 0x6CE, 14, 0x6CF, 0x6CF, 2, 0x6D0, 0x6D1, 3, 0x6D2, 0x6D3, 28, 0x6D5, 0x6D5, 5,
|
|
94
|
+
0x6EE, 0x6EE, 7, 0x6EF, 0x6EF, 8, 0x6FA, 0x6FA, 9, 0x6FB, 0x6FB, 10, 0x6FC, 0x6FC, 12, 0x6FF, 0x6FF, 24, 0x710, 0x710, 29, 0x712, 0x712, 30,
|
|
95
|
+
0x713, 0x714, 31, 0x715, 0x716, 32, 0x717, 0x717, 33, 0x718, 0x718, 34, 0x719, 0x719, 35, 0x71A, 0x71A, 36, 0x71B, 0x71C, 37, 0x71D, 0x71D, 38,
|
|
96
|
+
0x71E, 0x71E, 39, 0x71F, 0x71F, 40, 0x720, 0x720, 41, 0x721, 0x721, 42, 0x722, 0x722, 43, 0x723, 0x723, 44, 0x724, 0x724, 45, 0x725, 0x725, 46,
|
|
97
|
+
0x726, 0x726, 47, 0x727, 0x727, 48, 0x728, 0x728, 49, 0x729, 0x729, 50, 0x72A, 0x72A, 32, 0x72B, 0x72B, 51, 0x72C, 0x72C, 52, 0x72D, 0x72D, 30,
|
|
98
|
+
0x72E, 0x72E, 31, 0x72F, 0x72F, 32, 0x74D, 0x74D, 53, 0x74E, 0x74E, 54, 0x74F, 0x74F, 55, 0x750, 0x756, 4, 0x757, 0x758, 6, 0x759, 0x75A, 7,
|
|
99
|
+
0x75B, 0x75B, 8, 0x75C, 0x75C, 9, 0x75D, 0x75F, 12, 0x760, 0x761, 15, 0x762, 0x764, 13, 0x765, 0x766, 19, 0x767, 0x769, 20, 0x76A, 0x76A, 18,
|
|
100
|
+
0x76B, 0x76C, 8, 0x76D, 0x76D, 9, 0x76E, 0x76F, 6, 0x770, 0x770, 9, 0x771, 0x771, 8, 0x772, 0x772, 6, 0x773, 0x774, 1, 0x775, 0x776, 14,
|
|
101
|
+
0x777, 0x777, 3, 0x778, 0x779, 2, 0x77A, 0x77B, 56, 0x77C, 0x77C, 6, 0x77D, 0x77E, 9, 0x77F, 0x77F, 17, 0x860, 0x860, 57, 0x861, 0x861, 58,
|
|
102
|
+
0x862, 0x862, 59, 0x863, 0x863, 60, 0x864, 0x864, 61, 0x865, 0x865, 62, 0x866, 0x866, 63, 0x867, 0x867, 64, 0x868, 0x868, 65, 0x869, 0x869, 66,
|
|
103
|
+
0x86A, 0x86A, 67, 0x870, 0x882, 1, 0x886, 0x886, 68, 0x889, 0x889, 20, 0x88A, 0x88A, 6, 0x88B, 0x88C, 11, 0x88D, 0x88D, 13, 0x88E, 0x88E, 69,
|
|
104
|
+
0x88F, 0x88F, 20, 0x8A0, 0x8A1, 4, 0x8A2, 0x8A2, 6, 0x8A3, 0x8A3, 11, 0x8A4, 0x8A4, 15, 0x8A5, 0x8A5, 16, 0x8A6, 0x8A6, 18, 0x8A7, 0x8A7, 19,
|
|
105
|
+
0x8A8, 0x8A9, 3, 0x8AA, 0x8AA, 8, 0x8AB, 0x8AB, 2, 0x8AC, 0x8AC, 70, 0x8AE, 0x8AE, 7, 0x8AF, 0x8AF, 10, 0x8B0, 0x8B0, 13, 0x8B1, 0x8B1, 71,
|
|
106
|
+
0x8B2, 0x8B2, 8, 0x8B3, 0x8B3, 12, 0x8B4, 0x8B4, 17, 0x8B5, 0x8B5, 16, 0x8B6, 0x8B8, 4, 0x8B9, 0x8B9, 8, 0x8BA, 0x8BA, 3, 0x8BB, 0x8BB, 72,
|
|
107
|
+
0x8BC, 0x8BC, 73, 0x8BD, 0x8BD, 74, 0x8BE, 0x8C0, 4, 0x8C1, 0x8C1, 6, 0x8C2, 0x8C2, 13, 0x8C3, 0x8C3, 12, 0x8C4, 0x8C4, 73, 0x8C5, 0x8C6, 6,
|
|
108
|
+
0x8C7, 0x8C7, 18, 0x8C8, 0x8C8, 13,
|
|
109
|
+
];
|
|
110
|
+
//# sourceMappingURL=joiningGroups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"joiningGroups.js","sourceRoot":"","sources":["../../src/measure/joiningGroups.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,0EAA0E;AAC1E,0BAA0B;AAE1B;oCACoC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,cAAc;IACd,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,aAAa;IACb,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,WAAW;IACX,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,WAAW;IACX,KAAK;IACL,aAAa;IACb,UAAU;IACV,kBAAkB;IAClB,eAAe;IACf,YAAY;IACZ,OAAO;IACP,MAAM;IACN,OAAO;IACP,aAAa;IACb,IAAI;IACJ,YAAY;IACZ,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,QAAQ;IACR,KAAK;IACL,KAAK;IACL,SAAS;IACT,eAAe;IACf,GAAG;IACH,IAAI;IACJ,aAAa;IACb,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,OAAO;IACP,IAAI;IACJ,uBAAuB;IACvB,eAAe;IACf,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,UAAU;IACV,eAAe;IACf,cAAc;IACd,cAAc;IACd,aAAa;IACb,aAAa;IACb,cAAc;CACf,CAAC;AAEF;iEACiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC;IACtH,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IACzH,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC9H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC;IACxH,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IACxH,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC9H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC5H,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC;IAC1H,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC3H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC9H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC9H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC9H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC;IAC3H,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC5H,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IACvH,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC1H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC9H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC5H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC5H,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC1H,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC1H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC;IAC3H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;CAC/B,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kashida justification (#375, arabic-typography §3). A justified line of
|
|
3
|
+
* Arabic text is not letter-spaced (its letters join); it is stretched in
|
|
4
|
+
* its word spaces and by elongating joins inside words, with tatweels
|
|
5
|
+
* (U+0640, ـ) inserted between two connected letters. Fonts draw a run of
|
|
6
|
+
* them as one stroke (Amiri's `rlig` turns one to seven into a curved
|
|
7
|
+
* kashida of that length), so a kashida comes in whole tatweels.
|
|
8
|
+
*
|
|
9
|
+
* Two stages:
|
|
10
|
+
* - Breaking: each Arabic word box carries its kashida capacity as stretch
|
|
11
|
+
* (`kashidaCapacity`: points × the longest elongation a point may take),
|
|
12
|
+
* so Knuth–Plass knows a line of Arabic words can widen there and picks
|
|
13
|
+
* its breaks accordingly.
|
|
14
|
+
* - Setting (`justifyLinesWithKashida`): once the breaks are made, every
|
|
15
|
+
* justified line but the last fills its slack with tatweels first — one
|
|
16
|
+
* whole tatweel at a time, best points first, round after round, each
|
|
17
|
+
* word measured again whole with its tatweels — and leaves the remainder,
|
|
18
|
+
* less than one tatweel, to its word spaces, which renderers widen as on
|
|
19
|
+
* any justified line. So the word spaces keep close to their natural
|
|
20
|
+
* width, the Naskh norm.
|
|
21
|
+
*
|
|
22
|
+
* Where the points are and how good they are: `kashidaPatterns.ts` (the
|
|
23
|
+
* raqim-kashida rules). One point per word by default (`perWord`), the
|
|
24
|
+
* best-ranked one, the later of two that rank alike ("towards the end of
|
|
25
|
+
* the word", the Microsoft rule). A word holding a tatweel the author typed
|
|
26
|
+
* is elongated there and nowhere else.
|
|
27
|
+
*
|
|
28
|
+
* The inserted tatweels are in the segment's text, so every renderer paints
|
|
29
|
+
* them as text, shaped with the word; `VDTLineSegment.kashida` lists where
|
|
30
|
+
* they are, so plain text, source maps, links and extraction leave them out
|
|
31
|
+
* (`writtenText`), and `VDTLine.kashida` counts them.
|
|
32
|
+
*/
|
|
33
|
+
import type { VDTLine, VDTLineSegment } from '../vdt';
|
|
34
|
+
import { type KashidaPatternSetName } from './kashidaPatterns';
|
|
35
|
+
import type { ResolvedBodyTextConfig } from '../types';
|
|
36
|
+
export declare const TATWEEL = "\u0640";
|
|
37
|
+
/** Kashida justification as the measurer applies it
|
|
38
|
+
* (`MeasureBlockOptions.kashida`). */
|
|
39
|
+
export interface KashidaOptions {
|
|
40
|
+
patterns: KashidaPatternSetName;
|
|
41
|
+
/** Most points elongated in one word. */
|
|
42
|
+
perWord: number;
|
|
43
|
+
/** Longest elongation at one point, px (whole tatweels within it). */
|
|
44
|
+
maxLengthPx: number;
|
|
45
|
+
}
|
|
46
|
+
/** The pattern set a body font takes when `kashidaPatterns` is `'auto'`:
|
|
47
|
+
* none for a Ruqʿa or Dīwānī face, whose letters do not elongate (Aref
|
|
48
|
+
* Ruqaa); the Nastaʿlīq rules for a Nastaʿlīq face; Naskh otherwise. */
|
|
49
|
+
export declare function patternsForFont(fontFamily: string): KashidaPatternSetName | undefined;
|
|
50
|
+
/** The measurer's kashida options for text set in `fontString` at
|
|
51
|
+
* `fontSizePx` under `bodyText`, or `undefined` when it takes none
|
|
52
|
+
* (kashida off, or a face whose letters do not elongate). */
|
|
53
|
+
export declare function kashidaMeasureOptions(bodyText: Pick<ResolvedBodyTextConfig, 'kashida' | 'kashidaPatterns' | 'kashidaPerWord' | 'kashidaMaxLength'>, fontString: string, fontSizePx: number): KashidaOptions | undefined;
|
|
54
|
+
/** A point chosen in a word: where the tatweels go (UTF-16 offset in the
|
|
55
|
+
* word as written) and its rank. */
|
|
56
|
+
interface ChosenPoint {
|
|
57
|
+
offset: number;
|
|
58
|
+
priority: number;
|
|
59
|
+
}
|
|
60
|
+
/** The points of `word` that take its kashidas, best first: at most
|
|
61
|
+
* `perWord`, ranked by priority and, between equals, the later one. A word
|
|
62
|
+
* with a tatweel the author typed takes it alone (after the run it
|
|
63
|
+
* starts). */
|
|
64
|
+
export declare function chosenKashidaPoints(word: string, patterns: KashidaPatternSetName, perWord: number): readonly ChosenPoint[];
|
|
65
|
+
/** How far kashidas can widen a word (px): its points times the whole
|
|
66
|
+
* tatweels one point may take, `tatweelPx` each. 0 for a word with no
|
|
67
|
+
* point (Latin, digits, a lone letter). The breaker's stretch of the
|
|
68
|
+
* word's box. */
|
|
69
|
+
export declare function kashidaCapacity(word: string, options: KashidaOptions, tatweelPx: number): number;
|
|
70
|
+
/** A segment's text as written: its text without the tatweels kashida
|
|
71
|
+
* justification inserted (see `VDTLineSegment.kashida`). */
|
|
72
|
+
export declare function writtenText(seg: Pick<VDTLineSegment, 'text' | 'kashida'>): string;
|
|
73
|
+
/**
|
|
74
|
+
* Fill `width` px of slack on a line's segments with kashidas: whole
|
|
75
|
+
* tatweels, one at a time, the best points first and round after round (a
|
|
76
|
+
* second tatweel on a point only once every point that could take one has
|
|
77
|
+
* one), each word measured again whole (`widthOf`) after each, and none
|
|
78
|
+
* that would overfill the slack. Returns the segments (copies where
|
|
79
|
+
* elongated) and how many tatweels went in, or null when none did.
|
|
80
|
+
*/
|
|
81
|
+
export declare function distributeKashida(segments: readonly VDTLineSegment[], width: number, options: KashidaOptions, widthOf: (seg: VDTLineSegment, text: string) => number): {
|
|
82
|
+
segments: VDTLineSegment[];
|
|
83
|
+
added: number;
|
|
84
|
+
count: number;
|
|
85
|
+
} | null;
|
|
86
|
+
/**
|
|
87
|
+
* Kashida justification of a paragraph's lines (see the module comment):
|
|
88
|
+
* every justified line but the last one, with its slack against
|
|
89
|
+
* `lineWidth(i)` (the measure less its indent), takes its kashidas, then
|
|
90
|
+
* its word spaces are measured again (`justifiedSpaceRatio`). A line whose
|
|
91
|
+
* spaces would still stretch past the point where the pipeline sets it
|
|
92
|
+
* ragged (`raggedLooseLines`) is left as it is, ragged lines take none.
|
|
93
|
+
* Lines are replaced, never mutated.
|
|
94
|
+
*/
|
|
95
|
+
export declare function justifyLinesWithKashida(lines: VDTLine[], lineWidth: (index: number) => number, normalSpaceWidth: number, options: KashidaOptions, widthOf: (seg: VDTLineSegment, text: string) => number): void;
|
|
96
|
+
export {};
|
|
97
|
+
//# sourceMappingURL=kashida.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kashida.d.ts","sourceRoot":"","sources":["../../src/measure/kashida.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAwC,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAIrG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGvD,eAAO,MAAM,OAAO,WAAM,CAAC;AAE3B;uCACuC;AACvC,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;yEAEyE;AACzE,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAIrF;AAED;;8DAE8D;AAC9D,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,IAAI,CAAC,sBAAsB,EAAE,SAAS,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC,EAC7G,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,cAAc,GAAG,SAAS,CAM5B;AAED;qCACqC;AACrC,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAaD;;;eAGe;AACf,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,WAAW,EAAE,CA6B1H;AAUD;;;kBAGkB;AAClB,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKhG;AAED;6DAC6D;AAC7D,wBAAgB,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAajF;AAkCD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,SAAS,cAAc,EAAE,EACnC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GACrD;IAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgDrE;AASD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EAAE,EAChB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACpC,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GACrD,IAAI,CA8BN"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kashida justification (#375, arabic-typography §3). A justified line of
|
|
3
|
+
* Arabic text is not letter-spaced (its letters join); it is stretched in
|
|
4
|
+
* its word spaces and by elongating joins inside words, with tatweels
|
|
5
|
+
* (U+0640, ـ) inserted between two connected letters. Fonts draw a run of
|
|
6
|
+
* them as one stroke (Amiri's `rlig` turns one to seven into a curved
|
|
7
|
+
* kashida of that length), so a kashida comes in whole tatweels.
|
|
8
|
+
*
|
|
9
|
+
* Two stages:
|
|
10
|
+
* - Breaking: each Arabic word box carries its kashida capacity as stretch
|
|
11
|
+
* (`kashidaCapacity`: points × the longest elongation a point may take),
|
|
12
|
+
* so Knuth–Plass knows a line of Arabic words can widen there and picks
|
|
13
|
+
* its breaks accordingly.
|
|
14
|
+
* - Setting (`justifyLinesWithKashida`): once the breaks are made, every
|
|
15
|
+
* justified line but the last fills its slack with tatweels first — one
|
|
16
|
+
* whole tatweel at a time, best points first, round after round, each
|
|
17
|
+
* word measured again whole with its tatweels — and leaves the remainder,
|
|
18
|
+
* less than one tatweel, to its word spaces, which renderers widen as on
|
|
19
|
+
* any justified line. So the word spaces keep close to their natural
|
|
20
|
+
* width, the Naskh norm.
|
|
21
|
+
*
|
|
22
|
+
* Where the points are and how good they are: `kashidaPatterns.ts` (the
|
|
23
|
+
* raqim-kashida rules). One point per word by default (`perWord`), the
|
|
24
|
+
* best-ranked one, the later of two that rank alike ("towards the end of
|
|
25
|
+
* the word", the Microsoft rule). A word holding a tatweel the author typed
|
|
26
|
+
* is elongated there and nowhere else.
|
|
27
|
+
*
|
|
28
|
+
* The inserted tatweels are in the segment's text, so every renderer paints
|
|
29
|
+
* them as text, shaped with the word; `VDTLineSegment.kashida` lists where
|
|
30
|
+
* they are, so plain text, source maps, links and extraction leave them out
|
|
31
|
+
* (`writtenText`), and `VDTLine.kashida` counts them.
|
|
32
|
+
*/
|
|
33
|
+
import { findKashidaPoints, kashidaPatternSet } from './kashidaPatterns';
|
|
34
|
+
import { joiningScriptIn } from './joining';
|
|
35
|
+
import { joiningTypeOf } from '../bidi';
|
|
36
|
+
import { RAGGED_SPACE_RATIO } from '../knuthPlass/constants';
|
|
37
|
+
import { resolvedKashida } from '../defaults/bodyText';
|
|
38
|
+
export const TATWEEL = 'ـ';
|
|
39
|
+
/** The pattern set a body font takes when `kashidaPatterns` is `'auto'`:
|
|
40
|
+
* none for a Ruqʿa or Dīwānī face, whose letters do not elongate (Aref
|
|
41
|
+
* Ruqaa); the Nastaʿlīq rules for a Nastaʿlīq face; Naskh otherwise. */
|
|
42
|
+
export function patternsForFont(fontFamily) {
|
|
43
|
+
if (/ruq[ʿ']?a|diwani|dīwānī/i.test(fontFamily))
|
|
44
|
+
return undefined;
|
|
45
|
+
if (/nasta[ʿ']?l[iī]q/i.test(fontFamily))
|
|
46
|
+
return 'nastaliq';
|
|
47
|
+
return 'naskh';
|
|
48
|
+
}
|
|
49
|
+
/** The measurer's kashida options for text set in `fontString` at
|
|
50
|
+
* `fontSizePx` under `bodyText`, or `undefined` when it takes none
|
|
51
|
+
* (kashida off, or a face whose letters do not elongate). */
|
|
52
|
+
export function kashidaMeasureOptions(bodyText, fontString, fontSizePx) {
|
|
53
|
+
const k = resolvedKashida(bodyText);
|
|
54
|
+
if (!k)
|
|
55
|
+
return undefined;
|
|
56
|
+
const patterns = k.patterns === 'auto' ? patternsForFont(fontString) : k.patterns;
|
|
57
|
+
if (!patterns || k.maxLength <= 0)
|
|
58
|
+
return undefined;
|
|
59
|
+
return { patterns, perWord: k.perWord, maxLengthPx: k.maxLength * fontSizePx };
|
|
60
|
+
}
|
|
61
|
+
const chosenCache = new Map();
|
|
62
|
+
const CHOSEN_CACHE_LIMIT = 20000;
|
|
63
|
+
/** Whether `text[i]` is a tatweel the author typed as an elongation: one
|
|
64
|
+
* that carries no mark (a tatweel under a mark seats it). */
|
|
65
|
+
function bareTatweelAt(text, i) {
|
|
66
|
+
if (text[i] !== TATWEEL)
|
|
67
|
+
return false;
|
|
68
|
+
const next = text.codePointAt(i + 1);
|
|
69
|
+
return next === undefined || joiningTypeOf(next) !== 'T';
|
|
70
|
+
}
|
|
71
|
+
/** The points of `word` that take its kashidas, best first: at most
|
|
72
|
+
* `perWord`, ranked by priority and, between equals, the later one. A word
|
|
73
|
+
* with a tatweel the author typed takes it alone (after the run it
|
|
74
|
+
* starts). */
|
|
75
|
+
export function chosenKashidaPoints(word, patterns, perWord) {
|
|
76
|
+
const key = `${patterns}${perWord}\x00${word}`;
|
|
77
|
+
const hit = chosenCache.get(key);
|
|
78
|
+
if (hit)
|
|
79
|
+
return hit;
|
|
80
|
+
let out;
|
|
81
|
+
const typed = word.indexOf(TATWEEL);
|
|
82
|
+
let bare = -1;
|
|
83
|
+
for (let i = typed; i >= 0 && i < word.length; i = word.indexOf(TATWEEL, i + 1)) {
|
|
84
|
+
if (bareTatweelAt(word, i)) {
|
|
85
|
+
bare = i;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (bare >= 0) {
|
|
90
|
+
let end = bare;
|
|
91
|
+
while (word[end] === TATWEEL)
|
|
92
|
+
end++;
|
|
93
|
+
out = [{ offset: end, priority: 9 }];
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const all = findKashidaPoints(word, kashidaPatternSet(patterns));
|
|
97
|
+
all.sort((a, b) => b.priority - a.priority || b.offset - a.offset);
|
|
98
|
+
out = [];
|
|
99
|
+
for (const p of all) {
|
|
100
|
+
if (out.length >= perWord)
|
|
101
|
+
break;
|
|
102
|
+
if (!out.some((q) => q.offset === p.offset))
|
|
103
|
+
out.push({ offset: p.offset, priority: p.priority });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (chosenCache.size >= CHOSEN_CACHE_LIMIT)
|
|
107
|
+
chosenCache.clear();
|
|
108
|
+
chosenCache.set(key, out);
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
/** Whether a segment is a word kashida may elongate: Arabic-script text,
|
|
112
|
+
* not a reference label, a footnote marker, a chip, a formula or
|
|
113
|
+
* characters the layout added. */
|
|
114
|
+
function elongatable(seg) {
|
|
115
|
+
return seg.kind === 'text' && !seg.inserted && seg.refResourceId === undefined && seg.footnoteId === undefined
|
|
116
|
+
&& !seg.chip && !seg.mathRender && joiningScriptIn(seg.text);
|
|
117
|
+
}
|
|
118
|
+
/** How far kashidas can widen a word (px): its points times the whole
|
|
119
|
+
* tatweels one point may take, `tatweelPx` each. 0 for a word with no
|
|
120
|
+
* point (Latin, digits, a lone letter). The breaker's stretch of the
|
|
121
|
+
* word's box. */
|
|
122
|
+
export function kashidaCapacity(word, options, tatweelPx) {
|
|
123
|
+
if (tatweelPx <= 0 || !joiningScriptIn(word))
|
|
124
|
+
return 0;
|
|
125
|
+
const units = Math.floor(options.maxLengthPx / tatweelPx + 1e-6);
|
|
126
|
+
if (units <= 0)
|
|
127
|
+
return 0;
|
|
128
|
+
return chosenKashidaPoints(word, options.patterns, options.perWord).length * units * tatweelPx;
|
|
129
|
+
}
|
|
130
|
+
/** A segment's text as written: its text without the tatweels kashida
|
|
131
|
+
* justification inserted (see `VDTLineSegment.kashida`). */
|
|
132
|
+
export function writtenText(seg) {
|
|
133
|
+
const at = seg.kashida;
|
|
134
|
+
if (!at || at.length === 0)
|
|
135
|
+
return seg.text;
|
|
136
|
+
let out = '';
|
|
137
|
+
let k = 0;
|
|
138
|
+
for (let i = 0; i < seg.text.length; i++) {
|
|
139
|
+
if (k < at.length && at[k] === i) {
|
|
140
|
+
k++;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
out += seg.text[i];
|
|
144
|
+
}
|
|
145
|
+
return out;
|
|
146
|
+
}
|
|
147
|
+
/** Insert one tatweel at `offset` (in the text as it now stands) into a
|
|
148
|
+
* segment: its text, its styled runs and its inserted offsets. */
|
|
149
|
+
function withTatweel(seg, offset) {
|
|
150
|
+
const text = seg.text.slice(0, offset) + TATWEEL + seg.text.slice(offset);
|
|
151
|
+
const kashida = [...(seg.kashida ?? []).map((o) => (o >= offset ? o + 1 : o)), offset].sort((a, b) => a - b);
|
|
152
|
+
let runs = seg.runs;
|
|
153
|
+
if (runs) {
|
|
154
|
+
// The tatweel joins the run of the letter before it.
|
|
155
|
+
let pos = 0;
|
|
156
|
+
let placed = false;
|
|
157
|
+
runs = runs.map((r) => {
|
|
158
|
+
const start = pos;
|
|
159
|
+
pos += r.text.length;
|
|
160
|
+
if (placed || offset <= start || offset > pos)
|
|
161
|
+
return r;
|
|
162
|
+
placed = true;
|
|
163
|
+
return { ...r, text: r.text.slice(0, offset - start) + TATWEEL + r.text.slice(offset - start) };
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return { ...seg, text, kashida, ...(runs ? { runs } : {}) };
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Fill `width` px of slack on a line's segments with kashidas: whole
|
|
170
|
+
* tatweels, one at a time, the best points first and round after round (a
|
|
171
|
+
* second tatweel on a point only once every point that could take one has
|
|
172
|
+
* one), each word measured again whole (`widthOf`) after each, and none
|
|
173
|
+
* that would overfill the slack. Returns the segments (copies where
|
|
174
|
+
* elongated) and how many tatweels went in, or null when none did.
|
|
175
|
+
*/
|
|
176
|
+
export function distributeKashida(segments, width, options, widthOf) {
|
|
177
|
+
if (width <= 0)
|
|
178
|
+
return null;
|
|
179
|
+
const cands = [];
|
|
180
|
+
const tatweel = new Map();
|
|
181
|
+
for (let i = 0; i < segments.length; i++) {
|
|
182
|
+
const seg = segments[i];
|
|
183
|
+
if (!elongatable(seg))
|
|
184
|
+
continue;
|
|
185
|
+
const pts = chosenKashidaPoints(writtenText(seg), options.patterns, options.perWord);
|
|
186
|
+
if (pts.length === 0)
|
|
187
|
+
continue;
|
|
188
|
+
const unit = widthOf(seg, TATWEEL);
|
|
189
|
+
const max = unit > 0 ? Math.floor(options.maxLengthPx / unit + 1e-6) : 0;
|
|
190
|
+
if (max <= 0)
|
|
191
|
+
continue;
|
|
192
|
+
tatweel.set(i, unit);
|
|
193
|
+
for (const p of pts)
|
|
194
|
+
cands.push({ seg: i, offset: p.offset, priority: p.priority, count: 0, max, done: false });
|
|
195
|
+
}
|
|
196
|
+
if (cands.length === 0)
|
|
197
|
+
return null;
|
|
198
|
+
// Best first; between equals, the one nearer the line's end.
|
|
199
|
+
cands.sort((a, b) => b.priority - a.priority || b.seg - a.seg || b.offset - a.offset);
|
|
200
|
+
const out = segments.slice();
|
|
201
|
+
let remaining = width;
|
|
202
|
+
let count = 0;
|
|
203
|
+
const EPS = 1e-6;
|
|
204
|
+
for (let progressed = true; progressed;) {
|
|
205
|
+
progressed = false;
|
|
206
|
+
for (const c of cands) {
|
|
207
|
+
if (c.done || c.count >= c.max)
|
|
208
|
+
continue;
|
|
209
|
+
if (tatweel.get(c.seg) > remaining + EPS)
|
|
210
|
+
continue;
|
|
211
|
+
const seg = out[c.seg];
|
|
212
|
+
// Where the point stands in the text now: past the tatweels already
|
|
213
|
+
// inserted before it, and after this point's own.
|
|
214
|
+
let at = c.offset;
|
|
215
|
+
for (const o of seg.kashida ?? [])
|
|
216
|
+
if (o < at)
|
|
217
|
+
at++;
|
|
218
|
+
const next = withTatweel(seg, at);
|
|
219
|
+
const w = widthOf(next, next.text);
|
|
220
|
+
const delta = w - seg.width;
|
|
221
|
+
if (delta <= 0 || delta > remaining + EPS) {
|
|
222
|
+
c.done = true;
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
out[c.seg] = { ...next, width: w };
|
|
226
|
+
remaining -= delta;
|
|
227
|
+
c.count++;
|
|
228
|
+
count++;
|
|
229
|
+
progressed = true;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return count > 0 ? { segments: out, added: width - remaining, count } : null;
|
|
233
|
+
}
|
|
234
|
+
/** How far a line's word spaces widen before its kashidas take the rest
|
|
235
|
+
* of its slack: a quarter of their width, alreq's and Nemeth's advice to
|
|
236
|
+
* combine both levers (spaces alone open rivers, kashidas alone crowd the
|
|
237
|
+
* line with elongations). Whatever the kashidas leave, under one tatweel,
|
|
238
|
+
* goes to the spaces too. */
|
|
239
|
+
const SPACE_SHARE = 1.25;
|
|
240
|
+
/**
|
|
241
|
+
* Kashida justification of a paragraph's lines (see the module comment):
|
|
242
|
+
* every justified line but the last one, with its slack against
|
|
243
|
+
* `lineWidth(i)` (the measure less its indent), takes its kashidas, then
|
|
244
|
+
* its word spaces are measured again (`justifiedSpaceRatio`). A line whose
|
|
245
|
+
* spaces would still stretch past the point where the pipeline sets it
|
|
246
|
+
* ragged (`raggedLooseLines`) is left as it is, ragged lines take none.
|
|
247
|
+
* Lines are replaced, never mutated.
|
|
248
|
+
*/
|
|
249
|
+
export function justifyLinesWithKashida(lines, lineWidth, normalSpaceWidth, options, widthOf) {
|
|
250
|
+
for (let i = 0; i < lines.length; i++) {
|
|
251
|
+
const line = lines[i];
|
|
252
|
+
if (line.isLastLine || line.ragged || !line.segments || line.wordOverflow)
|
|
253
|
+
continue;
|
|
254
|
+
const target = lineWidth(i);
|
|
255
|
+
const natural = line.segments.reduce((s, seg) => s + seg.width, 0);
|
|
256
|
+
// The word spaces open up a little first (to `SPACE_SHARE` of their
|
|
257
|
+
// width); the kashidas take what is beyond.
|
|
258
|
+
const spaceCount = line.segments.reduce((n, seg) => n + (seg.kind === 'space' ? 1 : 0), 0);
|
|
259
|
+
const spaceShare = spaceCount * normalSpaceWidth * (SPACE_SHARE - 1);
|
|
260
|
+
const done = distributeKashida(line.segments, target - natural - spaceShare, options, widthOf);
|
|
261
|
+
if (!done)
|
|
262
|
+
continue;
|
|
263
|
+
let words = 0;
|
|
264
|
+
let spaces = 0;
|
|
265
|
+
for (const seg of done.segments) {
|
|
266
|
+
if (seg.kind === 'space')
|
|
267
|
+
spaces++;
|
|
268
|
+
else
|
|
269
|
+
words += seg.width;
|
|
270
|
+
}
|
|
271
|
+
const ratio = spaces > 0 && normalSpaceWidth > 0 ? (target - words) / spaces / normalSpaceWidth : undefined;
|
|
272
|
+
// Without the kashidas the pipeline would set this line ragged; it
|
|
273
|
+
// still would with them: leave it to that.
|
|
274
|
+
if (ratio !== undefined && ratio > RAGGED_SPACE_RATIO)
|
|
275
|
+
continue;
|
|
276
|
+
lines[i] = {
|
|
277
|
+
...line,
|
|
278
|
+
segments: done.segments,
|
|
279
|
+
bbox: { ...line.bbox, width: natural + done.added },
|
|
280
|
+
...(ratio !== undefined ? { justifiedSpaceRatio: ratio } : {}),
|
|
281
|
+
kashida: done.count,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=kashida.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kashida.js","sourceRoot":"","sources":["../../src/measure/kashida.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a kashida may go in an Arabic word, and how good a place it is: a
|
|
3
|
+
* port of raqim-kashida (Khaled Hosny, aliftype, MIT licence,
|
|
4
|
+
* https://github.com/aliftype/raqim-kashida, at e217f98c), its pattern
|
|
5
|
+
* language and its built-in sets.
|
|
6
|
+
*
|
|
7
|
+
* A pattern set scores the connections of a word's joined runs (letters
|
|
8
|
+
* that connect to each other: `المبتعث` is the run ا and the run لمبتعث). A
|
|
9
|
+
* pattern is a row of tokens (a letter, a joining group `@Beh` that folds
|
|
10
|
+
* the letters sharing its skeleton in a given position, a set `{…}`, `*`
|
|
11
|
+
* any joining letter, `.` the run's edge) with a priority digit 0–9, or
|
|
12
|
+
* `!` (forbidden), in the gaps between them; `9\6` drops by one per letter
|
|
13
|
+
* the run is longer than the guard's floor (`[4:]`) or, with `[:4:]`, away
|
|
14
|
+
* from it either way. The last rule that speaks at a connection wins. A
|
|
15
|
+
* point is only ever a real connection: never after a right-joining letter
|
|
16
|
+
* (ا د ذ ر ز و ة), never at a run's edge, never across a ZWNJ.
|
|
17
|
+
*
|
|
18
|
+
* The sets:
|
|
19
|
+
* - `naskh` — Benatia, Elyaakoubi & Lazrek's matrix (TUGboat 27(2), 2006)
|
|
20
|
+
* overridden by Fawzi Salim Afifi's calligraphy manual: nothing after kāf
|
|
21
|
+
* or lām (so never inside lām-alif), nothing before ṣād, ʿayn, wāw, ḥāʾ
|
|
22
|
+
* or a final fāʾ/qāf/yāʾ, 4-letter runs best, a final pronoun hāʾ best
|
|
23
|
+
* stretched just before it. For Amiri, Noto Naskh, Scheherazade…
|
|
24
|
+
* - `simple` — the Microsoft priorities (IE 5.5's `text-kashida`): after
|
|
25
|
+
* an initial or medial sīn/ṣād, before a final hāʾ/dāl, alif/ṭāʾ/lām/
|
|
26
|
+
* kāf, wāw/ʿayn/qāf/fāʾ, before any other final letter; never inside
|
|
27
|
+
* lām-alif.
|
|
28
|
+
* - `nastaliq` — naskh tailored after Afifi's Persian volume.
|
|
29
|
+
*
|
|
30
|
+
* Indices: the points are given as UTF-16 offsets in the word where a
|
|
31
|
+
* tatweel (U+0640) goes: after the whole cluster of the letter before the
|
|
32
|
+
* connection (its harakat included) and after a tatweel that seats a mark.
|
|
33
|
+
* A tatweel the author typed is a letter of its run like any other.
|
|
34
|
+
*/
|
|
35
|
+
/** A place a kashida may go. */
|
|
36
|
+
export interface KashidaPoint {
|
|
37
|
+
/** UTF-16 offset in the word where the tatweel is inserted. */
|
|
38
|
+
offset: number;
|
|
39
|
+
/** Index of the grapheme cluster the tatweel goes after (raqim's index). */
|
|
40
|
+
index: number;
|
|
41
|
+
/** 0–9, higher is better. */
|
|
42
|
+
priority: number;
|
|
43
|
+
}
|
|
44
|
+
/** The built-in pattern sets. */
|
|
45
|
+
export type KashidaPatternSetName = 'naskh' | 'simple' | 'nastaliq';
|
|
46
|
+
type Token = {
|
|
47
|
+
kind: 'group';
|
|
48
|
+
group: string;
|
|
49
|
+
} | {
|
|
50
|
+
kind: 'exact';
|
|
51
|
+
group: string;
|
|
52
|
+
} | {
|
|
53
|
+
kind: 'set';
|
|
54
|
+
members: Token[];
|
|
55
|
+
} | {
|
|
56
|
+
kind: 'notSet';
|
|
57
|
+
members: Token[];
|
|
58
|
+
} | {
|
|
59
|
+
kind: 'literal';
|
|
60
|
+
cp: number;
|
|
61
|
+
} | {
|
|
62
|
+
kind: 'any';
|
|
63
|
+
};
|
|
64
|
+
type Weight = {
|
|
65
|
+
base: number;
|
|
66
|
+
min: number;
|
|
67
|
+
} | 'suppress';
|
|
68
|
+
type Guard = {
|
|
69
|
+
kind: 'exact';
|
|
70
|
+
n: number;
|
|
71
|
+
} | {
|
|
72
|
+
kind: 'min';
|
|
73
|
+
n: number;
|
|
74
|
+
} | {
|
|
75
|
+
kind: 'range';
|
|
76
|
+
lo: number;
|
|
77
|
+
hi: number;
|
|
78
|
+
} | {
|
|
79
|
+
kind: 'open';
|
|
80
|
+
n: number;
|
|
81
|
+
};
|
|
82
|
+
interface Pattern {
|
|
83
|
+
guard?: Guard;
|
|
84
|
+
tokens: Token[];
|
|
85
|
+
/** `weights[k]`: the gap before token k; the last, the gap after the
|
|
86
|
+
* last token. */
|
|
87
|
+
weights: (Weight | undefined)[];
|
|
88
|
+
leading: boolean;
|
|
89
|
+
trailing: boolean;
|
|
90
|
+
}
|
|
91
|
+
/** A compiled pattern set. */
|
|
92
|
+
export interface KashidaPatternSet {
|
|
93
|
+
readonly patterns: readonly Pattern[];
|
|
94
|
+
}
|
|
95
|
+
/** A pattern line that does not compile: `line` is 1-based. */
|
|
96
|
+
export declare class KashidaPatternError extends Error {
|
|
97
|
+
readonly line: number;
|
|
98
|
+
constructor(message: string, line: number);
|
|
99
|
+
}
|
|
100
|
+
/** Compile pattern text (raqim's language; `use <set>` splices a built-in
|
|
101
|
+
* set in, `naskh` / `simple` / `nastaliq` or raqim's `arabic-…` names). */
|
|
102
|
+
export declare function compileKashidaPatterns(text: string): KashidaPatternSet;
|
|
103
|
+
/** The kashida points of `word` under `set`, in logical order. Text that
|
|
104
|
+
* is not Arabic-like (no joining letter) has none. */
|
|
105
|
+
export declare function findKashidaPoints(word: string, set: KashidaPatternSet): KashidaPoint[];
|
|
106
|
+
/** A built-in pattern set, compiled on first use. */
|
|
107
|
+
export declare function kashidaPatternSet(name: KashidaPatternSetName): KashidaPatternSet;
|
|
108
|
+
export {};
|
|
109
|
+
//# sourceMappingURL=kashidaPatterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kashidaPatterns.d.ts","sourceRoot":"","sources":["../../src/measure/kashidaPatterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAKH,gCAAgC;AAChC,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,iCAAiC;AACjC,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAsJpE,KAAK,KAAK,GACN;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,KAAK,EAAE,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,KAAK,EAAE,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpB,KAAK,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAAC;AAEzD,KAAK,KAAK,GACN;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhC,UAAU,OAAO;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB;sBACkB;IAClB,OAAO,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,8BAA8B;AAC9B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;CACvC;AAED,+DAA+D;AAC/D,qBAAa,mBAAoB,SAAQ,KAAK;IACf,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAtC,OAAO,EAAE,MAAM,EAAW,IAAI,EAAE,MAAM;CAInD;AAuID;4EAC4E;AAC5E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAsBtE;AAmED;uDACuD;AACvD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,YAAY,EAAE,CAKtF;AAkED,qDAAqD;AACrD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,iBAAiB,CAOhF"}
|