@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,416 @@
|
|
|
1
|
+
import { OOXML, W } from './namespaces.js';
|
|
2
|
+
import { SafeDocxError } from './errors.js';
|
|
3
|
+
export function getParagraphRuns(p) {
|
|
4
|
+
let FieldState;
|
|
5
|
+
(function (FieldState) {
|
|
6
|
+
FieldState[FieldState["OUTSIDE_FIELD"] = 0] = "OUTSIDE_FIELD";
|
|
7
|
+
FieldState[FieldState["IN_FIELD_CODE"] = 1] = "IN_FIELD_CODE";
|
|
8
|
+
FieldState[FieldState["IN_FIELD_RESULT"] = 2] = "IN_FIELD_RESULT";
|
|
9
|
+
})(FieldState || (FieldState = {}));
|
|
10
|
+
function getWAttr(el, localName) {
|
|
11
|
+
return el.getAttributeNS(OOXML.W_NS, localName) ?? el.getAttribute(`w:${localName}`) ?? el.getAttribute(localName);
|
|
12
|
+
}
|
|
13
|
+
const runs = [];
|
|
14
|
+
const rElems = Array.from(p.getElementsByTagNameNS(OOXML.W_NS, W.r));
|
|
15
|
+
let state = FieldState.OUTSIDE_FIELD;
|
|
16
|
+
for (const r of rElems) {
|
|
17
|
+
let runText = '';
|
|
18
|
+
let sawResult = state === FieldState.IN_FIELD_RESULT;
|
|
19
|
+
// Walk children in order so we can handle rare cases where fldChar and result text
|
|
20
|
+
// appear in the same run.
|
|
21
|
+
for (const child of Array.from(r.childNodes)) {
|
|
22
|
+
if (child.nodeType !== 1)
|
|
23
|
+
continue;
|
|
24
|
+
const el = child;
|
|
25
|
+
if (el.namespaceURI !== OOXML.W_NS)
|
|
26
|
+
continue;
|
|
27
|
+
if (el.localName === W.fldChar) {
|
|
28
|
+
const typ = getWAttr(el, 'fldCharType') ?? '';
|
|
29
|
+
if (typ === 'begin')
|
|
30
|
+
state = FieldState.IN_FIELD_CODE;
|
|
31
|
+
else if (typ === 'separate')
|
|
32
|
+
state = FieldState.IN_FIELD_RESULT;
|
|
33
|
+
else if (typ === 'end')
|
|
34
|
+
state = FieldState.OUTSIDE_FIELD;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (state === FieldState.IN_FIELD_CODE) {
|
|
38
|
+
// Skip field code/instruction text.
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (state === FieldState.IN_FIELD_RESULT)
|
|
42
|
+
sawResult = true;
|
|
43
|
+
if (el.localName === W.t) {
|
|
44
|
+
runText += el.textContent ?? '';
|
|
45
|
+
}
|
|
46
|
+
else if (el.localName === W.tab) {
|
|
47
|
+
runText += '\t';
|
|
48
|
+
}
|
|
49
|
+
else if (el.localName === W.br) {
|
|
50
|
+
runText += '\n';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (runText)
|
|
54
|
+
runs.push({ r, text: runText, isFieldResult: sawResult });
|
|
55
|
+
}
|
|
56
|
+
return runs;
|
|
57
|
+
}
|
|
58
|
+
export function getParagraphText(p) {
|
|
59
|
+
return getParagraphRuns(p)
|
|
60
|
+
.map((tr) => tr.text)
|
|
61
|
+
.join('');
|
|
62
|
+
}
|
|
63
|
+
function findOffsetInRuns(runs, start, end) {
|
|
64
|
+
// Map [start, end) in concatenated string to run index + offset.
|
|
65
|
+
let pos = 0;
|
|
66
|
+
let startRunIdx = -1;
|
|
67
|
+
let endRunIdx = -1;
|
|
68
|
+
let startOffset = 0;
|
|
69
|
+
let endOffset = 0;
|
|
70
|
+
for (let i = 0; i < runs.length; i++) {
|
|
71
|
+
const len = runs[i].text.length;
|
|
72
|
+
if (startRunIdx === -1 && start >= pos && start <= pos + len) {
|
|
73
|
+
startRunIdx = i;
|
|
74
|
+
startOffset = start - pos;
|
|
75
|
+
}
|
|
76
|
+
if (endRunIdx === -1 && end >= pos && end <= pos + len) {
|
|
77
|
+
endRunIdx = i;
|
|
78
|
+
endOffset = end - pos;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
pos += len;
|
|
82
|
+
}
|
|
83
|
+
if (startRunIdx === -1 || endRunIdx === -1) {
|
|
84
|
+
throw new Error('Offset mapping failed');
|
|
85
|
+
}
|
|
86
|
+
return { startRunIdx, startOffset, endRunIdx, endOffset };
|
|
87
|
+
}
|
|
88
|
+
function isW(el, localName) {
|
|
89
|
+
return !!el && el.namespaceURI === OOXML.W_NS && el.localName === localName;
|
|
90
|
+
}
|
|
91
|
+
function setXmlSpacePreserveIfNeeded(t, text) {
|
|
92
|
+
// OOXML needs xml:space="preserve" when leading/trailing spaces exist.
|
|
93
|
+
if (!text)
|
|
94
|
+
return;
|
|
95
|
+
if (text.startsWith(' ') || text.endsWith(' ')) {
|
|
96
|
+
t.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function cloneRunFormattingOnly(doc, sourceRun) {
|
|
100
|
+
const r = doc.createElementNS(OOXML.W_NS, 'w:r');
|
|
101
|
+
// Copy rPr if present (direct child).
|
|
102
|
+
for (const child of Array.from(sourceRun.childNodes)) {
|
|
103
|
+
if (child.nodeType !== 1)
|
|
104
|
+
continue;
|
|
105
|
+
const el = child;
|
|
106
|
+
if (isW(el, W.rPr)) {
|
|
107
|
+
r.appendChild(el.cloneNode(true));
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return r;
|
|
112
|
+
}
|
|
113
|
+
function appendTextToRun(doc, run, text) {
|
|
114
|
+
// Convert \t and \n to OOXML equivalents where possible.
|
|
115
|
+
let buf = '';
|
|
116
|
+
const flush = () => {
|
|
117
|
+
if (!buf)
|
|
118
|
+
return;
|
|
119
|
+
const t = doc.createElementNS(OOXML.W_NS, 'w:t');
|
|
120
|
+
setXmlSpacePreserveIfNeeded(t, buf);
|
|
121
|
+
t.appendChild(doc.createTextNode(buf));
|
|
122
|
+
run.appendChild(t);
|
|
123
|
+
buf = '';
|
|
124
|
+
};
|
|
125
|
+
for (let i = 0; i < text.length; i++) {
|
|
126
|
+
const ch = text[i];
|
|
127
|
+
if (ch === '\t') {
|
|
128
|
+
flush();
|
|
129
|
+
run.appendChild(doc.createElementNS(OOXML.W_NS, 'w:tab'));
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (ch === '\n') {
|
|
133
|
+
flush();
|
|
134
|
+
run.appendChild(doc.createElementNS(OOXML.W_NS, 'w:br'));
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
buf += ch;
|
|
138
|
+
}
|
|
139
|
+
flush();
|
|
140
|
+
}
|
|
141
|
+
export function visibleLengthForEl(el) {
|
|
142
|
+
if (el.namespaceURI !== OOXML.W_NS)
|
|
143
|
+
return 0;
|
|
144
|
+
if (el.localName === W.t)
|
|
145
|
+
return (el.textContent ?? '').length;
|
|
146
|
+
if (el.localName === W.tab)
|
|
147
|
+
return 1;
|
|
148
|
+
if (el.localName === W.br)
|
|
149
|
+
return 1;
|
|
150
|
+
return 0;
|
|
151
|
+
}
|
|
152
|
+
export function getDirectContentElements(run) {
|
|
153
|
+
// Direct children excluding rPr; preserves unknown nodes without duplicating them on splits.
|
|
154
|
+
const out = [];
|
|
155
|
+
for (const child of Array.from(run.childNodes)) {
|
|
156
|
+
if (child.nodeType !== 1)
|
|
157
|
+
continue;
|
|
158
|
+
const el = child;
|
|
159
|
+
if (el.namespaceURI !== OOXML.W_NS)
|
|
160
|
+
continue;
|
|
161
|
+
if (el.localName === W.rPr)
|
|
162
|
+
continue;
|
|
163
|
+
out.push(el);
|
|
164
|
+
}
|
|
165
|
+
return out;
|
|
166
|
+
}
|
|
167
|
+
export function splitRunAtVisibleOffset(run, offset) {
|
|
168
|
+
const doc = run.ownerDocument;
|
|
169
|
+
if (!doc)
|
|
170
|
+
throw new Error('Run has no ownerDocument');
|
|
171
|
+
const parent = run.parentNode;
|
|
172
|
+
if (!parent)
|
|
173
|
+
throw new Error('Run has no parent');
|
|
174
|
+
const right = run.cloneNode(true);
|
|
175
|
+
parent.insertBefore(right, run.nextSibling);
|
|
176
|
+
const leftContent = getDirectContentElements(run);
|
|
177
|
+
const rightContent = getDirectContentElements(right);
|
|
178
|
+
let pos = 0;
|
|
179
|
+
for (let i = 0; i < leftContent.length; i++) {
|
|
180
|
+
const lEl = leftContent[i];
|
|
181
|
+
const rEl = rightContent[i];
|
|
182
|
+
const len = visibleLengthForEl(lEl);
|
|
183
|
+
if (len === 0) {
|
|
184
|
+
// Zero-length nodes (proofing, field markers, etc.) should not be duplicated. Keep them on the side
|
|
185
|
+
// determined by the current visible position.
|
|
186
|
+
if (pos < offset)
|
|
187
|
+
rEl.parentNode?.removeChild(rEl);
|
|
188
|
+
else
|
|
189
|
+
lEl.parentNode?.removeChild(lEl);
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
const start = pos;
|
|
193
|
+
const end = pos + len;
|
|
194
|
+
if (offset <= start) {
|
|
195
|
+
// Entire element is to the right.
|
|
196
|
+
lEl.parentNode?.removeChild(lEl);
|
|
197
|
+
pos += len;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (offset >= end) {
|
|
201
|
+
// Entire element is to the left.
|
|
202
|
+
rEl.parentNode?.removeChild(rEl);
|
|
203
|
+
pos += len;
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
// Split inside this element.
|
|
207
|
+
if (isW(lEl, W.t) && isW(rEl, W.t)) {
|
|
208
|
+
const full = lEl.textContent ?? '';
|
|
209
|
+
const leftText = full.slice(0, offset - start);
|
|
210
|
+
const rightText = full.slice(offset - start);
|
|
211
|
+
lEl.textContent = leftText;
|
|
212
|
+
rEl.textContent = rightText;
|
|
213
|
+
setXmlSpacePreserveIfNeeded(lEl, leftText);
|
|
214
|
+
setXmlSpacePreserveIfNeeded(rEl, rightText);
|
|
215
|
+
if (!leftText)
|
|
216
|
+
lEl.parentNode?.removeChild(lEl);
|
|
217
|
+
if (!rightText)
|
|
218
|
+
rEl.parentNode?.removeChild(rEl);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
// tab/br are length 1 and should not be split; move to the right by default.
|
|
222
|
+
lEl.parentNode?.removeChild(lEl);
|
|
223
|
+
}
|
|
224
|
+
pos += len;
|
|
225
|
+
}
|
|
226
|
+
return { left: run, right };
|
|
227
|
+
}
|
|
228
|
+
function cleanupEmptyRuns(parent) {
|
|
229
|
+
for (const child of Array.from(parent.childNodes)) {
|
|
230
|
+
if (child.nodeType !== 1)
|
|
231
|
+
continue;
|
|
232
|
+
const el = child;
|
|
233
|
+
if (!isW(el, W.r))
|
|
234
|
+
continue;
|
|
235
|
+
// Keep run if it has any non-rPr element children.
|
|
236
|
+
let hasContent = false;
|
|
237
|
+
for (const c of Array.from(el.childNodes)) {
|
|
238
|
+
if (c.nodeType !== 1)
|
|
239
|
+
continue;
|
|
240
|
+
const cEl = c;
|
|
241
|
+
if (!isW(cEl, W.rPr)) {
|
|
242
|
+
hasContent = true;
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (!hasContent)
|
|
247
|
+
el.parentNode?.removeChild(el);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
function getDirectChild(parent, localName) {
|
|
251
|
+
for (const child of Array.from(parent.childNodes)) {
|
|
252
|
+
if (child.nodeType !== 1)
|
|
253
|
+
continue;
|
|
254
|
+
const el = child;
|
|
255
|
+
if (isW(el, localName))
|
|
256
|
+
return el;
|
|
257
|
+
}
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
function ensureRPr(doc, run) {
|
|
261
|
+
const existing = getDirectChild(run, W.rPr);
|
|
262
|
+
if (existing)
|
|
263
|
+
return existing;
|
|
264
|
+
const rPr = doc.createElementNS(OOXML.W_NS, `w:${W.rPr}`);
|
|
265
|
+
run.insertBefore(rPr, run.firstChild);
|
|
266
|
+
return rPr;
|
|
267
|
+
}
|
|
268
|
+
function ensureBoolProp(doc, rPr, localName) {
|
|
269
|
+
let el = rPr.getElementsByTagNameNS(OOXML.W_NS, localName).item(0);
|
|
270
|
+
if (!el) {
|
|
271
|
+
el = doc.createElementNS(OOXML.W_NS, `w:${localName}`);
|
|
272
|
+
rPr.appendChild(el);
|
|
273
|
+
}
|
|
274
|
+
// Ensure truthy by removing any explicit false.
|
|
275
|
+
el.removeAttributeNS(OOXML.W_NS, 'val');
|
|
276
|
+
el.removeAttribute('w:val');
|
|
277
|
+
el.removeAttribute('val');
|
|
278
|
+
}
|
|
279
|
+
function ensureUnderline(doc, rPr, val) {
|
|
280
|
+
let el = rPr.getElementsByTagNameNS(OOXML.W_NS, W.u).item(0);
|
|
281
|
+
if (!el) {
|
|
282
|
+
el = doc.createElementNS(OOXML.W_NS, `w:${W.u}`);
|
|
283
|
+
rPr.appendChild(el);
|
|
284
|
+
}
|
|
285
|
+
const v = val ?? 'single';
|
|
286
|
+
el.setAttribute('w:val', v);
|
|
287
|
+
}
|
|
288
|
+
function clearHighlightProp(rPr) {
|
|
289
|
+
const hs = Array.from(rPr.getElementsByTagNameNS(OOXML.W_NS, W.highlight));
|
|
290
|
+
for (const h of hs)
|
|
291
|
+
h.parentNode?.removeChild(h);
|
|
292
|
+
}
|
|
293
|
+
function ensureHighlight(doc, rPr, val) {
|
|
294
|
+
let el = rPr.getElementsByTagNameNS(OOXML.W_NS, W.highlight).item(0);
|
|
295
|
+
if (!el) {
|
|
296
|
+
el = doc.createElementNS(OOXML.W_NS, `w:${W.highlight}`);
|
|
297
|
+
rPr.appendChild(el);
|
|
298
|
+
}
|
|
299
|
+
el.setAttribute('w:val', val ?? 'yellow');
|
|
300
|
+
}
|
|
301
|
+
function applyRunProps(doc, run, add, clearHighlight) {
|
|
302
|
+
if (!add && !clearHighlight)
|
|
303
|
+
return;
|
|
304
|
+
const rPr = ensureRPr(doc, run);
|
|
305
|
+
if (clearHighlight)
|
|
306
|
+
clearHighlightProp(rPr);
|
|
307
|
+
if (!add)
|
|
308
|
+
return;
|
|
309
|
+
if (add.bold)
|
|
310
|
+
ensureBoolProp(doc, rPr, W.b);
|
|
311
|
+
if (add.italic)
|
|
312
|
+
ensureBoolProp(doc, rPr, W.i);
|
|
313
|
+
if (add.underline)
|
|
314
|
+
ensureUnderline(doc, rPr, typeof add.underline === 'string' ? add.underline : null);
|
|
315
|
+
if (add.highlight)
|
|
316
|
+
ensureHighlight(doc, rPr, typeof add.highlight === 'string' ? add.highlight : null);
|
|
317
|
+
}
|
|
318
|
+
export function replaceParagraphTextRange(p, start, end, replacement) {
|
|
319
|
+
// Replace visible text in [start, end) in paragraph by operating on w:t nodes.
|
|
320
|
+
// Strategy:
|
|
321
|
+
// 1. Build concatenated visible text from visible runs (field-code aware).
|
|
322
|
+
// 2. Map offsets to run index + offset.
|
|
323
|
+
// 3. Split boundary runs so the replace range aligns to run boundaries.
|
|
324
|
+
// 4. Remove the runs in range and insert new run(s) that clone formatting from the
|
|
325
|
+
// predominant run in the replaced span.
|
|
326
|
+
const doc = p.ownerDocument;
|
|
327
|
+
if (!doc)
|
|
328
|
+
throw new Error('Paragraph has no ownerDocument');
|
|
329
|
+
const runs = getParagraphRuns(p);
|
|
330
|
+
const fullText = runs.map((r) => r.text).join('');
|
|
331
|
+
if (start < 0 || end < start || end > fullText.length) {
|
|
332
|
+
throw new Error(`Invalid range [${start}, ${end}) for paragraph length ${fullText.length}`);
|
|
333
|
+
}
|
|
334
|
+
const { startRunIdx, startOffset, endRunIdx, endOffset } = findOffsetInRuns(runs, start, end);
|
|
335
|
+
const startRun = runs[startRunIdx];
|
|
336
|
+
const endRun = runs[endRunIdx];
|
|
337
|
+
// For now we only support field edits that stay within a single visible run.
|
|
338
|
+
if (startRunIdx !== endRunIdx) {
|
|
339
|
+
for (let i = startRunIdx; i <= endRunIdx; i++) {
|
|
340
|
+
if (runs[i]?.isFieldResult) {
|
|
341
|
+
throw new SafeDocxError('UNSUPPORTED_EDIT', 'Edit spans multiple runs and intersects a field result. This is currently unsupported in Safe-Docx TS.', 'Narrow old_string so the edit does not cross a field, or edit the field result text in a smaller span.');
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// Pick a template run from the span: the run with the largest overlap by visible character count.
|
|
346
|
+
let templateRun = startRun.r;
|
|
347
|
+
let best = -1;
|
|
348
|
+
for (let i = startRunIdx; i <= endRunIdx; i++) {
|
|
349
|
+
const r = runs[i];
|
|
350
|
+
const runStart = i === startRunIdx ? startOffset : 0;
|
|
351
|
+
const runEnd = i === endRunIdx ? endOffset : r.text.length;
|
|
352
|
+
const overlap = Math.max(0, runEnd - runStart);
|
|
353
|
+
if (overlap > best) {
|
|
354
|
+
best = overlap;
|
|
355
|
+
templateRun = r.r;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
const parts = typeof replacement === 'string' ? [{ text: replacement }] : replacement;
|
|
359
|
+
// Split boundary runs so we can remove whole runs cleanly.
|
|
360
|
+
let rangeStartRunEl = startRun.r;
|
|
361
|
+
let rangeEndRunEl = endRun.r;
|
|
362
|
+
if (startRunIdx === endRunIdx) {
|
|
363
|
+
// Single-run replacement: split end first, then start.
|
|
364
|
+
const runLen = startRun.text.length;
|
|
365
|
+
if (endOffset < runLen) {
|
|
366
|
+
const { left } = splitRunAtVisibleOffset(rangeStartRunEl, endOffset);
|
|
367
|
+
rangeStartRunEl = left;
|
|
368
|
+
rangeEndRunEl = left;
|
|
369
|
+
}
|
|
370
|
+
if (startOffset > 0) {
|
|
371
|
+
const { right } = splitRunAtVisibleOffset(rangeStartRunEl, startOffset);
|
|
372
|
+
rangeStartRunEl = right;
|
|
373
|
+
rangeEndRunEl = right;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
// Multi-run replacement: split start then end.
|
|
378
|
+
if (startOffset > 0) {
|
|
379
|
+
const { right } = splitRunAtVisibleOffset(rangeStartRunEl, startOffset);
|
|
380
|
+
rangeStartRunEl = right;
|
|
381
|
+
}
|
|
382
|
+
const endLen = endRun.text.length;
|
|
383
|
+
if (endOffset < endLen) {
|
|
384
|
+
const { left } = splitRunAtVisibleOffset(rangeEndRunEl, endOffset);
|
|
385
|
+
rangeEndRunEl = left;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
const parent = rangeStartRunEl.parentNode;
|
|
389
|
+
if (!parent)
|
|
390
|
+
throw new Error('Run has no parent');
|
|
391
|
+
if (rangeEndRunEl.parentNode !== parent) {
|
|
392
|
+
throw new SafeDocxError('UNSAFE_CONTAINER_BOUNDARY', 'Edit crosses container boundaries (e.g. hyperlinks/SDTs).', 'Narrow old_string so the match is contained within a single container, or avoid editing inside hyperlinks.');
|
|
393
|
+
}
|
|
394
|
+
const insertBeforeNode = rangeEndRunEl.nextSibling;
|
|
395
|
+
// Remove runs in [rangeStartRunEl, rangeEndRunEl] inclusive (only w:r elements).
|
|
396
|
+
let cur = rangeStartRunEl;
|
|
397
|
+
while (cur) {
|
|
398
|
+
const nextNode = cur.nextSibling;
|
|
399
|
+
if (cur.nodeType === 1 && isW(cur, W.r)) {
|
|
400
|
+
cur.parentNode?.removeChild(cur);
|
|
401
|
+
}
|
|
402
|
+
if (cur === rangeEndRunEl)
|
|
403
|
+
break;
|
|
404
|
+
cur = nextNode;
|
|
405
|
+
}
|
|
406
|
+
// Insert replacement runs.
|
|
407
|
+
for (const part of parts) {
|
|
408
|
+
const tmpl = part.templateRun ?? templateRun;
|
|
409
|
+
const newRun = cloneRunFormattingOnly(doc, tmpl);
|
|
410
|
+
applyRunProps(doc, newRun, part.addRunProps, part.clearHighlight);
|
|
411
|
+
appendTextToRun(doc, newRun, part.text);
|
|
412
|
+
parent.insertBefore(newRun, insertBeforeNode);
|
|
413
|
+
}
|
|
414
|
+
cleanupEmptyRuns(parent);
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/primitives/text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* validate_document — structural integrity checks for OOXML documents.
|
|
3
|
+
*
|
|
4
|
+
* Runs before download/pack to catch common issues that could produce
|
|
5
|
+
* corrupt or unexpected output. Returns warnings (non-blocking) that are
|
|
6
|
+
* surfaced in response metadata.
|
|
7
|
+
*/
|
|
8
|
+
export type ValidationWarning = {
|
|
9
|
+
code: string;
|
|
10
|
+
message: string;
|
|
11
|
+
/** Optional element context (e.g. bookmark name, paragraph index). */
|
|
12
|
+
context?: string;
|
|
13
|
+
};
|
|
14
|
+
export type ValidateDocumentResult = {
|
|
15
|
+
warnings: ValidationWarning[];
|
|
16
|
+
isValid: boolean;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Validate structural integrity of the document body.
|
|
20
|
+
* Returns warnings for issues that may cause problems during download/pack.
|
|
21
|
+
* All checks are non-destructive and read-only.
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateDocument(doc: Document): ValidateDocumentResult;
|
|
24
|
+
//# sourceMappingURL=validate_document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate_document.d.ts","sourceRoot":"","sources":["../../src/primitives/validate_document.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAyIF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,GAAG,sBAAsB,CActE"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* validate_document — structural integrity checks for OOXML documents.
|
|
3
|
+
*
|
|
4
|
+
* Runs before download/pack to catch common issues that could produce
|
|
5
|
+
* corrupt or unexpected output. Returns warnings (non-blocking) that are
|
|
6
|
+
* surfaced in response metadata.
|
|
7
|
+
*/
|
|
8
|
+
import { OOXML, W } from './namespaces.js';
|
|
9
|
+
// ── Helpers ───────────────────────────────────────────────────────────
|
|
10
|
+
function getWAttr(el, localName) {
|
|
11
|
+
return el.getAttributeNS(OOXML.W_NS, localName) ?? el.getAttribute(`w:${localName}`);
|
|
12
|
+
}
|
|
13
|
+
// ── Check: orphaned bookmarks ─────────────────────────────────────────
|
|
14
|
+
function checkOrphanedBookmarks(body) {
|
|
15
|
+
const warnings = [];
|
|
16
|
+
const starts = new Map();
|
|
17
|
+
const ends = new Set();
|
|
18
|
+
const bookmarkStarts = body.getElementsByTagNameNS(OOXML.W_NS, W.bookmarkStart);
|
|
19
|
+
for (let i = 0; i < bookmarkStarts.length; i++) {
|
|
20
|
+
const el = bookmarkStarts.item(i);
|
|
21
|
+
const id = getWAttr(el, 'id');
|
|
22
|
+
if (id)
|
|
23
|
+
starts.set(id, el);
|
|
24
|
+
}
|
|
25
|
+
const bookmarkEnds = body.getElementsByTagNameNS(OOXML.W_NS, W.bookmarkEnd);
|
|
26
|
+
for (let i = 0; i < bookmarkEnds.length; i++) {
|
|
27
|
+
const el = bookmarkEnds.item(i);
|
|
28
|
+
const id = getWAttr(el, 'id');
|
|
29
|
+
if (id)
|
|
30
|
+
ends.add(id);
|
|
31
|
+
}
|
|
32
|
+
// bookmarkStart without matching bookmarkEnd
|
|
33
|
+
for (const [id, el] of starts) {
|
|
34
|
+
if (!ends.has(id)) {
|
|
35
|
+
const name = getWAttr(el, 'name') ?? '(unnamed)';
|
|
36
|
+
warnings.push({
|
|
37
|
+
code: 'ORPHANED_BOOKMARK_START',
|
|
38
|
+
message: `bookmarkStart id="${id}" name="${name}" has no matching bookmarkEnd`,
|
|
39
|
+
context: `name=${name}`,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// bookmarkEnd without matching bookmarkStart
|
|
44
|
+
for (const id of ends) {
|
|
45
|
+
if (!starts.has(id)) {
|
|
46
|
+
warnings.push({
|
|
47
|
+
code: 'ORPHANED_BOOKMARK_END',
|
|
48
|
+
message: `bookmarkEnd id="${id}" has no matching bookmarkStart`,
|
|
49
|
+
context: `id=${id}`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return warnings;
|
|
54
|
+
}
|
|
55
|
+
// ── Check: malformed tracked-change wrappers ──────────────────────────
|
|
56
|
+
const TC_LOCALS = ['ins', 'del', 'moveFrom', 'moveTo'];
|
|
57
|
+
const REQUIRED_TC_ATTRS = ['id', 'author', 'date'];
|
|
58
|
+
function checkTrackedChangeWrappers(body) {
|
|
59
|
+
const warnings = [];
|
|
60
|
+
for (const local of TC_LOCALS) {
|
|
61
|
+
const elements = body.getElementsByTagNameNS(OOXML.W_NS, local);
|
|
62
|
+
for (let i = 0; i < elements.length; i++) {
|
|
63
|
+
const el = elements.item(i);
|
|
64
|
+
for (const attr of REQUIRED_TC_ATTRS) {
|
|
65
|
+
const val = getWAttr(el, attr);
|
|
66
|
+
if (!val) {
|
|
67
|
+
warnings.push({
|
|
68
|
+
code: 'MALFORMED_TRACKED_CHANGE',
|
|
69
|
+
message: `<w:${local}> missing required attribute w:${attr}`,
|
|
70
|
+
context: `element=w:${local}, missing=w:${attr}`,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Check for empty tracked-change wrappers (no child elements)
|
|
75
|
+
let hasChildElement = false;
|
|
76
|
+
let c = el.firstChild;
|
|
77
|
+
while (c) {
|
|
78
|
+
if (c.nodeType === 1) {
|
|
79
|
+
hasChildElement = true;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
c = c.nextSibling;
|
|
83
|
+
}
|
|
84
|
+
if (!hasChildElement) {
|
|
85
|
+
const tcId = getWAttr(el, 'id') ?? '?';
|
|
86
|
+
warnings.push({
|
|
87
|
+
code: 'EMPTY_TRACKED_CHANGE',
|
|
88
|
+
message: `<w:${local} w:id="${tcId}"> has no child elements`,
|
|
89
|
+
context: `element=w:${local}, id=${tcId}`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return warnings;
|
|
95
|
+
}
|
|
96
|
+
// ── Check: mismatched field markers ───────────────────────────────────
|
|
97
|
+
function checkFieldMarkers(body) {
|
|
98
|
+
const warnings = [];
|
|
99
|
+
// Collect all fldChar elements in document order
|
|
100
|
+
const fldChars = body.getElementsByTagNameNS(OOXML.W_NS, W.fldChar);
|
|
101
|
+
let depth = 0;
|
|
102
|
+
for (let i = 0; i < fldChars.length; i++) {
|
|
103
|
+
const el = fldChars.item(i);
|
|
104
|
+
const fldCharType = getWAttr(el, 'fldCharType');
|
|
105
|
+
if (fldCharType === 'begin') {
|
|
106
|
+
depth++;
|
|
107
|
+
}
|
|
108
|
+
else if (fldCharType === 'end') {
|
|
109
|
+
depth--;
|
|
110
|
+
if (depth < 0) {
|
|
111
|
+
warnings.push({
|
|
112
|
+
code: 'UNMATCHED_FIELD_END',
|
|
113
|
+
message: 'fldChar type="end" without matching type="begin"',
|
|
114
|
+
});
|
|
115
|
+
depth = 0;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (depth > 0) {
|
|
120
|
+
warnings.push({
|
|
121
|
+
code: 'UNMATCHED_FIELD_BEGIN',
|
|
122
|
+
message: `${depth} fldChar type="begin" without matching type="end"`,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return warnings;
|
|
126
|
+
}
|
|
127
|
+
// ── Public API ────────────────────────────────────────────────────────
|
|
128
|
+
/**
|
|
129
|
+
* Validate structural integrity of the document body.
|
|
130
|
+
* Returns warnings for issues that may cause problems during download/pack.
|
|
131
|
+
* All checks are non-destructive and read-only.
|
|
132
|
+
*/
|
|
133
|
+
export function validateDocument(doc) {
|
|
134
|
+
const body = doc.getElementsByTagNameNS(OOXML.W_NS, W.body).item(0);
|
|
135
|
+
if (!body)
|
|
136
|
+
return { warnings: [], isValid: true };
|
|
137
|
+
const warnings = [
|
|
138
|
+
...checkOrphanedBookmarks(body),
|
|
139
|
+
...checkTrackedChangeWrappers(body),
|
|
140
|
+
...checkFieldMarkers(body),
|
|
141
|
+
];
|
|
142
|
+
return {
|
|
143
|
+
warnings,
|
|
144
|
+
isValid: warnings.length === 0,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=validate_document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate_document.js","sourceRoot":"","sources":["../../src/primitives/validate_document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../src/primitives/xml.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC;AAE9B,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAW5C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAEjE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { DOMParser, XMLSerializer } from '@xmldom/xmldom';
|
|
2
|
+
export function parseXml(xml) {
|
|
3
|
+
// application/xml ensures XML parsing rules (vs HTML-ish parsing).
|
|
4
|
+
const doc = new DOMParser().parseFromString(xml, 'application/xml');
|
|
5
|
+
// xmldom uses a <parsererror> element for some failures; keep a minimal check.
|
|
6
|
+
const parseErrors = doc.getElementsByTagName('parsererror');
|
|
7
|
+
if (parseErrors && parseErrors.length > 0) {
|
|
8
|
+
const msg = parseErrors[0]?.textContent?.trim() || 'XML parse error';
|
|
9
|
+
throw new Error(msg);
|
|
10
|
+
}
|
|
11
|
+
return doc;
|
|
12
|
+
}
|
|
13
|
+
export function serializeXml(doc) {
|
|
14
|
+
return new XMLSerializer().serializeToString(doc);
|
|
15
|
+
}
|
|
16
|
+
export function textContent(node) {
|
|
17
|
+
return node?.textContent ?? '';
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/primitives/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAI1D,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,mEAAmE;IACnE,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAEpE,+EAA+E;IAC/E,MAAM,WAAW,GAAG,GAAG,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAC5D,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,iBAAiB,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,IAAI,aAAa,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAA6B;IACvD,OAAO,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC;AACjC,CAAC"}
|