@stll/folio-core 0.15.13 → 0.17.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/server.d.ts CHANGED
@@ -18,8 +18,8 @@ import { EvaluateDocxXmlPatchProposalArgs, FOLIO_DOCX_XML_PATCH_PROPOSAL_DEFAULT
18
18
  import { FOLIO_DOCX_CONFORMANCE_CHECKS, FOLIO_DOCX_CONFORMANCE_ISSUE_CODES, FOLIO_DOCX_CONFORMANCE_PROFILE, FOLIO_DOCX_CONFORMANCE_REPORT_VERSION, FolioDocxConformanceCheck, FolioDocxConformanceCheckId, FolioDocxConformanceCheckStatus, FolioDocxConformanceIssue, FolioDocxConformanceIssueCode, FolioDocxConformanceReport, FolioDocxConformanceStatus, ValidateDocxConformanceOptions, validateDocxConformance } from "./docx/server/validateDocxConformance.js";
19
19
  import { ApplyDocxXmlPatchProposalArgs, FOLIO_DOCX_XML_PATCH_APPLICATION_PROFILE, FOLIO_DOCX_XML_PATCH_APPLICATION_VERSION, FolioDocxXmlPatchApplication, FolioDocxXmlPatchApplicationError, FolioDocxXmlPatchApplicationReceipt, UnsupportedFolioDocxXmlPatchApplicationProfileError, applyDocxXmlPatchProposal } from "./docx/server/applyDocxXmlPatchProposal.js";
20
20
  import { docxToMarkdown } from "./docx/server/docxToMarkdown.js";
21
- import { DocxParagraphSource, ExtractedDocxParagraph, ExtractedDocxText, extractDocxText } from "./docx/server/extractDocxText.js";
21
+ import { DocxParagraphSource, DocxTableRowKind, DocxTableRowPosition, ExtractedDocxParagraph, ExtractedDocxTableCell, ExtractedDocxTableCellParagraph, ExtractedDocxText, extractDocxText } from "./docx/server/extractDocxText.js";
22
22
  import { FOLIO_DOCX_PACKAGE_INSPECTION_DEFAULTS, FOLIO_DOCX_PACKAGE_INSPECTION_ERROR_CODES, FOLIO_DOCX_PACKAGE_INSPECTION_VERSION, FolioDocxInspectedXmlPart, FolioDocxPackageInspection, FolioDocxPackageInspectionError, FolioDocxPackageInspectionErrorCode, FolioDocxPackageInspectionLimits, FolioDocxPackagePart, FolioDocxPackagePartKind, InspectDocxPackageOptions, inspectDocxPackage } from "./docx/server/inspectDocxPackage.js";
23
23
  import { GenerateRedlineDocxOptions, GenerateRedlineDocxResult, GenerateRedlineUnprocessedStory, InvalidGenerateRedlineDocxOptionsError, generateRedlineDocx } from "./redline.js";
24
24
  import { FOLIO_VERSION_COMPARISON_PRIVACY_TRANSFORMS, FOLIO_VERSION_COMPARISON_SCOPES, FolioBlockDiff, FolioCompareDocxVersionsOptions, FolioDocumentMetadataValue, FolioFormatProperty, FolioMetadataDiff, FolioStoryDiff, FolioVersionBlockHandle, FolioVersionComparisonPrivacyTransform, FolioVersionComparisonScope, FolioVersionDiff, FolioVersionDiffPrivacyOptions, FolioVersionDiffPrivacyReport, FolioVersionDiffSegment, FolioVersionDiffSummaryCounts, InvalidFolioVersionComparisonOptionsError, applyFolioVersionDiffPrivacy, compareDocxVersions, isFolioVersionComparisonPrivacyTransform, isFolioVersionComparisonScope } from "./version-comparison.js";
25
- export { type ApplyDocxXmlPatchProposalArgs, type ApplyFolioAIEditsToBufferOptions, type ApplyFolioAIEditsToBufferResult, type CreateCommentReplyInput, type CreateEmptyDocumentOptions, DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION, type DeriveBlockIdInput, type DocumentPreset, type DocumentStyleCatalog, type DocumentStyleCatalogEntry, type DocumentStyleSet, DocxArchiveError, type DocxArchiveOptions, type DocxParagraphSource, EnsureParaIdsError, type EnsureParaIdsOptions, type EnsureParaIdsResult, type EvaluateDocxXmlPatchProposalArgs, type ExtractDocumentStyleSetOptions, type ExtractedDocxParagraph, type ExtractedDocxText, FOLIO_DOCUMENT_METADATA_PROPERTIES, FOLIO_DOCUMENT_OPERATION_BATCH_MODES, FOLIO_DOCUMENT_OPERATION_CONTRACT_VERSION, FOLIO_DOCUMENT_OPERATION_MODES, FOLIO_DOCUMENT_OPERATION_MODES_BY_TYPE, FOLIO_DOCUMENT_OPERATION_PRECONDITIONS, FOLIO_DOCUMENT_OPERATION_STORIES, FOLIO_DOCUMENT_OPERATION_TYPES, FOLIO_DOCUMENT_PRIVACY_TRANSFORMS, FOLIO_DOCX_CONFORMANCE_CHECKS, FOLIO_DOCX_CONFORMANCE_ISSUE_CODES, FOLIO_DOCX_CONFORMANCE_PROFILE, FOLIO_DOCX_CONFORMANCE_REPORT_VERSION, FOLIO_DOCX_PACKAGE_INSPECTION_DEFAULTS, FOLIO_DOCX_PACKAGE_INSPECTION_ERROR_CODES, FOLIO_DOCX_PACKAGE_INSPECTION_VERSION, FOLIO_DOCX_XML_PATCH_APPLICATION_PROFILE, FOLIO_DOCX_XML_PATCH_APPLICATION_VERSION, FOLIO_DOCX_XML_PATCH_PROPOSAL_DEFAULTS, FOLIO_DOCX_XML_PATCH_PROPOSAL_ISSUE_CODES, FOLIO_DOCX_XML_PATCH_PROPOSAL_PROFILE, FOLIO_DOCX_XML_PATCH_PROPOSAL_VERSION, FOLIO_RESOLVED_REVIEWED_VIEWS, FOLIO_REVIEWED_VIEWS, FOLIO_VERSION_COMPARISON_PRIVACY_TRANSFORMS, FOLIO_VERSION_COMPARISON_SCOPES, type FolioAIBlock, type FolioAIBlockAnchor, type FolioAIBlockKind, type FolioAIBlockPreviewRun, type FolioAIComment, type FolioAIEditApplyMode, type FolioAIEditApplyResult, type FolioAIEditOperation, type FolioAIEditPrecondition, type FolioAIEditSnapshot, type FolioAIInlineFormatting, type FolioAITextRangeHandle, type FolioApplyDocumentOperationsOptions, type FolioApplyDocumentOperationsToStoryOptions, type FolioApplyOperationsOptions, type FolioBlockDiff, type FolioBlockId, type FolioCompareDocxVersionsOptions, type FolioDocumentMetadataProperty, type FolioDocumentMetadataValue, type FolioDocumentNavigationTarget, type FolioDocumentOperation, type FolioDocumentOperationAffectedTarget, type FolioDocumentOperationBatch, type FolioDocumentOperationCapabilities, type FolioDocumentOperationIssue, type FolioDocumentOperationMode, type FolioDocumentOperationPrecondition, type FolioDocumentOperationReceipt, type FolioDocumentOperationRecovery, type FolioDocumentOperationResult, type FolioDocumentOperationStatus, type FolioDocumentOperationStory, type FolioDocumentOperationType, type FolioDocumentOperationUndoFailureReason, type FolioDocumentOperationUndoHandle, type FolioDocumentOperationUndoResult, type FolioDocumentOutline, type FolioDocumentOutlineEntry, FolioDocumentPrivacyArchiveError, type FolioDocumentPrivacyOptions, type FolioDocumentPrivacyReport, type FolioDocumentPrivacyTransform, type FolioDocumentSection, type FolioDocumentSectionHandle, type FolioDocumentSectionReadResult, type FolioDocumentStory, type FolioDocumentStoryHandle, FolioDocumentStoryNotFoundError, type FolioDocxConformanceCheck, type FolioDocxConformanceCheckId, type FolioDocxConformanceCheckStatus, type FolioDocxConformanceIssue, type FolioDocxConformanceIssueCode, type FolioDocxConformanceReport, type FolioDocxConformanceStatus, type FolioDocxInspectedXmlPart, type FolioDocxPackageInspection, FolioDocxPackageInspectionError, type FolioDocxPackageInspectionErrorCode, type FolioDocxPackageInspectionLimits, type FolioDocxPackagePart, type FolioDocxPackagePartKind, type FolioDocxPreparedXmlReplacement, FolioDocxReviewer, type FolioDocxReviewerOptions, type FolioDocxXmlPatchApplication, FolioDocxXmlPatchApplicationError, type FolioDocxXmlPatchApplicationReceipt, type FolioDocxXmlPatchProposal, type FolioDocxXmlPatchProposalEvaluation, type FolioDocxXmlPatchProposalIssue, type FolioDocxXmlPatchProposalIssueCode, type FolioDocxXmlPatchProposalLimits, type FolioDocxXmlReplacement, type FolioEditableDocumentStoryHandle, type FolioFormatProperty, type FolioMetadataDiff, type FolioReadReviewedStoryOptions, type FolioResolveReviewedStoryOptions, type FolioResolvedReviewedView, type FolioReviewChange, type FolioReviewChangeFilter, type FolioReviewChangeKind, type FolioReviewComment, type FolioReviewCommentFilter, type FolioReviewCommentReply, type FolioReviewReplyInput, type FolioReviewedStory, type FolioReviewedView, type FolioStoryDiff, type FolioVersionBlockHandle, type FolioVersionComparisonPrivacyTransform, type FolioVersionComparisonScope, type FolioVersionDiff, type FolioVersionDiffPrivacyOptions, type FolioVersionDiffPrivacyReport, type FolioVersionDiffSegment, type FolioVersionDiffSummaryCounts, type GenerateRedlineDocxOptions, type GenerateRedlineDocxResult, type GenerateRedlineUnprocessedStory, type InspectDocxPackageOptions, InvalidFolioDocumentOperationBatchError, InvalidFolioDocumentPrivacyOptionsError, InvalidFolioDocxXmlPatchProposalError, InvalidFolioDocxXmlPatchProposalOptionsError, InvalidFolioVersionComparisonOptionsError, InvalidGenerateRedlineDocxOptionsError, type RewriteDocxMetadataPrivacyResult, STELLA_STYLE_SET_NAME, UnsupportedFolioDocumentOperationVersionError, UnsupportedFolioDocxXmlPatchApplicationProfileError, UnsupportedFolioReviewedViewError, type ValidateDocxConformanceOptions, applyDocxXmlPatchProposal, applyFolioAIEditsToBuffer, applyFolioVersionDiffPrivacy, assertSupportedFolioDocumentOperationVersion, compareDocxVersions, createDocx, createEmptyDocument, createFolioAITextRangeHandle, createStellaStyleDocumentPreset, createStellaStyleSet, deriveBlockId, docxToMarkdown, ensureParaIds, evaluateDocxXmlPatchProposal, extractDocumentStyleSet, extractDocumentStyleSetFromDocx, extractDocxText, generateRedlineDocx, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioDocumentOutline, getFolioParaIdFromBlockId, hashFolioAIBlockText, inspectDocumentStyles, inspectDocumentStylesFromDocx, inspectDocxPackage, isFolioBlockId, isFolioDocumentOperationModeSupported, isFolioDocumentPrivacyTransform, isFolioResolvedReviewedView, isFolioReviewedView, isFolioVersionComparisonPrivacyTransform, isFolioVersionComparisonScope, isSequentialFolioBlockId, isSupportedFolioDocumentOperationVersion, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, parseFolioDocxXmlPatchProposal, readFolioDocumentSection, replyToComment, rewriteDocxMetadataPrivacy, validateDocxConformance };
25
+ export { type ApplyDocxXmlPatchProposalArgs, type ApplyFolioAIEditsToBufferOptions, type ApplyFolioAIEditsToBufferResult, type CreateCommentReplyInput, type CreateEmptyDocumentOptions, DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION, type DeriveBlockIdInput, type DocumentPreset, type DocumentStyleCatalog, type DocumentStyleCatalogEntry, type DocumentStyleSet, DocxArchiveError, type DocxArchiveOptions, type DocxParagraphSource, type DocxTableRowKind, type DocxTableRowPosition, EnsureParaIdsError, type EnsureParaIdsOptions, type EnsureParaIdsResult, type EvaluateDocxXmlPatchProposalArgs, type ExtractDocumentStyleSetOptions, type ExtractedDocxParagraph, type ExtractedDocxTableCell, type ExtractedDocxTableCellParagraph, type ExtractedDocxText, FOLIO_DOCUMENT_METADATA_PROPERTIES, FOLIO_DOCUMENT_OPERATION_BATCH_MODES, FOLIO_DOCUMENT_OPERATION_CONTRACT_VERSION, FOLIO_DOCUMENT_OPERATION_MODES, FOLIO_DOCUMENT_OPERATION_MODES_BY_TYPE, FOLIO_DOCUMENT_OPERATION_PRECONDITIONS, FOLIO_DOCUMENT_OPERATION_STORIES, FOLIO_DOCUMENT_OPERATION_TYPES, FOLIO_DOCUMENT_PRIVACY_TRANSFORMS, FOLIO_DOCX_CONFORMANCE_CHECKS, FOLIO_DOCX_CONFORMANCE_ISSUE_CODES, FOLIO_DOCX_CONFORMANCE_PROFILE, FOLIO_DOCX_CONFORMANCE_REPORT_VERSION, FOLIO_DOCX_PACKAGE_INSPECTION_DEFAULTS, FOLIO_DOCX_PACKAGE_INSPECTION_ERROR_CODES, FOLIO_DOCX_PACKAGE_INSPECTION_VERSION, FOLIO_DOCX_XML_PATCH_APPLICATION_PROFILE, FOLIO_DOCX_XML_PATCH_APPLICATION_VERSION, FOLIO_DOCX_XML_PATCH_PROPOSAL_DEFAULTS, FOLIO_DOCX_XML_PATCH_PROPOSAL_ISSUE_CODES, FOLIO_DOCX_XML_PATCH_PROPOSAL_PROFILE, FOLIO_DOCX_XML_PATCH_PROPOSAL_VERSION, FOLIO_RESOLVED_REVIEWED_VIEWS, FOLIO_REVIEWED_VIEWS, FOLIO_VERSION_COMPARISON_PRIVACY_TRANSFORMS, FOLIO_VERSION_COMPARISON_SCOPES, type FolioAIBlock, type FolioAIBlockAnchor, type FolioAIBlockKind, type FolioAIBlockPreviewRun, type FolioAIComment, type FolioAIEditApplyMode, type FolioAIEditApplyResult, type FolioAIEditOperation, type FolioAIEditPrecondition, type FolioAIEditSnapshot, type FolioAIInlineFormatting, type FolioAITextRangeHandle, type FolioApplyDocumentOperationsOptions, type FolioApplyDocumentOperationsToStoryOptions, type FolioApplyOperationsOptions, type FolioBlockDiff, type FolioBlockId, type FolioCompareDocxVersionsOptions, type FolioDocumentMetadataProperty, type FolioDocumentMetadataValue, type FolioDocumentNavigationTarget, type FolioDocumentOperation, type FolioDocumentOperationAffectedTarget, type FolioDocumentOperationBatch, type FolioDocumentOperationCapabilities, type FolioDocumentOperationIssue, type FolioDocumentOperationMode, type FolioDocumentOperationPrecondition, type FolioDocumentOperationReceipt, type FolioDocumentOperationRecovery, type FolioDocumentOperationResult, type FolioDocumentOperationStatus, type FolioDocumentOperationStory, type FolioDocumentOperationType, type FolioDocumentOperationUndoFailureReason, type FolioDocumentOperationUndoHandle, type FolioDocumentOperationUndoResult, type FolioDocumentOutline, type FolioDocumentOutlineEntry, FolioDocumentPrivacyArchiveError, type FolioDocumentPrivacyOptions, type FolioDocumentPrivacyReport, type FolioDocumentPrivacyTransform, type FolioDocumentSection, type FolioDocumentSectionHandle, type FolioDocumentSectionReadResult, type FolioDocumentStory, type FolioDocumentStoryHandle, FolioDocumentStoryNotFoundError, type FolioDocxConformanceCheck, type FolioDocxConformanceCheckId, type FolioDocxConformanceCheckStatus, type FolioDocxConformanceIssue, type FolioDocxConformanceIssueCode, type FolioDocxConformanceReport, type FolioDocxConformanceStatus, type FolioDocxInspectedXmlPart, type FolioDocxPackageInspection, FolioDocxPackageInspectionError, type FolioDocxPackageInspectionErrorCode, type FolioDocxPackageInspectionLimits, type FolioDocxPackagePart, type FolioDocxPackagePartKind, type FolioDocxPreparedXmlReplacement, FolioDocxReviewer, type FolioDocxReviewerOptions, type FolioDocxXmlPatchApplication, FolioDocxXmlPatchApplicationError, type FolioDocxXmlPatchApplicationReceipt, type FolioDocxXmlPatchProposal, type FolioDocxXmlPatchProposalEvaluation, type FolioDocxXmlPatchProposalIssue, type FolioDocxXmlPatchProposalIssueCode, type FolioDocxXmlPatchProposalLimits, type FolioDocxXmlReplacement, type FolioEditableDocumentStoryHandle, type FolioFormatProperty, type FolioMetadataDiff, type FolioReadReviewedStoryOptions, type FolioResolveReviewedStoryOptions, type FolioResolvedReviewedView, type FolioReviewChange, type FolioReviewChangeFilter, type FolioReviewChangeKind, type FolioReviewComment, type FolioReviewCommentFilter, type FolioReviewCommentReply, type FolioReviewReplyInput, type FolioReviewedStory, type FolioReviewedView, type FolioStoryDiff, type FolioVersionBlockHandle, type FolioVersionComparisonPrivacyTransform, type FolioVersionComparisonScope, type FolioVersionDiff, type FolioVersionDiffPrivacyOptions, type FolioVersionDiffPrivacyReport, type FolioVersionDiffSegment, type FolioVersionDiffSummaryCounts, type GenerateRedlineDocxOptions, type GenerateRedlineDocxResult, type GenerateRedlineUnprocessedStory, type InspectDocxPackageOptions, InvalidFolioDocumentOperationBatchError, InvalidFolioDocumentPrivacyOptionsError, InvalidFolioDocxXmlPatchProposalError, InvalidFolioDocxXmlPatchProposalOptionsError, InvalidFolioVersionComparisonOptionsError, InvalidGenerateRedlineDocxOptionsError, type RewriteDocxMetadataPrivacyResult, STELLA_STYLE_SET_NAME, UnsupportedFolioDocumentOperationVersionError, UnsupportedFolioDocxXmlPatchApplicationProfileError, UnsupportedFolioReviewedViewError, type ValidateDocxConformanceOptions, applyDocxXmlPatchProposal, applyFolioAIEditsToBuffer, applyFolioVersionDiffPrivacy, assertSupportedFolioDocumentOperationVersion, compareDocxVersions, createDocx, createEmptyDocument, createFolioAITextRangeHandle, createStellaStyleDocumentPreset, createStellaStyleSet, deriveBlockId, docxToMarkdown, ensureParaIds, evaluateDocxXmlPatchProposal, extractDocumentStyleSet, extractDocumentStyleSetFromDocx, extractDocxText, generateRedlineDocx, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioDocumentOutline, getFolioParaIdFromBlockId, hashFolioAIBlockText, inspectDocumentStyles, inspectDocumentStylesFromDocx, inspectDocxPackage, isFolioBlockId, isFolioDocumentOperationModeSupported, isFolioDocumentPrivacyTransform, isFolioResolvedReviewedView, isFolioReviewedView, isFolioVersionComparisonPrivacyTransform, isFolioVersionComparisonScope, isSequentialFolioBlockId, isSupportedFolioDocumentOperationVersion, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, parseFolioDocxXmlPatchProposal, readFolioDocumentSection, replyToComment, rewriteDocxMetadataPrivacy, validateDocxConformance };
@@ -0,0 +1,49 @@
1
+ //#region src/utils/cursiveJoining.d.ts
2
+ /**
3
+ * Cursive-joining queries for scripts whose letters change shape by position.
4
+ *
5
+ * In Arabic, Syriac, N'Ko, Adlam and friends a letter's glyph depends on its
6
+ * neighbours: isolated, initial, medial or final. Shaping stops at an element
7
+ * boundary whenever the two sides resolve to a different font face, so a run
8
+ * split inside a word — bold on one letter, a different size, a different
9
+ * family — makes the word come apart visually, while Word joins straight
10
+ * through it. These predicates say whether a given split severed a connection,
11
+ * so the painter and the measurer can repair it identically.
12
+ *
13
+ * A boundary where both sides share a face is NOT a problem: browsers shape
14
+ * across inline boxes when no shaping-relevant property changes, so ordinary
15
+ * colour or underline marks (tracked changes, comment anchors) already join.
16
+ *
17
+ * The tables come from the pinned UCD via `scripts/generate-joining-types.ts`;
18
+ * see {@link joiningTypes.gen} for why they are generated rather than authored.
19
+ */
20
+ /** Joining_Type D, L or C: this code point can connect to the one after it. */
21
+ declare const joinsToFollowing: (cp: number) => boolean;
22
+ /** Joining_Type D, R or C: this code point can connect to the one before it. */
23
+ declare const joinsToPreceding: (cp: number) => boolean;
24
+ /**
25
+ * Joining_Type T: invisible to joining. Combining marks (harakat, Syriac
26
+ * vowels) sit between two letters without breaking their connection, so they
27
+ * must be skipped when looking for a joining neighbour.
28
+ */
29
+ declare const isJoiningTransparent: (cp: number) => boolean;
30
+ /** Joining_Type D, L or R: a cursive letter, as opposed to ZWJ or punctuation. */
31
+ declare const isCursiveLetter: (cp: number) => boolean;
32
+ /**
33
+ * Whether the text contains any cursive letter at all.
34
+ *
35
+ * Callers gate on this so the all-Latin hot path never pays for joining
36
+ * analysis, mirroring how `hasCjk` gates script segmentation.
37
+ */
38
+ declare function hasCursiveLetter(text: string): boolean;
39
+ /**
40
+ * Whether `before` and `after` were cursively connected before something split
41
+ * them apart.
42
+ *
43
+ * True means the two sides need a joiner to keep rendering as one word. False
44
+ * means the split is harmless: a space, a non-joining letter such as alef on
45
+ * the left of the cut, punctuation, or a script that does not join at all.
46
+ */
47
+ declare function joinsAcrossBoundary(before: string, after: string): boolean;
48
+ //#endregion
49
+ export { hasCursiveLetter, isCursiveLetter, isJoiningTransparent, joinsAcrossBoundary, joinsToFollowing, joinsToPreceding };
@@ -0,0 +1,97 @@
1
+ import { JOINING_LETTER_RANGES, JOINING_TRANSPARENT_RANGES, JOINS_BACKWARD_RANGES, JOINS_FORWARD_RANGES } from "./joiningTypes.gen.js";
2
+ //#region src/utils/cursiveJoining.ts
3
+ /**
4
+ * Cursive-joining queries for scripts whose letters change shape by position.
5
+ *
6
+ * In Arabic, Syriac, N'Ko, Adlam and friends a letter's glyph depends on its
7
+ * neighbours: isolated, initial, medial or final. Shaping stops at an element
8
+ * boundary whenever the two sides resolve to a different font face, so a run
9
+ * split inside a word — bold on one letter, a different size, a different
10
+ * family — makes the word come apart visually, while Word joins straight
11
+ * through it. These predicates say whether a given split severed a connection,
12
+ * so the painter and the measurer can repair it identically.
13
+ *
14
+ * A boundary where both sides share a face is NOT a problem: browsers shape
15
+ * across inline boxes when no shaping-relevant property changes, so ordinary
16
+ * colour or underline marks (tracked changes, comment anchors) already join.
17
+ *
18
+ * The tables come from the pinned UCD via `scripts/generate-joining-types.ts`;
19
+ * see {@link joiningTypes.gen} for why they are generated rather than authored.
20
+ */
21
+ /**
22
+ * Membership test over a flat sorted `[start, end, …]` inclusive-range list.
23
+ *
24
+ * Binary search rather than `.some()`: the transparent table alone is 375
25
+ * ranges, and these run per code point on every measured word.
26
+ */
27
+ function inRanges(ranges, cp) {
28
+ let low = 0;
29
+ let high = ranges.length / 2 - 1;
30
+ while (low <= high) {
31
+ const mid = low + high >> 1;
32
+ const start = ranges[mid * 2];
33
+ const end = ranges[mid * 2 + 1];
34
+ if (cp < start) high = mid - 1;
35
+ else if (cp > end) low = mid + 1;
36
+ else return true;
37
+ }
38
+ return false;
39
+ }
40
+ /** Joining_Type D, L or C: this code point can connect to the one after it. */
41
+ const joinsToFollowing = (cp) => inRanges(JOINS_FORWARD_RANGES, cp);
42
+ /** Joining_Type D, R or C: this code point can connect to the one before it. */
43
+ const joinsToPreceding = (cp) => inRanges(JOINS_BACKWARD_RANGES, cp);
44
+ /**
45
+ * Joining_Type T: invisible to joining. Combining marks (harakat, Syriac
46
+ * vowels) sit between two letters without breaking their connection, so they
47
+ * must be skipped when looking for a joining neighbour.
48
+ */
49
+ const isJoiningTransparent = (cp) => inRanges(JOINING_TRANSPARENT_RANGES, cp);
50
+ /** Joining_Type D, L or R: a cursive letter, as opposed to ZWJ or punctuation. */
51
+ const isCursiveLetter = (cp) => inRanges(JOINING_LETTER_RANGES, cp);
52
+ /**
53
+ * Whether the text contains any cursive letter at all.
54
+ *
55
+ * Callers gate on this so the all-Latin hot path never pays for joining
56
+ * analysis, mirroring how `hasCjk` gates script segmentation.
57
+ */
58
+ function hasCursiveLetter(text) {
59
+ for (const ch of text) if (isCursiveLetter(ch.codePointAt(0))) return true;
60
+ return false;
61
+ }
62
+ /** Last code point of `text` that joining can see, skipping transparents. */
63
+ function lastJoiningRelevantCodePoint(text) {
64
+ let index = text.length;
65
+ while (index > 0) {
66
+ const unit = text.charCodeAt(index - 1);
67
+ const isLowSurrogate = unit >= 56320 && unit <= 57343;
68
+ const high = isLowSurrogate ? text.charCodeAt(index - 2) : NaN;
69
+ const start = isLowSurrogate && high >= 55296 && high <= 56319 ? index - 2 : index - 1;
70
+ const cp = text.codePointAt(start);
71
+ if (!isJoiningTransparent(cp)) return cp;
72
+ index = start;
73
+ }
74
+ }
75
+ /** First code point of `text` that joining can see, skipping transparents. */
76
+ function firstJoiningRelevantCodePoint(text) {
77
+ for (const ch of text) {
78
+ const cp = ch.codePointAt(0);
79
+ if (!isJoiningTransparent(cp)) return cp;
80
+ }
81
+ }
82
+ /**
83
+ * Whether `before` and `after` were cursively connected before something split
84
+ * them apart.
85
+ *
86
+ * True means the two sides need a joiner to keep rendering as one word. False
87
+ * means the split is harmless: a space, a non-joining letter such as alef on
88
+ * the left of the cut, punctuation, or a script that does not join at all.
89
+ */
90
+ function joinsAcrossBoundary(before, after) {
91
+ const previous = lastJoiningRelevantCodePoint(before);
92
+ if (previous === void 0 || !joinsToFollowing(previous)) return false;
93
+ const next = firstJoiningRelevantCodePoint(after);
94
+ return next !== void 0 && joinsToPreceding(next);
95
+ }
96
+ //#endregion
97
+ export { hasCursiveLetter, isCursiveLetter, isJoiningTransparent, joinsAcrossBoundary, joinsToFollowing, joinsToPreceding };
@@ -0,0 +1,26 @@
1
+ //#region src/utils/joiningTypes.gen.d.ts
2
+ /**
3
+ * GENERATED FILE — do not edit.
4
+ *
5
+ * Unicode Joining_Type ranges, derived from the pinned UCD sources by
6
+ * `scripts/generate-joining-types.ts`. Regenerate with:
7
+ *
8
+ * bun run generate:joining-types
9
+ *
10
+ * ArabicShaping.txt: 17.0.0
11
+ * DerivedGeneralCategory.txt: 17.0.0
12
+ *
13
+ * Each table is a flat sorted `[start, end, …]` list of inclusive code-point
14
+ * ranges. Transparent is dominated by the General_Category Mn/Me/Cf default,
15
+ * which is why it is by far the largest table.
16
+ */
17
+ /** Joining_Type D, L or C: connects to the FOLLOWING character. */
18
+ declare const JOINS_FORWARD_RANGES: readonly number[];
19
+ /** Joining_Type D, R or C: connects to the PRECEDING character. */
20
+ declare const JOINS_BACKWARD_RANGES: readonly number[];
21
+ /** Joining_Type T: transparent, skipped when looking for a joining neighbour. */
22
+ declare const JOINING_TRANSPARENT_RANGES: readonly number[];
23
+ /** Joining_Type D, L or R: a cursive letter. Gates the whole joining path. */
24
+ declare const JOINING_LETTER_RANGES: readonly number[];
25
+ //#endregion
26
+ export { JOINING_LETTER_RANGES, JOINING_TRANSPARENT_RANGES, JOINS_BACKWARD_RANGES, JOINS_FORWARD_RANGES };