@stll/folio-core 0.6.1 → 0.8.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/ai-edits/blockRange.d.ts +13 -2
- package/dist/ai-edits/blockRange.js +23 -2
- package/dist/ai-edits/index.d.ts +4 -2
- package/dist/ai-edits/index.js +3 -1
- package/dist/ai-edits/scoped-reading.d.ts +9 -0
- package/dist/ai-edits/scoped-reading.js +60 -0
- package/dist/ai-edits/snapshot.js +13 -4
- package/dist/ai-edits/types.d.ts +44 -2
- package/dist/compat/eigenpal.d.ts +5 -2
- package/dist/compat/eigenpal.js +4 -1
- package/dist/controller/fontReadiness.d.ts +29 -0
- package/dist/controller/fontReadiness.js +139 -0
- package/dist/controller/layoutPipeline.js +86 -11
- package/dist/docx/blockContentParser.js +51 -8
- package/dist/docx/capabilities.d.ts +41 -0
- package/dist/docx/capabilities.js +322 -0
- package/dist/docx/compatibility.d.ts +34 -2
- package/dist/docx/compatibility.js +128 -38
- package/dist/docx/conformance.d.ts +6 -0
- package/dist/docx/conformance.js +18 -0
- package/dist/docx/ensureParaIds.d.ts +29 -0
- package/dist/docx/ensureParaIds.js +423 -0
- package/dist/docx/groupDrawingParser.d.ts +1 -1
- package/dist/docx/groupDrawingParser.js +49 -8
- package/dist/docx/numberingParser.js +1 -0
- package/dist/docx/paragraphParser.js +9 -0
- package/dist/docx/paragraphTextBoxEnrichment.js +141 -2
- package/dist/docx/parser.js +2 -0
- package/dist/docx/runParser.js +11 -2
- package/dist/docx/selectiveXmlPatch.d.ts +10 -1
- package/dist/docx/selectiveXmlPatch.js +1 -1
- package/dist/docx/serializer/paragraphSerializer.js +4 -0
- package/dist/docx/serializer/runSerializer.js +7 -2
- package/dist/docx/serializer/tableSerializer.js +4 -0
- package/dist/docx/server/boundedArchive.d.ts +24 -0
- package/dist/docx/server/boundedArchive.js +106 -0
- package/dist/docx/server/extractDocxText.d.ts +23 -0
- package/dist/docx/server/extractDocxText.js +154 -0
- package/dist/docx/tableParser.js +8 -0
- package/dist/docx/textBoxParser.js +6 -1
- package/dist/docx/vmlImageParser.js +145 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +4 -1
- package/dist/layout-bridge/convert/headerFooterLayout.js +16 -2
- package/dist/layout-bridge/convert/paragraphFrames.d.ts +7 -0
- package/dist/layout-bridge/convert/paragraphFrames.js +136 -0
- package/dist/layout-bridge/convert/toFlowBlocks.js +106 -13
- package/dist/layout-bridge/engine/hitTest.js +2 -1
- package/dist/layout-bridge/engine/selectionRects.js +2 -1
- package/dist/layout-engine/headerFooterRefs.d.ts +7 -0
- package/dist/layout-engine/headerFooterRefs.js +40 -0
- package/dist/layout-engine/index.d.ts +3 -2
- package/dist/layout-engine/index.js +125 -72
- package/dist/layout-engine/keep-together.d.ts +7 -5
- package/dist/layout-engine/keep-together.js +20 -4
- package/dist/layout-engine/measure/cache.js +2 -0
- package/dist/layout-engine/measure/listMarkerWidth.d.ts +3 -1
- package/dist/layout-engine/measure/listMarkerWidth.js +23 -4
- package/dist/layout-engine/measure/measureBlocks.d.ts +3 -0
- package/dist/layout-engine/measure/measureBlocks.js +133 -51
- package/dist/layout-engine/measure/measureParagraph.js +42 -15
- package/dist/layout-engine/measure/tableCellGrid.d.ts +15 -0
- package/dist/layout-engine/measure/tableCellGrid.js +62 -0
- package/dist/layout-engine/measure/textBoxParagraphLayout.d.ts +18 -0
- package/dist/layout-engine/measure/textBoxParagraphLayout.js +32 -0
- package/dist/layout-engine/paginator.d.ts +2 -1
- package/dist/layout-engine/paginator.js +17 -8
- package/dist/layout-engine/paragraphFrame.d.ts +22 -0
- package/dist/layout-engine/paragraphFrame.js +17 -0
- package/dist/layout-engine/paragraphSequence.d.ts +7 -0
- package/dist/layout-engine/paragraphSequence.js +25 -0
- package/dist/layout-engine/paragraphSpacing.d.ts +17 -0
- package/dist/layout-engine/paragraphSpacing.js +30 -0
- package/dist/layout-engine/renderedBreakReconciliation.d.ts +58 -0
- package/dist/layout-engine/renderedBreakReconciliation.js +63 -0
- package/dist/layout-engine/types.d.ts +31 -10
- package/dist/layout-engine/types.js +15 -2
- package/dist/layout-painter/renderPage.js +2 -2
- package/dist/layout-painter/renderParagraph.js +94 -10
- package/dist/layout-painter/renderTable.js +42 -12
- package/dist/layout-painter/renderTextBox.js +17 -7
- package/dist/managers/DocumentLoaderManager.js +1 -1
- package/dist/paged-layout/sectionBlockWidths.d.ts +3 -0
- package/dist/paged-layout/sectionBlockWidths.js +9 -0
- package/dist/paged-layout/sectionGeometry.js +1 -1
- package/dist/prosemirror/attrs/index.js +11 -0
- package/dist/prosemirror/conversion/fromProseDoc.js +2 -0
- package/dist/prosemirror/conversion/toProseDoc.js +29 -23
- package/dist/prosemirror/extensions/core/ParagraphExtension.js +1 -0
- package/dist/prosemirror/extensions/features/ListExtension.js +1 -0
- package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.js +68 -16
- package/dist/prosemirror/extensions/nodes/TableExtension.js +1 -0
- package/dist/prosemirror/extensions/nodes/TextBoxExtension.d.ts +2 -1
- package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +7 -0
- package/dist/prosemirror/schema/nodes.d.ts +6 -3
- package/dist/prosemirror/styles/resolvedStyleAttrs.js +1 -0
- package/dist/prosemirror/utils/tabCalculator.js +1 -1
- package/dist/server.d.ts +6 -2
- package/dist/server.js +5 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/utils/createDocument.js +26 -18
- package/dist/utils/formatToStyle.js +3 -3
- package/dist/utils/hexId.d.ts +8 -1
- package/dist/utils/hexId.js +11 -3
- package/dist/utils/units.d.ts +6 -6
- package/dist/utils/units.js +8 -8
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FolioAIEditSnapshot } from "./types.js";
|
|
1
|
+
import { FolioAIEditSnapshot, FolioAITextRangeHandle } from "./types.js";
|
|
2
2
|
import { Node } from "prosemirror-model";
|
|
3
3
|
|
|
4
4
|
//#region src/ai-edits/blockRange.d.ts
|
|
@@ -16,6 +16,17 @@ declare const resolveFolioAIBlockRange: ({
|
|
|
16
16
|
doc,
|
|
17
17
|
snapshot
|
|
18
18
|
}: ResolveFolioAIBlockRangeOptions) => DocPositionRange | null;
|
|
19
|
+
type ResolveFolioAITextRangeOptions = {
|
|
20
|
+
range: FolioAITextRangeHandle;
|
|
21
|
+
doc: Node;
|
|
22
|
+
snapshot?: FolioAIEditSnapshot | null | undefined;
|
|
23
|
+
};
|
|
24
|
+
/** Resolve and validate a stable text-range handle against the live document. */
|
|
25
|
+
declare const resolveFolioAITextRange: ({
|
|
26
|
+
range,
|
|
27
|
+
doc,
|
|
28
|
+
snapshot
|
|
29
|
+
}: ResolveFolioAITextRangeOptions) => DocPositionRange | null;
|
|
19
30
|
/**
|
|
20
31
|
* Clamp a `{from, to}` pair so both endpoints fit inside a document of
|
|
21
32
|
* `docSize` (in PM content positions). Block-boundary snapshots and stale
|
|
@@ -30,4 +41,4 @@ declare const resolveFolioAIBlockRange: ({
|
|
|
30
41
|
*/
|
|
31
42
|
declare function clampRangeToDocSize(docSize: number, range: DocPositionRange): DocPositionRange;
|
|
32
43
|
//#endregion
|
|
33
|
-
export { DocPositionRange, clampRangeToDocSize, resolveFolioAIBlockRange };
|
|
44
|
+
export { DocPositionRange, clampRangeToDocSize, resolveFolioAIBlockRange, resolveFolioAITextRange };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getFolioParaIdFromBlockId, getSequentialFolioBlockIdIndex } from "../types/block-id.js";
|
|
2
|
-
import {
|
|
2
|
+
import { buildCleanBlockText } from "./clean-text.js";
|
|
3
|
+
import { createFolioAIEditSnapshot, hashFolioAIBlockText } from "./snapshot.js";
|
|
3
4
|
import { findParagraphByParaId } from "../prosemirror/utils/findParagraphByParaId.js";
|
|
4
5
|
//#region src/ai-edits/blockRange.ts
|
|
5
6
|
const resolveFolioAIBlockRange = ({ blockId, doc, snapshot }) => {
|
|
@@ -16,6 +17,26 @@ const resolveFolioAIBlockRange = ({ blockId, doc, snapshot }) => {
|
|
|
16
17
|
if (!anchor) return null;
|
|
17
18
|
return clampRangeToDocSize(doc.content.size, anchor);
|
|
18
19
|
};
|
|
20
|
+
/** Resolve and validate a stable text-range handle against the live document. */
|
|
21
|
+
const resolveFolioAITextRange = ({ range, doc, snapshot }) => {
|
|
22
|
+
const blockRange = resolveFolioAIBlockRange({
|
|
23
|
+
blockId: range.blockId,
|
|
24
|
+
doc,
|
|
25
|
+
snapshot
|
|
26
|
+
});
|
|
27
|
+
if (blockRange === null) return null;
|
|
28
|
+
const blockNode = doc.nodeAt(blockRange.from);
|
|
29
|
+
if (!blockNode?.isTextblock) return null;
|
|
30
|
+
const cleanBlock = buildCleanBlockText(blockNode, blockRange.from);
|
|
31
|
+
const from = cleanBlock.offsets[range.startOffset];
|
|
32
|
+
const to = cleanBlock.offsets[range.endOffset];
|
|
33
|
+
if (from === void 0 || to === void 0) return null;
|
|
34
|
+
if (hashFolioAIBlockText(cleanBlock.text.slice(range.startOffset, range.endOffset)) !== range.selectedTextHash) return null;
|
|
35
|
+
return clampRangeToDocSize(doc.content.size, {
|
|
36
|
+
from,
|
|
37
|
+
to
|
|
38
|
+
});
|
|
39
|
+
};
|
|
19
40
|
/**
|
|
20
41
|
* Resolve a `seq-NNNN` fallback id by document position.
|
|
21
42
|
*
|
|
@@ -55,4 +76,4 @@ function clampRangeToDocSize(docSize, range) {
|
|
|
55
76
|
};
|
|
56
77
|
}
|
|
57
78
|
//#endregion
|
|
58
|
-
export { clampRangeToDocSize, resolveFolioAIBlockRange };
|
|
79
|
+
export { clampRangeToDocSize, resolveFolioAIBlockRange, resolveFolioAITextRange };
|
package/dist/ai-edits/index.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { FolioAIBlock, FolioAIBlockAnchor, FolioAIBlockKind, FolioAIBlockPreviewRun, FolioAIComment, FolioAIEditAppliedOperation, FolioAIEditApplyMode, FolioAIEditApplyResult, FolioAIEditOperation, FolioAIEditPrecondition, FolioAIEditReviewMeta, FolioAIEditSeverity, FolioAIEditSkipReason, FolioAIEditSkippedOperation, FolioAIEditSnapshot, FolioAIInlineFormatting, FolioAISignatureParty, FolioAITextRangeHandle } from "./types.js";
|
|
1
|
+
import { FolioAIBlock, FolioAIBlockAnchor, FolioAIBlockKind, FolioAIBlockPreviewRun, FolioAIComment, FolioAIEditAppliedOperation, FolioAIEditApplyMode, FolioAIEditApplyResult, FolioAIEditOperation, FolioAIEditPrecondition, FolioAIEditReviewMeta, FolioAIEditSeverity, FolioAIEditSkipReason, FolioAIEditSkippedOperation, FolioAIEditSnapshot, FolioAIInlineFormatting, FolioAISignatureParty, FolioAITextRangeHandle, FolioDocumentNavigationTarget, FolioDocumentOutline, FolioDocumentOutlineEntry, FolioDocumentSection, FolioDocumentSectionHandle, FolioDocumentSectionReadResult } from "./types.js";
|
|
2
2
|
import { FolioAIEditView, applyFolioAIEditOperations } from "./apply.js";
|
|
3
|
+
import { DocPositionRange, clampRangeToDocSize, resolveFolioAIBlockRange, resolveFolioAITextRange } from "./blockRange.js";
|
|
3
4
|
import { buildAnnotatedBlockText } from "./clean-text.js";
|
|
4
5
|
import { ApplyFolioDocumentOperationsOptions, 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, FolioDocumentOperation, FolioDocumentOperationAffectedTarget, FolioDocumentOperationBatch, FolioDocumentOperationCapabilities, FolioDocumentOperationIssue, FolioDocumentOperationMode, FolioDocumentOperationPrecondition, FolioDocumentOperationReceipt, FolioDocumentOperationRecovery, FolioDocumentOperationResult, FolioDocumentOperationStatus, FolioDocumentOperationType, FolioDocumentOperationUndoFailureReason, FolioDocumentOperationUndoHandle, FolioDocumentOperationUndoResult, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch } from "../document-operations.js";
|
|
5
6
|
import { FolioCommentAnchor, FolioReviewChange, FolioReviewChangeKind, getCommentAnchorsFromDoc, getTrackedChangesFromDoc } from "./read.js";
|
|
6
7
|
import { FolioDocumentStory, FolioDocumentStoryHandle } from "./headless.js";
|
|
7
8
|
import { createFolioAIEditSnapshot, createFolioAITextRangeHandle, hashFolioAIBlockText, normalizeFolioAIBlockText } from "./snapshot.js";
|
|
9
|
+
import { getFolioDocumentOutline, readFolioDocumentSection } from "./scoped-reading.js";
|
|
8
10
|
import { getFolioParaIdFromBlockId } from "../types/block-id.js";
|
|
9
11
|
import { WordDiffSegment, diffWordSegments } from "./word-diff.js";
|
|
10
|
-
export { type ApplyFolioDocumentOperationsOptions, 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, type FolioAIBlock, type FolioAIBlockAnchor, type FolioAIBlockKind, type FolioAIBlockPreviewRun, type FolioAIComment, type FolioAIEditAppliedOperation, type FolioAIEditApplyMode, type FolioAIEditApplyResult, type FolioAIEditOperation, type FolioAIEditPrecondition, type FolioAIEditReviewMeta, type FolioAIEditSeverity, type FolioAIEditSkipReason, type FolioAIEditSkippedOperation, type FolioAIEditSnapshot, type FolioAIEditView, type FolioAIInlineFormatting, type FolioAISignatureParty, type FolioAITextRangeHandle, type FolioCommentAnchor, type FolioDocumentOperation, type FolioDocumentOperationAffectedTarget, type FolioDocumentOperationBatch, type FolioDocumentOperationCapabilities, type FolioDocumentOperationIssue, type FolioDocumentOperationMode, type FolioDocumentOperationPrecondition, type FolioDocumentOperationReceipt, type FolioDocumentOperationRecovery, type FolioDocumentOperationResult, type FolioDocumentOperationStatus, type FolioDocumentOperationType, type FolioDocumentOperationUndoFailureReason, type FolioDocumentOperationUndoHandle, type FolioDocumentOperationUndoResult, type FolioDocumentStory, type FolioDocumentStoryHandle, type FolioReviewChange, type FolioReviewChangeKind, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, type WordDiffSegment, applyFolioAIEditOperations, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, buildAnnotatedBlockText, createFolioAIEditSnapshot, createFolioAITextRangeHandle, diffWordSegments, getCommentAnchorsFromDoc, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioParaIdFromBlockId, getTrackedChangesFromDoc, hashFolioAIBlockText, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch };
|
|
12
|
+
export { type ApplyFolioDocumentOperationsOptions, type DocPositionRange, 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, type FolioAIBlock, type FolioAIBlockAnchor, type FolioAIBlockKind, type FolioAIBlockPreviewRun, type FolioAIComment, type FolioAIEditAppliedOperation, type FolioAIEditApplyMode, type FolioAIEditApplyResult, type FolioAIEditOperation, type FolioAIEditPrecondition, type FolioAIEditReviewMeta, type FolioAIEditSeverity, type FolioAIEditSkipReason, type FolioAIEditSkippedOperation, type FolioAIEditSnapshot, type FolioAIEditView, type FolioAIInlineFormatting, type FolioAISignatureParty, type FolioAITextRangeHandle, type FolioCommentAnchor, 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 FolioDocumentOperationType, type FolioDocumentOperationUndoFailureReason, type FolioDocumentOperationUndoHandle, type FolioDocumentOperationUndoResult, type FolioDocumentOutline, type FolioDocumentOutlineEntry, type FolioDocumentSection, type FolioDocumentSectionHandle, type FolioDocumentSectionReadResult, type FolioDocumentStory, type FolioDocumentStoryHandle, type FolioReviewChange, type FolioReviewChangeKind, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, type WordDiffSegment, applyFolioAIEditOperations, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, buildAnnotatedBlockText, clampRangeToDocSize, createFolioAIEditSnapshot, createFolioAITextRangeHandle, diffWordSegments, getCommentAnchorsFromDoc, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioDocumentOutline, getFolioParaIdFromBlockId, getTrackedChangesFromDoc, hashFolioAIBlockText, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, readFolioDocumentSection, resolveFolioAIBlockRange, resolveFolioAITextRange };
|
package/dist/ai-edits/index.js
CHANGED
|
@@ -4,5 +4,7 @@ import { createFolioAIEditSnapshot, createFolioAITextRangeHandle, hashFolioAIBlo
|
|
|
4
4
|
import { diffWordSegments } from "./word-diff.js";
|
|
5
5
|
import { applyFolioAIEditOperations } from "./apply.js";
|
|
6
6
|
import { 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, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch } from "../document-operations.js";
|
|
7
|
+
import { clampRangeToDocSize, resolveFolioAIBlockRange, resolveFolioAITextRange } from "./blockRange.js";
|
|
7
8
|
import { getCommentAnchorsFromDoc, getTrackedChangesFromDoc } from "./read.js";
|
|
8
|
-
|
|
9
|
+
import { getFolioDocumentOutline, readFolioDocumentSection } from "./scoped-reading.js";
|
|
10
|
+
export { 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, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, applyFolioAIEditOperations, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, buildAnnotatedBlockText, clampRangeToDocSize, createFolioAIEditSnapshot, createFolioAITextRangeHandle, diffWordSegments, getCommentAnchorsFromDoc, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioDocumentOutline, getFolioParaIdFromBlockId, getTrackedChangesFromDoc, hashFolioAIBlockText, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, readFolioDocumentSection, resolveFolioAIBlockRange, resolveFolioAITextRange };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FolioAIEditSnapshot, FolioDocumentOutline, FolioDocumentSectionHandle, FolioDocumentSectionReadResult } from "./types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/ai-edits/scoped-reading.d.ts
|
|
4
|
+
/** Build a flat, ordered outline with stable handles and explicit parents. */
|
|
5
|
+
declare const getFolioDocumentOutline: (snapshot: FolioAIEditSnapshot) => FolioDocumentOutline;
|
|
6
|
+
/** Resolve one heading section against a fresh snapshot without guessing. */
|
|
7
|
+
declare const readFolioDocumentSection: (snapshot: FolioAIEditSnapshot, handle: FolioDocumentSectionHandle) => FolioDocumentSectionReadResult;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { getFolioDocumentOutline, readFolioDocumentSection };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
//#region src/ai-edits/scoped-reading.ts
|
|
2
|
+
const toSectionHandle = (snapshot, headingBlockId, headingLevel) => {
|
|
3
|
+
const headingTextHash = snapshot.anchors[headingBlockId]?.textHash;
|
|
4
|
+
if (headingTextHash === void 0) return null;
|
|
5
|
+
return {
|
|
6
|
+
type: "headingSection",
|
|
7
|
+
story: "main",
|
|
8
|
+
headingBlockId,
|
|
9
|
+
headingTextHash,
|
|
10
|
+
headingLevel
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
/** Build a flat, ordered outline with stable handles and explicit parents. */
|
|
14
|
+
const getFolioDocumentOutline = (snapshot) => {
|
|
15
|
+
const sections = [];
|
|
16
|
+
const parentStack = [];
|
|
17
|
+
for (const block of snapshot.blocks) {
|
|
18
|
+
if (block.headingLevel === void 0) continue;
|
|
19
|
+
const handle = toSectionHandle(snapshot, block.id, block.headingLevel);
|
|
20
|
+
if (handle === null) continue;
|
|
21
|
+
while ((parentStack.at(-1)?.level ?? 0) >= block.headingLevel) parentStack.pop();
|
|
22
|
+
const parentHandle = parentStack.at(-1)?.handle;
|
|
23
|
+
const entry = {
|
|
24
|
+
handle,
|
|
25
|
+
headingBlockId: block.id,
|
|
26
|
+
text: block.text,
|
|
27
|
+
level: block.headingLevel,
|
|
28
|
+
...parentHandle !== void 0 && { parentHandle }
|
|
29
|
+
};
|
|
30
|
+
sections.push(entry);
|
|
31
|
+
parentStack.push(entry);
|
|
32
|
+
}
|
|
33
|
+
return { sections };
|
|
34
|
+
};
|
|
35
|
+
/** Resolve one heading section against a fresh snapshot without guessing. */
|
|
36
|
+
const readFolioDocumentSection = (snapshot, handle) => {
|
|
37
|
+
const heading = getFolioDocumentOutline(snapshot).sections.find(({ headingBlockId }) => headingBlockId === handle.headingBlockId);
|
|
38
|
+
if (heading === void 0) return { status: "missing" };
|
|
39
|
+
if (heading.handle.headingTextHash !== handle.headingTextHash || heading.level !== handle.headingLevel) return { status: "stale" };
|
|
40
|
+
const startIndex = snapshot.blocks.findIndex(({ id }) => id === handle.headingBlockId);
|
|
41
|
+
if (startIndex === -1) return { status: "missing" };
|
|
42
|
+
let endIndex = snapshot.blocks.length;
|
|
43
|
+
for (let index = startIndex + 1; index < snapshot.blocks.length; index++) {
|
|
44
|
+
const block = snapshot.blocks.at(index);
|
|
45
|
+
if (block?.headingLevel !== void 0 && block.headingLevel <= heading.level) {
|
|
46
|
+
endIndex = index;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
status: "found",
|
|
52
|
+
section: {
|
|
53
|
+
handle,
|
|
54
|
+
heading,
|
|
55
|
+
blocks: snapshot.blocks.slice(startIndex, endIndex)
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
//#endregion
|
|
60
|
+
export { getFolioDocumentOutline, readFolioDocumentSection };
|
|
@@ -38,7 +38,8 @@ const createFolioAIEditSnapshot = (doc) => {
|
|
|
38
38
|
taken: usedBlockIds
|
|
39
39
|
});
|
|
40
40
|
usedBlockIds.add(id);
|
|
41
|
-
const
|
|
41
|
+
const headingLevel = getHeadingLevel(node);
|
|
42
|
+
const kind = getBlockKind(node, headingLevel);
|
|
42
43
|
const displayLabel = getDisplayLabel(node);
|
|
43
44
|
const styleId = getStyleId(node);
|
|
44
45
|
const previewRuns = getPreviewRuns(node);
|
|
@@ -47,6 +48,7 @@ const createFolioAIEditSnapshot = (doc) => {
|
|
|
47
48
|
id,
|
|
48
49
|
kind,
|
|
49
50
|
text,
|
|
51
|
+
...headingLevel !== void 0 && { headingLevel },
|
|
50
52
|
...displayLabel !== void 0 && { displayLabel },
|
|
51
53
|
...styleId !== void 0 && { styleId },
|
|
52
54
|
...previewRuns !== void 0 && { previewRuns }
|
|
@@ -75,14 +77,21 @@ const createFolioAIEditSnapshot = (doc) => {
|
|
|
75
77
|
anchors
|
|
76
78
|
};
|
|
77
79
|
};
|
|
78
|
-
const getBlockKind = (node) => {
|
|
80
|
+
const getBlockKind = (node, headingLevel) => {
|
|
79
81
|
const listMarker = node.attrs["listMarker"];
|
|
80
82
|
const numPr = node.attrs["numPr"];
|
|
81
83
|
if (typeof listMarker === "string" && listMarker.trim().length > 0 || numPr !== void 0 && numPr !== null) return "listItem";
|
|
82
|
-
|
|
83
|
-
if (typeof outlineLevel === "number" && outlineLevel >= 0) return "heading";
|
|
84
|
+
if (headingLevel !== void 0) return "heading";
|
|
84
85
|
return "paragraph";
|
|
85
86
|
};
|
|
87
|
+
const getHeadingLevel = (node) => {
|
|
88
|
+
const outlineLevel = node.attrs["outlineLevel"];
|
|
89
|
+
if (typeof outlineLevel === "number" && Number.isInteger(outlineLevel) && outlineLevel >= 0 && outlineLevel <= 8) return outlineLevel + 1;
|
|
90
|
+
const styleId = node.attrs["styleId"];
|
|
91
|
+
if (typeof styleId !== "string") return;
|
|
92
|
+
const level = /^heading(?<level>[1-9])$/iu.exec(styleId)?.groups?.["level"];
|
|
93
|
+
return level === void 0 ? void 0 : Number.parseInt(level, 10);
|
|
94
|
+
};
|
|
86
95
|
const getDisplayLabel = (node) => {
|
|
87
96
|
const listMarker = node.attrs["listMarker"];
|
|
88
97
|
if (typeof listMarker === "string" && listMarker.trim().length > 0) return listMarker.trim();
|
package/dist/ai-edits/types.d.ts
CHANGED
|
@@ -13,7 +13,8 @@ type FolioAIBlockPreviewRun = {
|
|
|
13
13
|
type FolioAIBlock = {
|
|
14
14
|
id: string;
|
|
15
15
|
kind: FolioAIBlockKind;
|
|
16
|
-
text: string;
|
|
16
|
+
text: string; /** One-based heading depth when the block has outline semantics. */
|
|
17
|
+
headingLevel?: number;
|
|
17
18
|
displayLabel?: string;
|
|
18
19
|
styleId?: string;
|
|
19
20
|
previewRuns?: FolioAIBlockPreviewRun[];
|
|
@@ -61,6 +62,47 @@ type FolioAITextRangeHandle = {
|
|
|
61
62
|
endOffset: number;
|
|
62
63
|
selectedTextHash: string;
|
|
63
64
|
};
|
|
65
|
+
/**
|
|
66
|
+
* Stable handle for the logical document section introduced by one heading.
|
|
67
|
+
* The section runs until the next heading at the same or a higher level.
|
|
68
|
+
* `headingTextHash` makes a renamed heading fail stale instead of silently
|
|
69
|
+
* resolving to content whose meaning may have changed.
|
|
70
|
+
*/
|
|
71
|
+
type FolioDocumentSectionHandle = {
|
|
72
|
+
type: "headingSection";
|
|
73
|
+
story: "main";
|
|
74
|
+
headingBlockId: string;
|
|
75
|
+
headingTextHash: string; /** One-based depth used to detect structural section-boundary changes. */
|
|
76
|
+
headingLevel: number;
|
|
77
|
+
};
|
|
78
|
+
type FolioDocumentOutlineEntry = {
|
|
79
|
+
handle: FolioDocumentSectionHandle;
|
|
80
|
+
headingBlockId: string;
|
|
81
|
+
text: string; /** One-based heading depth. */
|
|
82
|
+
level: number;
|
|
83
|
+
parentHandle?: FolioDocumentSectionHandle;
|
|
84
|
+
};
|
|
85
|
+
type FolioDocumentOutline = {
|
|
86
|
+
sections: FolioDocumentOutlineEntry[];
|
|
87
|
+
};
|
|
88
|
+
type FolioDocumentSection = {
|
|
89
|
+
handle: FolioDocumentSectionHandle;
|
|
90
|
+
heading: FolioDocumentOutlineEntry; /** Heading block followed by every block in its logical section. */
|
|
91
|
+
blocks: FolioAIBlock[];
|
|
92
|
+
};
|
|
93
|
+
type FolioDocumentSectionReadResult = {
|
|
94
|
+
status: "found";
|
|
95
|
+
section: FolioDocumentSection;
|
|
96
|
+
} | {
|
|
97
|
+
status: "missing";
|
|
98
|
+
} | {
|
|
99
|
+
status: "stale";
|
|
100
|
+
};
|
|
101
|
+
type FolioDocumentNavigationTarget = {
|
|
102
|
+
type: "block";
|
|
103
|
+
story: "main";
|
|
104
|
+
blockId: string;
|
|
105
|
+
} | FolioAITextRangeHandle;
|
|
64
106
|
type FolioAIInlineFormatting = {
|
|
65
107
|
bold?: boolean;
|
|
66
108
|
italic?: boolean;
|
|
@@ -192,4 +234,4 @@ type FolioAIEditApplyResult = {
|
|
|
192
234
|
skipped: FolioAIEditSkippedOperation[];
|
|
193
235
|
};
|
|
194
236
|
//#endregion
|
|
195
|
-
export { FolioAIBlock, FolioAIBlockAnchor, FolioAIBlockKind, FolioAIBlockPreviewRun, FolioAIComment, FolioAIEditAppliedOperation, FolioAIEditApplyMode, FolioAIEditApplyResult, FolioAIEditOperation, FolioAIEditPrecondition, FolioAIEditReviewMeta, FolioAIEditSeverity, FolioAIEditSkipReason, FolioAIEditSkippedOperation, FolioAIEditSnapshot, FolioAIInlineFormatting, FolioAISignatureParty, FolioAITextRangeHandle };
|
|
237
|
+
export { FolioAIBlock, FolioAIBlockAnchor, FolioAIBlockKind, FolioAIBlockPreviewRun, FolioAIComment, FolioAIEditAppliedOperation, FolioAIEditApplyMode, FolioAIEditApplyResult, FolioAIEditOperation, FolioAIEditPrecondition, FolioAIEditReviewMeta, FolioAIEditSeverity, FolioAIEditSkipReason, FolioAIEditSkippedOperation, FolioAIEditSnapshot, FolioAIInlineFormatting, FolioAISignatureParty, FolioAITextRangeHandle, FolioDocumentNavigationTarget, FolioDocumentOutline, FolioDocumentOutlineEntry, FolioDocumentSection, FolioDocumentSectionHandle, FolioDocumentSectionReadResult };
|
|
@@ -11,7 +11,8 @@ import { ResolvedAnchor, isSuggestionStale, resolveSuggestionAnchor } from "../a
|
|
|
11
11
|
import { PositionalText, buildPositionalText } from "../ai-suggestions/text-positions.js";
|
|
12
12
|
import { CreateEmptyDocumentOptions, createEmptyDocument } from "../utils/createDocument.js";
|
|
13
13
|
import { createDocx } from "../docx/rezip.js";
|
|
14
|
-
import {
|
|
14
|
+
import { FOLIO_DOCX_CAPABILITY_HOSTS, FOLIO_DOCX_CAPABILITY_IDS, FOLIO_DOCX_CAPABILITY_MANIFEST, FOLIO_DOCX_CAPABILITY_MANIFEST_VERSION, FOLIO_DOCX_CAPABILITY_OPERATIONS, FOLIO_DOCX_COMPATIBILITY_HOSTS, FOLIO_DOCX_COMPATIBILITY_PROFILES, FOLIO_DOCX_PROFILES, FOLIO_DOCX_SUPPORT_STATES, FolioDocxCapabilityHost, FolioDocxCapabilityId, FolioDocxCapabilityManifest, FolioDocxCapabilityOperation, FolioDocxCompatibilityHost, FolioDocxCompatibilityProfile, FolioDocxFeatureCapability, FolioDocxProfile, FolioDocxSupportState, InvalidFolioDocxCapabilityIdError, getFolioDocxCapability, isFolioDocxCapabilityId } from "../docx/capabilities.js";
|
|
15
|
+
import { DocxCompatibility, DocxCompatibilityContext, DocxCompatibilityIssue, DocxCompatibilityLocation, DocxCompatibilityPart, InspectDocxCompatibilityOptions, inspectDocxCompatibility } from "../docx/compatibility.js";
|
|
15
16
|
import { setAISuggestionsMeta, setFocusedSuggestionMeta } from "../prosemirror/plugins/aiSuggestionDecorations.js";
|
|
16
17
|
import { scrollFolioPositionIntoView } from "../paged-layout/scrollToPmPosition.js";
|
|
17
18
|
import { getFolioCaretViewportRect, getFolioSelectionViewportRect } from "../paged-layout/selectionViewportRect.js";
|
|
@@ -26,5 +27,7 @@ import { fromMarkdown } from "../markdown/fromMarkdown.js";
|
|
|
26
27
|
import { toMarkdown, toMarkdownResult } from "../markdown/index.js";
|
|
27
28
|
import { EmbeddedFont, EmbeddedFontParts, extractEmbeddedFonts, getEmbeddedFontFaces } from "../fonts/embeddedFonts.js";
|
|
28
29
|
import { getGoogleFontsEnabled, setGoogleFontsEnabled } from "../utils/fontResolver.js";
|
|
30
|
+
import { DOCX_CONFORMANCE_CLASSES } from "../index.js";
|
|
29
31
|
type Document = document_d_exports.Document;
|
|
30
|
-
|
|
32
|
+
type DocxConformanceClass = document_d_exports.DocxConformanceClass;
|
|
33
|
+
export { type AIBarStatus, type AIChatMode, type AICitation, type AICitationRange, type AICitationSource, type AIGenerateInput, type AISuggestion, type AISuggestionApplyMode, type AISuggestionPreset, type AISuggestionSeverity, type AISuggestionStatus, type AcceptAutocompleteResult, type AnonymizationMatch, type AnonymizationTerm, type ApplyFolioDocumentOperationsOptions, type ApplyResult, type AutocompleteSuggestionPluginOptions, type AutocompleteSuggestionState, type AutocompleteSuggestionStatus, type AutocompleteTriggerCheck, type AutocompleteTriggerOptions, type AutocompleteTriggerSkipReason, type CreateEmptyDocumentOptions, DEFAULT_AI_SUGGESTION_PRESETS, DEFAULT_AUTOCOMPLETE_DEAD_ZONE_NODES, DOCX_CONFORMANCE_CLASSES, type DeriveBlockIdInput, type DirectiveKind, type DirectiveRange, type Document, type DocxCompatibility, type DocxCompatibilityContext, type DocxCompatibilityIssue, type DocxCompatibilityLocation, type DocxCompatibilityPart, type DocxConformanceClass, type EmbeddedFont, type EmbeddedFontParts, 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_DOCX_CAPABILITY_HOSTS, FOLIO_DOCX_CAPABILITY_IDS, FOLIO_DOCX_CAPABILITY_MANIFEST, FOLIO_DOCX_CAPABILITY_MANIFEST_VERSION, FOLIO_DOCX_CAPABILITY_OPERATIONS, FOLIO_DOCX_COMPATIBILITY_HOSTS, FOLIO_DOCX_COMPATIBILITY_PROFILES, FOLIO_DOCX_PROFILES, FOLIO_DOCX_SUPPORT_STATES, type FolioAIBlock, type FolioAIBlockAnchor, type FolioAIBlockKind, type FolioAIBlockPreviewRun, type FolioAIComment, type FolioAIEditAppliedOperation, type FolioAIEditApplyMode, type FolioAIEditApplyResult, type FolioAIEditOperation, type FolioAIEditPrecondition, type FolioAIEditReviewMeta, type FolioAIEditSeverity, type FolioAIEditSkipReason, type FolioAIEditSkippedOperation, type FolioAIEditSnapshot, type FolioAISignatureParty, type FolioBlockId, type FolioDocumentOperation, type FolioDocumentOperationAffectedTarget, type FolioDocumentOperationBatch, type FolioDocumentOperationCapabilities, type FolioDocumentOperationIssue, type FolioDocumentOperationMode, type FolioDocumentOperationPrecondition, type FolioDocumentOperationReceipt, type FolioDocumentOperationRecovery, type FolioDocumentOperationResult, type FolioDocumentOperationStatus, type FolioDocumentOperationType, type FolioDocumentOperationUndoFailureReason, type FolioDocumentOperationUndoHandle, type FolioDocumentOperationUndoResult, type FolioDocxCapabilityHost, type FolioDocxCapabilityId, type FolioDocxCapabilityManifest, type FolioDocxCapabilityOperation, type FolioDocxCompatibilityHost, type FolioDocxCompatibilityProfile, type FolioDocxFeatureCapability, type FolioDocxProfile, type FolioDocxSupportState, type ImageMeta, type ImageRef, type InspectDocxCompatibilityOptions, InvalidFolioDocumentOperationBatchError, InvalidFolioDocxCapabilityIdError, type MarkdownOptions, type MarkdownResult, type PositionalText, type ResolvedAnchor, type TemplatePreviewSpan, type TemplatePreviewValue, type TemplatePreviewValues, type TemplateSlashMenuKeyAction, type TemplateSlashMenuState, UnsupportedFolioDocumentOperationVersionError, type WordDiffSegment, acceptAutocompleteSuggestion, acceptAutocompleteWord, anonymizationDecorationsKey, appendAutocompleteToken, applyFolioAIEditOperations, applyFolioDocumentOperations, applySuggestions, assertSupportedFolioDocumentOperationVersion, autocompleteSuggestionKey, autocompleteSuggestionPlugin, buildPositionalText, clearAutocompleteSuggestion, clearTemplateSlashMenu, consumeTemplateSlashQuery, createAICitationDecorationsPlugin, createDocx, createEmptyDocument, createFolioAIEditSnapshot, deriveBlockId, diffWordSegments, extractEmbeddedFonts, finishAutocompleteSuggestion, fromMarkdown, getAnonymizationMatches, getAutocompleteSuggestion, getEmbeddedFontFaces, getFolioCaretViewportRect, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioDocxCapability, getFolioParaIdFromBlockId, getFolioSelectionViewportRect, getGoogleFontsEnabled, getTemplateDirectives, getTemplateSlashMenu, hashFolioAIBlockText, inspectDocxCompatibility, isFolioBlockId, isFolioDocumentOperationModeSupported, isFolioDocxCapabilityId, isSequentialFolioBlockId, isSuggestionStale, isSupportedFolioDocumentOperationVersion, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, resetTemplateSlashQuery, resolveSuggestionAnchor, scanDirectives, scrollFolioPositionIntoView, setAICitationsMeta, setAISuggestionsMeta, setActiveCitationMeta, setAnonymizationTermsMeta, setFocusedSuggestionMeta, setGoogleFontsEnabled, setTemplatePreviewValues, shouldTriggerAutocomplete, startAutocompleteSuggestion, templateSlashMenuKey, toMarkdown, toMarkdownResult };
|
package/dist/compat/eigenpal.js
CHANGED
|
@@ -5,6 +5,8 @@ import { applyFolioAIEditOperations } from "../ai-edits/apply.js";
|
|
|
5
5
|
import { 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, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, applyFolioDocumentOperations, assertSupportedFolioDocumentOperationVersion, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch } from "../document-operations.js";
|
|
6
6
|
import { createEmptyDocument } from "../utils/createDocument.js";
|
|
7
7
|
import { createDocx } from "../docx/rezip.js";
|
|
8
|
+
import { FOLIO_DOCX_CAPABILITY_HOSTS, FOLIO_DOCX_CAPABILITY_IDS, FOLIO_DOCX_CAPABILITY_MANIFEST, FOLIO_DOCX_CAPABILITY_MANIFEST_VERSION, FOLIO_DOCX_CAPABILITY_OPERATIONS, FOLIO_DOCX_COMPATIBILITY_HOSTS, FOLIO_DOCX_COMPATIBILITY_PROFILES, FOLIO_DOCX_PROFILES, FOLIO_DOCX_SUPPORT_STATES, InvalidFolioDocxCapabilityIdError, getFolioDocxCapability, isFolioDocxCapabilityId } from "../docx/capabilities.js";
|
|
9
|
+
import { inspectDocxCompatibility } from "../docx/compatibility.js";
|
|
8
10
|
import { DEFAULT_AI_SUGGESTION_PRESETS } from "../ai-suggestions/types.js";
|
|
9
11
|
import { buildPositionalText } from "../ai-suggestions/text-positions.js";
|
|
10
12
|
import { isSuggestionStale, resolveSuggestionAnchor } from "../ai-suggestions/conflict.js";
|
|
@@ -22,4 +24,5 @@ import { DEFAULT_AUTOCOMPLETE_DEAD_ZONE_NODES, acceptAutocompleteSuggestion, acc
|
|
|
22
24
|
import { fromMarkdown } from "../markdown/fromMarkdown.js";
|
|
23
25
|
import { toMarkdown, toMarkdownResult } from "../markdown/index.js";
|
|
24
26
|
import { extractEmbeddedFonts, getEmbeddedFontFaces } from "../fonts/embeddedFonts.js";
|
|
25
|
-
|
|
27
|
+
import { DOCX_CONFORMANCE_CLASSES } from "../index.js";
|
|
28
|
+
export { DEFAULT_AI_SUGGESTION_PRESETS, DEFAULT_AUTOCOMPLETE_DEAD_ZONE_NODES, DOCX_CONFORMANCE_CLASSES, 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_DOCX_CAPABILITY_HOSTS, FOLIO_DOCX_CAPABILITY_IDS, FOLIO_DOCX_CAPABILITY_MANIFEST, FOLIO_DOCX_CAPABILITY_MANIFEST_VERSION, FOLIO_DOCX_CAPABILITY_OPERATIONS, FOLIO_DOCX_COMPATIBILITY_HOSTS, FOLIO_DOCX_COMPATIBILITY_PROFILES, FOLIO_DOCX_PROFILES, FOLIO_DOCX_SUPPORT_STATES, InvalidFolioDocumentOperationBatchError, InvalidFolioDocxCapabilityIdError, UnsupportedFolioDocumentOperationVersionError, acceptAutocompleteSuggestion, acceptAutocompleteWord, anonymizationDecorationsKey, appendAutocompleteToken, applyFolioAIEditOperations, applyFolioDocumentOperations, applySuggestions, assertSupportedFolioDocumentOperationVersion, autocompleteSuggestionKey, autocompleteSuggestionPlugin, buildPositionalText, clearAutocompleteSuggestion, clearTemplateSlashMenu, consumeTemplateSlashQuery, createAICitationDecorationsPlugin, createDocx, createEmptyDocument, createFolioAIEditSnapshot, deriveBlockId, diffWordSegments, extractEmbeddedFonts, finishAutocompleteSuggestion, fromMarkdown, getAnonymizationMatches, getAutocompleteSuggestion, getEmbeddedFontFaces, getFolioCaretViewportRect, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioDocxCapability, getFolioParaIdFromBlockId, getFolioSelectionViewportRect, getGoogleFontsEnabled, getTemplateDirectives, getTemplateSlashMenu, hashFolioAIBlockText, inspectDocxCompatibility, isFolioBlockId, isFolioDocumentOperationModeSupported, isFolioDocxCapabilityId, isSequentialFolioBlockId, isSuggestionStale, isSupportedFolioDocumentOperationVersion, normalizeFolioAIBlockText, parseFolioDocumentOperationBatch, resetTemplateSlashQuery, resolveSuggestionAnchor, scanDirectives, scrollFolioPositionIntoView, setAICitationsMeta, setAISuggestionsMeta, setActiveCitationMeta, setAnonymizationTermsMeta, setFocusedSuggestionMeta, setGoogleFontsEnabled, setTemplatePreviewValues, shouldTriggerAutocomplete, startAutocompleteSuggestion, templateSlashMenuKey, toMarkdown, toMarkdownResult };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { document_d_exports } from "../types/document.js";
|
|
2
|
+
import { EditorState } from "prosemirror-state";
|
|
3
|
+
|
|
4
|
+
//#region src/controller/fontReadiness.d.ts
|
|
5
|
+
declare function getDocumentFontSet(): FontFaceSet | null;
|
|
6
|
+
declare function documentFontsAreLoaded(): boolean;
|
|
7
|
+
declare const LAYOUT_FONT_DESCRIPTORS: readonly [{
|
|
8
|
+
readonly style: "normal";
|
|
9
|
+
readonly weight: 400;
|
|
10
|
+
}, {
|
|
11
|
+
readonly style: "italic";
|
|
12
|
+
readonly weight: 400;
|
|
13
|
+
}, {
|
|
14
|
+
readonly style: "normal";
|
|
15
|
+
readonly weight: 700;
|
|
16
|
+
}, {
|
|
17
|
+
readonly style: "italic";
|
|
18
|
+
readonly weight: 700;
|
|
19
|
+
}];
|
|
20
|
+
type LayoutFontFace = {
|
|
21
|
+
family: string;
|
|
22
|
+
style: (typeof LAYOUT_FONT_DESCRIPTORS)[number]["style"];
|
|
23
|
+
weight: (typeof LAYOUT_FONT_DESCRIPTORS)[number]["weight"];
|
|
24
|
+
};
|
|
25
|
+
declare function waitForInitialLayoutFonts(documentModel: document_d_exports.Document | null, pmDoc: EditorState["doc"]): Promise<boolean>;
|
|
26
|
+
declare function collectInitialLayoutFontFamilies(documentModel: document_d_exports.Document | null, pmDoc: EditorState["doc"]): Set<string>;
|
|
27
|
+
declare function collectInitialLayoutFontFaces(documentModel: document_d_exports.Document | null, pmDoc: EditorState["doc"]): LayoutFontFace[];
|
|
28
|
+
//#endregion
|
|
29
|
+
export { LayoutFontFace, collectInitialLayoutFontFaces, collectInitialLayoutFontFamilies, documentFontsAreLoaded, getDocumentFontSet, waitForInitialLayoutFonts };
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { expectFontFamilyMarkAttrs } from "../prosemirror/attrs/index.js";
|
|
2
|
+
//#region src/controller/fontReadiness.ts
|
|
3
|
+
function getDocumentFontSet() {
|
|
4
|
+
if (typeof document === "undefined" || !("fonts" in document)) return null;
|
|
5
|
+
return document.fonts;
|
|
6
|
+
}
|
|
7
|
+
function documentFontsAreLoaded() {
|
|
8
|
+
const fontSet = getDocumentFontSet();
|
|
9
|
+
return !fontSet || fontSet.status === "loaded";
|
|
10
|
+
}
|
|
11
|
+
const INITIAL_LAYOUT_FONT_TIMEOUT_MS = 2e3;
|
|
12
|
+
const DEFAULT_LAYOUT_FONT_FAMILY = "Calibri";
|
|
13
|
+
const OFFICE_FONT_FAMILY_MAP = {
|
|
14
|
+
Arial: "Arimo",
|
|
15
|
+
Calibri: "Carlito",
|
|
16
|
+
Cambria: "Caladea",
|
|
17
|
+
"Times New Roman": "Tinos",
|
|
18
|
+
"Courier New": "Cousine"
|
|
19
|
+
};
|
|
20
|
+
const CSS_GENERIC_FONT_FAMILIES = /* @__PURE__ */ new Set([
|
|
21
|
+
"serif",
|
|
22
|
+
"sans-serif",
|
|
23
|
+
"monospace",
|
|
24
|
+
"cursive",
|
|
25
|
+
"fantasy",
|
|
26
|
+
"system-ui"
|
|
27
|
+
]);
|
|
28
|
+
const REGULAR_LAYOUT_FONT_DESCRIPTOR = [
|
|
29
|
+
{
|
|
30
|
+
style: "normal",
|
|
31
|
+
weight: 400
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
style: "italic",
|
|
35
|
+
weight: 400
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
style: "normal",
|
|
39
|
+
weight: 700
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
style: "italic",
|
|
43
|
+
weight: 700
|
|
44
|
+
}
|
|
45
|
+
][0];
|
|
46
|
+
function waitForInitialLayoutFonts(documentModel, pmDoc) {
|
|
47
|
+
const fontSet = getDocumentFontSet();
|
|
48
|
+
if (!fontSet) return Promise.resolve(true);
|
|
49
|
+
const loadChecks = [];
|
|
50
|
+
for (const face of collectInitialLayoutFontFaces(documentModel, pmDoc)) loadChecks.push(`${face.style} ${face.weight} 16px "${escapeCssFontFamily(face.family)}"`);
|
|
51
|
+
const loadFonts = Promise.allSettled(loadChecks.map((check) => fontSet.load(check))).then(() => fontSet.ready).then(() => true);
|
|
52
|
+
return Promise.race([loadFonts, new Promise((resolve) => {
|
|
53
|
+
globalThis.setTimeout(() => resolve(false), INITIAL_LAYOUT_FONT_TIMEOUT_MS);
|
|
54
|
+
})]);
|
|
55
|
+
}
|
|
56
|
+
function collectInitialLayoutFontFamilies(documentModel, pmDoc) {
|
|
57
|
+
return new Set(collectInitialLayoutFontFaces(documentModel, pmDoc).map(({ family }) => family));
|
|
58
|
+
}
|
|
59
|
+
function collectInitialLayoutFontFaces(documentModel, pmDoc) {
|
|
60
|
+
const faces = /* @__PURE__ */ new Map();
|
|
61
|
+
addLayoutFontFamilyFace(faces, DEFAULT_LAYOUT_FONT_FAMILY, REGULAR_LAYOUT_FONT_DESCRIPTOR);
|
|
62
|
+
for (const family of documentModel?.requiredFonts ?? []) addLayoutFontFamilyFace(faces, family, REGULAR_LAYOUT_FONT_DESCRIPTOR);
|
|
63
|
+
addLayoutFontFamilyFace(faces, documentModel?.package.theme?.fontScheme?.majorFont?.latin, REGULAR_LAYOUT_FONT_DESCRIPTOR);
|
|
64
|
+
addLayoutFontFamilyFace(faces, documentModel?.package.theme?.fontScheme?.minorFont?.latin, REGULAR_LAYOUT_FONT_DESCRIPTOR);
|
|
65
|
+
addTextFormattingFontFaces(faces, documentModel?.package.styles?.docDefaults?.rPr);
|
|
66
|
+
for (const style of documentModel?.package.styles?.styles ?? []) addTextFormattingFontFaces(faces, style.rPr);
|
|
67
|
+
collectProseMirrorFontFaces(faces, pmDoc, void 0);
|
|
68
|
+
return Array.from(faces.values());
|
|
69
|
+
}
|
|
70
|
+
function addTextFormattingFontFaces(faces, formatting) {
|
|
71
|
+
addLayoutFontFamilyFace(faces, formatting?.fontFamily, layoutDescriptorFromFormatting(formatting));
|
|
72
|
+
}
|
|
73
|
+
function collectProseMirrorFontFaces(faces, node, inheritedTextFormatting) {
|
|
74
|
+
const paragraphDefaults = readParagraphDefaultTextFormatting(node);
|
|
75
|
+
const textFormatting = paragraphDefaults ?? inheritedTextFormatting;
|
|
76
|
+
if (paragraphDefaults) addTextFormattingFontFaces(faces, paragraphDefaults);
|
|
77
|
+
if (node.attrs["listMarkerFontFamily"]) addLayoutFontFamilyFace(faces, node.attrs["listMarkerFontFamily"], REGULAR_LAYOUT_FONT_DESCRIPTOR);
|
|
78
|
+
if (node.isText) {
|
|
79
|
+
const descriptor = layoutDescriptorFromFormattingAndMarks(textFormatting, node.marks);
|
|
80
|
+
addLayoutFontFamilyFace(faces, readFontFamilyMarkAttrs(node.marks) ?? textFormatting?.fontFamily ?? DEFAULT_LAYOUT_FONT_FAMILY, descriptor);
|
|
81
|
+
}
|
|
82
|
+
node.forEach((child) => {
|
|
83
|
+
collectProseMirrorFontFaces(faces, child, textFormatting);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function readParagraphDefaultTextFormatting(node) {
|
|
87
|
+
const value = node.attrs["defaultTextFormatting"];
|
|
88
|
+
if (!value || typeof value !== "object") return;
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
function readFontFamilyMarkAttrs(marks) {
|
|
92
|
+
for (const mark of marks) if (mark.type.name === "fontFamily") return expectFontFamilyMarkAttrs(mark);
|
|
93
|
+
}
|
|
94
|
+
function layoutDescriptorFromFormatting(formatting) {
|
|
95
|
+
return {
|
|
96
|
+
style: formatting?.italic ? "italic" : "normal",
|
|
97
|
+
weight: formatting?.bold ? 700 : 400
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function layoutDescriptorFromFormattingAndMarks(formatting, marks) {
|
|
101
|
+
let bold = formatting?.bold === true;
|
|
102
|
+
let italic = formatting?.italic === true;
|
|
103
|
+
for (const mark of marks) {
|
|
104
|
+
if (mark.type.name === "bold") bold = true;
|
|
105
|
+
if (mark.type.name === "italic") italic = true;
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
style: italic ? "italic" : "normal",
|
|
109
|
+
weight: bold ? 700 : 400
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function addLayoutFontFamilyFace(faces, value, descriptor) {
|
|
113
|
+
if (typeof value === "string") {
|
|
114
|
+
addLayoutFontFamilyNameFace(faces, value, descriptor);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (!value || typeof value !== "object") return;
|
|
118
|
+
const fontFamily = value;
|
|
119
|
+
addLayoutFontFamilyFace(faces, fontFamily.ascii, descriptor);
|
|
120
|
+
addLayoutFontFamilyFace(faces, fontFamily.hAnsi, descriptor);
|
|
121
|
+
}
|
|
122
|
+
function addLayoutFontFamilyNameFace(faces, family, descriptor) {
|
|
123
|
+
const normalized = family.trim();
|
|
124
|
+
if (!normalized || CSS_GENERIC_FONT_FAMILIES.has(normalized)) return;
|
|
125
|
+
addLayoutFontFace(faces, normalized, descriptor);
|
|
126
|
+
const mappedFamily = OFFICE_FONT_FAMILY_MAP[normalized];
|
|
127
|
+
if (mappedFamily) addLayoutFontFace(faces, mappedFamily, descriptor);
|
|
128
|
+
}
|
|
129
|
+
function addLayoutFontFace(faces, family, descriptor) {
|
|
130
|
+
faces.set(`${family}|${descriptor.style}|${descriptor.weight}`, {
|
|
131
|
+
family,
|
|
132
|
+
...descriptor
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
function escapeCssFontFamily(family) {
|
|
136
|
+
return family.replace(/\\/gu, "\\\\").replace(/"/gu, "\\\"");
|
|
137
|
+
}
|
|
138
|
+
//#endregion
|
|
139
|
+
export { collectInitialLayoutFontFaces, collectInitialLayoutFontFamilies, documentFontsAreLoaded, getDocumentFontSet, waitForInitialLayoutFonts };
|