@eigenpal/docx-editor-core 1.0.3 → 1.1.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/LICENSE +13 -16
- package/dist/agent/index.d.mts +1 -2
- package/dist/agent/index.d.ts +1 -2
- package/dist/agent/index.js +1 -1
- package/dist/agent/index.mjs +1 -1
- package/dist/{chunk-Z4SJCSTS.js → chunk-25KY5HLN.js} +1 -1
- package/dist/chunk-44FHVKSI.js +1 -0
- package/dist/{chunk-XWQB6APW.mjs → chunk-5CDBSK2R.mjs} +1 -1
- package/dist/{chunk-EQVNAHL7.mjs → chunk-6Y6LON6Y.mjs} +1 -1
- package/dist/{chunk-QVEAQOMR.mjs → chunk-6ZXL3EIP.mjs} +1 -1
- package/dist/chunk-73AZQWIE.js +1 -0
- package/dist/chunk-7HANRHHL.js +1 -0
- package/dist/chunk-7LRR7RKE.mjs +15 -0
- package/dist/{chunk-GHQS3I2W.mjs → chunk-7Z2AGPNQ.mjs} +1 -1
- package/dist/chunk-BGE57OES.js +1 -0
- package/dist/{chunk-3JXR6YU4.mjs → chunk-BOOHU5EW.mjs} +1 -1
- package/dist/chunk-CA2EYL6T.mjs +1 -0
- package/dist/{chunk-2IE6UDHJ.mjs → chunk-CTHHUJAB.mjs} +1 -1
- package/dist/chunk-DLCDDB66.mjs +3 -0
- package/dist/chunk-DV6GWBUJ.js +2 -0
- package/dist/{chunk-EPX7BBJD.js → chunk-E4JMCA5X.js} +2 -2
- package/dist/chunk-F44ZLDZS.js +4 -0
- package/dist/chunk-FDEDN2RC.mjs +0 -0
- package/dist/chunk-FEWCI2E5.mjs +1 -0
- package/dist/chunk-GFDIPDJ6.mjs +1 -0
- package/dist/chunk-GM4USWKO.js +2 -0
- package/dist/chunk-GWBVJZVT.js +3 -0
- package/dist/chunk-GY5BWVM7.js +1 -0
- package/dist/{chunk-XBHF5Q2F.js → chunk-H42RXHT4.js} +1 -1
- package/dist/chunk-HMBVSDCH.mjs +1 -0
- package/dist/{chunk-D536HC5M.js → chunk-HQPWFUP5.js} +1 -1
- package/dist/chunk-HV6HE6YR.js +59 -0
- package/dist/chunk-IF4C25FN.mjs +1 -0
- package/dist/chunk-IQG3KLWY.mjs +2 -0
- package/dist/{chunk-ABBG4WD2.js → chunk-J4J2Y6EU.js} +2 -2
- package/dist/chunk-KGDXHUYC.js +1 -0
- package/dist/chunk-KHF4JU7D.mjs +1 -0
- package/dist/chunk-LCICADWM.js +2 -0
- package/dist/{chunk-D5E5TA74.js → chunk-LOCW6MR2.js} +1 -1
- package/dist/{chunk-XBIKSAH6.js → chunk-LTHT4A4S.js} +1 -1
- package/dist/chunk-MJ6XZFVD.mjs +1 -0
- package/dist/chunk-MNOHUTKE.js +15 -0
- package/dist/chunk-MP4QSEO2.mjs +1 -0
- package/dist/chunk-MZ2XCZAN.mjs +1 -0
- package/dist/chunk-OAWTQ3IY.js +1 -0
- package/dist/{chunk-HL5PQT3A.mjs → chunk-OEXVWIHW.mjs} +1 -1
- package/dist/chunk-ONRBRDIC.mjs +59 -0
- package/dist/{chunk-7PX32GLB.mjs → chunk-ONWOHAFW.mjs} +1 -1
- package/dist/{chunk-EV6W6KXG.mjs → chunk-OUEKNYX5.mjs} +1 -1
- package/dist/chunk-OX75Q5ZG.mjs +1 -0
- package/dist/chunk-QEACB5VG.js +1 -0
- package/dist/chunk-RFC2SXZ6.mjs +4 -0
- package/dist/chunk-RFVFX5WK.mjs +1 -0
- package/dist/chunk-SORYYVJ7.js +1 -0
- package/dist/chunk-TUIEV7Q7.js +1 -0
- package/dist/chunk-U74VPTIU.js +1 -0
- package/dist/chunk-UOQT6A7P.js +1 -0
- package/dist/chunk-V5VDCQDN.mjs +1 -0
- package/dist/chunk-VHUVPHPI.mjs +1 -0
- package/dist/{chunk-SAFW7UQZ.js → chunk-W7GLQ6DV.js} +1 -1
- package/dist/chunk-WLHNIXWC.mjs +2 -0
- package/dist/chunk-X6HFDXKB.js +1 -0
- package/dist/chunk-XPV6VILW.mjs +1 -0
- package/dist/chunk-Y3ZQQI4D.js +1 -0
- package/dist/chunk-YTDWMXNS.js +1 -0
- package/dist/chunk-ZUGNF5KU.js +1 -0
- package/dist/chunk-ZX26QZJ5.mjs +1 -0
- package/dist/content-5Mrz6w_b.d.mts +1360 -0
- package/dist/content-CmqAwdFL.d.ts +1360 -0
- package/dist/core-plugins.d.mts +1 -2
- package/dist/core-plugins.d.ts +1 -2
- package/dist/core-plugins.js +1 -1
- package/dist/core-plugins.mjs +1 -1
- package/dist/core.d.mts +6 -7
- package/dist/core.d.ts +6 -7
- package/dist/core.js +1 -1
- package/dist/core.mjs +1 -1
- package/dist/{documentSerializer-Chn7J1WG.d.ts → documentSerializer-BRaaXIHm.d.ts} +1 -1
- package/dist/{documentSerializer-C1ueey5d.d.mts → documentSerializer-DgO3A9av.d.mts} +1 -1
- package/dist/docx/index.d.mts +1 -2
- package/dist/docx/index.d.ts +1 -2
- package/dist/docx/index.js +1 -1
- package/dist/docx/index.mjs +1 -1
- package/dist/docx/parser.d.mts +1 -2
- package/dist/docx/parser.d.ts +1 -2
- package/dist/docx/parser.js +1 -1
- package/dist/docx/parser.mjs +1 -1
- package/dist/docx/rezip.d.mts +1 -2
- package/dist/docx/rezip.d.ts +1 -2
- package/dist/docx/rezip.js +1 -1
- package/dist/docx/rezip.mjs +1 -1
- package/dist/docx/serializer/index.d.mts +2 -3
- package/dist/docx/serializer/index.d.ts +2 -3
- package/dist/docx/serializer/index.js +1 -1
- package/dist/docx/serializer/index.mjs +1 -1
- package/dist/{fontLoader-BOt95Jtf.d.mts → fontLoader-8b4X-AIh.d.mts} +63 -3
- package/dist/{fontLoader-QPwbcX5j.d.ts → fontLoader-CK2QLq68.d.ts} +63 -3
- package/dist/{headerFooterLayout-DVFcJ832.d.mts → headerFooterLayout-72Vz7yp3.d.mts} +74 -2
- package/dist/{headerFooterLayout-B5LyDpSM.d.ts → headerFooterLayout-Ca4ESDHF.d.ts} +74 -2
- package/dist/headless.d.mts +5 -5
- package/dist/headless.d.ts +5 -5
- package/dist/headless.js +1 -1
- package/dist/headless.mjs +1 -1
- package/dist/layout-bridge/index.d.mts +4 -4
- package/dist/layout-bridge/index.d.ts +4 -4
- package/dist/layout-bridge/index.js +1 -1
- package/dist/layout-bridge/index.mjs +1 -1
- package/dist/layout-bridge/measuring/index.d.mts +4 -0
- package/dist/layout-bridge/measuring/index.d.ts +4 -0
- package/dist/layout-bridge/measuring/index.js +1 -1
- package/dist/layout-bridge/measuring/index.mjs +1 -1
- package/dist/layout-bridge/tableInsertHover.js +1 -1
- package/dist/layout-bridge/tableInsertHover.mjs +1 -1
- package/dist/layout-bridge/toFlowBlocks.d.mts +2 -1
- package/dist/layout-bridge/toFlowBlocks.d.ts +2 -1
- package/dist/layout-bridge/toFlowBlocks.js +1 -1
- package/dist/layout-bridge/toFlowBlocks.mjs +1 -1
- package/dist/layout-engine/index.d.mts +3 -0
- package/dist/layout-engine/index.d.ts +3 -0
- package/dist/layout-engine/index.js +1 -1
- package/dist/layout-engine/index.mjs +1 -1
- package/dist/layout-engine/types.d.mts +44 -0
- package/dist/layout-engine/types.d.ts +44 -0
- package/dist/layout-painter/index.d.mts +2 -3
- package/dist/layout-painter/index.d.ts +2 -3
- package/dist/layout-painter/index.js +1 -1
- package/dist/layout-painter/index.mjs +1 -1
- package/dist/layout-painter/renderPage.d.mts +2 -3
- package/dist/layout-painter/renderPage.d.ts +2 -3
- package/dist/layout-painter/renderPage.js +1 -1
- package/dist/layout-painter/renderPage.mjs +1 -1
- package/dist/managers/AutoSaveManager.d.mts +1 -2
- package/dist/managers/AutoSaveManager.d.ts +1 -2
- package/dist/managers/TableSelectionManager.d.mts +1 -2
- package/dist/managers/TableSelectionManager.d.ts +1 -2
- package/dist/managers/types.d.mts +1 -2
- package/dist/managers/types.d.ts +1 -2
- package/dist/mcp-cli.mjs +23 -22
- package/dist/mcp.d.mts +1 -2
- package/dist/mcp.d.ts +1 -2
- package/dist/mcp.js +3 -3
- package/dist/mcp.mjs +1 -1
- package/dist/{nodes-CL8M0L-a.d.mts → nodes-7753Bgi_.d.mts} +64 -3
- package/dist/{nodes-D7PTUJ2N.d.ts → nodes-CC_nwkT_.d.ts} +64 -3
- package/dist/prosemirror/commands/formatting.js +1 -1
- package/dist/prosemirror/commands/formatting.mjs +1 -1
- package/dist/prosemirror/commands/index.d.mts +80 -6
- package/dist/prosemirror/commands/index.d.ts +80 -6
- package/dist/prosemirror/commands/index.js +1 -1
- package/dist/prosemirror/commands/index.mjs +1 -1
- package/dist/prosemirror/commands/paragraph.js +1 -1
- package/dist/prosemirror/commands/paragraph.mjs +1 -1
- package/dist/prosemirror/conversion/fromProseDoc.d.mts +1 -2
- package/dist/prosemirror/conversion/fromProseDoc.d.ts +1 -2
- package/dist/prosemirror/conversion/fromProseDoc.js +1 -1
- package/dist/prosemirror/conversion/fromProseDoc.mjs +1 -1
- package/dist/prosemirror/conversion/index.d.mts +1 -2
- package/dist/prosemirror/conversion/index.d.ts +1 -2
- package/dist/prosemirror/conversion/index.js +1 -1
- package/dist/prosemirror/conversion/index.mjs +1 -1
- package/dist/prosemirror/editor.css +155 -95
- package/dist/prosemirror/extensions/index.js +1 -1
- package/dist/prosemirror/extensions/index.mjs +1 -1
- package/dist/prosemirror/extensions/nodes/TableExtension.js +1 -1
- package/dist/prosemirror/extensions/nodes/TableExtension.mjs +1 -1
- package/dist/prosemirror/index.d.mts +2 -3
- package/dist/prosemirror/index.d.ts +2 -3
- package/dist/prosemirror/index.js +1 -1
- package/dist/prosemirror/index.mjs +1 -1
- package/dist/prosemirror/plugins/index.d.mts +121 -17
- package/dist/prosemirror/plugins/index.d.ts +121 -17
- package/dist/prosemirror/plugins/index.js +1 -1
- package/dist/prosemirror/plugins/index.mjs +1 -1
- package/dist/prosemirror/schema/index.d.mts +3 -4
- package/dist/prosemirror/schema/index.d.ts +3 -4
- package/dist/prosemirror/schema/index.js +1 -1
- package/dist/prosemirror/schema/index.mjs +1 -1
- package/dist/prosemirror/utils/extractTrackedChanges.d.mts +44 -22
- package/dist/prosemirror/utils/extractTrackedChanges.d.ts +44 -22
- package/dist/prosemirror/utils/extractTrackedChanges.js +1 -1
- package/dist/prosemirror/utils/extractTrackedChanges.mjs +1 -1
- package/dist/types/content.d.mts +4 -1167
- package/dist/types/content.d.ts +4 -1167
- package/dist/types/document.d.mts +2 -4
- package/dist/types/document.d.ts +2 -4
- package/dist/utils/comments.d.mts +78 -5
- package/dist/utils/comments.d.ts +78 -5
- package/dist/utils/comments.js +1 -1
- package/dist/utils/comments.mjs +1 -1
- package/dist/utils/highlightColors.js +1 -1
- package/dist/utils/highlightColors.mjs +1 -1
- package/dist/utils/index.d.mts +2 -3
- package/dist/utils/index.d.ts +2 -3
- package/dist/utils/index.js +3 -3
- package/dist/utils/index.mjs +3 -3
- package/dist/{variableDetector-CAdt8yOr.d.mts → variableDetector-DF3-nxUC.d.mts} +1 -1
- package/dist/{variableDetector-W4XEN9YC.d.ts → variableDetector-sBkgVh3f.d.ts} +1 -1
- package/package.json +3 -3
- package/dist/chunk-3AZWLVLC.js +0 -1
- package/dist/chunk-3NLVHZMT.js +0 -59
- package/dist/chunk-5SU4HPQS.mjs +0 -1
- package/dist/chunk-AHXPHBMT.js +0 -1
- package/dist/chunk-B6LYBJ4H.mjs +0 -1
- package/dist/chunk-BFB4PRS4.mjs +0 -1
- package/dist/chunk-BRHHK4MG.mjs +0 -2
- package/dist/chunk-CP5OSG5Z.mjs +0 -1
- package/dist/chunk-CUXXRGPQ.mjs +0 -1
- package/dist/chunk-G7AKYAKU.mjs +0 -1
- package/dist/chunk-HAAMO2Z2.mjs +0 -1
- package/dist/chunk-IN6IYQ2X.js +0 -1
- package/dist/chunk-IO6HZ7KR.js +0 -2
- package/dist/chunk-KBU6QQFU.js +0 -9
- package/dist/chunk-LDKESXXK.mjs +0 -3
- package/dist/chunk-N3EIZN65.js +0 -1
- package/dist/chunk-NERY274X.js +0 -1
- package/dist/chunk-NNQWQOC5.mjs +0 -1
- package/dist/chunk-NO5LW2DQ.mjs +0 -1
- package/dist/chunk-OTDF6PZK.js +0 -1
- package/dist/chunk-P3AXSRLG.mjs +0 -1
- package/dist/chunk-QMLIXLZJ.mjs +0 -4
- package/dist/chunk-QXHL67FG.mjs +0 -1
- package/dist/chunk-TGPS3SRR.mjs +0 -1
- package/dist/chunk-TMISJEGL.js +0 -1
- package/dist/chunk-TRJWRZZD.js +0 -1
- package/dist/chunk-TRQN2SFW.mjs +0 -59
- package/dist/chunk-UGXSKZVM.js +0 -1
- package/dist/chunk-V435QKZB.js +0 -3
- package/dist/chunk-V6SWUCTS.js +0 -2
- package/dist/chunk-X3NB7STJ.js +0 -1
- package/dist/chunk-XOH7YAYL.js +0 -1
- package/dist/chunk-Y5HZAMND.mjs +0 -9
- package/dist/chunk-Y7I5QDCN.mjs +0 -1
- package/dist/chunk-YCDB5TA6.js +0 -4
- package/dist/chunk-YE357WVA.js +0 -1
- package/dist/chunk-YVYB4YCI.js +0 -1
- package/dist/lists-CvG_iVK3.d.mts +0 -148
- package/dist/lists-UTp_tk7B.d.ts +0 -148
|
@@ -7,39 +7,56 @@
|
|
|
7
7
|
* @public
|
|
8
8
|
*/
|
|
9
9
|
export { SelectionChangeCallback, SelectionContext, createSelectionTrackerPlugin, extractSelectionContext, getSelectionContext, selectionTrackerKey } from './selectionTracker.mjs';
|
|
10
|
-
import {
|
|
10
|
+
import { PluginKey, EditorState, Transaction, Plugin } from 'prosemirror-state';
|
|
11
|
+
import { m as RevisionInfo } from '../../content-5Mrz6w_b.mjs';
|
|
11
12
|
import '../../formatting-BH4hcZiq.mjs';
|
|
12
13
|
import '../../colors-C3vA7HUU.mjs';
|
|
14
|
+
import '../../docx/wrapTypes.mjs';
|
|
13
15
|
|
|
14
16
|
/**
|
|
15
|
-
* Suggestion
|
|
16
|
-
*
|
|
17
|
-
* When active, intercepts all text insertions and deletions,
|
|
18
|
-
* wrapping them in tracked change marks (insertion/deletion)
|
|
19
|
-
* instead of modifying the document directly.
|
|
17
|
+
* Suggestion-mode plugin state + shared meta keys.
|
|
20
18
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* (retracting your own suggestion)
|
|
19
|
+
* Kept in its own module to avoid an import cycle: every handler file needs
|
|
20
|
+
* the plugin key + meta constants but should not transitively pull in the
|
|
21
|
+
* plugin factory.
|
|
25
22
|
*/
|
|
26
23
|
|
|
27
|
-
declare const suggestionModeKey: PluginKey<SuggestionModeState>;
|
|
28
24
|
interface SuggestionModeState {
|
|
29
25
|
active: boolean;
|
|
30
26
|
author: string;
|
|
31
27
|
}
|
|
28
|
+
declare const suggestionModeKey: PluginKey<SuggestionModeState>;
|
|
29
|
+
|
|
32
30
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
31
|
+
* Suggesting-mode toggle / set / query commands. Each dispatches a meta on
|
|
32
|
+
* the plugin key — the plugin's `state.apply` merges it into
|
|
33
|
+
* `SuggestionModeState`. No-ops gracefully when the plugin isn't mounted.
|
|
35
34
|
*/
|
|
36
|
-
|
|
35
|
+
|
|
37
36
|
/**
|
|
38
|
-
* Toggle
|
|
37
|
+
* Toggle suggesting mode on/off. The mounted `createSuggestionModePlugin`
|
|
38
|
+
* is required for the dispatch to have any effect — without it the meta
|
|
39
|
+
* is silently dropped. Returns `false` (no-op) if the plugin is missing.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { toggleSuggestionMode } from '@eigenpal/docx-editor-core/prosemirror/plugins';
|
|
44
|
+
* toggleSuggestionMode(view.state, view.dispatch);
|
|
45
|
+
* ```
|
|
39
46
|
*/
|
|
40
47
|
declare function toggleSuggestionMode(state: EditorState, dispatch?: (tr: Transaction) => void): boolean;
|
|
41
48
|
/**
|
|
42
|
-
* Set
|
|
49
|
+
* Set suggesting mode active state and (optionally) author. Author
|
|
50
|
+
* tracks across every revision minted while the mode is on. The
|
|
51
|
+
* mounted `createSuggestionModePlugin` is required.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* import { setSuggestionMode } from '@eigenpal/docx-editor-core/prosemirror/plugins';
|
|
56
|
+
* setSuggestionMode(true, view.state, view.dispatch, 'Jane');
|
|
57
|
+
* // ... typed text now wraps in <w:ins> with author="Jane"
|
|
58
|
+
* setSuggestionMode(false, view.state, view.dispatch);
|
|
59
|
+
* ```
|
|
43
60
|
*/
|
|
44
61
|
declare function setSuggestionMode(active: boolean, state: EditorState, dispatch?: (tr: Transaction) => void, author?: string): boolean;
|
|
45
62
|
/**
|
|
@@ -47,4 +64,91 @@ declare function setSuggestionMode(active: boolean, state: EditorState, dispatch
|
|
|
47
64
|
*/
|
|
48
65
|
declare function isSuggestionModeActive(state: EditorState): boolean;
|
|
49
66
|
|
|
50
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Suggestion Mode Plugin
|
|
69
|
+
*
|
|
70
|
+
* When active, intercepts all text insertions and deletions, wrapping
|
|
71
|
+
* them in tracked-change marks (insertion/deletion) instead of modifying
|
|
72
|
+
* the document directly.
|
|
73
|
+
*
|
|
74
|
+
* - Typed text is marked as insertion (green underline)
|
|
75
|
+
* - Deleted text is NOT removed — it's marked as deletion (red strikethrough)
|
|
76
|
+
* - Text already marked as insertion by the current author is deleted
|
|
77
|
+
* normally (retracting your own suggestion)
|
|
78
|
+
*
|
|
79
|
+
* The implementation is split across this directory for readability:
|
|
80
|
+
* - `state.ts` — plugin key, meta constants, shared types
|
|
81
|
+
* - `markAttrs.ts` — fresh-attr minting + projection
|
|
82
|
+
* - `adjacency.ts` — coalescing lookups (sibling, cross-block, cellMarker)
|
|
83
|
+
* - `handlers/` — keyboard / input handlers (delete, insert, structural)
|
|
84
|
+
* - `commands.ts` — toggle / set / isActive
|
|
85
|
+
* - this file — `createSuggestionModePlugin` + public re-exports
|
|
86
|
+
*/
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Create the suggestion-mode ProseMirror plugin. **Must be mounted on
|
|
90
|
+
* the editor view for `setSuggestionMode` and `toggleSuggestionMode`
|
|
91
|
+
* to do anything** — both adapters (`@eigenpal/docx-editor-react`,
|
|
92
|
+
* `@eigenpal/docx-editor-vue`) auto-mount this inside the `DocxEditor`
|
|
93
|
+
* component, so consumers using the bundled components don't need to
|
|
94
|
+
* register it themselves.
|
|
95
|
+
*
|
|
96
|
+
* When active, typed text gets the `insertion` mark, deleted text gets
|
|
97
|
+
* the `deletion` mark (text stays in the doc; the painter strikes it
|
|
98
|
+
* through), Enter sets `pPrIns` on the originating paragraph, and
|
|
99
|
+
* Backspace at paragraph start sets `pPrDel` on the previous paragraph.
|
|
100
|
+
* Author + adjacent same-author marks coalesce into one tracked change.
|
|
101
|
+
*
|
|
102
|
+
* @param initialActive - Whether suggesting mode starts on. Default `false`.
|
|
103
|
+
* @param author - Author name attached to every minted revision. Default `'User'`.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* import { createSuggestionModePlugin } from '@eigenpal/docx-editor-core/prosemirror/plugins';
|
|
108
|
+
*
|
|
109
|
+
* const plugin = createSuggestionModePlugin(false, 'Jane');
|
|
110
|
+
* EditorState.create({ doc, plugins: [plugin, ...other] });
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
declare function createSuggestionModePlugin(initialActive?: boolean, author?: string): Plugin;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Single source of tracked-revision ids across the package.
|
|
117
|
+
*
|
|
118
|
+
* Why a shared module-level counter:
|
|
119
|
+
*
|
|
120
|
+
* - Each `revisionId` is the OOXML `<w:ins w:id="…"/>` attribute. Two
|
|
121
|
+
* unrelated revisions emitted by the same author with the same id
|
|
122
|
+
* would silently collapse in the sidebar (grouped by id+author+date)
|
|
123
|
+
* and on accept (resolved by id), so collisions are observable.
|
|
124
|
+
* - Pre-refactor, three call sites each kept their own
|
|
125
|
+
* `Date.now() + offset` counter (suggestionMode.ts, table commands
|
|
126
|
+
* delete.ts, table commands insert.ts). Offsets made first-load
|
|
127
|
+
* collisions rare but not impossible — counters drift independently,
|
|
128
|
+
* and parallel-browser Playwright workers can start from identical
|
|
129
|
+
* `Date.now()` seeds.
|
|
130
|
+
*
|
|
131
|
+
* Routing every mint through this module guarantees within-realm
|
|
132
|
+
* uniqueness even when callers interleave across plugins, commands, and
|
|
133
|
+
* test harnesses.
|
|
134
|
+
*
|
|
135
|
+
* Re-exported as `@public` through `prosemirror/plugins/index.ts` so
|
|
136
|
+
* adapter integrations (image insertion, custom commands) can mint
|
|
137
|
+
* revision triples without reaching into the implementation directly.
|
|
138
|
+
*
|
|
139
|
+
* @packageDocumentation
|
|
140
|
+
* @public
|
|
141
|
+
*/
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Build a fresh `RevisionInfo` triple from the active suggesting-mode
|
|
145
|
+
* state. Returns `null` when suggesting mode is OFF — callers use this to
|
|
146
|
+
* decide whether to track an edit or apply it directly.
|
|
147
|
+
*
|
|
148
|
+
* Shared by `suggestionMode.ts`'s text/paragraph handlers and by the
|
|
149
|
+
* suggesting-aware table commands (`addRowBelow`, `deleteRow`, ...). One
|
|
150
|
+
* source of truth for both the mint and the author/date fields.
|
|
151
|
+
*/
|
|
152
|
+
declare function makeRevisionInfo(state: EditorState): RevisionInfo | null;
|
|
153
|
+
|
|
154
|
+
export { RevisionInfo, createSuggestionModePlugin, isSuggestionModeActive, makeRevisionInfo, setSuggestionMode, suggestionModeKey, toggleSuggestionMode };
|
|
@@ -7,39 +7,56 @@
|
|
|
7
7
|
* @public
|
|
8
8
|
*/
|
|
9
9
|
export { SelectionChangeCallback, SelectionContext, createSelectionTrackerPlugin, extractSelectionContext, getSelectionContext, selectionTrackerKey } from './selectionTracker.js';
|
|
10
|
-
import {
|
|
10
|
+
import { PluginKey, EditorState, Transaction, Plugin } from 'prosemirror-state';
|
|
11
|
+
import { m as RevisionInfo } from '../../content-CmqAwdFL.js';
|
|
11
12
|
import '../../formatting-_OXU8gLB.js';
|
|
12
13
|
import '../../colors-C3vA7HUU.js';
|
|
14
|
+
import '../../docx/wrapTypes.js';
|
|
13
15
|
|
|
14
16
|
/**
|
|
15
|
-
* Suggestion
|
|
16
|
-
*
|
|
17
|
-
* When active, intercepts all text insertions and deletions,
|
|
18
|
-
* wrapping them in tracked change marks (insertion/deletion)
|
|
19
|
-
* instead of modifying the document directly.
|
|
17
|
+
* Suggestion-mode plugin state + shared meta keys.
|
|
20
18
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* (retracting your own suggestion)
|
|
19
|
+
* Kept in its own module to avoid an import cycle: every handler file needs
|
|
20
|
+
* the plugin key + meta constants but should not transitively pull in the
|
|
21
|
+
* plugin factory.
|
|
25
22
|
*/
|
|
26
23
|
|
|
27
|
-
declare const suggestionModeKey: PluginKey<SuggestionModeState>;
|
|
28
24
|
interface SuggestionModeState {
|
|
29
25
|
active: boolean;
|
|
30
26
|
author: string;
|
|
31
27
|
}
|
|
28
|
+
declare const suggestionModeKey: PluginKey<SuggestionModeState>;
|
|
29
|
+
|
|
32
30
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
31
|
+
* Suggesting-mode toggle / set / query commands. Each dispatches a meta on
|
|
32
|
+
* the plugin key — the plugin's `state.apply` merges it into
|
|
33
|
+
* `SuggestionModeState`. No-ops gracefully when the plugin isn't mounted.
|
|
35
34
|
*/
|
|
36
|
-
|
|
35
|
+
|
|
37
36
|
/**
|
|
38
|
-
* Toggle
|
|
37
|
+
* Toggle suggesting mode on/off. The mounted `createSuggestionModePlugin`
|
|
38
|
+
* is required for the dispatch to have any effect — without it the meta
|
|
39
|
+
* is silently dropped. Returns `false` (no-op) if the plugin is missing.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { toggleSuggestionMode } from '@eigenpal/docx-editor-core/prosemirror/plugins';
|
|
44
|
+
* toggleSuggestionMode(view.state, view.dispatch);
|
|
45
|
+
* ```
|
|
39
46
|
*/
|
|
40
47
|
declare function toggleSuggestionMode(state: EditorState, dispatch?: (tr: Transaction) => void): boolean;
|
|
41
48
|
/**
|
|
42
|
-
* Set
|
|
49
|
+
* Set suggesting mode active state and (optionally) author. Author
|
|
50
|
+
* tracks across every revision minted while the mode is on. The
|
|
51
|
+
* mounted `createSuggestionModePlugin` is required.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* import { setSuggestionMode } from '@eigenpal/docx-editor-core/prosemirror/plugins';
|
|
56
|
+
* setSuggestionMode(true, view.state, view.dispatch, 'Jane');
|
|
57
|
+
* // ... typed text now wraps in <w:ins> with author="Jane"
|
|
58
|
+
* setSuggestionMode(false, view.state, view.dispatch);
|
|
59
|
+
* ```
|
|
43
60
|
*/
|
|
44
61
|
declare function setSuggestionMode(active: boolean, state: EditorState, dispatch?: (tr: Transaction) => void, author?: string): boolean;
|
|
45
62
|
/**
|
|
@@ -47,4 +64,91 @@ declare function setSuggestionMode(active: boolean, state: EditorState, dispatch
|
|
|
47
64
|
*/
|
|
48
65
|
declare function isSuggestionModeActive(state: EditorState): boolean;
|
|
49
66
|
|
|
50
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Suggestion Mode Plugin
|
|
69
|
+
*
|
|
70
|
+
* When active, intercepts all text insertions and deletions, wrapping
|
|
71
|
+
* them in tracked-change marks (insertion/deletion) instead of modifying
|
|
72
|
+
* the document directly.
|
|
73
|
+
*
|
|
74
|
+
* - Typed text is marked as insertion (green underline)
|
|
75
|
+
* - Deleted text is NOT removed — it's marked as deletion (red strikethrough)
|
|
76
|
+
* - Text already marked as insertion by the current author is deleted
|
|
77
|
+
* normally (retracting your own suggestion)
|
|
78
|
+
*
|
|
79
|
+
* The implementation is split across this directory for readability:
|
|
80
|
+
* - `state.ts` — plugin key, meta constants, shared types
|
|
81
|
+
* - `markAttrs.ts` — fresh-attr minting + projection
|
|
82
|
+
* - `adjacency.ts` — coalescing lookups (sibling, cross-block, cellMarker)
|
|
83
|
+
* - `handlers/` — keyboard / input handlers (delete, insert, structural)
|
|
84
|
+
* - `commands.ts` — toggle / set / isActive
|
|
85
|
+
* - this file — `createSuggestionModePlugin` + public re-exports
|
|
86
|
+
*/
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Create the suggestion-mode ProseMirror plugin. **Must be mounted on
|
|
90
|
+
* the editor view for `setSuggestionMode` and `toggleSuggestionMode`
|
|
91
|
+
* to do anything** — both adapters (`@eigenpal/docx-editor-react`,
|
|
92
|
+
* `@eigenpal/docx-editor-vue`) auto-mount this inside the `DocxEditor`
|
|
93
|
+
* component, so consumers using the bundled components don't need to
|
|
94
|
+
* register it themselves.
|
|
95
|
+
*
|
|
96
|
+
* When active, typed text gets the `insertion` mark, deleted text gets
|
|
97
|
+
* the `deletion` mark (text stays in the doc; the painter strikes it
|
|
98
|
+
* through), Enter sets `pPrIns` on the originating paragraph, and
|
|
99
|
+
* Backspace at paragraph start sets `pPrDel` on the previous paragraph.
|
|
100
|
+
* Author + adjacent same-author marks coalesce into one tracked change.
|
|
101
|
+
*
|
|
102
|
+
* @param initialActive - Whether suggesting mode starts on. Default `false`.
|
|
103
|
+
* @param author - Author name attached to every minted revision. Default `'User'`.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* import { createSuggestionModePlugin } from '@eigenpal/docx-editor-core/prosemirror/plugins';
|
|
108
|
+
*
|
|
109
|
+
* const plugin = createSuggestionModePlugin(false, 'Jane');
|
|
110
|
+
* EditorState.create({ doc, plugins: [plugin, ...other] });
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
declare function createSuggestionModePlugin(initialActive?: boolean, author?: string): Plugin;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Single source of tracked-revision ids across the package.
|
|
117
|
+
*
|
|
118
|
+
* Why a shared module-level counter:
|
|
119
|
+
*
|
|
120
|
+
* - Each `revisionId` is the OOXML `<w:ins w:id="…"/>` attribute. Two
|
|
121
|
+
* unrelated revisions emitted by the same author with the same id
|
|
122
|
+
* would silently collapse in the sidebar (grouped by id+author+date)
|
|
123
|
+
* and on accept (resolved by id), so collisions are observable.
|
|
124
|
+
* - Pre-refactor, three call sites each kept their own
|
|
125
|
+
* `Date.now() + offset` counter (suggestionMode.ts, table commands
|
|
126
|
+
* delete.ts, table commands insert.ts). Offsets made first-load
|
|
127
|
+
* collisions rare but not impossible — counters drift independently,
|
|
128
|
+
* and parallel-browser Playwright workers can start from identical
|
|
129
|
+
* `Date.now()` seeds.
|
|
130
|
+
*
|
|
131
|
+
* Routing every mint through this module guarantees within-realm
|
|
132
|
+
* uniqueness even when callers interleave across plugins, commands, and
|
|
133
|
+
* test harnesses.
|
|
134
|
+
*
|
|
135
|
+
* Re-exported as `@public` through `prosemirror/plugins/index.ts` so
|
|
136
|
+
* adapter integrations (image insertion, custom commands) can mint
|
|
137
|
+
* revision triples without reaching into the implementation directly.
|
|
138
|
+
*
|
|
139
|
+
* @packageDocumentation
|
|
140
|
+
* @public
|
|
141
|
+
*/
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Build a fresh `RevisionInfo` triple from the active suggesting-mode
|
|
145
|
+
* state. Returns `null` when suggesting mode is OFF — callers use this to
|
|
146
|
+
* decide whether to track an edit or apply it directly.
|
|
147
|
+
*
|
|
148
|
+
* Shared by `suggestionMode.ts`'s text/paragraph handlers and by the
|
|
149
|
+
* suggesting-aware table commands (`addRowBelow`, `deleteRow`, ...). One
|
|
150
|
+
* source of truth for both the mint and the author/date fields.
|
|
151
|
+
*/
|
|
152
|
+
declare function makeRevisionInfo(state: EditorState): RevisionInfo | null;
|
|
153
|
+
|
|
154
|
+
export { RevisionInfo, createSuggestionModePlugin, isSuggestionModeActive, makeRevisionInfo, setSuggestionMode, suggestionModeKey, toggleSuggestionMode };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';require('../../chunk-U74VPTIU.js');var chunk73AZQWIE_js=require('../../chunk-73AZQWIE.js');require('../../chunk-YTDWMXNS.js');var chunk6LVPRTB6_js=require('../../chunk-6LVPRTB6.js'),chunk7HANRHHL_js=require('../../chunk-7HANRHHL.js');require('../../chunk-Q4CKLXWA.js'),require('../../chunk-DC7S76ZX.js');Object.defineProperty(exports,"createSuggestionModePlugin",{enumerable:true,get:function(){return chunk73AZQWIE_js.d}});Object.defineProperty(exports,"isSuggestionModeActive",{enumerable:true,get:function(){return chunk73AZQWIE_js.c}});Object.defineProperty(exports,"setSuggestionMode",{enumerable:true,get:function(){return chunk73AZQWIE_js.b}});Object.defineProperty(exports,"toggleSuggestionMode",{enumerable:true,get:function(){return chunk73AZQWIE_js.a}});Object.defineProperty(exports,"createSelectionTrackerPlugin",{enumerable:true,get:function(){return chunk6LVPRTB6_js.c}});Object.defineProperty(exports,"extractSelectionContext",{enumerable:true,get:function(){return chunk6LVPRTB6_js.b}});Object.defineProperty(exports,"getSelectionContext",{enumerable:true,get:function(){return chunk6LVPRTB6_js.d}});Object.defineProperty(exports,"selectionTrackerKey",{enumerable:true,get:function(){return chunk6LVPRTB6_js.a}});Object.defineProperty(exports,"makeRevisionInfo",{enumerable:true,get:function(){return chunk7HANRHHL_js.i}});Object.defineProperty(exports,"suggestionModeKey",{enumerable:true,get:function(){return chunk7HANRHHL_js.e}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export{
|
|
1
|
+
import'../../chunk-FDEDN2RC.mjs';export{d as createSuggestionModePlugin,c as isSuggestionModeActive,b as setSuggestionMode,a as toggleSuggestionMode}from'../../chunk-KHF4JU7D.mjs';import'../../chunk-VHUVPHPI.mjs';export{c as createSelectionTrackerPlugin,b as extractSelectionContext,d as getSelectionContext,a as selectionTrackerKey}from'../../chunk-BGY3CB37.mjs';export{i as makeRevisionInfo,e as suggestionModeKey}from'../../chunk-MJ6XZFVD.mjs';import'../../chunk-VQWZHPWI.mjs';import'../../chunk-QYUPLKLP.mjs';
|
|
@@ -9,14 +9,13 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import * as prosemirror_model from 'prosemirror-model';
|
|
11
11
|
import { a as ExtensionManager } from '../../types-RchZmPFN.mjs';
|
|
12
|
-
export { I as ImageAttrs, a as ImagePositionAttrs, P as ParagraphAttrs, T as TableAttrs, b as TableCellAttrs, c as TableRowAttrs } from '../../nodes-
|
|
12
|
+
export { I as ImageAttrs, a as ImagePositionAttrs, P as ParagraphAttrs, T as TableAttrs, b as TableCellAttrs, c as TableRowAttrs } from '../../nodes-7753Bgi_.mjs';
|
|
13
13
|
export { F as FontFamilyAttrs, a as FontSizeAttrs, H as HyperlinkAttrs, T as TextColorAttrs, U as UnderlineAttrs } from '../../marks-BY573yZn.mjs';
|
|
14
14
|
import 'prosemirror-state';
|
|
15
|
-
import '../../formatting-BH4hcZiq.mjs';
|
|
16
15
|
import '../../colors-C3vA7HUU.mjs';
|
|
17
|
-
import '../../
|
|
16
|
+
import '../../formatting-BH4hcZiq.mjs';
|
|
17
|
+
import '../../content-5Mrz6w_b.mjs';
|
|
18
18
|
import '../../docx/wrapTypes.mjs';
|
|
19
|
-
import '../../types/content.mjs';
|
|
20
19
|
|
|
21
20
|
declare const singletonManager: ExtensionManager;
|
|
22
21
|
declare const schema: prosemirror_model.Schema<any, any>;
|
|
@@ -9,14 +9,13 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import * as prosemirror_model from 'prosemirror-model';
|
|
11
11
|
import { a as ExtensionManager } from '../../types-RchZmPFN.js';
|
|
12
|
-
export { I as ImageAttrs, a as ImagePositionAttrs, P as ParagraphAttrs, T as TableAttrs, b as TableCellAttrs, c as TableRowAttrs } from '../../nodes-
|
|
12
|
+
export { I as ImageAttrs, a as ImagePositionAttrs, P as ParagraphAttrs, T as TableAttrs, b as TableCellAttrs, c as TableRowAttrs } from '../../nodes-CC_nwkT_.js';
|
|
13
13
|
export { F as FontFamilyAttrs, a as FontSizeAttrs, H as HyperlinkAttrs, T as TextColorAttrs, U as UnderlineAttrs } from '../../marks-CjC9tF5k.js';
|
|
14
14
|
import 'prosemirror-state';
|
|
15
|
-
import '../../formatting-_OXU8gLB.js';
|
|
16
15
|
import '../../colors-C3vA7HUU.js';
|
|
17
|
-
import '../../
|
|
16
|
+
import '../../formatting-_OXU8gLB.js';
|
|
17
|
+
import '../../content-CmqAwdFL.js';
|
|
18
18
|
import '../../docx/wrapTypes.js';
|
|
19
|
-
import '../../types/content.js';
|
|
20
19
|
|
|
21
20
|
declare const singletonManager: ExtensionManager;
|
|
22
21
|
declare const schema: prosemirror_model.Schema<any, any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var chunkOAWTQ3IY_js=require('../../chunk-OAWTQ3IY.js');require('../../chunk-GM4USWKO.js'),require('../../chunk-BHBOAP6Z.js'),require('../../chunk-MZ7LW5CH.js'),require('../../chunk-N3Y5BUKV.js'),require('../../chunk-YTDWMXNS.js'),require('../../chunk-6LVPRTB6.js'),require('../../chunk-TUIEV7Q7.js'),require('../../chunk-7HANRHHL.js'),require('../../chunk-MJ5FQX7Q.js'),require('../../chunk-C2BAPYGJ.js'),require('../../chunk-4Q2IP5FW.js'),require('../../chunk-Q4CKLXWA.js'),require('../../chunk-DC7S76ZX.js');Object.defineProperty(exports,"schema",{enumerable:true,get:function(){return chunkOAWTQ3IY_js.b}});Object.defineProperty(exports,"singletonManager",{enumerable:true,get:function(){return chunkOAWTQ3IY_js.a}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export{b as schema,a as singletonManager}from'../../chunk-
|
|
1
|
+
export{b as schema,a as singletonManager}from'../../chunk-CA2EYL6T.mjs';import'../../chunk-IQG3KLWY.mjs';import'../../chunk-MOKKS75W.mjs';import'../../chunk-OZMNIX6U.mjs';import'../../chunk-AMENZY5F.mjs';import'../../chunk-VHUVPHPI.mjs';import'../../chunk-BGY3CB37.mjs';import'../../chunk-ZX26QZJ5.mjs';import'../../chunk-MJ6XZFVD.mjs';import'../../chunk-67LVRQIR.mjs';import'../../chunk-LE67NTCN.mjs';import'../../chunk-VW22RZ6C.mjs';import'../../chunk-VQWZHPWI.mjs';import'../../chunk-QYUPLKLP.mjs';
|
|
@@ -6,25 +6,22 @@
|
|
|
6
6
|
* for replace ops).
|
|
7
7
|
*
|
|
8
8
|
* Pure function — no React, no Vue, no side effects. Single O(N) walk
|
|
9
|
-
* over text nodes.
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* those. The subpath stays in `package.json` `exports` for back-compat;
|
|
16
|
-
* expect it to move behind a public surface in a future major.
|
|
9
|
+
* over text nodes. Consumers building custom sidebars should prefer the
|
|
10
|
+
* adapter-specific wrappers (`useTrackedChanges` in
|
|
11
|
+
* `@eigenpal/docx-editor-react/hooks` and
|
|
12
|
+
* `@eigenpal/docx-editor-vue/composables`), which add the memoization
|
|
13
|
+
* and reactivity layer. Reach for the core function directly for
|
|
14
|
+
* server-side analysis or test fixtures.
|
|
17
15
|
*
|
|
18
16
|
* @packageDocumentation
|
|
19
|
-
* @
|
|
17
|
+
* @public
|
|
20
18
|
*/
|
|
21
19
|
import { EditorState } from 'prosemirror-state';
|
|
22
20
|
import { TrackedChangeEntry } from '../../utils/comments.mjs';
|
|
23
|
-
import '../../
|
|
21
|
+
import '../../content-5Mrz6w_b.mjs';
|
|
24
22
|
import '../../formatting-BH4hcZiq.mjs';
|
|
25
23
|
import '../../colors-C3vA7HUU.mjs';
|
|
26
24
|
import '../../docx/wrapTypes.mjs';
|
|
27
|
-
import '../../lists-CvG_iVK3.mjs';
|
|
28
25
|
|
|
29
26
|
/**
|
|
30
27
|
* Walk the PM doc once and derive (a) the tracked-change list and (b) a
|
|
@@ -34,20 +31,22 @@ import '../../lists-CvG_iVK3.mjs';
|
|
|
34
31
|
* for replace ops).
|
|
35
32
|
*
|
|
36
33
|
* Pure function — no React, no Vue, no side effects. Single O(N) walk
|
|
37
|
-
* over text nodes.
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* those. The subpath stays in `package.json` `exports` for back-compat;
|
|
44
|
-
* expect it to move behind a public surface in a future major.
|
|
34
|
+
* over text nodes. Consumers building custom sidebars should prefer the
|
|
35
|
+
* adapter-specific wrappers (`useTrackedChanges` in
|
|
36
|
+
* `@eigenpal/docx-editor-react/hooks` and
|
|
37
|
+
* `@eigenpal/docx-editor-vue/composables`), which add the memoization
|
|
38
|
+
* and reactivity layer. Reach for the core function directly for
|
|
39
|
+
* server-side analysis or test fixtures.
|
|
45
40
|
*
|
|
46
41
|
* @packageDocumentation
|
|
47
|
-
* @
|
|
42
|
+
* @public
|
|
48
43
|
*/
|
|
49
44
|
|
|
50
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* Output of {@link extractTrackedChanges}.
|
|
47
|
+
*
|
|
48
|
+
* @public
|
|
49
|
+
*/
|
|
51
50
|
interface TrackedChangesResult {
|
|
52
51
|
/** Tracked-change entries, sorted by document position, with adjacent same-revision entries merged. */
|
|
53
52
|
entries: TrackedChangeEntry[];
|
|
@@ -57,7 +56,30 @@ interface TrackedChangesResult {
|
|
|
57
56
|
*/
|
|
58
57
|
commentToRevision: Map<number, number>;
|
|
59
58
|
}
|
|
60
|
-
/**
|
|
59
|
+
/**
|
|
60
|
+
* Walk the PM doc and extract every tracked change as a flat list of
|
|
61
|
+
* `TrackedChangeEntry` plus a comment→revision overlap map. Adjacent
|
|
62
|
+
* inline marks coalesce by `(type, revisionId, author, date)`; a
|
|
63
|
+
* deletion immediately followed by an insertion (same author + same
|
|
64
|
+
* date) collapses into a single `replacement` entry; paragraph-mark
|
|
65
|
+
* cards (`paragraphMarkInsertion` / `paragraphMarkDeletion`) are
|
|
66
|
+
* hidden when an inline entry already covers their revision triple
|
|
67
|
+
* (one Accept clears every site of one conceptual change).
|
|
68
|
+
*
|
|
69
|
+
* Pure and deterministic. Returns `EMPTY_RESULT` on null state.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* import { extractTrackedChanges } from '@eigenpal/docx-editor-core/prosemirror/utils/extractTrackedChanges';
|
|
74
|
+
*
|
|
75
|
+
* const { entries, commentToRevision } = extractTrackedChanges(view.state);
|
|
76
|
+
* for (const e of entries) {
|
|
77
|
+
* console.log(e.type, e.author, e.text);
|
|
78
|
+
* }
|
|
79
|
+
* ```
|
|
80
|
+
*
|
|
81
|
+
* @public
|
|
82
|
+
*/
|
|
61
83
|
declare function extractTrackedChanges(state: EditorState | null): TrackedChangesResult;
|
|
62
84
|
|
|
63
85
|
export { type TrackedChangesResult, extractTrackedChanges };
|
|
@@ -6,25 +6,22 @@
|
|
|
6
6
|
* for replace ops).
|
|
7
7
|
*
|
|
8
8
|
* Pure function — no React, no Vue, no side effects. Single O(N) walk
|
|
9
|
-
* over text nodes.
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* those. The subpath stays in `package.json` `exports` for back-compat;
|
|
16
|
-
* expect it to move behind a public surface in a future major.
|
|
9
|
+
* over text nodes. Consumers building custom sidebars should prefer the
|
|
10
|
+
* adapter-specific wrappers (`useTrackedChanges` in
|
|
11
|
+
* `@eigenpal/docx-editor-react/hooks` and
|
|
12
|
+
* `@eigenpal/docx-editor-vue/composables`), which add the memoization
|
|
13
|
+
* and reactivity layer. Reach for the core function directly for
|
|
14
|
+
* server-side analysis or test fixtures.
|
|
17
15
|
*
|
|
18
16
|
* @packageDocumentation
|
|
19
|
-
* @
|
|
17
|
+
* @public
|
|
20
18
|
*/
|
|
21
19
|
import { EditorState } from 'prosemirror-state';
|
|
22
20
|
import { TrackedChangeEntry } from '../../utils/comments.js';
|
|
23
|
-
import '../../
|
|
21
|
+
import '../../content-CmqAwdFL.js';
|
|
24
22
|
import '../../formatting-_OXU8gLB.js';
|
|
25
23
|
import '../../colors-C3vA7HUU.js';
|
|
26
24
|
import '../../docx/wrapTypes.js';
|
|
27
|
-
import '../../lists-UTp_tk7B.js';
|
|
28
25
|
|
|
29
26
|
/**
|
|
30
27
|
* Walk the PM doc once and derive (a) the tracked-change list and (b) a
|
|
@@ -34,20 +31,22 @@ import '../../lists-UTp_tk7B.js';
|
|
|
34
31
|
* for replace ops).
|
|
35
32
|
*
|
|
36
33
|
* Pure function — no React, no Vue, no side effects. Single O(N) walk
|
|
37
|
-
* over text nodes.
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* those. The subpath stays in `package.json` `exports` for back-compat;
|
|
44
|
-
* expect it to move behind a public surface in a future major.
|
|
34
|
+
* over text nodes. Consumers building custom sidebars should prefer the
|
|
35
|
+
* adapter-specific wrappers (`useTrackedChanges` in
|
|
36
|
+
* `@eigenpal/docx-editor-react/hooks` and
|
|
37
|
+
* `@eigenpal/docx-editor-vue/composables`), which add the memoization
|
|
38
|
+
* and reactivity layer. Reach for the core function directly for
|
|
39
|
+
* server-side analysis or test fixtures.
|
|
45
40
|
*
|
|
46
41
|
* @packageDocumentation
|
|
47
|
-
* @
|
|
42
|
+
* @public
|
|
48
43
|
*/
|
|
49
44
|
|
|
50
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* Output of {@link extractTrackedChanges}.
|
|
47
|
+
*
|
|
48
|
+
* @public
|
|
49
|
+
*/
|
|
51
50
|
interface TrackedChangesResult {
|
|
52
51
|
/** Tracked-change entries, sorted by document position, with adjacent same-revision entries merged. */
|
|
53
52
|
entries: TrackedChangeEntry[];
|
|
@@ -57,7 +56,30 @@ interface TrackedChangesResult {
|
|
|
57
56
|
*/
|
|
58
57
|
commentToRevision: Map<number, number>;
|
|
59
58
|
}
|
|
60
|
-
/**
|
|
59
|
+
/**
|
|
60
|
+
* Walk the PM doc and extract every tracked change as a flat list of
|
|
61
|
+
* `TrackedChangeEntry` plus a comment→revision overlap map. Adjacent
|
|
62
|
+
* inline marks coalesce by `(type, revisionId, author, date)`; a
|
|
63
|
+
* deletion immediately followed by an insertion (same author + same
|
|
64
|
+
* date) collapses into a single `replacement` entry; paragraph-mark
|
|
65
|
+
* cards (`paragraphMarkInsertion` / `paragraphMarkDeletion`) are
|
|
66
|
+
* hidden when an inline entry already covers their revision triple
|
|
67
|
+
* (one Accept clears every site of one conceptual change).
|
|
68
|
+
*
|
|
69
|
+
* Pure and deterministic. Returns `EMPTY_RESULT` on null state.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* import { extractTrackedChanges } from '@eigenpal/docx-editor-core/prosemirror/utils/extractTrackedChanges';
|
|
74
|
+
*
|
|
75
|
+
* const { entries, commentToRevision } = extractTrackedChanges(view.state);
|
|
76
|
+
* for (const e of entries) {
|
|
77
|
+
* console.log(e.type, e.author, e.text);
|
|
78
|
+
* }
|
|
79
|
+
* ```
|
|
80
|
+
*
|
|
81
|
+
* @public
|
|
82
|
+
*/
|
|
61
83
|
declare function extractTrackedChanges(state: EditorState | null): TrackedChangesResult;
|
|
62
84
|
|
|
63
85
|
export { type TrackedChangesResult, extractTrackedChanges };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';require('../../chunk-DC7S76ZX.js');var
|
|
1
|
+
'use strict';require('../../chunk-DC7S76ZX.js');var B={entries:[],commentToRevision:new Map};function O(S){if(!S)return B;let{doc:K,schema:v}=S,b=v.marks.insertion,g=v.marks.deletion,w=v.marks.comment;if(!b&&!g)return B;let d=[],C=new Map;K.descendants((e,t)=>{if(e.type.name==="paragraph"){let r=e.attrs.pPrIns,i=e.attrs.pPrDel;r&&d.push({type:"paragraphMarkInsertion",text:e.textContent||"",author:r.author||"",date:r.date??void 0,from:t,to:t+e.nodeSize,revisionId:r.revisionId}),i&&d.push({type:"paragraphMarkDeletion",text:e.textContent||"",author:i.author||"",date:i.date??void 0,from:t,to:t+e.nodeSize,revisionId:i.revisionId});let o=e.attrs.pPrChange;if(Array.isArray(o))for(let a of o)d.push({type:"paragraphPropertiesChanged",text:e.textContent||"",author:a.info.author||"",date:a.info.date??void 0,from:t,to:t+e.nodeSize,revisionId:a.info.id});}if(e.type.name==="tableRow"){let r=e.attrs.trIns,i=e.attrs.trDel;r&&d.push({type:"rowInserted",text:e.textContent||"",author:r.author||"",date:r.date??void 0,from:t,to:t+e.nodeSize,revisionId:r.revisionId}),i&&d.push({type:"rowDeleted",text:e.textContent||"",author:i.author||"",date:i.date??void 0,from:t,to:t+e.nodeSize,revisionId:i.revisionId});let o=e.attrs.trPrChange;if(Array.isArray(o))for(let a of o)!a?.info||typeof a.info.id!="number"||d.push({type:"rowPropertiesChanged",text:e.textContent||"",author:a.info.author||"",date:a.info.date??void 0,from:t,to:t+e.nodeSize,revisionId:a.info.id});}if(e.type.name==="tableCell"||e.type.name==="tableHeader"){let r=e.attrs.cellMarker;if(r?.info&&typeof r.info.revisionId=="number"){let a={ins:"cellInserted",del:"cellDeleted",merge:"cellMerged"}[r.kind];a&&d.push({type:a,text:e.textContent||"",author:r.info.author||"",date:r.info.date??void 0,from:t,to:t+e.nodeSize,revisionId:r.info.revisionId});}let i=e.attrs.tcPrChange;if(Array.isArray(i))for(let o of i)!o?.info||typeof o.info.id!="number"||d.push({type:"cellPropertiesChanged",text:e.textContent||"",author:o.info.author||"",date:o.info.date??void 0,from:t,to:t+e.nodeSize,revisionId:o.info.id});}if(e.type.name==="table"){let r=e.attrs.tblPrChange;if(Array.isArray(r))for(let l of r)!l?.info||typeof l.info.id!="number"||d.push({type:"tablePropertiesChanged",text:"",author:l.info.author||"",date:l.info.date??void 0,from:t,to:t+e.nodeSize,revisionId:l.info.id});let i=e.firstChild,o=i?.attrs.trIns,a=i?.attrs.trDel,x=o?"trIns":a?"trDel":null;if(x){let l=o??a,R=true,M=[];if(e.forEach(p=>{if(p.type.name!=="tableRow"){R=false;return}let c=p.attrs[x];if(!c||(c.author??"")!==(l.author??"")||(c.date??null)!==(l.date??null)){R=false;return}M.push(c.revisionId);}),R){let p="";g?e.descendants(h=>{h.isText&&!h.marks.some(P=>P.type===g)&&(p+=h.text||"");}):p=e.textContent||"";let c=l.revisionId,A=M.filter((h,P)=>h!==c&&M.indexOf(h)===P);d.push({type:x==="trIns"?"tableInserted":"tableDeleted",text:p,author:l.author||"",date:l.date??void 0,from:t,to:t+e.nodeSize,revisionId:c,...A.length>0?{coalescedRevisionIds:A}:{}});}}}if(!e.isInline)return;let n=e.isText?e.text||"":e.type.name==="image"?e.attrs.alt||"image":e.type.name,s=null;for(let r of e.marks)(r.type===b||r.type===g)&&(d.push({type:r.type===b?"insertion":"deletion",text:n,author:r.attrs.author||"",date:r.attrs.date,from:t,to:t+e.nodeSize,revisionId:r.attrs.revisionId}),s=r);if(w&&s){let r=e.marks.find(i=>i.type===w);if(r){let i=r.attrs.commentId,o=s.attrs.revisionId;C.has(i)||C.set(i,o);}}});let k={tableInserted:6,tableDeleted:6,tablePropertiesChanged:5,rowInserted:4,rowDeleted:4,rowPropertiesChanged:4,cellInserted:3,cellDeleted:3,cellMerged:3,cellPropertiesChanged:3,paragraphMarkInsertion:2,paragraphMarkDeletion:2,paragraphPropertiesChanged:2},U=e=>e in k,E=new Map,f=[],T=(e,t)=>{let n=new Set(e.coalescedRevisionIds??[]);for(let s of t.coalescedRevisionIds??[])n.add(s);return n.add(t.revisionId),n.delete(e.revisionId),[...n]};for(let e of d){if(!U(e.type)){f.push(e);continue}let t=`${e.author}|${e.date??""}`,n=E.get(t);if(n===void 0){E.set(t,f.push(e)-1);continue}let s=f[n],r=k[e.type]??0,i=k[s.type]??0;r>i?f[n]={...e,coalescedRevisionIds:T(e,s)}:f[n]={...s,coalescedRevisionIds:T(s,e)};}let D=new Map,y=[];for(let e of f){if(!(e.type==="insertion"||e.type==="deletion")){y.push({...e});continue}let n=`${e.type}|${e.author}|${e.date??""}`,s=D.get(n);if(s){let r=s.to===e.from?"":" ";if(s.text+=r+e.text,s.to=e.to,e.revisionId!==s.revisionId){let i=new Set(s.coalescedRevisionIds??[]);for(let o of e.coalescedRevisionIds??[])i.add(o);i.add(e.revisionId),i.delete(s.revisionId),s.coalescedRevisionIds=i.size>0?[...i]:void 0;}}else {let r={...e};D.set(n,r),y.push(r);}}let u=[];for(let e=0;e<y.length;e++){let t=y[e],n=y[e+1];t.type==="deletion"&&n&&n.type==="insertion"&&t.author===n.author&&t.date===n.date&&t.to===n.from?(u.push({type:"replacement",text:n.text,deletedText:t.text,author:t.author,date:t.date,from:t.from,to:n.to,revisionId:t.revisionId,insertionRevisionId:n.revisionId}),e++):u.push(t);}let I=new Map;for(let e of u)if(e.type==="insertion"||e.type==="deletion"||e.type==="replacement"){let t=`${e.author}|${e.date??""}`;I.has(t)||I.set(t,e);}for(let e of u){if(e.type!=="paragraphMarkInsertion"&&e.type!=="paragraphMarkDeletion")continue;let t=I.get(`${e.author}|${e.date??""}`);if(!t)continue;let n=new Set(t.coalescedRevisionIds??[]);for(let s of e.coalescedRevisionIds??[])n.add(s);n.add(e.revisionId),n.delete(t.revisionId),t.type==="replacement"&&t.insertionRevisionId!=null&&n.delete(t.insertionRevisionId),t.coalescedRevisionIds=n.size>0?[...n]:void 0;}let z=new Set,m=new Map;for(let e of u){if(e.type!=="tableInserted"&&e.type!=="tableDeleted")continue;let t=`${e.author}|${e.date??""}`;e.text.trim().length>0||(z.add(e),m.has(t)||m.set(t,e));}for(let e of u){if(e.type!=="paragraphMarkInsertion"&&e.type!=="paragraphMarkDeletion")continue;let t=m.get(`${e.author}|${e.date??""}`);if(!t)continue;let n=new Set(t.coalescedRevisionIds??[]);for(let s of e.coalescedRevisionIds??[])n.add(s);n.add(e.revisionId),n.delete(t.revisionId),t.coalescedRevisionIds=n.size>0?[...n]:void 0;}let H=u.filter(e=>e.type==="insertion"||e.type==="replacement"),$=new Set;for(let e of u){if(e.type!=="paragraphPropertiesChanged")continue;let t=H.find(s=>s.author===e.author&&s.from<e.to&&e.from<s.to);if(!t)continue;let n=new Set(T(t,e));t.type==="replacement"&&t.insertionRevisionId!=null&&n.delete(t.insertionRevisionId),t.coalescedRevisionIds=n.size>0?[...n]:void 0,$.add(e);}return {entries:u.filter(e=>{let t=`${e.author}|${e.date??""}`;return e.type==="tableInserted"||e.type==="tableDeleted"?z.has(e):e.type==="paragraphMarkInsertion"||e.type==="paragraphMarkDeletion"?!I.has(t)&&!m.has(t):e.type==="paragraphPropertiesChanged"?!$.has(e):e.type==="insertion"||e.type==="deletion"||e.type==="replacement"?!m.has(t):true}),commentToRevision:C}}exports.extractTrackedChanges=O;
|