@stll/folio-core 0.12.0 → 0.14.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/apply.d.ts +2 -1
- package/dist/ai-edits/apply.js +118 -40
- package/dist/ai-edits/blockRange.js +1 -1
- package/dist/ai-edits/clean-text.js +2 -1
- package/dist/ai-edits/headless.js +3 -3
- package/dist/ai-edits/snapshot.js +21 -3
- package/dist/ai-edits/table-cell-mutations.js +2 -1
- package/dist/ai-edits/table-row-column-mutations.d.ts +9 -1
- package/dist/ai-edits/table-row-column-mutations.js +1 -1
- package/dist/ai-edits/types.d.ts +28 -1
- package/dist/ai-edits/word-diff.js +21 -0
- package/dist/compat/eigenpal.d.ts +3 -3
- package/dist/compat/eigenpal.js +3 -3
- package/dist/controller/headerFooterEditorManager.js +1 -1
- package/dist/controller/hiddenEditorManager.js +12 -1
- package/dist/controller/layoutPipeline.js +1 -1
- package/dist/controller/noteEditorManager.js +1 -1
- package/dist/document-operations.d.ts +13 -13
- package/dist/document-operations.js +31 -21
- package/dist/docx/blockContentParser.js +19 -5
- package/dist/docx/commentRangeIntegrity.d.ts +6 -0
- package/dist/docx/commentRangeIntegrity.js +186 -0
- package/dist/docx/conformance.js +57 -3
- package/dist/docx/encryption/agileDecryption.js +12 -2
- package/dist/docx/encryption/compoundFile.js +6 -1
- package/dist/docx/encryption/encryptionInfo.d.ts +9 -1
- package/dist/docx/encryption/encryptionInfo.js +18 -2
- package/dist/docx/encryption/openEncryptedDocx.js +1 -1
- package/dist/docx/ensureParaIds.js +7 -6
- package/dist/docx/groupDrawingParser.js +10 -5
- package/dist/docx/hyperlinkParser.js +1 -1
- package/dist/docx/imageParser.js +10 -6
- package/dist/docx/metadataPrivacy.js +17 -3
- package/dist/docx/paragraphParser.js +7 -3
- package/dist/docx/rezip.js +19 -8
- package/dist/docx/runParser.js +13 -4
- package/dist/docx/sectionParser.js +17 -4
- package/dist/docx/selectiveSave.js +4 -0
- package/dist/docx/selectiveXmlPatch.d.ts +22 -1
- package/dist/docx/selectiveXmlPatch.js +61 -1
- package/dist/docx/serializer/blockSdtSerializer.js +3 -2
- package/dist/docx/serializer/commentSerializer.js +4 -4
- package/dist/docx/serializer/paragraphSerializer.js +16 -14
- package/dist/docx/serializer/runSerializer.js +21 -19
- package/dist/docx/serializer/sectionPropertiesSerializer.js +2 -1
- package/dist/docx/serializer/tableSerializer.js +9 -7
- package/dist/docx/serializer/xmlUtils.d.ts +13 -1
- package/dist/docx/serializer/xmlUtils.js +27 -1
- package/dist/docx/server/docxToMarkdown.d.ts +15 -0
- package/dist/docx/server/docxToMarkdown.js +17 -0
- package/dist/docx/server/extractDocxText.js +55 -8
- package/dist/docx/settingsParser.js +15 -2
- package/dist/docx/tableParser.d.ts +8 -1
- package/dist/docx/tableParser.js +29 -8
- package/dist/docx/unzip.js +1 -0
- package/dist/docx/vmlImageParser.js +11 -3
- package/dist/docx/xmlParser.js +11 -1
- package/dist/fonts/embeddedFonts.d.ts +33 -5
- package/dist/fonts/embeddedFonts.js +37 -8
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/layout-bridge/convert/toFlowBlocks.js +15 -0
- package/dist/layout-engine/index.js +19 -12
- package/dist/layout-engine/measure/cache.js +2 -0
- package/dist/layout-engine/measure/effectiveLineBreakPolicy.js +8 -2
- package/dist/layout-engine/measure/floatingTablePosition.d.ts +9 -0
- package/dist/layout-engine/measure/floatingTablePosition.js +17 -0
- package/dist/layout-engine/measure/index.d.ts +2 -1
- package/dist/layout-engine/measure/index.js +2 -1
- package/dist/layout-engine/measure/lineBreakProvider.d.ts +2 -2
- package/dist/layout-engine/measure/lineBreakProvider.js +3 -3
- package/dist/layout-engine/measure/measureBlocks.js +11 -8
- package/dist/layout-engine/measure/measureHelpers.d.ts +10 -1
- package/dist/layout-engine/measure/measureHelpers.js +12 -1
- package/dist/layout-engine/measure/measureParagraph.js +16 -0
- package/dist/layout-engine/types.d.ts +22 -2
- package/dist/layout-painter/renderImage.d.ts +12 -1
- package/dist/layout-painter/renderImage.js +21 -4
- package/dist/layout-painter/renderPage.js +5 -8
- package/dist/layout-painter/renderParagraph.js +33 -9
- package/dist/layout-painter/renderTable.js +2 -1
- package/dist/layout-painter/renderWatermark.d.ts +1 -1
- package/dist/layout-painter/renderWatermark.js +2 -1
- package/dist/markdown/fromMarkdown.js +1 -1
- package/dist/prosemirror/attrs/index.d.ts +1 -1
- package/dist/prosemirror/attrs/index.js +21 -0
- package/dist/prosemirror/commands/comments.d.ts +76 -1
- package/dist/prosemirror/commands/comments.js +401 -28
- package/dist/prosemirror/commands/hyperlink.js +15 -1
- package/dist/prosemirror/commands/image.js +7 -1
- package/dist/prosemirror/commands/index.d.ts +2 -2
- package/dist/prosemirror/commands/index.js +2 -2
- package/dist/prosemirror/commands/tableCellMergeResolution.js +1 -1
- package/dist/prosemirror/commentIdAllocator.js +13 -3
- package/dist/prosemirror/conversion/fromProseDoc.js +122 -5
- package/dist/prosemirror/conversion/index.js +1 -1
- package/dist/prosemirror/conversion/toProseDoc.js +20 -8
- package/dist/prosemirror/extensions/core/ParagraphExtension.js +2 -1
- package/dist/prosemirror/extensions/features/ImagePasteExtension.js +10 -2
- package/dist/prosemirror/extensions/features/pasteCleanup.js +15 -2
- package/dist/prosemirror/extensions/marks/HyperlinkExtension.js +30 -4
- package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.js +49 -13
- package/dist/prosemirror/extensions/nodes/TableExtension.d.ts +1 -1
- package/dist/prosemirror/extensions/nodes/TableExtension.js +5 -3
- package/dist/prosemirror/index.d.ts +1 -1
- package/dist/prosemirror/index.js +1 -1
- package/dist/prosemirror/plugins/contentControlWidgets.d.ts +2 -2
- package/dist/prosemirror/plugins/contentControlWidgets.js +4 -4
- package/dist/prosemirror/plugins/revisionIds.d.ts +23 -0
- package/dist/prosemirror/plugins/revisionIds.js +57 -0
- package/dist/prosemirror/plugins/suggestionMode.js +4 -3
- package/dist/prosemirror/runFormattingMarkNames.d.ts +14 -0
- package/dist/prosemirror/runFormattingMarkNames.js +40 -0
- package/dist/prosemirror/schema/index.d.ts +1 -1
- package/dist/prosemirror/schema/marks.d.ts +27 -4
- package/dist/prosemirror/schema/marks.js +15 -0
- package/dist/prosemirror/schema/nodes.d.ts +50 -2
- package/dist/prosemirror/utils/tabCalculator.js +3 -3
- package/dist/render-dom/RemoteSelectionOverlay.js +2 -2
- package/dist/server.d.ts +3 -2
- package/dist/server.js +4 -3
- package/dist/utils/clipboard.d.ts +10 -1
- package/dist/utils/clipboard.js +33 -6
- package/dist/utils/colorResolver.d.ts +8 -1
- package/dist/utils/colorResolver.js +35 -5
- package/dist/utils/fontResolver.d.ts +2 -1
- package/dist/utils/fontResolver.js +9 -3
- package/dist/utils/hexId.d.ts +11 -1
- package/dist/utils/hexId.js +11 -1
- package/dist/utils/sanitizeImageSrc.d.ts +21 -0
- package/dist/utils/sanitizeImageSrc.js +30 -0
- package/dist/utils/stripXmlDeclarations.d.ts +11 -0
- package/dist/utils/stripXmlDeclarations.js +35 -0
- package/dist/version-comparison.d.ts +22 -2
- package/dist/version-comparison.js +41 -12
- package/dist/watermark/index.d.ts +11 -1
- package/dist/watermark/index.js +22 -1
- package/package.json +3 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ContentControlLockedError, ContentControlTypeError } from "../../content-controls/errors.js";
|
|
1
|
+
import { ContentControlBoundError, ContentControlLockedError, ContentControlTypeError } from "../../content-controls/errors.js";
|
|
2
2
|
import { findBlockSdtMatch, setContentControlValueTr } from "../commands/contentControls.js";
|
|
3
3
|
import { Plugin, PluginKey } from "prosemirror-state";
|
|
4
4
|
//#region src/prosemirror/plugins/contentControlWidgets.ts
|
|
@@ -127,7 +127,7 @@ const handleContentControlWidgetClick = ({ event, onEvent, view }) => {
|
|
|
127
127
|
return true;
|
|
128
128
|
}
|
|
129
129
|
} catch (error) {
|
|
130
|
-
if (error instanceof ContentControlLockedError || error instanceof ContentControlTypeError) {
|
|
130
|
+
if (error instanceof ContentControlLockedError || error instanceof ContentControlTypeError || error instanceof ContentControlBoundError) {
|
|
131
131
|
onEvent({
|
|
132
132
|
kind: "refused",
|
|
133
133
|
tag,
|
|
@@ -183,7 +183,7 @@ function dispatchDropdownPick(view, pmPos, value) {
|
|
|
183
183
|
view.dispatch(tr);
|
|
184
184
|
return true;
|
|
185
185
|
} catch (error) {
|
|
186
|
-
if (error instanceof ContentControlLockedError || error instanceof ContentControlTypeError) return false;
|
|
186
|
+
if (error instanceof ContentControlLockedError || error instanceof ContentControlTypeError || error instanceof ContentControlBoundError) return false;
|
|
187
187
|
throw error;
|
|
188
188
|
}
|
|
189
189
|
}
|
|
@@ -197,7 +197,7 @@ function dispatchDatePick(view, pmPos, date) {
|
|
|
197
197
|
view.dispatch(tr);
|
|
198
198
|
return true;
|
|
199
199
|
} catch (error) {
|
|
200
|
-
if (error instanceof ContentControlLockedError || error instanceof ContentControlTypeError) return false;
|
|
200
|
+
if (error instanceof ContentControlLockedError || error instanceof ContentControlTypeError || error instanceof ContentControlBoundError) return false;
|
|
201
201
|
throw error;
|
|
202
202
|
}
|
|
203
203
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Node } from "prosemirror-model";
|
|
2
|
+
|
|
3
|
+
//#region src/prosemirror/plugins/revisionIds.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Mint the next tracked-revision id (`w:id`). Strictly monotonic per realm,
|
|
6
|
+
* and always inside the range serialized `w:id` may occupy.
|
|
7
|
+
*/
|
|
8
|
+
declare function mintRevisionId(): number;
|
|
9
|
+
/**
|
|
10
|
+
* Raise the counter above `maxId` so freshly minted ids cannot collide with
|
|
11
|
+
* ids already present in a loaded document. Only ever raises.
|
|
12
|
+
*
|
|
13
|
+
* `maxId` is derived from file content, so it is untrusted: a malformed or
|
|
14
|
+
* out-of-range value is ignored outright rather than folded into range.
|
|
15
|
+
*/
|
|
16
|
+
declare function seedRevisionIdsAbove(maxId: number): void;
|
|
17
|
+
/**
|
|
18
|
+
* Raise the counter above every revision id already present in `doc`.
|
|
19
|
+
* Called from the suggestion-mode plugin's `state.init`.
|
|
20
|
+
*/
|
|
21
|
+
declare function seedRevisionIdsFromDoc(doc: Node): void;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { mintRevisionId, seedRevisionIdsAbove, seedRevisionIdsFromDoc };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { MAX_REVISION_ID } from "@stll/docx-core/model";
|
|
2
|
+
//#region src/prosemirror/plugins/revisionIds.ts
|
|
3
|
+
/**
|
|
4
|
+
* Next id to hand out. Starts at 1 (0 is the serializer's "unusable metadata"
|
|
5
|
+
* fallback) and is raised past a loaded document's existing ids by
|
|
6
|
+
* `seedRevisionIdsAbove`.
|
|
7
|
+
*
|
|
8
|
+
* NOT seeded from a clock. `Date.now()` (~1.8e12) overflows the signed 32-bit
|
|
9
|
+
* int consumers read `w:id` into.
|
|
10
|
+
*/
|
|
11
|
+
let counter = 1;
|
|
12
|
+
/**
|
|
13
|
+
* Mint the next tracked-revision id (`w:id`). Strictly monotonic per realm,
|
|
14
|
+
* and always inside the range serialized `w:id` may occupy.
|
|
15
|
+
*/
|
|
16
|
+
function mintRevisionId() {
|
|
17
|
+
if (counter > MAX_REVISION_ID) counter = 1;
|
|
18
|
+
return counter++;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Raise the counter above `maxId` so freshly minted ids cannot collide with
|
|
22
|
+
* ids already present in a loaded document. Only ever raises.
|
|
23
|
+
*
|
|
24
|
+
* `maxId` is derived from file content, so it is untrusted: a malformed or
|
|
25
|
+
* out-of-range value is ignored outright rather than folded into range.
|
|
26
|
+
*/
|
|
27
|
+
function seedRevisionIdsAbove(maxId) {
|
|
28
|
+
if (!Number.isInteger(maxId) || maxId < 0 || maxId >= MAX_REVISION_ID) return;
|
|
29
|
+
if (maxId >= counter) counter = maxId + 1;
|
|
30
|
+
}
|
|
31
|
+
/** Node attrs that carry a revision id directly (`revisionId` field). */
|
|
32
|
+
const DIRECT_REVISION_ATTR_KEYS = ["trIns", "trDel"];
|
|
33
|
+
/**
|
|
34
|
+
* Raise the counter above every revision id already present in `doc`.
|
|
35
|
+
* Called from the suggestion-mode plugin's `state.init`.
|
|
36
|
+
*/
|
|
37
|
+
function seedRevisionIdsFromDoc(doc) {
|
|
38
|
+
let max = 0;
|
|
39
|
+
const consider = (id) => {
|
|
40
|
+
if (typeof id === "number" && Number.isInteger(id) && id > max && id <= MAX_REVISION_ID) max = id;
|
|
41
|
+
};
|
|
42
|
+
doc.descendants((node) => {
|
|
43
|
+
for (const mark of node.marks) consider(mark.attrs["revisionId"]);
|
|
44
|
+
const attrs = node.attrs;
|
|
45
|
+
const pPrMark = attrs["pPrMark"];
|
|
46
|
+
if (pPrMark?.info) consider(pPrMark.info.id);
|
|
47
|
+
for (const key of DIRECT_REVISION_ATTR_KEYS) {
|
|
48
|
+
const value = attrs[key];
|
|
49
|
+
if (value) consider(value.revisionId);
|
|
50
|
+
}
|
|
51
|
+
const cellMarker = attrs["cellMarker"];
|
|
52
|
+
if (cellMarker?.info) consider(cellMarker.info.revisionId);
|
|
53
|
+
});
|
|
54
|
+
seedRevisionIdsAbove(max);
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { mintRevisionId, seedRevisionIdsAbove, seedRevisionIdsFromDoc };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { splitBlockClearBorders } from "../extensions/features/BaseKeymapExtension.js";
|
|
2
|
+
import { mintRevisionId, seedRevisionIdsFromDoc } from "./revisionIds.js";
|
|
2
3
|
import { isHistoryTransaction } from "prosemirror-history";
|
|
3
4
|
import { Plugin, PluginKey, TextSelection } from "prosemirror-state";
|
|
4
5
|
//#region src/prosemirror/plugins/suggestionMode.ts
|
|
@@ -17,10 +18,9 @@ import { Plugin, PluginKey, TextSelection } from "prosemirror-state";
|
|
|
17
18
|
const suggestionModeKey = new PluginKey("suggestionMode");
|
|
18
19
|
const SUGGESTION_META = "suggestionModeApplied";
|
|
19
20
|
const SUGGESTION_BYPASS_META = "suggestionModeBypass";
|
|
20
|
-
let nextRevisionId = Date.now();
|
|
21
21
|
function makeMarkAttrs(pluginState) {
|
|
22
22
|
return {
|
|
23
|
-
revisionId:
|
|
23
|
+
revisionId: mintRevisionId(),
|
|
24
24
|
author: pluginState.author,
|
|
25
25
|
date: (/* @__PURE__ */ new Date()).toISOString()
|
|
26
26
|
};
|
|
@@ -340,7 +340,8 @@ function createSuggestionModePlugin(initialActive = false, author = "User") {
|
|
|
340
340
|
return new Plugin({
|
|
341
341
|
key: suggestionModeKey,
|
|
342
342
|
state: {
|
|
343
|
-
init() {
|
|
343
|
+
init(_config, instance) {
|
|
344
|
+
seedRevisionIdsFromDoc(instance.doc);
|
|
344
345
|
return {
|
|
345
346
|
active: initialActive,
|
|
346
347
|
author
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/prosemirror/runFormattingMarkNames.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Names of the marks that carry run-level (character) formatting.
|
|
4
|
+
*
|
|
5
|
+
* Single source of truth shared by every place that must swap a run's live
|
|
6
|
+
* formatting back to a previously recorded set: rejecting a `runPropertyChange`
|
|
7
|
+
* (commands/comments.ts) and stripping a *suggested* `runPropertyChange` at the
|
|
8
|
+
* serialization boundary (conversion/fromProseDoc.ts). Keeping one list makes
|
|
9
|
+
* it structurally impossible for the two paths to drift and let a formatting
|
|
10
|
+
* mark survive a revert.
|
|
11
|
+
*/
|
|
12
|
+
declare const RUN_FORMATTING_MARK_NAMES: Set<string>;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { RUN_FORMATTING_MARK_NAMES };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
//#region src/prosemirror/runFormattingMarkNames.ts
|
|
2
|
+
/**
|
|
3
|
+
* Names of the marks that carry run-level (character) formatting.
|
|
4
|
+
*
|
|
5
|
+
* Single source of truth shared by every place that must swap a run's live
|
|
6
|
+
* formatting back to a previously recorded set: rejecting a `runPropertyChange`
|
|
7
|
+
* (commands/comments.ts) and stripping a *suggested* `runPropertyChange` at the
|
|
8
|
+
* serialization boundary (conversion/fromProseDoc.ts). Keeping one list makes
|
|
9
|
+
* it structurally impossible for the two paths to drift and let a formatting
|
|
10
|
+
* mark survive a revert.
|
|
11
|
+
*/
|
|
12
|
+
const RUN_FORMATTING_MARK_NAMES = /* @__PURE__ */ new Set([
|
|
13
|
+
"bold",
|
|
14
|
+
"italic",
|
|
15
|
+
"underline",
|
|
16
|
+
"strike",
|
|
17
|
+
"textColor",
|
|
18
|
+
"highlight",
|
|
19
|
+
"runShading",
|
|
20
|
+
"fontSize",
|
|
21
|
+
"fontFamily",
|
|
22
|
+
"language",
|
|
23
|
+
"superscript",
|
|
24
|
+
"subscript",
|
|
25
|
+
"allCaps",
|
|
26
|
+
"smallCaps",
|
|
27
|
+
"characterSpacing",
|
|
28
|
+
"emboss",
|
|
29
|
+
"imprint",
|
|
30
|
+
"hidden",
|
|
31
|
+
"textShadow",
|
|
32
|
+
"emphasisMark",
|
|
33
|
+
"textOutline",
|
|
34
|
+
"rtl",
|
|
35
|
+
"textEffect",
|
|
36
|
+
"runFormattingOverride",
|
|
37
|
+
"characterStyle"
|
|
38
|
+
]);
|
|
39
|
+
//#endregion
|
|
40
|
+
export { RUN_FORMATTING_MARK_NAMES };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { CharacterSpacingAttrs, CharacterStyleAttrs, CommentAttrs, EmphasisMarkAttrs, FontFamilyAttrs, FontSizeAttrs, FootnoteRefAttrs, HighlightAttrs, HyperlinkAttrs, LanguageAttrs, RunFormattingOverrideAttrs, RunPropertyChangeMarkAttrs, RunShadingAttrs, StrikeAttrs, TextColorAttrs, TextEffectAttrs, TrackedChangeMarkAttrs, UnderlineAttrs } from "./marks.js";
|
|
1
2
|
import { ExtensionManager } from "../extensions/ExtensionManager.js";
|
|
2
3
|
import { BlockSdtAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, ImagePositionAttrs, MathAttrs, ParagraphAttrs, SdtAttrs, ShapeAttrs, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAttrs } from "./nodes.js";
|
|
3
|
-
import { CharacterSpacingAttrs, CharacterStyleAttrs, CommentAttrs, EmphasisMarkAttrs, FontFamilyAttrs, FontSizeAttrs, FootnoteRefAttrs, HighlightAttrs, HyperlinkAttrs, LanguageAttrs, RunFormattingOverrideAttrs, RunPropertyChangeMarkAttrs, RunShadingAttrs, StrikeAttrs, TextColorAttrs, TextEffectAttrs, TrackedChangeMarkAttrs, UnderlineAttrs } from "./marks.js";
|
|
4
4
|
|
|
5
5
|
//#region src/prosemirror/schema/index.d.ts
|
|
6
6
|
declare const singletonManager: ExtensionManager;
|
|
@@ -85,15 +85,38 @@ type FootnoteRefAttrs = {
|
|
|
85
85
|
type CommentAttrs = {
|
|
86
86
|
commentId: number;
|
|
87
87
|
};
|
|
88
|
+
/**
|
|
89
|
+
* Provenance of a tracked change.
|
|
90
|
+
*
|
|
91
|
+
* - `"user"` — a normal tracked change authored by a person (or an
|
|
92
|
+
* accepted suggestion). Serializes to OOXML `w:ins` / `w:del` /
|
|
93
|
+
* `w:rPrChange`.
|
|
94
|
+
* - `"suggested"` — an AI-proposed edit rendered with the tracked-change
|
|
95
|
+
* visual grammar but ALWAYS stripped from serialized DOCX output until
|
|
96
|
+
* accepted. Suggested marks never round-trip through OOXML; parsing a
|
|
97
|
+
* DOCX can only ever produce `"user"` marks.
|
|
98
|
+
*/
|
|
99
|
+
declare const TRACKED_CHANGE_PROVENANCE_VALUES: readonly ["user", "suggested"];
|
|
100
|
+
type TrackedChangeProvenance = (typeof TRACKED_CHANGE_PROVENANCE_VALUES)[number];
|
|
88
101
|
type TrackedChangeMarkAttrs = {
|
|
89
102
|
revisionId: number;
|
|
90
103
|
author: string;
|
|
91
|
-
date?: string;
|
|
92
|
-
|
|
104
|
+
date?: string; /** Optional author initials (w:initials) carried through the round-trip. */
|
|
105
|
+
initials?: string;
|
|
106
|
+
moveKind?: "moveTo" | "moveFrom"; /** Defaults to `"user"`; `"suggested"` for AI-proposed, non-serialized edits. */
|
|
107
|
+
provenance: TrackedChangeProvenance;
|
|
108
|
+
/**
|
|
109
|
+
* Groups every mark belonging to one logical suggestion so the host can
|
|
110
|
+
* accept/reject them together. Absent for `"user"` provenance (the mark's
|
|
111
|
+
* `null` default is normalized to absent by the attrs reader).
|
|
112
|
+
*/
|
|
113
|
+
suggestionId?: string;
|
|
93
114
|
};
|
|
94
115
|
/** Run-property revisions carried through the editable model. */
|
|
95
116
|
type RunPropertyChangeMarkAttrs = {
|
|
96
|
-
changes: document_d_exports.RunPropertyChange[];
|
|
117
|
+
changes: document_d_exports.RunPropertyChange[]; /** See {@link TrackedChangeProvenance}. Defaults to `"user"`. */
|
|
118
|
+
provenance: TrackedChangeProvenance;
|
|
119
|
+
suggestionId?: string;
|
|
97
120
|
};
|
|
98
121
|
type RunFormattingOverrideAttrs = { [K in keyof Pick<document_d_exports.TextFormatting, "bold" | "italic" | "strike" | "doubleStrike" | "allCaps" | "smallCaps" | "hidden" | "emboss" | "imprint" | "shadow" | "outline" | "rtl">]?: false } & {
|
|
99
122
|
underline?: "none";
|
|
@@ -124,4 +147,4 @@ type HyperlinkAttrs = {
|
|
|
124
147
|
_docxHyperlinkIndex?: number;
|
|
125
148
|
};
|
|
126
149
|
//#endregion
|
|
127
|
-
export { CharacterSpacingAttrs, CharacterStyleAttrs, CommentAttrs, EmphasisMarkAttrs, FontFamilyAttrs, FontSizeAttrs, FootnoteRefAttrs, HighlightAttrs, HyperlinkAttrs, LanguageAttrs, RunFormattingOverrideAttrs, RunPropertyChangeMarkAttrs, RunShadingAttrs, StrikeAttrs, TextColorAttrs, TextEffectAttrs, TrackedChangeMarkAttrs, UnderlineAttrs };
|
|
150
|
+
export { CharacterSpacingAttrs, CharacterStyleAttrs, CommentAttrs, EmphasisMarkAttrs, FontFamilyAttrs, FontSizeAttrs, FootnoteRefAttrs, HighlightAttrs, HyperlinkAttrs, LanguageAttrs, RunFormattingOverrideAttrs, RunPropertyChangeMarkAttrs, RunShadingAttrs, StrikeAttrs, TRACKED_CHANGE_PROVENANCE_VALUES, TextColorAttrs, TextEffectAttrs, TrackedChangeMarkAttrs, TrackedChangeProvenance, UnderlineAttrs };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/prosemirror/schema/marks.ts
|
|
2
|
+
/**
|
|
3
|
+
* Provenance of a tracked change.
|
|
4
|
+
*
|
|
5
|
+
* - `"user"` — a normal tracked change authored by a person (or an
|
|
6
|
+
* accepted suggestion). Serializes to OOXML `w:ins` / `w:del` /
|
|
7
|
+
* `w:rPrChange`.
|
|
8
|
+
* - `"suggested"` — an AI-proposed edit rendered with the tracked-change
|
|
9
|
+
* visual grammar but ALWAYS stripped from serialized DOCX output until
|
|
10
|
+
* accepted. Suggested marks never round-trip through OOXML; parsing a
|
|
11
|
+
* DOCX can only ever produce `"user"` marks.
|
|
12
|
+
*/
|
|
13
|
+
const TRACKED_CHANGE_PROVENANCE_VALUES = ["user", "suggested"];
|
|
14
|
+
//#endregion
|
|
15
|
+
export { TRACKED_CHANGE_PROVENANCE_VALUES };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { document_d_exports } from "../../types/document.js";
|
|
2
|
+
import { TrackedChangeProvenance } from "./marks.js";
|
|
2
3
|
import { OutlineStyleAttr } from "../../types/documentEnumValues.js";
|
|
3
4
|
import { SpacingExplicit } from "../../types/formatting.js";
|
|
4
5
|
import { ParagraphDirection } from "../paragraphDirection.js";
|
|
@@ -152,6 +153,12 @@ type ParagraphAttrs = {
|
|
|
152
153
|
* `del`. Stored as a discriminated union to mirror folio's
|
|
153
154
|
* `TrackedChangeWrapperType` model rather than two parallel attrs. */
|
|
154
155
|
pPrMark?: document_d_exports.ParagraphMarkChange;
|
|
156
|
+
/**
|
|
157
|
+
* Marks this whole paragraph as a *suggested* insertion (AI proposal). The
|
|
158
|
+
* paragraph is dropped from serialized DOCX until accepted; accepting turns
|
|
159
|
+
* it into a real inserted-paragraph tracked change (paragraph-mark `w:ins`).
|
|
160
|
+
*/
|
|
161
|
+
_suggestedInsert?: SuggestedStructuralMarker | null;
|
|
155
162
|
};
|
|
156
163
|
/**
|
|
157
164
|
* Image position for floating images (horizontal and vertical positioning)
|
|
@@ -382,6 +389,12 @@ type TableAttrs = {
|
|
|
382
389
|
_resolvedIndent?: NonNullable<document_d_exports.TableFormatting["indent"]>; /** Original table formatting from DOCX for lossless round-trip serialization */
|
|
383
390
|
_originalFormatting?: document_d_exports.TableFormatting; /** Tracked table property changes (w:tblPrChange) for round-trip + accept/reject */
|
|
384
391
|
tblPrChange?: document_d_exports.TablePropertyChange[];
|
|
392
|
+
/**
|
|
393
|
+
* Marks this whole table as a *suggested* insertion (AI proposal). The table
|
|
394
|
+
* is dropped from serialized DOCX until accepted; because OOXML has no tracked
|
|
395
|
+
* whole-table-insert primitive, accepting applies it directly.
|
|
396
|
+
*/
|
|
397
|
+
_suggestedInsert?: SuggestedStructuralMarker | null;
|
|
385
398
|
};
|
|
386
399
|
/**
|
|
387
400
|
* Table row attributes
|
|
@@ -394,10 +407,19 @@ type TableRowAttrs = {
|
|
|
394
407
|
_originalFormatting?: document_d_exports.TableRowFormatting; /** Tracked row property changes (w:trPrChange) for round-trip + accept/reject */
|
|
395
408
|
trPrChange?: document_d_exports.TableRowPropertyChange[];
|
|
396
409
|
} & ({
|
|
397
|
-
/**
|
|
410
|
+
/**
|
|
411
|
+
* Tracked structural row insertion (w:trPr/w:ins). A `"suggested"`
|
|
412
|
+
* provenance marks a whole-row AI proposal: stripped from serialized DOCX
|
|
413
|
+
* until accepted, at which point it becomes a real (user) `trIns`. Rows use
|
|
414
|
+
* this, NOT `_suggestedInsert` (that marker is paragraph/table only).
|
|
415
|
+
*/
|
|
416
|
+
trIns: {
|
|
398
417
|
revisionId: number;
|
|
399
418
|
author: string;
|
|
400
419
|
date?: string | null;
|
|
420
|
+
initials?: string | null;
|
|
421
|
+
provenance?: TrackedChangeProvenance;
|
|
422
|
+
suggestionId?: string | null;
|
|
401
423
|
};
|
|
402
424
|
trDel?: never;
|
|
403
425
|
} | {
|
|
@@ -406,11 +428,28 @@ type TableRowAttrs = {
|
|
|
406
428
|
revisionId: number;
|
|
407
429
|
author: string;
|
|
408
430
|
date?: string | null;
|
|
431
|
+
initials?: string | null;
|
|
432
|
+
provenance?: TrackedChangeProvenance;
|
|
433
|
+
suggestionId?: string | null;
|
|
409
434
|
};
|
|
410
435
|
} | {
|
|
411
436
|
trIns?: never;
|
|
412
437
|
trDel?: never;
|
|
413
438
|
});
|
|
439
|
+
/**
|
|
440
|
+
* A whole-node *suggested* insertion marker (AI proposal) carried on a
|
|
441
|
+
* paragraph or table node. The node is dropped entirely from serialized DOCX
|
|
442
|
+
* until accepted; accepting converts it to a real tracked change (paragraph
|
|
443
|
+
* mark `w:ins`) or, where OOXML has no tracked representation (whole table),
|
|
444
|
+
* applies it directly.
|
|
445
|
+
*/
|
|
446
|
+
type SuggestedStructuralMarker = {
|
|
447
|
+
suggestionId: string;
|
|
448
|
+
revisionId: number;
|
|
449
|
+
author: string;
|
|
450
|
+
date?: string | null;
|
|
451
|
+
initials?: string | null;
|
|
452
|
+
};
|
|
414
453
|
/**
|
|
415
454
|
* Table cell attributes
|
|
416
455
|
*/
|
|
@@ -441,13 +480,22 @@ type TableCellAttrs = {
|
|
|
441
480
|
revisionId: number;
|
|
442
481
|
author: string;
|
|
443
482
|
date?: string | null;
|
|
483
|
+
initials?: string | null; /** `"suggested"` marks this as an AI proposal (stripped until accepted). */
|
|
484
|
+
provenance?: TrackedChangeProvenance;
|
|
485
|
+
suggestionId?: string | null;
|
|
444
486
|
};
|
|
445
487
|
} | {
|
|
446
488
|
kind: "merge";
|
|
489
|
+
/**
|
|
490
|
+
* Merge markers resolve via cell-merge resolution and are never
|
|
491
|
+
* produced in suggested mode (cell merge/split reports
|
|
492
|
+
* `unsupportedMode`), so they carry no suggestion provenance.
|
|
493
|
+
*/
|
|
447
494
|
info: {
|
|
448
495
|
revisionId: number;
|
|
449
496
|
author: string;
|
|
450
497
|
date?: string | null;
|
|
498
|
+
initials?: string | null;
|
|
451
499
|
};
|
|
452
500
|
verticalMerge?: "continue" | "rest";
|
|
453
501
|
verticalMergeOriginal?: "continue" | "rest";
|
|
@@ -456,4 +504,4 @@ type TableCellAttrs = {
|
|
|
456
504
|
_docxVMergeContinuationCells?: document_d_exports.TableCell[];
|
|
457
505
|
};
|
|
458
506
|
//#endregion
|
|
459
|
-
export { BlockSdtAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, ImagePositionAttrs, MathAttrs, ParagraphAttrs, SdtAttrs, ShapeAttrs, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAnchorAttrs, TextBoxAttrs };
|
|
507
|
+
export { BlockSdtAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, ImagePositionAttrs, MathAttrs, ParagraphAttrs, SdtAttrs, ShapeAttrs, SuggestedStructuralMarker, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAnchorAttrs, TextBoxAttrs };
|
|
@@ -36,11 +36,11 @@ function pixelsToTwips(pixels) {
|
|
|
36
36
|
*/
|
|
37
37
|
function computeTabStops(context) {
|
|
38
38
|
const { explicitStops = [], defaultTabInterval = 720, leftIndent = 0 } = context;
|
|
39
|
-
const validExplicitStops = explicitStops.filter((stop) => stop.val !== "clear");
|
|
39
|
+
const validExplicitStops = explicitStops.filter((stop) => stop.val !== "clear" && stop.val !== "bar");
|
|
40
40
|
const clearPositions = explicitStops.filter((stop) => stop.val === "clear").map((stop) => stop.pos);
|
|
41
41
|
let maxExplicit = 0;
|
|
42
42
|
for (const stop of validExplicitStops) maxExplicit = Math.max(maxExplicit, stop.pos);
|
|
43
|
-
const stops =
|
|
43
|
+
const stops = explicitStops.filter((stop) => stop.val !== "clear");
|
|
44
44
|
const hasLeftIndentClear = clearPositions.some((p) => Math.abs(p - leftIndent) < 20);
|
|
45
45
|
const addsImplicitLeftIndent = leftIndent > 0 && !hasLeftIndentClear && !validExplicitStops.some((stop) => stop.pos <= leftIndent);
|
|
46
46
|
if (addsImplicitLeftIndent) stops.push({
|
|
@@ -53,7 +53,7 @@ function computeTabStops(context) {
|
|
|
53
53
|
while (pos < limitPos) {
|
|
54
54
|
pos += defaultTabInterval;
|
|
55
55
|
let hasExplicitStop = false;
|
|
56
|
-
for (const stop of
|
|
56
|
+
for (const stop of stops) if (Math.abs(stop.pos - pos) < 20) {
|
|
57
57
|
hasExplicitStop = true;
|
|
58
58
|
break;
|
|
59
59
|
}
|
|
@@ -41,7 +41,7 @@ var RemoteSelectionOverlay = class {
|
|
|
41
41
|
if (!caret) continue;
|
|
42
42
|
const caretElement = createOverlayElement(pagesContainer, CARET_CLASS, zIndex + 1);
|
|
43
43
|
caretElement.dataset["clientId"] = String(selection.clientId);
|
|
44
|
-
caretElement.style.
|
|
44
|
+
caretElement.style.backgroundColor = selection.color;
|
|
45
45
|
setBox(caretElement, {
|
|
46
46
|
...caret,
|
|
47
47
|
width: 2
|
|
@@ -50,7 +50,7 @@ var RemoteSelectionOverlay = class {
|
|
|
50
50
|
const label = createOverlayElement(pagesContainer, LABEL_CLASS, zIndex + 2);
|
|
51
51
|
label.dataset["clientId"] = String(selection.clientId);
|
|
52
52
|
label.textContent = selection.name;
|
|
53
|
-
label.style.
|
|
53
|
+
label.style.backgroundColor = selection.color;
|
|
54
54
|
label.style.color = "var(--background, #fff)";
|
|
55
55
|
label.style.fontSize = "10px";
|
|
56
56
|
label.style.lineHeight = "1";
|
package/dist/server.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { FolioAIBlock, FolioAIBlockAnchor, FolioAIBlockKind, FolioAIBlockPreview
|
|
|
2
2
|
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, FolioDocumentOperation, FolioDocumentOperationAffectedTarget, FolioDocumentOperationBatch, FolioDocumentOperationCapabilities, FolioDocumentOperationIssue, FolioDocumentOperationMode, FolioDocumentOperationPrecondition, FolioDocumentOperationReceipt, FolioDocumentOperationRecovery, FolioDocumentOperationResult, FolioDocumentOperationStatus, FolioDocumentOperationStory, FolioDocumentOperationType, FolioDocumentOperationUndoFailureReason, FolioDocumentOperationUndoHandle, FolioDocumentOperationUndoResult, InvalidFolioDocumentOperationBatchError, UnsupportedFolioDocumentOperationVersionError, assertSupportedFolioDocumentOperationVersion, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch } from "./document-operations.js";
|
|
3
3
|
import { FolioReviewChange, FolioReviewChangeKind } from "./ai-edits/read.js";
|
|
4
4
|
import { ApplyFolioAIEditsToBufferOptions, ApplyFolioAIEditsToBufferResult, FOLIO_RESOLVED_REVIEWED_VIEWS, FOLIO_REVIEWED_VIEWS, FolioApplyDocumentOperationsOptions, FolioApplyDocumentOperationsToStoryOptions, FolioApplyOperationsOptions, FolioDocumentStory, FolioDocumentStoryHandle, FolioDocumentStoryNotFoundError, FolioDocxReviewer, FolioDocxReviewerOptions, FolioEditableDocumentStoryHandle, FolioReadReviewedStoryOptions, FolioResolveReviewedStoryOptions, FolioResolvedReviewedView, FolioReviewChangeFilter, FolioReviewComment, FolioReviewCommentFilter, FolioReviewCommentReply, FolioReviewReplyInput, FolioReviewedStory, FolioReviewedView, UnsupportedFolioReviewedViewError, applyFolioAIEditsToBuffer, isFolioResolvedReviewedView, isFolioReviewedView } from "./ai-edits/headless.js";
|
|
5
|
-
import { createFolioAITextRangeHandle } from "./ai-edits/snapshot.js";
|
|
5
|
+
import { createFolioAITextRangeHandle, hashFolioAIBlockText, normalizeFolioAIBlockText } from "./ai-edits/snapshot.js";
|
|
6
6
|
import { getFolioDocumentOutline, readFolioDocumentSection } from "./ai-edits/scoped-reading.js";
|
|
7
7
|
import { DeriveBlockIdInput, FolioBlockId, deriveBlockId, getFolioParaIdFromBlockId, isFolioBlockId, isSequentialFolioBlockId } from "./types/block-id.js";
|
|
8
8
|
import { DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION, DocumentPreset, DocumentStyleSet } from "./style-sets/types.js";
|
|
@@ -17,8 +17,9 @@ import { DocxArchiveError, DocxArchiveOptions } from "./docx/server/boundedArchi
|
|
|
17
17
|
import { EvaluateDocxXmlPatchProposalArgs, 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, FolioDocxPreparedXmlReplacement, FolioDocxXmlPatchProposal, FolioDocxXmlPatchProposalEvaluation, FolioDocxXmlPatchProposalIssue, FolioDocxXmlPatchProposalIssueCode, FolioDocxXmlPatchProposalLimits, FolioDocxXmlReplacement, InvalidFolioDocxXmlPatchProposalError, InvalidFolioDocxXmlPatchProposalOptionsError, evaluateDocxXmlPatchProposal, parseFolioDocxXmlPatchProposal } from "./docx/server/evaluateDocxXmlPatchProposal.js";
|
|
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
|
+
import { docxToMarkdown } from "./docx/server/docxToMarkdown.js";
|
|
20
21
|
import { DocxParagraphSource, ExtractedDocxParagraph, ExtractedDocxText, extractDocxText } from "./docx/server/extractDocxText.js";
|
|
21
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";
|
|
22
23
|
import { GenerateRedlineDocxOptions, GenerateRedlineDocxResult, GenerateRedlineUnprocessedStory, InvalidGenerateRedlineDocxOptionsError, generateRedlineDocx } from "./redline.js";
|
|
23
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";
|
|
24
|
-
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, ensureParaIds, evaluateDocxXmlPatchProposal, extractDocumentStyleSet, extractDocumentStyleSetFromDocx, extractDocxText, generateRedlineDocx, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioDocumentOutline, getFolioParaIdFromBlockId, inspectDocumentStyles, inspectDocumentStylesFromDocx, inspectDocxPackage, isFolioBlockId, isFolioDocumentOperationModeSupported, isFolioDocumentPrivacyTransform, isFolioResolvedReviewedView, isFolioReviewedView, isFolioVersionComparisonPrivacyTransform, isFolioVersionComparisonScope, isSequentialFolioBlockId, isSupportedFolioDocumentOperationVersion, 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, 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 };
|
package/dist/server.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { deriveBlockId, getFolioParaIdFromBlockId, isFolioBlockId, isSequentialFolioBlockId } from "./types/block-id.js";
|
|
2
|
-
import { createFolioAITextRangeHandle } from "./ai-edits/snapshot.js";
|
|
2
|
+
import { createFolioAITextRangeHandle, hashFolioAIBlockText, normalizeFolioAIBlockText } from "./ai-edits/snapshot.js";
|
|
3
3
|
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, assertSupportedFolioDocumentOperationVersion, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, isFolioDocumentOperationModeSupported, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch } from "./document-operations.js";
|
|
4
4
|
import { DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION } from "./style-sets/types.js";
|
|
5
5
|
import { createEmptyDocument } from "./utils/createDocument.js";
|
|
@@ -12,11 +12,12 @@ import { FOLIO_RESOLVED_REVIEWED_VIEWS, FOLIO_REVIEWED_VIEWS, FolioDocumentStory
|
|
|
12
12
|
import { FOLIO_DOCUMENT_METADATA_PROPERTIES, FOLIO_DOCUMENT_PRIVACY_TRANSFORMS, FolioDocumentPrivacyArchiveError, InvalidFolioDocumentPrivacyOptionsError, isFolioDocumentPrivacyTransform, rewriteDocxMetadataPrivacy } from "./docx/metadataPrivacy.js";
|
|
13
13
|
import { FOLIO_VERSION_COMPARISON_PRIVACY_TRANSFORMS, FOLIO_VERSION_COMPARISON_SCOPES, InvalidFolioVersionComparisonOptionsError, applyFolioVersionDiffPrivacy, compareDocxVersions, isFolioVersionComparisonPrivacyTransform, isFolioVersionComparisonScope } from "./version-comparison.js";
|
|
14
14
|
import { InvalidGenerateRedlineDocxOptionsError, generateRedlineDocx } from "./redline.js";
|
|
15
|
-
import { EnsureParaIdsError, ensureParaIds } from "./docx/ensureParaIds.js";
|
|
16
15
|
import { DocxArchiveError } from "./docx/server/boundedArchive.js";
|
|
16
|
+
import { EnsureParaIdsError, ensureParaIds } from "./docx/ensureParaIds.js";
|
|
17
17
|
import { extractDocxText } from "./docx/server/extractDocxText.js";
|
|
18
|
+
import { docxToMarkdown } from "./docx/server/docxToMarkdown.js";
|
|
18
19
|
import { FOLIO_DOCX_PACKAGE_INSPECTION_DEFAULTS, FOLIO_DOCX_PACKAGE_INSPECTION_ERROR_CODES, FOLIO_DOCX_PACKAGE_INSPECTION_VERSION, FolioDocxPackageInspectionError, inspectDocxPackage } from "./docx/server/inspectDocxPackage.js";
|
|
19
20
|
import { 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, InvalidFolioDocxXmlPatchProposalError, InvalidFolioDocxXmlPatchProposalOptionsError, evaluateDocxXmlPatchProposal, parseFolioDocxXmlPatchProposal } from "./docx/server/evaluateDocxXmlPatchProposal.js";
|
|
20
21
|
import { FOLIO_DOCX_CONFORMANCE_CHECKS, FOLIO_DOCX_CONFORMANCE_ISSUE_CODES, FOLIO_DOCX_CONFORMANCE_PROFILE, FOLIO_DOCX_CONFORMANCE_REPORT_VERSION, validateDocxConformance } from "./docx/server/validateDocxConformance.js";
|
|
21
22
|
import { FOLIO_DOCX_XML_PATCH_APPLICATION_PROFILE, FOLIO_DOCX_XML_PATCH_APPLICATION_VERSION, FolioDocxXmlPatchApplicationError, UnsupportedFolioDocxXmlPatchApplicationProfileError, applyDocxXmlPatchProposal } from "./docx/server/applyDocxXmlPatchProposal.js";
|
|
22
|
-
export { DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION, DocxArchiveError, EnsureParaIdsError, 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, FolioDocumentPrivacyArchiveError, FolioDocumentStoryNotFoundError, FolioDocxPackageInspectionError, FolioDocxReviewer, FolioDocxXmlPatchApplicationError, InvalidFolioDocumentOperationBatchError, InvalidFolioDocumentPrivacyOptionsError, InvalidFolioDocxXmlPatchProposalError, InvalidFolioDocxXmlPatchProposalOptionsError, InvalidFolioVersionComparisonOptionsError, InvalidGenerateRedlineDocxOptionsError, STELLA_STYLE_SET_NAME, UnsupportedFolioDocumentOperationVersionError, UnsupportedFolioDocxXmlPatchApplicationProfileError, UnsupportedFolioReviewedViewError, applyDocxXmlPatchProposal, applyFolioAIEditsToBuffer, applyFolioVersionDiffPrivacy, assertSupportedFolioDocumentOperationVersion, compareDocxVersions, createDocx, createEmptyDocument, createFolioAITextRangeHandle, createStellaStyleDocumentPreset, createStellaStyleSet, deriveBlockId, ensureParaIds, evaluateDocxXmlPatchProposal, extractDocumentStyleSet, extractDocumentStyleSetFromDocx, extractDocxText, generateRedlineDocx, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioDocumentOutline, getFolioParaIdFromBlockId, inspectDocumentStyles, inspectDocumentStylesFromDocx, inspectDocxPackage, isFolioBlockId, isFolioDocumentOperationModeSupported, isFolioDocumentPrivacyTransform, isFolioResolvedReviewedView, isFolioReviewedView, isFolioVersionComparisonPrivacyTransform, isFolioVersionComparisonScope, isSequentialFolioBlockId, isSupportedFolioDocumentOperationVersion, parseFolioDocumentOperationBatch, parseFolioDocxXmlPatchProposal, readFolioDocumentSection, replyToComment, rewriteDocxMetadataPrivacy, validateDocxConformance };
|
|
23
|
+
export { DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION, DocxArchiveError, EnsureParaIdsError, 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, FolioDocumentPrivacyArchiveError, FolioDocumentStoryNotFoundError, FolioDocxPackageInspectionError, FolioDocxReviewer, FolioDocxXmlPatchApplicationError, InvalidFolioDocumentOperationBatchError, InvalidFolioDocumentPrivacyOptionsError, InvalidFolioDocxXmlPatchProposalError, InvalidFolioDocxXmlPatchProposalOptionsError, InvalidFolioVersionComparisonOptionsError, InvalidGenerateRedlineDocxOptionsError, STELLA_STYLE_SET_NAME, UnsupportedFolioDocumentOperationVersionError, UnsupportedFolioDocxXmlPatchApplicationProfileError, UnsupportedFolioReviewedViewError, 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 };
|
|
@@ -85,6 +85,15 @@ declare function isWordHtml(html: string): boolean;
|
|
|
85
85
|
* Check if HTML is from our editor
|
|
86
86
|
*/
|
|
87
87
|
declare function isEditorHtml(html: string): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Sanitize inbound clipboard HTML at the paste trust boundary.
|
|
90
|
+
*
|
|
91
|
+
* Comments and XML declarations are stripped with linear scanners. When a
|
|
92
|
+
* browser `window` is available, DOMPurify removes scripts, event handlers,
|
|
93
|
+
* and dangerous URLs before any DOM walk. Without a window (unit stubs / SSR)
|
|
94
|
+
* the linear cleaners still run; the live editor path always has `window`.
|
|
95
|
+
*/
|
|
96
|
+
declare function sanitizeInboundClipboardHtml(html: string): string;
|
|
88
97
|
/**
|
|
89
98
|
* Clean Microsoft Word HTML
|
|
90
99
|
*/
|
|
@@ -123,4 +132,4 @@ declare const _default: {
|
|
|
123
132
|
createClipboardHandlers: typeof createClipboardHandlers;
|
|
124
133
|
};
|
|
125
134
|
//#endregion
|
|
126
|
-
export { CLIPBOARD_TYPES, ClipboardContent, ClipboardOptions, INTERNAL_CLIPBOARD_TYPE, ParsedClipboardContent, cleanWordHtml, copyParagraphs, copyRuns, createClipboardHandlers, _default as default, getClipboardImageFiles, handlePasteEvent, htmlToRuns, isEditorHtml, isWordHtml, paragraphsToClipboardContent, parseClipboardHtml, readFromClipboard, runsToClipboardContent, writeToClipboard };
|
|
135
|
+
export { CLIPBOARD_TYPES, ClipboardContent, ClipboardOptions, INTERNAL_CLIPBOARD_TYPE, ParsedClipboardContent, cleanWordHtml, copyParagraphs, copyRuns, createClipboardHandlers, _default as default, getClipboardImageFiles, handlePasteEvent, htmlToRuns, isEditorHtml, isWordHtml, paragraphsToClipboardContent, parseClipboardHtml, readFromClipboard, runsToClipboardContent, sanitizeInboundClipboardHtml, writeToClipboard };
|
package/dist/utils/clipboard.js
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
|
+
import { stripXmlDeclarations } from "./stripXmlDeclarations.js";
|
|
2
|
+
import createDOMPurify from "dompurify";
|
|
1
3
|
//#region src/utils/clipboard.ts
|
|
2
4
|
/**
|
|
5
|
+
* Clipboard utilities for copy/paste with formatting
|
|
6
|
+
*
|
|
7
|
+
* Handles:
|
|
8
|
+
* - Copy: puts formatted HTML and plain text on clipboard
|
|
9
|
+
* - Paste: reads HTML clipboard, converts to runs with formatting
|
|
10
|
+
* - Handles paste from Word (cleans up Word HTML)
|
|
11
|
+
* - Ctrl+C, Ctrl+V, Ctrl+X keyboard shortcuts
|
|
12
|
+
*/
|
|
13
|
+
let domPurify;
|
|
14
|
+
const getDomPurify = () => domPurify ??= createDOMPurify(window);
|
|
15
|
+
/**
|
|
3
16
|
* Custom MIME type for internal clipboard format
|
|
4
17
|
*/
|
|
5
18
|
const INTERNAL_CLIPBOARD_TYPE = "application/x-stella-folio";
|
|
@@ -308,12 +321,24 @@ function stripPairedNamespaceTags(html, prefix) {
|
|
|
308
321
|
return result;
|
|
309
322
|
}
|
|
310
323
|
/**
|
|
324
|
+
* Sanitize inbound clipboard HTML at the paste trust boundary.
|
|
325
|
+
*
|
|
326
|
+
* Comments and XML declarations are stripped with linear scanners. When a
|
|
327
|
+
* browser `window` is available, DOMPurify removes scripts, event handlers,
|
|
328
|
+
* and dangerous URLs before any DOM walk. Without a window (unit stubs / SSR)
|
|
329
|
+
* the linear cleaners still run; the live editor path always has `window`.
|
|
330
|
+
*/
|
|
331
|
+
function sanitizeInboundClipboardHtml(html) {
|
|
332
|
+
let cleaned = stripHtmlComments(html);
|
|
333
|
+
cleaned = stripXmlDeclarations(cleaned);
|
|
334
|
+
if (typeof globalThis.window === "undefined") return cleaned;
|
|
335
|
+
return getDomPurify().sanitize(cleaned);
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
311
338
|
* Clean Microsoft Word HTML
|
|
312
339
|
*/
|
|
313
340
|
function cleanWordHtml(html) {
|
|
314
|
-
let cleaned = html;
|
|
315
|
-
cleaned = stripHtmlComments(cleaned);
|
|
316
|
-
cleaned = cleaned.replace(/<\?xml[^>]*>/gi, "");
|
|
341
|
+
let cleaned = sanitizeInboundClipboardHtml(html);
|
|
317
342
|
cleaned = stripPairedNamespaceTags(cleaned, "o:");
|
|
318
343
|
cleaned = cleaned.replace(/<o:[^>]*\/>/gi, "");
|
|
319
344
|
cleaned = stripPairedNamespaceTags(cleaned, "w:");
|
|
@@ -325,7 +350,8 @@ function cleanWordHtml(html) {
|
|
|
325
350
|
return cleaned;
|
|
326
351
|
}
|
|
327
352
|
function cleanWordAttributes(html) {
|
|
328
|
-
const
|
|
353
|
+
const sanitized = sanitizeInboundClipboardHtml(html);
|
|
354
|
+
const container = new DOMParser().parseFromString(sanitized, "text/html").body;
|
|
329
355
|
for (const element of Array.from(container.querySelectorAll("*"))) {
|
|
330
356
|
const filteredClasses = Array.from(element.classList).filter((className) => !className.includes("Mso"));
|
|
331
357
|
if (filteredClasses.length === 0) element.removeAttribute("class");
|
|
@@ -346,7 +372,8 @@ function cleanWordAttributes(html) {
|
|
|
346
372
|
*/
|
|
347
373
|
function htmlToRuns(html, plainTextFallback) {
|
|
348
374
|
if (!html || html.trim() === "") return plainTextFallback ? [createTextRun(plainTextFallback)] : [];
|
|
349
|
-
const
|
|
375
|
+
const sanitized = sanitizeInboundClipboardHtml(html);
|
|
376
|
+
const container = new DOMParser().parseFromString(sanitized, "text/html").body;
|
|
350
377
|
const runs = [];
|
|
351
378
|
processNode(container, runs, {});
|
|
352
379
|
if (runs.length === 0 && plainTextFallback) return [createTextRun(plainTextFallback)];
|
|
@@ -619,4 +646,4 @@ var clipboard_default = {
|
|
|
619
646
|
createClipboardHandlers
|
|
620
647
|
};
|
|
621
648
|
//#endregion
|
|
622
|
-
export { CLIPBOARD_TYPES, INTERNAL_CLIPBOARD_TYPE, cleanWordHtml, copyParagraphs, copyRuns, createClipboardHandlers, clipboard_default as default, getClipboardImageFiles, handlePasteEvent, htmlToRuns, isEditorHtml, isWordHtml, paragraphsToClipboardContent, parseClipboardHtml, readFromClipboard, runsToClipboardContent, writeToClipboard };
|
|
649
|
+
export { CLIPBOARD_TYPES, INTERNAL_CLIPBOARD_TYPE, cleanWordHtml, copyParagraphs, copyRuns, createClipboardHandlers, clipboard_default as default, getClipboardImageFiles, handlePasteEvent, htmlToRuns, isEditorHtml, isWordHtml, paragraphsToClipboardContent, parseClipboardHtml, readFromClipboard, runsToClipboardContent, sanitizeInboundClipboardHtml, writeToClipboard };
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { document_d_exports } from "../types/document.js";
|
|
2
2
|
|
|
3
3
|
//#region src/utils/colorResolver.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Public form of the same hex-color check, for callers that read a color
|
|
6
|
+
* value from an untrusted surface (e.g. a pasted DOM node's `dataset`,
|
|
7
|
+
* which bypasses the CSSOM's own value validation) and must reject it
|
|
8
|
+
* before storing it as editor state.
|
|
9
|
+
*/
|
|
10
|
+
declare function isValidHexColor(value: string | undefined | null): boolean;
|
|
4
11
|
/**
|
|
5
12
|
* Resolve a ColorValue to a CSS color string
|
|
6
13
|
*
|
|
@@ -162,4 +169,4 @@ declare function generateThemeTintShadeMatrix(colorScheme?: document_d_exports.T
|
|
|
162
169
|
*/
|
|
163
170
|
declare function colorsEqual(color1: document_d_exports.ColorValue | undefined | null, color2: document_d_exports.ColorValue | undefined | null, theme: document_d_exports.Theme | null | undefined): boolean;
|
|
164
171
|
//#endregion
|
|
165
|
-
export { STANDARD_TEXT_COLORS, ThemeMatrixCell, blendColors, colorsEqual, createRgbColor, createThemeColor, darkenColor, ensureHexPrefix, generateThemeTintShadeMatrix, getContrastingColor, getThemeTintShadeHex, isBlack, isWhite, lightenColor, parseColorString, resolveColor, resolveColorToHex, resolveHighlightColor, resolveHighlightToCss, resolveShadingColor };
|
|
172
|
+
export { STANDARD_TEXT_COLORS, ThemeMatrixCell, blendColors, colorsEqual, createRgbColor, createThemeColor, darkenColor, ensureHexPrefix, generateThemeTintShadeMatrix, getContrastingColor, getThemeTintShadeHex, isBlack, isValidHexColor, isWhite, lightenColor, parseColorString, resolveColor, resolveColorToHex, resolveHighlightColor, resolveHighlightToCss, resolveShadingColor };
|