@usejunior/docx-core 0.0.1 → 0.1.1
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 +21 -0
- package/README.md +86 -28
- package/dist/.tsbuildinfo +1 -0
- package/dist/atomizer.d.ts +218 -0
- package/dist/atomizer.d.ts.map +1 -0
- package/dist/atomizer.js +856 -0
- package/dist/atomizer.js.map +1 -0
- package/dist/baselines/atomizer/atomLcs.d.ts +96 -0
- package/dist/baselines/atomizer/atomLcs.d.ts.map +1 -0
- package/dist/baselines/atomizer/atomLcs.js +347 -0
- package/dist/baselines/atomizer/atomLcs.js.map +1 -0
- package/dist/baselines/atomizer/debug.d.ts +41 -0
- package/dist/baselines/atomizer/debug.d.ts.map +1 -0
- package/dist/baselines/atomizer/debug.js +85 -0
- package/dist/baselines/atomizer/debug.js.map +1 -0
- package/dist/baselines/atomizer/documentReconstructor.d.ts +64 -0
- package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -0
- package/dist/baselines/atomizer/documentReconstructor.js +939 -0
- package/dist/baselines/atomizer/documentReconstructor.js.map +1 -0
- package/dist/baselines/atomizer/hierarchicalLcs.d.ts +111 -0
- package/dist/baselines/atomizer/hierarchicalLcs.d.ts.map +1 -0
- package/dist/baselines/atomizer/hierarchicalLcs.js +469 -0
- package/dist/baselines/atomizer/hierarchicalLcs.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier.d.ts +183 -0
- package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier.js +1600 -0
- package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -0
- package/dist/baselines/atomizer/numberingIntegration.d.ts +59 -0
- package/dist/baselines/atomizer/numberingIntegration.d.ts.map +1 -0
- package/dist/baselines/atomizer/numberingIntegration.js +209 -0
- package/dist/baselines/atomizer/numberingIntegration.js.map +1 -0
- package/dist/baselines/atomizer/pipeline.d.ts +65 -0
- package/dist/baselines/atomizer/pipeline.d.ts.map +1 -0
- package/dist/baselines/atomizer/pipeline.js +510 -0
- package/dist/baselines/atomizer/pipeline.js.map +1 -0
- package/dist/baselines/atomizer/premergeRuns.d.ts +26 -0
- package/dist/baselines/atomizer/premergeRuns.d.ts.map +1 -0
- package/dist/baselines/atomizer/premergeRuns.js +150 -0
- package/dist/baselines/atomizer/premergeRuns.js.map +1 -0
- package/dist/baselines/atomizer/trackChangesAcceptor.d.ts +63 -0
- package/dist/baselines/atomizer/trackChangesAcceptor.d.ts.map +1 -0
- package/dist/baselines/atomizer/trackChangesAcceptor.js +254 -0
- package/dist/baselines/atomizer/trackChangesAcceptor.js.map +1 -0
- package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts +64 -0
- package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -0
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js +586 -0
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -0
- package/dist/baselines/atomizer/xmlToWmlElement.d.ts +65 -0
- package/dist/baselines/atomizer/xmlToWmlElement.d.ts.map +1 -0
- package/dist/baselines/atomizer/xmlToWmlElement.js +95 -0
- package/dist/baselines/atomizer/xmlToWmlElement.js.map +1 -0
- package/dist/baselines/diffmatch/documentBuilder.d.ts +44 -0
- package/dist/baselines/diffmatch/documentBuilder.d.ts.map +1 -0
- package/dist/baselines/diffmatch/documentBuilder.js +227 -0
- package/dist/baselines/diffmatch/documentBuilder.js.map +1 -0
- package/dist/baselines/diffmatch/paragraphAlignment.d.ts +75 -0
- package/dist/baselines/diffmatch/paragraphAlignment.d.ts.map +1 -0
- package/dist/baselines/diffmatch/paragraphAlignment.js +206 -0
- package/dist/baselines/diffmatch/paragraphAlignment.js.map +1 -0
- package/dist/baselines/diffmatch/pipeline.d.ts +33 -0
- package/dist/baselines/diffmatch/pipeline.d.ts.map +1 -0
- package/dist/baselines/diffmatch/pipeline.js +84 -0
- package/dist/baselines/diffmatch/pipeline.js.map +1 -0
- package/dist/baselines/diffmatch/runDiff.d.ts +53 -0
- package/dist/baselines/diffmatch/runDiff.d.ts.map +1 -0
- package/dist/baselines/diffmatch/runDiff.js +253 -0
- package/dist/baselines/diffmatch/runDiff.js.map +1 -0
- package/dist/baselines/diffmatch/trackChangesRenderer.d.ts +64 -0
- package/dist/baselines/diffmatch/trackChangesRenderer.d.ts.map +1 -0
- package/dist/baselines/diffmatch/trackChangesRenderer.js +178 -0
- package/dist/baselines/diffmatch/trackChangesRenderer.js.map +1 -0
- package/dist/baselines/diffmatch/xmlParser.d.ts +45 -0
- package/dist/baselines/diffmatch/xmlParser.d.ts.map +1 -0
- package/dist/baselines/diffmatch/xmlParser.js +344 -0
- package/dist/baselines/diffmatch/xmlParser.js.map +1 -0
- package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts +51 -0
- package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts.map +1 -0
- package/dist/baselines/wmlcomparer/DocxodusWasm.js +83 -0
- package/dist/baselines/wmlcomparer/DocxodusWasm.js.map +1 -0
- package/dist/baselines/wmlcomparer/DotnetCli.d.ts +40 -0
- package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -0
- package/dist/baselines/wmlcomparer/DotnetCli.js +135 -0
- package/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -0
- package/dist/benchmark/metrics.d.ts +72 -0
- package/dist/benchmark/metrics.d.ts.map +1 -0
- package/dist/benchmark/metrics.js +45 -0
- package/dist/benchmark/metrics.js.map +1 -0
- package/dist/benchmark/reporter.d.ts +23 -0
- package/dist/benchmark/reporter.d.ts.map +1 -0
- package/dist/benchmark/reporter.js +147 -0
- package/dist/benchmark/reporter.js.map +1 -0
- package/dist/benchmark/runner.d.ts +30 -0
- package/dist/benchmark/runner.d.ts.map +1 -0
- package/dist/benchmark/runner.js +233 -0
- package/dist/benchmark/runner.js.map +1 -0
- package/dist/cli/compare-two.d.ts +28 -0
- package/dist/cli/compare-two.d.ts.map +1 -0
- package/dist/cli/compare-two.js +110 -0
- package/dist/cli/compare-two.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +21 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core-types.d.ts +296 -0
- package/dist/core-types.d.ts.map +1 -0
- package/dist/core-types.js +122 -0
- package/dist/core-types.js.map +1 -0
- package/dist/footnotes.d.ts +144 -0
- package/dist/footnotes.d.ts.map +1 -0
- package/dist/footnotes.js +291 -0
- package/dist/footnotes.js.map +1 -0
- package/dist/format-detection.d.ts +120 -0
- package/dist/format-detection.d.ts.map +1 -0
- package/dist/format-detection.js +338 -0
- package/dist/format-detection.js.map +1 -0
- package/dist/index.d.ts +177 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/output-artifacts.d.ts +6 -0
- package/dist/integration/output-artifacts.d.ts.map +1 -0
- package/dist/integration/output-artifacts.js +30 -0
- package/dist/integration/output-artifacts.js.map +1 -0
- package/dist/move-detection.d.ts +211 -0
- package/dist/move-detection.d.ts.map +1 -0
- package/dist/move-detection.js +391 -0
- package/dist/move-detection.js.map +1 -0
- package/dist/numbering.d.ts +136 -0
- package/dist/numbering.d.ts.map +1 -0
- package/dist/numbering.js +446 -0
- package/dist/numbering.js.map +1 -0
- package/dist/primitives/accept_changes.d.ts +30 -0
- package/dist/primitives/accept_changes.d.ts.map +1 -0
- package/dist/primitives/accept_changes.js +241 -0
- package/dist/primitives/accept_changes.js.map +1 -0
- package/dist/primitives/bookmarks.d.ts +12 -0
- package/dist/primitives/bookmarks.d.ts.map +1 -0
- package/dist/primitives/bookmarks.js +248 -0
- package/dist/primitives/bookmarks.js.map +1 -0
- package/dist/primitives/comments.d.ts +88 -0
- package/dist/primitives/comments.d.ts.map +1 -0
- package/dist/primitives/comments.js +703 -0
- package/dist/primitives/comments.js.map +1 -0
- package/dist/primitives/document.d.ts +168 -0
- package/dist/primitives/document.d.ts.map +1 -0
- package/dist/primitives/document.js +532 -0
- package/dist/primitives/document.js.map +1 -0
- package/dist/primitives/document_view.d.ts +93 -0
- package/dist/primitives/document_view.d.ts.map +1 -0
- package/dist/primitives/document_view.js +722 -0
- package/dist/primitives/document_view.js.map +1 -0
- package/dist/primitives/dom-helpers.d.ts +94 -0
- package/dist/primitives/dom-helpers.d.ts.map +1 -0
- package/dist/primitives/dom-helpers.js +219 -0
- package/dist/primitives/dom-helpers.js.map +1 -0
- package/dist/primitives/errors.d.ts +7 -0
- package/dist/primitives/errors.d.ts.map +1 -0
- package/dist/primitives/errors.js +10 -0
- package/dist/primitives/errors.js.map +1 -0
- package/dist/primitives/extract_revisions.d.ts +50 -0
- package/dist/primitives/extract_revisions.d.ts.map +1 -0
- package/dist/primitives/extract_revisions.js +340 -0
- package/dist/primitives/extract_revisions.js.map +1 -0
- package/dist/primitives/footnotes.d.ts +37 -0
- package/dist/primitives/footnotes.d.ts.map +1 -0
- package/dist/primitives/footnotes.js +552 -0
- package/dist/primitives/footnotes.js.map +1 -0
- package/dist/primitives/formatting_tags.d.ts +30 -0
- package/dist/primitives/formatting_tags.d.ts.map +1 -0
- package/dist/primitives/formatting_tags.js +217 -0
- package/dist/primitives/formatting_tags.js.map +1 -0
- package/dist/primitives/index.d.ts +26 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +26 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/layout.d.ts +53 -0
- package/dist/primitives/layout.d.ts.map +1 -0
- package/dist/primitives/layout.js +178 -0
- package/dist/primitives/layout.js.map +1 -0
- package/dist/primitives/list_labels.d.ts +19 -0
- package/dist/primitives/list_labels.d.ts.map +1 -0
- package/dist/primitives/list_labels.js +57 -0
- package/dist/primitives/list_labels.js.map +1 -0
- package/dist/primitives/matching.d.ts +17 -0
- package/dist/primitives/matching.d.ts.map +1 -0
- package/dist/primitives/matching.js +144 -0
- package/dist/primitives/matching.js.map +1 -0
- package/dist/primitives/merge_runs.d.ts +23 -0
- package/dist/primitives/merge_runs.d.ts.map +1 -0
- package/dist/primitives/merge_runs.js +195 -0
- package/dist/primitives/merge_runs.js.map +1 -0
- package/dist/primitives/namespaces.d.ts +90 -0
- package/dist/primitives/namespaces.d.ts.map +1 -0
- package/dist/primitives/namespaces.js +107 -0
- package/dist/primitives/namespaces.js.map +1 -0
- package/dist/primitives/numbering.d.ts +27 -0
- package/dist/primitives/numbering.d.ts.map +1 -0
- package/dist/primitives/numbering.js +182 -0
- package/dist/primitives/numbering.js.map +1 -0
- package/dist/primitives/prevent_double_elevation.d.ts +18 -0
- package/dist/primitives/prevent_double_elevation.d.ts.map +1 -0
- package/dist/primitives/prevent_double_elevation.js +190 -0
- package/dist/primitives/prevent_double_elevation.js.map +1 -0
- package/dist/primitives/reject_changes.d.ts +27 -0
- package/dist/primitives/reject_changes.d.ts.map +1 -0
- package/dist/primitives/reject_changes.js +371 -0
- package/dist/primitives/reject_changes.js.map +1 -0
- package/dist/primitives/relationships.d.ts +7 -0
- package/dist/primitives/relationships.d.ts.map +1 -0
- package/dist/primitives/relationships.js +24 -0
- package/dist/primitives/relationships.js.map +1 -0
- package/dist/primitives/semantic_tags.d.ts +32 -0
- package/dist/primitives/semantic_tags.d.ts.map +1 -0
- package/dist/primitives/semantic_tags.js +139 -0
- package/dist/primitives/semantic_tags.js.map +1 -0
- package/dist/primitives/simplify_redlines.d.ts +19 -0
- package/dist/primitives/simplify_redlines.d.ts.map +1 -0
- package/dist/primitives/simplify_redlines.js +94 -0
- package/dist/primitives/simplify_redlines.js.map +1 -0
- package/dist/primitives/styles.d.ts +36 -0
- package/dist/primitives/styles.d.ts.map +1 -0
- package/dist/primitives/styles.js +190 -0
- package/dist/primitives/styles.js.map +1 -0
- package/dist/primitives/text.d.ts +27 -0
- package/dist/primitives/text.d.ts.map +1 -0
- package/dist/primitives/text.js +416 -0
- package/dist/primitives/text.js.map +1 -0
- package/dist/primitives/validate_document.d.ts +24 -0
- package/dist/primitives/validate_document.d.ts.map +1 -0
- package/dist/primitives/validate_document.js +147 -0
- package/dist/primitives/validate_document.js.map +1 -0
- package/dist/primitives/xml.d.ts +5 -0
- package/dist/primitives/xml.d.ts.map +1 -0
- package/dist/primitives/xml.js +19 -0
- package/dist/primitives/xml.js.map +1 -0
- package/dist/primitives/zip.d.ts +25 -0
- package/dist/primitives/zip.d.ts.map +1 -0
- package/dist/primitives/zip.js +78 -0
- package/dist/primitives/zip.js.map +1 -0
- package/dist/shared/docx/DocxArchive.d.ts +94 -0
- package/dist/shared/docx/DocxArchive.d.ts.map +1 -0
- package/dist/shared/docx/DocxArchive.js +169 -0
- package/dist/shared/docx/DocxArchive.js.map +1 -0
- package/dist/shared/ooxml/namespaces.d.ts +149 -0
- package/dist/shared/ooxml/namespaces.d.ts.map +1 -0
- package/dist/shared/ooxml/namespaces.js +224 -0
- package/dist/shared/ooxml/namespaces.js.map +1 -0
- package/dist/shared/ooxml/types.d.ts +136 -0
- package/dist/shared/ooxml/types.d.ts.map +1 -0
- package/dist/shared/ooxml/types.js +7 -0
- package/dist/shared/ooxml/types.js.map +1 -0
- package/package.json +63 -6
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* extract_revisions — walk tracked-change markup in a document body and
|
|
3
|
+
* return structured per-paragraph revision records with before/after text.
|
|
4
|
+
*
|
|
5
|
+
* Algorithm:
|
|
6
|
+
* 1. Clone DOM twice → acceptChanges() on one, rejectChanges() on the other
|
|
7
|
+
* 2. Walk all w:p in the *original* tracked DOM (including inside w:tc table cells)
|
|
8
|
+
* 3. For each paragraph with revision wrappers, look up before_text (rejected clone)
|
|
9
|
+
* and after_text (accepted clone) by _bk_* bookmark ID
|
|
10
|
+
* 4. Collect individual revision entries with type, text, author
|
|
11
|
+
* 5. Join comments by anchoredParagraphId
|
|
12
|
+
* 6. Apply offset/limit pagination
|
|
13
|
+
*/
|
|
14
|
+
import { OOXML } from './namespaces.js';
|
|
15
|
+
import { acceptChanges } from './accept_changes.js';
|
|
16
|
+
import { rejectChanges } from './reject_changes.js';
|
|
17
|
+
import { getParagraphText } from './text.js';
|
|
18
|
+
import { getParagraphBookmarkId, findParagraphByBookmarkId } from './bookmarks.js';
|
|
19
|
+
const W_NS = OOXML.W_NS;
|
|
20
|
+
// ── Internal helpers ────────────────────────────────────────────────
|
|
21
|
+
function isW(node, localName) {
|
|
22
|
+
return (node.nodeType === 1 &&
|
|
23
|
+
node.namespaceURI === W_NS &&
|
|
24
|
+
node.localName === localName);
|
|
25
|
+
}
|
|
26
|
+
// Revision wrapper local names
|
|
27
|
+
const REVISION_WRAPPER_LOCALS = new Set(['ins', 'del', 'moveFrom', 'moveTo']);
|
|
28
|
+
// Property change local names
|
|
29
|
+
const PR_CHANGE_LOCALS = new Set([
|
|
30
|
+
'rPrChange', 'pPrChange', 'sectPrChange',
|
|
31
|
+
'tblPrChange', 'trPrChange', 'tcPrChange',
|
|
32
|
+
]);
|
|
33
|
+
/**
|
|
34
|
+
* Check if a paragraph is entirely inserted (all content is inside w:ins).
|
|
35
|
+
* Such paragraphs have no "before" state — they didn't exist before the edit.
|
|
36
|
+
*/
|
|
37
|
+
function paragraphIsEntirelyInserted(p) {
|
|
38
|
+
// Check for paragraph-level insertion marker: w:pPr > w:rPr > w:ins
|
|
39
|
+
for (let i = 0; i < p.childNodes.length; i++) {
|
|
40
|
+
const child = p.childNodes[i];
|
|
41
|
+
if (!isW(child, 'pPr'))
|
|
42
|
+
continue;
|
|
43
|
+
for (let j = 0; j < child.childNodes.length; j++) {
|
|
44
|
+
if (!isW(child.childNodes[j], 'rPr'))
|
|
45
|
+
continue;
|
|
46
|
+
for (let k = 0; k < child.childNodes[j].childNodes.length; k++) {
|
|
47
|
+
if (isW(child.childNodes[j].childNodes[k], 'ins'))
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Check if all content-bearing children are inside w:ins
|
|
53
|
+
let hasContent = false;
|
|
54
|
+
for (let i = 0; i < p.childNodes.length; i++) {
|
|
55
|
+
const child = p.childNodes[i];
|
|
56
|
+
if (child.nodeType !== 1)
|
|
57
|
+
continue;
|
|
58
|
+
const el = child;
|
|
59
|
+
if (el.namespaceURI !== W_NS)
|
|
60
|
+
continue;
|
|
61
|
+
const local = el.localName;
|
|
62
|
+
if (local === 'pPr' || local === 'bookmarkStart' || local === 'bookmarkEnd')
|
|
63
|
+
continue;
|
|
64
|
+
if (local === 'ins' || local === 'moveTo') {
|
|
65
|
+
hasContent = true;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
// Any content outside ins/moveTo means not entirely inserted
|
|
69
|
+
if (local === 'r' || local === 'del' || local === 'moveFrom')
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return hasContent;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check if a paragraph is entirely deleted (all content is inside w:del).
|
|
76
|
+
* Such paragraphs have no "after" state — they were fully removed.
|
|
77
|
+
*/
|
|
78
|
+
function paragraphIsEntirelyDeleted(p) {
|
|
79
|
+
// Check for paragraph-level deletion marker: w:pPr > w:rPr > w:del
|
|
80
|
+
for (let i = 0; i < p.childNodes.length; i++) {
|
|
81
|
+
const child = p.childNodes[i];
|
|
82
|
+
if (!isW(child, 'pPr'))
|
|
83
|
+
continue;
|
|
84
|
+
for (let j = 0; j < child.childNodes.length; j++) {
|
|
85
|
+
if (!isW(child.childNodes[j], 'rPr'))
|
|
86
|
+
continue;
|
|
87
|
+
for (let k = 0; k < child.childNodes[j].childNodes.length; k++) {
|
|
88
|
+
if (isW(child.childNodes[j].childNodes[k], 'del'))
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Check if all content-bearing children are inside w:del
|
|
94
|
+
let hasContent = false;
|
|
95
|
+
for (let i = 0; i < p.childNodes.length; i++) {
|
|
96
|
+
const child = p.childNodes[i];
|
|
97
|
+
if (child.nodeType !== 1)
|
|
98
|
+
continue;
|
|
99
|
+
const el = child;
|
|
100
|
+
if (el.namespaceURI !== W_NS)
|
|
101
|
+
continue;
|
|
102
|
+
const local = el.localName;
|
|
103
|
+
if (local === 'pPr' || local === 'bookmarkStart' || local === 'bookmarkEnd')
|
|
104
|
+
continue;
|
|
105
|
+
if (local === 'del' || local === 'moveFrom') {
|
|
106
|
+
hasContent = true;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
// Any content outside del/moveFrom means not entirely deleted
|
|
110
|
+
if (local === 'r' || local === 'ins' || local === 'moveTo')
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
return hasContent;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if a paragraph contains any revision wrappers or property change records.
|
|
117
|
+
*/
|
|
118
|
+
function paragraphHasRevisions(p) {
|
|
119
|
+
// Check for revision wrappers (w:ins, w:del, w:moveFrom, w:moveTo)
|
|
120
|
+
for (const local of REVISION_WRAPPER_LOCALS) {
|
|
121
|
+
if (p.getElementsByTagNameNS(W_NS, local).length > 0)
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
// Check for property change records
|
|
125
|
+
for (const local of PR_CHANGE_LOCALS) {
|
|
126
|
+
if (p.getElementsByTagNameNS(W_NS, local).length > 0)
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Extract text content from an element's w:t and w:delText children (recursive through runs).
|
|
133
|
+
*/
|
|
134
|
+
function getRevisionText(el) {
|
|
135
|
+
const parts = [];
|
|
136
|
+
const ts = el.getElementsByTagNameNS(W_NS, 't');
|
|
137
|
+
for (let i = 0; i < ts.length; i++) {
|
|
138
|
+
parts.push(ts[i].textContent ?? '');
|
|
139
|
+
}
|
|
140
|
+
const delTs = el.getElementsByTagNameNS(W_NS, 'delText');
|
|
141
|
+
for (let i = 0; i < delTs.length; i++) {
|
|
142
|
+
parts.push(delTs[i].textContent ?? '');
|
|
143
|
+
}
|
|
144
|
+
return parts.join('');
|
|
145
|
+
}
|
|
146
|
+
function getAttr(el, localName) {
|
|
147
|
+
return el.getAttributeNS(W_NS, localName) ?? el.getAttribute(`w:${localName}`) ?? '';
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Collect individual revision entries from a paragraph's revision wrappers.
|
|
151
|
+
*/
|
|
152
|
+
function collectRevisionEntries(p) {
|
|
153
|
+
const entries = [];
|
|
154
|
+
// Collect from w:ins wrappers
|
|
155
|
+
const insEls = p.getElementsByTagNameNS(W_NS, 'ins');
|
|
156
|
+
for (let i = 0; i < insEls.length; i++) {
|
|
157
|
+
const ins = insEls[i];
|
|
158
|
+
// Skip paragraph-level markers (inside pPr/rPr)
|
|
159
|
+
if (isInsidePPrOrRPr(ins, p))
|
|
160
|
+
continue;
|
|
161
|
+
entries.push({
|
|
162
|
+
type: 'INSERTION',
|
|
163
|
+
text: getRevisionText(ins),
|
|
164
|
+
author: getAttr(ins, 'author'),
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
// Collect from w:del wrappers
|
|
168
|
+
const delEls = p.getElementsByTagNameNS(W_NS, 'del');
|
|
169
|
+
for (let i = 0; i < delEls.length; i++) {
|
|
170
|
+
const del = delEls[i];
|
|
171
|
+
if (isInsidePPrOrRPr(del, p))
|
|
172
|
+
continue;
|
|
173
|
+
entries.push({
|
|
174
|
+
type: 'DELETION',
|
|
175
|
+
text: getRevisionText(del),
|
|
176
|
+
author: getAttr(del, 'author'),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
// Collect from w:moveFrom wrappers
|
|
180
|
+
const moveFromEls = p.getElementsByTagNameNS(W_NS, 'moveFrom');
|
|
181
|
+
for (let i = 0; i < moveFromEls.length; i++) {
|
|
182
|
+
const mf = moveFromEls[i];
|
|
183
|
+
entries.push({
|
|
184
|
+
type: 'MOVE_FROM',
|
|
185
|
+
text: getRevisionText(mf),
|
|
186
|
+
author: getAttr(mf, 'author'),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
// Collect from w:moveTo wrappers
|
|
190
|
+
const moveToEls = p.getElementsByTagNameNS(W_NS, 'moveTo');
|
|
191
|
+
for (let i = 0; i < moveToEls.length; i++) {
|
|
192
|
+
const mt = moveToEls[i];
|
|
193
|
+
entries.push({
|
|
194
|
+
type: 'MOVE_TO',
|
|
195
|
+
text: getRevisionText(mt),
|
|
196
|
+
author: getAttr(mt, 'author'),
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// Collect FORMAT_CHANGE from *PrChange records
|
|
200
|
+
for (const localName of PR_CHANGE_LOCALS) {
|
|
201
|
+
const changes = p.getElementsByTagNameNS(W_NS, localName);
|
|
202
|
+
for (let i = 0; i < changes.length; i++) {
|
|
203
|
+
const change = changes[i];
|
|
204
|
+
entries.push({
|
|
205
|
+
type: 'FORMAT_CHANGE',
|
|
206
|
+
text: '',
|
|
207
|
+
author: getAttr(change, 'author'),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return entries;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Check if an element is nested inside w:pPr or w:rPr within the given paragraph.
|
|
215
|
+
* These are paragraph-level revision markers, not content revisions.
|
|
216
|
+
*/
|
|
217
|
+
function isInsidePPrOrRPr(el, paragraph) {
|
|
218
|
+
let cur = el.parentNode;
|
|
219
|
+
while (cur && cur !== paragraph) {
|
|
220
|
+
if (cur.nodeType === 1) {
|
|
221
|
+
const cel = cur;
|
|
222
|
+
if (cel.namespaceURI === W_NS && cel.localName === 'pPr')
|
|
223
|
+
return true;
|
|
224
|
+
const parent = cel.parentNode;
|
|
225
|
+
if (cel.namespaceURI === W_NS && cel.localName === 'rPr' &&
|
|
226
|
+
parent && parent.namespaceURI === W_NS && parent.localName === 'pPr') {
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
cur = cur.parentNode;
|
|
231
|
+
}
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Convert a Comment (from getComments()) to a RevisionComment.
|
|
236
|
+
*/
|
|
237
|
+
function commentToRevisionComment(c) {
|
|
238
|
+
const rc = {
|
|
239
|
+
author: c.author,
|
|
240
|
+
text: c.text,
|
|
241
|
+
date: c.date || null,
|
|
242
|
+
};
|
|
243
|
+
if (c.replies.length > 0) {
|
|
244
|
+
rc.replies = c.replies.map(commentToRevisionComment);
|
|
245
|
+
}
|
|
246
|
+
return rc;
|
|
247
|
+
}
|
|
248
|
+
// ── Public API ──────────────────────────────────────────────────────
|
|
249
|
+
/**
|
|
250
|
+
* Extract structured revision data from a document with tracked changes.
|
|
251
|
+
*
|
|
252
|
+
* @param doc - The original document DOM with tracked changes
|
|
253
|
+
* @param comments - Comments from getComments() (with anchoredParagraphId resolved)
|
|
254
|
+
* @param opts - Pagination options: offset (0-based) and limit
|
|
255
|
+
*/
|
|
256
|
+
export function extractRevisions(doc, comments, opts) {
|
|
257
|
+
const body = doc.getElementsByTagNameNS(W_NS, 'body').item(0);
|
|
258
|
+
if (!body) {
|
|
259
|
+
return { changes: [], total_changes: 0, has_more: false };
|
|
260
|
+
}
|
|
261
|
+
// Clone DOM twice and apply accept/reject
|
|
262
|
+
const acceptedDoc = doc.cloneNode(true);
|
|
263
|
+
const rejectedDoc = doc.cloneNode(true);
|
|
264
|
+
acceptChanges(acceptedDoc);
|
|
265
|
+
rejectChanges(rejectedDoc);
|
|
266
|
+
// Build comment lookup by anchoredParagraphId
|
|
267
|
+
const commentsByParaId = new Map();
|
|
268
|
+
for (const c of comments) {
|
|
269
|
+
if (c.anchoredParagraphId) {
|
|
270
|
+
const existing = commentsByParaId.get(c.anchoredParagraphId);
|
|
271
|
+
if (existing) {
|
|
272
|
+
existing.push(c);
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
commentsByParaId.set(c.anchoredParagraphId, [c]);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// Walk all paragraphs in the original tracked DOM
|
|
280
|
+
const allParagraphs = Array.from(body.getElementsByTagNameNS(W_NS, 'p'));
|
|
281
|
+
const changedParagraphs = [];
|
|
282
|
+
for (const p of allParagraphs) {
|
|
283
|
+
if (!paragraphHasRevisions(p))
|
|
284
|
+
continue;
|
|
285
|
+
const paraId = getParagraphBookmarkId(p);
|
|
286
|
+
if (!paraId)
|
|
287
|
+
continue; // All paragraphs should have bookmarks from session resolution
|
|
288
|
+
// Detect entirely-inserted/deleted paragraphs to avoid stale bookmark lookups.
|
|
289
|
+
// When rejectChanges() removes an inserted paragraph, it relocates bookmarks
|
|
290
|
+
// to adjacent paragraphs, which would give the wrong before_text.
|
|
291
|
+
const isFullyInserted = paragraphIsEntirelyInserted(p);
|
|
292
|
+
const isFullyDeleted = paragraphIsEntirelyDeleted(p);
|
|
293
|
+
// Look up before_text in rejected clone by bookmark
|
|
294
|
+
let beforeText;
|
|
295
|
+
if (isFullyInserted) {
|
|
296
|
+
beforeText = ''; // Didn't exist before
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
const rejectedP = findParagraphByBookmarkId(rejectedDoc, paraId);
|
|
300
|
+
beforeText = rejectedP ? getParagraphText(rejectedP) : '';
|
|
301
|
+
}
|
|
302
|
+
// Look up after_text in accepted clone by bookmark
|
|
303
|
+
let afterText;
|
|
304
|
+
if (isFullyDeleted) {
|
|
305
|
+
afterText = ''; // Doesn't exist after
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
const acceptedP = findParagraphByBookmarkId(acceptedDoc, paraId);
|
|
309
|
+
afterText = acceptedP ? getParagraphText(acceptedP) : '';
|
|
310
|
+
}
|
|
311
|
+
// Collect revision entries
|
|
312
|
+
const revisions = collectRevisionEntries(p);
|
|
313
|
+
// Skip structurally-empty paragraphs with only paragraph-level markers
|
|
314
|
+
// (e.g. empty inserted paragraphs from comparison engines with pPr/rPr/ins only)
|
|
315
|
+
if (revisions.length === 0 && beforeText === '' && afterText === '')
|
|
316
|
+
continue;
|
|
317
|
+
// Associate comments
|
|
318
|
+
const paraComments = commentsByParaId.get(paraId) ?? [];
|
|
319
|
+
const revisionComments = paraComments.map(commentToRevisionComment);
|
|
320
|
+
changedParagraphs.push({
|
|
321
|
+
para_id: paraId,
|
|
322
|
+
before_text: beforeText,
|
|
323
|
+
after_text: afterText,
|
|
324
|
+
revisions,
|
|
325
|
+
comments: revisionComments,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
// Apply pagination
|
|
329
|
+
const totalChanges = changedParagraphs.length;
|
|
330
|
+
const offset = opts?.offset ?? 0;
|
|
331
|
+
const limit = opts?.limit ?? totalChanges;
|
|
332
|
+
const page = changedParagraphs.slice(offset, offset + limit);
|
|
333
|
+
const hasMore = offset + limit < totalChanges;
|
|
334
|
+
return {
|
|
335
|
+
changes: page,
|
|
336
|
+
total_changes: totalChanges,
|
|
337
|
+
has_more: hasMore,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=extract_revisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract_revisions.js","sourceRoot":"","sources":["../../src/primitives/extract_revisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* footnotes — OOXML footnote bootstrapping, CRUD, and display numbering.
|
|
3
|
+
*
|
|
4
|
+
* Creates footnote XML parts when missing, inserts footnote reference runs,
|
|
5
|
+
* and supports reading, updating, and deleting footnotes.
|
|
6
|
+
*/
|
|
7
|
+
import { DocxZip } from './zip.js';
|
|
8
|
+
export type Footnote = {
|
|
9
|
+
id: number;
|
|
10
|
+
displayNumber: number;
|
|
11
|
+
text: string;
|
|
12
|
+
anchoredParagraphId: string | null;
|
|
13
|
+
};
|
|
14
|
+
export type AddFootnoteParams = {
|
|
15
|
+
paragraphEl: Element;
|
|
16
|
+
afterText?: string;
|
|
17
|
+
text: string;
|
|
18
|
+
};
|
|
19
|
+
export type AddFootnoteResult = {
|
|
20
|
+
noteId: number;
|
|
21
|
+
};
|
|
22
|
+
export type BootstrapFootnoteResult = {
|
|
23
|
+
partsCreated: string[];
|
|
24
|
+
};
|
|
25
|
+
export declare function isReservedFootnote(footnoteEl: Element): boolean;
|
|
26
|
+
export declare function bootstrapFootnoteParts(zip: DocxZip): Promise<BootstrapFootnoteResult>;
|
|
27
|
+
export declare function getFootnotes(zip: DocxZip, documentXml: Document): Promise<Footnote[]>;
|
|
28
|
+
export declare function getFootnote(zip: DocxZip, documentXml: Document, noteId: number): Promise<Footnote | null>;
|
|
29
|
+
export declare function addFootnote(documentXml: Document, zip: DocxZip, params: AddFootnoteParams): Promise<AddFootnoteResult>;
|
|
30
|
+
export declare function updateFootnoteText(zip: DocxZip, params: {
|
|
31
|
+
noteId: number;
|
|
32
|
+
newText: string;
|
|
33
|
+
}): Promise<void>;
|
|
34
|
+
export declare function deleteFootnote(documentXml: Document, zip: DocxZip, params: {
|
|
35
|
+
noteId: number;
|
|
36
|
+
}): Promise<void>;
|
|
37
|
+
//# sourceMappingURL=footnotes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footnotes.d.ts","sourceRoot":"","sources":["../../src/primitives/footnotes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AA0BnC,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAQF,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAG/D;AAID,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAiB3F;AAmID,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAqD3F;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAG/G;AAgCD,wBAAsB,WAAW,CAC/B,WAAW,EAAE,QAAQ,EACrB,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAkB5B;AAuOD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CAmDf;AAID,wBAAsB,cAAc,CAClC,WAAW,EAAE,QAAQ,EACrB,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAsCf"}
|