@usejunior/docx-core 0.10.0 → 0.11.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 +202 -21
- package/NOTICE +2 -0
- package/README.md +2 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/atomizer.d.ts +13 -7
- package/dist/atomizer.d.ts.map +1 -1
- package/dist/atomizer.js +59 -24
- package/dist/atomizer.js.map +1 -1
- package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts +99 -0
- package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts.map +1 -0
- package/dist/baselines/atomizer/auxiliaryIdCollision.js +415 -0
- package/dist/baselines/atomizer/auxiliaryIdCollision.js.map +1 -0
- package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -1
- package/dist/baselines/atomizer/documentReconstructor.js +120 -27
- package/dist/baselines/atomizer/documentReconstructor.js.map +1 -1
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +9 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +1 -1
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +52 -4
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +1 -1
- package/dist/baselines/atomizer/pipeline.d.ts +12 -53
- package/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
- package/dist/baselines/atomizer/pipeline.js +126 -231
- package/dist/baselines/atomizer/pipeline.js.map +1 -1
- package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -1
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js +153 -23
- package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -1
- package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -1
- package/dist/baselines/wmlcomparer/DotnetCli.js +7 -0
- package/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -1
- package/dist/cli/compare-two.d.ts.map +1 -1
- package/dist/cli/compare-two.js +3 -1
- package/dist/cli/compare-two.js.map +1 -1
- package/dist/cli/conformance-adapter.d.ts +3 -0
- package/dist/cli/conformance-adapter.d.ts.map +1 -0
- package/dist/cli/conformance-adapter.js +93 -0
- package/dist/cli/conformance-adapter.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +5 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/compare-types.d.ts +46 -0
- package/dist/compare-types.d.ts.map +1 -1
- package/dist/generation/compile.d.ts +21 -0
- package/dist/generation/compile.d.ts.map +1 -0
- package/dist/generation/compile.js +46 -0
- package/dist/generation/compile.js.map +1 -0
- package/dist/generation/context.d.ts +42 -0
- package/dist/generation/context.d.ts.map +1 -0
- package/dist/generation/context.js +65 -0
- package/dist/generation/context.js.map +1 -0
- package/dist/generation/emit/comments-part.d.ts +36 -0
- package/dist/generation/emit/comments-part.d.ts.map +1 -0
- package/dist/generation/emit/comments-part.js +116 -0
- package/dist/generation/emit/comments-part.js.map +1 -0
- package/dist/generation/emit/document-part.d.ts +24 -0
- package/dist/generation/emit/document-part.d.ts.map +1 -0
- package/dist/generation/emit/document-part.js +60 -0
- package/dist/generation/emit/document-part.js.map +1 -0
- package/dist/generation/emit/emit-context.d.ts +26 -0
- package/dist/generation/emit/emit-context.d.ts.map +1 -0
- package/dist/generation/emit/emit-context.js +19 -0
- package/dist/generation/emit/emit-context.js.map +1 -0
- package/dist/generation/emit/header-footer-part.d.ts +23 -0
- package/dist/generation/emit/header-footer-part.d.ts.map +1 -0
- package/dist/generation/emit/header-footer-part.js +57 -0
- package/dist/generation/emit/header-footer-part.js.map +1 -0
- package/dist/generation/emit/numbering-part.d.ts +29 -0
- package/dist/generation/emit/numbering-part.d.ts.map +1 -0
- package/dist/generation/emit/numbering-part.js +100 -0
- package/dist/generation/emit/numbering-part.js.map +1 -0
- package/dist/generation/emit/package-parts.d.ts +24 -0
- package/dist/generation/emit/package-parts.d.ts.map +1 -0
- package/dist/generation/emit/package-parts.js +121 -0
- package/dist/generation/emit/package-parts.js.map +1 -0
- package/dist/generation/emit/paragraph.d.ts +24 -0
- package/dist/generation/emit/paragraph.d.ts.map +1 -0
- package/dist/generation/emit/paragraph.js +63 -0
- package/dist/generation/emit/paragraph.js.map +1 -0
- package/dist/generation/emit/properties.d.ts +34 -0
- package/dist/generation/emit/properties.d.ts.map +1 -0
- package/dist/generation/emit/properties.js +138 -0
- package/dist/generation/emit/properties.js.map +1 -0
- package/dist/generation/emit/run.d.ts +15 -0
- package/dist/generation/emit/run.d.ts.map +1 -0
- package/dist/generation/emit/run.js +71 -0
- package/dist/generation/emit/run.js.map +1 -0
- package/dist/generation/emit/section.d.ts +29 -0
- package/dist/generation/emit/section.d.ts.map +1 -0
- package/dist/generation/emit/section.js +117 -0
- package/dist/generation/emit/section.js.map +1 -0
- package/dist/generation/emit/settings-part.d.ts +13 -0
- package/dist/generation/emit/settings-part.d.ts.map +1 -0
- package/dist/generation/emit/settings-part.js +24 -0
- package/dist/generation/emit/settings-part.js.map +1 -0
- package/dist/generation/emit/styles-part.d.ts +16 -0
- package/dist/generation/emit/styles-part.d.ts.map +1 -0
- package/dist/generation/emit/styles-part.js +80 -0
- package/dist/generation/emit/styles-part.js.map +1 -0
- package/dist/generation/emit/table.d.ts +26 -0
- package/dist/generation/emit/table.d.ts.map +1 -0
- package/dist/generation/emit/table.js +196 -0
- package/dist/generation/emit/table.js.map +1 -0
- package/dist/generation/errors.d.ts +22 -0
- package/dist/generation/errors.d.ts.map +1 -0
- package/dist/generation/errors.js +29 -0
- package/dist/generation/errors.js.map +1 -0
- package/dist/generation/index.d.ts +13 -0
- package/dist/generation/index.d.ts.map +1 -0
- package/dist/generation/index.js +12 -0
- package/dist/generation/index.js.map +1 -0
- package/dist/generation/ordering.d.ts +46 -0
- package/dist/generation/ordering.d.ts.map +1 -0
- package/dist/generation/ordering.js +119 -0
- package/dist/generation/ordering.js.map +1 -0
- package/dist/generation/recipes.d.ts +47 -0
- package/dist/generation/recipes.d.ts.map +1 -0
- package/dist/generation/recipes.js +84 -0
- package/dist/generation/recipes.js.map +1 -0
- package/dist/generation/structural-checks.d.ts +24 -0
- package/dist/generation/structural-checks.d.ts.map +1 -0
- package/dist/generation/structural-checks.js +318 -0
- package/dist/generation/structural-checks.js.map +1 -0
- package/dist/generation/types.d.ts +217 -0
- package/dist/generation/types.d.ts.map +1 -0
- package/dist/generation/types.js +16 -0
- package/dist/generation/types.js.map +1 -0
- package/dist/generation/validate-spec.d.ts +27 -0
- package/dist/generation/validate-spec.d.ts.map +1 -0
- package/dist/generation/validate-spec.js +307 -0
- package/dist/generation/validate-spec.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/integration/generation-probes.d.ts +15 -0
- package/dist/integration/generation-probes.d.ts.map +1 -0
- package/dist/integration/generation-probes.js +84 -0
- package/dist/integration/generation-probes.js.map +1 -0
- package/dist/integration/libreoffice-oracle.d.ts +8 -0
- package/dist/integration/libreoffice-oracle.d.ts.map +1 -1
- package/dist/integration/libreoffice-oracle.js +14 -6
- package/dist/integration/libreoffice-oracle.js.map +1 -1
- package/dist/integration/synthetic-docx-fixture.d.ts +72 -0
- package/dist/integration/synthetic-docx-fixture.d.ts.map +1 -1
- package/dist/integration/synthetic-docx-fixture.js +131 -4
- package/dist/integration/synthetic-docx-fixture.js.map +1 -1
- package/dist/primitives/accept_changes.d.ts +2 -1
- package/dist/primitives/accept_changes.d.ts.map +1 -1
- package/dist/primitives/accept_changes.js +153 -12
- package/dist/primitives/accept_changes.js.map +1 -1
- package/dist/primitives/document.d.ts +38 -0
- package/dist/primitives/document.d.ts.map +1 -1
- package/dist/primitives/document.js +75 -9
- package/dist/primitives/document.js.map +1 -1
- package/dist/primitives/document_view-comments.d.ts.map +1 -1
- package/dist/primitives/document_view-comments.js +4 -3
- package/dist/primitives/document_view-comments.js.map +1 -1
- package/dist/primitives/document_view-types.d.ts +15 -0
- package/dist/primitives/document_view-types.d.ts.map +1 -1
- package/dist/primitives/document_view.d.ts.map +1 -1
- package/dist/primitives/document_view.js +21 -13
- package/dist/primitives/document_view.js.map +1 -1
- package/dist/primitives/formatting_tags.d.ts +1 -0
- package/dist/primitives/formatting_tags.d.ts.map +1 -1
- package/dist/primitives/formatting_tags.js +16 -10
- package/dist/primitives/formatting_tags.js.map +1 -1
- package/dist/primitives/index.d.ts +4 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +4 -0
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/layout.d.ts.map +1 -1
- package/dist/primitives/layout.js +13 -0
- package/dist/primitives/layout.js.map +1 -1
- package/dist/primitives/minimal_save.d.ts +38 -0
- package/dist/primitives/minimal_save.d.ts.map +1 -0
- package/dist/primitives/minimal_save.js +323 -0
- package/dist/primitives/minimal_save.js.map +1 -0
- package/dist/primitives/namespaces.d.ts +41 -0
- package/dist/primitives/namespaces.d.ts.map +1 -1
- package/dist/primitives/namespaces.js +43 -0
- package/dist/primitives/namespaces.js.map +1 -1
- package/dist/primitives/reject_changes.d.ts +4 -2
- package/dist/primitives/reject_changes.d.ts.map +1 -1
- package/dist/primitives/reject_changes.js +177 -24
- package/dist/primitives/reject_changes.js.map +1 -1
- package/dist/primitives/revision-parts.d.ts +7 -0
- package/dist/primitives/revision-parts.d.ts.map +1 -0
- package/dist/primitives/revision-parts.js +27 -0
- package/dist/primitives/revision-parts.js.map +1 -0
- package/dist/primitives/revision-vocabulary.d.ts +7 -0
- package/dist/primitives/revision-vocabulary.d.ts.map +1 -0
- package/dist/primitives/revision-vocabulary.js +39 -0
- package/dist/primitives/revision-vocabulary.js.map +1 -0
- package/dist/primitives/schema-corpus-capture.d.ts +19 -0
- package/dist/primitives/schema-corpus-capture.d.ts.map +1 -0
- package/dist/primitives/schema-corpus-capture.js +29 -0
- package/dist/primitives/schema-corpus-capture.js.map +1 -0
- package/dist/primitives/sectPrAudit.d.ts +19 -0
- package/dist/primitives/sectPrAudit.d.ts.map +1 -0
- package/dist/primitives/sectPrAudit.js +165 -0
- package/dist/primitives/sectPrAudit.js.map +1 -0
- package/dist/primitives/semantic_tags.d.ts.map +1 -1
- package/dist/primitives/semantic_tags.js +2 -1
- package/dist/primitives/semantic_tags.js.map +1 -1
- package/dist/primitives/serialize_html.d.ts +1 -0
- package/dist/primitives/serialize_html.d.ts.map +1 -1
- package/dist/primitives/serialize_html.js +4 -2
- package/dist/primitives/serialize_html.js.map +1 -1
- package/dist/primitives/styles.d.ts +15 -0
- package/dist/primitives/styles.d.ts.map +1 -1
- package/dist/primitives/styles.js +11 -0
- package/dist/primitives/styles.js.map +1 -1
- package/dist/primitives/track-changes-emitter.d.ts +9 -0
- package/dist/primitives/track-changes-emitter.d.ts.map +1 -1
- package/dist/primitives/track-changes-emitter.js +54 -4
- package/dist/primitives/track-changes-emitter.js.map +1 -1
- package/dist/primitives/validate_ai_revisions.d.ts +35 -0
- package/dist/primitives/validate_ai_revisions.d.ts.map +1 -0
- package/dist/primitives/validate_ai_revisions.js +323 -0
- package/dist/primitives/validate_ai_revisions.js.map +1 -0
- package/dist/primitives/xml.d.ts +5 -0
- package/dist/primitives/xml.d.ts.map +1 -1
- package/dist/primitives/xml.js +5 -0
- package/dist/primitives/xml.js.map +1 -1
- package/dist/primitives/zip.d.ts +1 -0
- package/dist/primitives/zip.d.ts.map +1 -1
- package/dist/primitives/zip.js +21 -3
- package/dist/primitives/zip.js.map +1 -1
- package/dist/shared/field-structure.d.ts +14 -0
- package/dist/shared/field-structure.d.ts.map +1 -0
- package/dist/shared/field-structure.js +166 -0
- package/dist/shared/field-structure.js.map +1 -0
- package/package.json +7 -4
|
@@ -2,6 +2,8 @@ export interface SyntheticDocxOptions {
|
|
|
2
2
|
paragraphs: string[];
|
|
3
3
|
footnoteOnParagraph?: number;
|
|
4
4
|
footnoteText?: string;
|
|
5
|
+
endnoteOnParagraph?: number;
|
|
6
|
+
endnoteText?: string;
|
|
5
7
|
commentOnParagraph?: number;
|
|
6
8
|
commentText?: string;
|
|
7
9
|
commentAuthor?: string;
|
|
@@ -46,14 +48,84 @@ export interface SyntheticDocxOptions {
|
|
|
46
48
|
name: string;
|
|
47
49
|
id?: number;
|
|
48
50
|
};
|
|
51
|
+
/**
|
|
52
|
+
* Multi-paragraph comment range with body-level markers: the
|
|
53
|
+
* commentRangeStart is emitted as a sibling of <w:p> before
|
|
54
|
+
* paragraphs[startBeforeParagraph] and the commentRangeEnd as a sibling
|
|
55
|
+
* after paragraphs[endAfterParagraph]. The commentReference run is
|
|
56
|
+
* appended inside paragraphs[endAfterParagraph]. This is the issue #103
|
|
57
|
+
* shape: range markers spanning whole paragraphs sit outside any <w:p>.
|
|
58
|
+
*
|
|
59
|
+
* Mutually exclusive with commentOnParagraph and commentSpanParagraphs.
|
|
60
|
+
*/
|
|
61
|
+
siblingCommentRange?: {
|
|
62
|
+
startBeforeParagraph: number;
|
|
63
|
+
endAfterParagraph: number;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Pre-existing tracked move with explicit in-paragraph range markers.
|
|
67
|
+
* paragraphs[from]'s text is wrapped in <w:moveFrom> (as w:delText)
|
|
68
|
+
* bracketed by w:moveFromRangeStart/End; paragraphs[to]'s text is wrapped
|
|
69
|
+
* in <w:moveTo> bracketed by w:moveToRangeStart/End. All four markers are
|
|
70
|
+
* direct children of their <w:p>, sharing the given w:name. Callers should
|
|
71
|
+
* pass identical text for paragraphs[from] and paragraphs[to] so the shape
|
|
72
|
+
* matches what Word produces for a real tracked move. Used to verify
|
|
73
|
+
* explicit move-range marker reconstruction (issue #110).
|
|
74
|
+
*/
|
|
75
|
+
trackedMove?: {
|
|
76
|
+
from: number;
|
|
77
|
+
to: number;
|
|
78
|
+
name: string;
|
|
79
|
+
author?: string;
|
|
80
|
+
firstId?: number;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Range permission spanning paragraphs. permStart opens at the start of
|
|
84
|
+
* paragraphs[start] and permEnd closes at the end of paragraphs[end].
|
|
85
|
+
* start === end yields a single-paragraph span around that paragraph's run.
|
|
86
|
+
*/
|
|
87
|
+
permSpanParagraphs?: {
|
|
88
|
+
start: number;
|
|
89
|
+
end: number;
|
|
90
|
+
id?: number;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Body-level (sibling of <w:p>) permStart/permEnd pair inserted between
|
|
94
|
+
* paragraphs[index - 1] and paragraphs[index]. Used to verify scaffold
|
|
95
|
+
* perm markers do not leak into reconstructed paragraphs.
|
|
96
|
+
*/
|
|
97
|
+
siblingPermBefore?: {
|
|
98
|
+
index: number;
|
|
99
|
+
id?: number;
|
|
100
|
+
};
|
|
49
101
|
}
|
|
50
102
|
export declare function buildSyntheticDocx(opts: SyntheticDocxOptions): Promise<Buffer>;
|
|
103
|
+
/** Parts for {@link buildDocxFromParts}. Only the body XML is required. */
|
|
104
|
+
export interface DocxPartsOptions {
|
|
105
|
+
/** Raw `<w:body>` children (paragraphs/tables), without the `<w:body>` wrapper. */
|
|
106
|
+
bodyXml: string;
|
|
107
|
+
/** Full `word/styles.xml` content. */
|
|
108
|
+
stylesXml?: string;
|
|
109
|
+
/** Full `word/numbering.xml` content. */
|
|
110
|
+
numberingXml?: string;
|
|
111
|
+
/** Extra `<Relationship …/>` entries for `word/_rels/document.xml.rels` (e.g. hyperlinks). */
|
|
112
|
+
documentRelEntries?: string[];
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Build a loadable DOCX from raw part XML. The `testing/ooxml-fixtures.ts`
|
|
116
|
+
* `buildDocxFromBodyXml` covers the body-only case for docx-core's own tests, but it lives
|
|
117
|
+
* in the build-excluded testing tree; this builder is exported from the package root for
|
|
118
|
+
* downstream suites (odf-core's DOCX→ODT conversion tests) and additionally accepts the
|
|
119
|
+
* optional styles/numbering/relationship parts those tests exercise.
|
|
120
|
+
*/
|
|
121
|
+
export declare function buildDocxFromParts(opts: DocxPartsOptions): Promise<Buffer>;
|
|
51
122
|
export interface SyntheticResultParts {
|
|
52
123
|
documentXml: string;
|
|
53
124
|
footnotesXml: string | null;
|
|
54
125
|
endnotesXml: string | null;
|
|
55
126
|
commentsXml: string | null;
|
|
56
127
|
commentsExtendedXml: string | null;
|
|
128
|
+
commentsIdsXml: string | null;
|
|
57
129
|
peopleXml: string | null;
|
|
58
130
|
contentTypesXml: string | null;
|
|
59
131
|
relsXml: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synthetic-docx-fixture.d.ts","sourceRoot":"","sources":["../../src/integration/synthetic-docx-fixture.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD;;;OAGG;IACH,mBAAmB,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACvE;;;;OAIG;IACH,qBAAqB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"synthetic-docx-fixture.d.ts","sourceRoot":"","sources":["../../src/integration/synthetic-docx-fixture.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,17 +2,29 @@ import JSZip from 'jszip';
|
|
|
2
2
|
import { DocxArchive } from '../shared/docx/DocxArchive.js';
|
|
3
3
|
export async function buildSyntheticDocx(opts) {
|
|
4
4
|
const hasFootnote = opts.footnoteOnParagraph != null;
|
|
5
|
+
const hasEndnote = opts.endnoteOnParagraph != null;
|
|
5
6
|
const hasComment = opts.commentOnParagraph != null;
|
|
6
7
|
const hasCommentSpan = opts.commentSpanParagraphs != null;
|
|
7
8
|
const hasBookmark = opts.bookmarkOnParagraph != null;
|
|
8
9
|
const hasSiblingBookmark = opts.siblingBookmarkBefore != null;
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
const hasSiblingCommentRange = opts.siblingCommentRange != null;
|
|
11
|
+
const hasPermSpan = opts.permSpanParagraphs != null;
|
|
12
|
+
const hasSiblingPerm = opts.siblingPermBefore != null;
|
|
13
|
+
if ([hasComment, hasCommentSpan, hasSiblingCommentRange].filter(Boolean).length > 1) {
|
|
14
|
+
throw new Error('commentOnParagraph, commentSpanParagraphs and siblingCommentRange are mutually exclusive');
|
|
11
15
|
}
|
|
12
16
|
const bookmarkId = opts.bookmarkOnParagraph?.id ?? 100;
|
|
13
17
|
const siblingBookmarkId = opts.siblingBookmarkBefore?.id ?? 200;
|
|
14
18
|
const spanStart = opts.commentSpanParagraphs?.start;
|
|
15
19
|
const spanEnd = opts.commentSpanParagraphs?.end;
|
|
20
|
+
const hasTrackedMove = opts.trackedMove != null;
|
|
21
|
+
const moveAuthor = opts.trackedMove?.author ?? 'Mover';
|
|
22
|
+
const moveBaseId = opts.trackedMove?.firstId ?? 300;
|
|
23
|
+
const moveDate = '2025-01-01T00:00:00Z';
|
|
24
|
+
const permId = opts.permSpanParagraphs?.id ?? 500;
|
|
25
|
+
const siblingPermId = opts.siblingPermBefore?.id ?? 600;
|
|
26
|
+
const permSpanStart = opts.permSpanParagraphs?.start;
|
|
27
|
+
const permSpanEnd = opts.permSpanParagraphs?.end;
|
|
16
28
|
const paragraphParts = opts.paragraphs.map((text, idx) => {
|
|
17
29
|
const escaped = text
|
|
18
30
|
.replaceAll('&', '&')
|
|
@@ -22,6 +34,9 @@ export async function buildSyntheticDocx(opts) {
|
|
|
22
34
|
if (hasFootnote && idx === opts.footnoteOnParagraph) {
|
|
23
35
|
extra += `<w:r><w:rPr><w:rStyle w:val="FootnoteReference"/></w:rPr><w:footnoteReference w:id="1"/></w:r>`;
|
|
24
36
|
}
|
|
37
|
+
if (hasEndnote && idx === opts.endnoteOnParagraph) {
|
|
38
|
+
extra += `<w:r><w:rPr><w:rStyle w:val="EndnoteReference"/></w:rPr><w:endnoteReference w:id="1"/></w:r>`;
|
|
39
|
+
}
|
|
25
40
|
if (hasComment && idx === opts.commentOnParagraph) {
|
|
26
41
|
extra =
|
|
27
42
|
`<w:commentRangeStart w:id="1"/>` +
|
|
@@ -38,6 +53,28 @@ export async function buildSyntheticDocx(opts) {
|
|
|
38
53
|
: '';
|
|
39
54
|
return `<w:p>${before}<w:r><w:t>${escaped}</w:t></w:r>${after}${extra}</w:p>`;
|
|
40
55
|
}
|
|
56
|
+
if (hasTrackedMove && idx === opts.trackedMove.from) {
|
|
57
|
+
const name = opts.trackedMove.name;
|
|
58
|
+
return (`<w:p>` +
|
|
59
|
+
`<w:moveFromRangeStart w:id="${moveBaseId}" w:name="${name}" w:author="${moveAuthor}" w:date="${moveDate}"/>` +
|
|
60
|
+
`<w:moveFrom w:id="${moveBaseId + 1}" w:author="${moveAuthor}" w:date="${moveDate}">` +
|
|
61
|
+
`<w:r><w:delText>${escaped}</w:delText></w:r>` +
|
|
62
|
+
`</w:moveFrom>` +
|
|
63
|
+
`<w:moveFromRangeEnd w:id="${moveBaseId}"/>` +
|
|
64
|
+
extra +
|
|
65
|
+
`</w:p>`);
|
|
66
|
+
}
|
|
67
|
+
if (hasTrackedMove && idx === opts.trackedMove.to) {
|
|
68
|
+
const name = opts.trackedMove.name;
|
|
69
|
+
return (`<w:p>` +
|
|
70
|
+
`<w:moveToRangeStart w:id="${moveBaseId + 2}" w:name="${name}" w:author="${moveAuthor}" w:date="${moveDate}"/>` +
|
|
71
|
+
`<w:moveTo w:id="${moveBaseId + 3}" w:author="${moveAuthor}" w:date="${moveDate}">` +
|
|
72
|
+
`<w:r><w:t>${escaped}</w:t></w:r>` +
|
|
73
|
+
`</w:moveTo>` +
|
|
74
|
+
`<w:moveToRangeEnd w:id="${moveBaseId + 2}"/>` +
|
|
75
|
+
extra +
|
|
76
|
+
`</w:p>`);
|
|
77
|
+
}
|
|
41
78
|
if (hasBookmark && idx === opts.bookmarkOnParagraph.paragraph) {
|
|
42
79
|
const name = opts.bookmarkOnParagraph.name;
|
|
43
80
|
return (`<w:p>` +
|
|
@@ -47,6 +84,13 @@ export async function buildSyntheticDocx(opts) {
|
|
|
47
84
|
extra +
|
|
48
85
|
`</w:p>`);
|
|
49
86
|
}
|
|
87
|
+
if (hasPermSpan && (idx === permSpanStart || idx === permSpanEnd)) {
|
|
88
|
+
const before = idx === permSpanStart
|
|
89
|
+
? `<w:permStart w:id="${permId}" w:edGrp="everyone"/>`
|
|
90
|
+
: '';
|
|
91
|
+
const after = idx === permSpanEnd ? `<w:permEnd w:id="${permId}"/>` : '';
|
|
92
|
+
return `<w:p>${before}<w:r><w:t>${escaped}</w:t></w:r>${after}${extra}</w:p>`;
|
|
93
|
+
}
|
|
50
94
|
return `<w:p><w:r><w:t>${escaped}</w:t></w:r>${extra}</w:p>`;
|
|
51
95
|
});
|
|
52
96
|
// Inject a body-level (sibling of <w:p>) bookmark before paragraphs[index].
|
|
@@ -57,10 +101,30 @@ export async function buildSyntheticDocx(opts) {
|
|
|
57
101
|
`<w:bookmarkEnd w:id="${siblingBookmarkId}"/>`;
|
|
58
102
|
paragraphParts.splice(index, 0, sibling);
|
|
59
103
|
}
|
|
104
|
+
// Inject body-level comment range markers around whole paragraphs (the
|
|
105
|
+
// issue #103 shape). The range markers are siblings of <w:p>; only the
|
|
106
|
+
// commentReference run anchors inside the last spanned paragraph. End is
|
|
107
|
+
// spliced before start so the start index is not shifted.
|
|
108
|
+
if (hasSiblingCommentRange) {
|
|
109
|
+
const { startBeforeParagraph, endAfterParagraph } = opts.siblingCommentRange;
|
|
110
|
+
paragraphParts[endAfterParagraph] = paragraphParts[endAfterParagraph].replace('</w:p>', `<w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="1"/></w:r></w:p>`);
|
|
111
|
+
paragraphParts.splice(endAfterParagraph + 1, 0, `<w:commentRangeEnd w:id="1"/>`);
|
|
112
|
+
paragraphParts.splice(startBeforeParagraph, 0, `<w:commentRangeStart w:id="1"/>`);
|
|
113
|
+
}
|
|
114
|
+
// Inject a body-level (sibling of <w:p>) permStart/permEnd pair before
|
|
115
|
+
// paragraphs[index], mirroring the sibling-bookmark scaffold shape above.
|
|
116
|
+
if (hasSiblingPerm) {
|
|
117
|
+
const { index } = opts.siblingPermBefore;
|
|
118
|
+
const sibling = `<w:permStart w:id="${siblingPermId}" w:edGrp="everyone"/>` +
|
|
119
|
+
`<w:permEnd w:id="${siblingPermId}"/>`;
|
|
120
|
+
paragraphParts.splice(index, 0, sibling);
|
|
121
|
+
}
|
|
60
122
|
const paragraphsXml = paragraphParts.join('\n ');
|
|
61
123
|
const documentXml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>` +
|
|
62
124
|
`<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"` +
|
|
63
|
-
` xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
|
|
125
|
+
` xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"` +
|
|
126
|
+
` xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"` +
|
|
127
|
+
` mc:Ignorable="w14">` +
|
|
64
128
|
`<w:body>${paragraphsXml}<w:sectPr/></w:body></w:document>`;
|
|
65
129
|
const contentTypeParts = [
|
|
66
130
|
`<Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>`,
|
|
@@ -81,7 +145,20 @@ export async function buildSyntheticDocx(opts) {
|
|
|
81
145
|
rIdCounter++;
|
|
82
146
|
docRelEntries.push(`<Relationship Id="rId${rIdCounter}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes" Target="footnotes.xml"/>`);
|
|
83
147
|
}
|
|
84
|
-
if (
|
|
148
|
+
if (hasEndnote) {
|
|
149
|
+
const enText = opts.endnoteText ?? 'Test endnote';
|
|
150
|
+
const endnotesXml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>` +
|
|
151
|
+
`<w:endnotes xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">` +
|
|
152
|
+
`<w:endnote w:type="separator" w:id="-1"><w:p><w:r><w:separator/></w:r></w:p></w:endnote>` +
|
|
153
|
+
`<w:endnote w:type="continuationSeparator" w:id="0"><w:p><w:r><w:continuationSeparator/></w:r></w:p></w:endnote>` +
|
|
154
|
+
`<w:endnote w:id="1"><w:p><w:r><w:t>${enText}</w:t></w:r></w:p></w:endnote>` +
|
|
155
|
+
`</w:endnotes>`;
|
|
156
|
+
zip.file('word/endnotes.xml', endnotesXml);
|
|
157
|
+
contentTypeParts.push(`<Override PartName="/word/endnotes.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml"/>`);
|
|
158
|
+
rIdCounter++;
|
|
159
|
+
docRelEntries.push(`<Relationship Id="rId${rIdCounter}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes" Target="endnotes.xml"/>`);
|
|
160
|
+
}
|
|
161
|
+
if (hasComment || hasCommentSpan || hasSiblingCommentRange) {
|
|
85
162
|
const cText = opts.commentText ?? 'Test comment';
|
|
86
163
|
const cAuthor = opts.commentAuthor ?? 'Author';
|
|
87
164
|
const hasReply = opts.replyText != null;
|
|
@@ -155,6 +232,55 @@ export async function buildSyntheticDocx(opts) {
|
|
|
155
232
|
zip.file('word/_rels/document.xml.rels', docRelsXml);
|
|
156
233
|
return (await zip.generateAsync({ type: 'nodebuffer' }));
|
|
157
234
|
}
|
|
235
|
+
/**
|
|
236
|
+
* Build a loadable DOCX from raw part XML. The `testing/ooxml-fixtures.ts`
|
|
237
|
+
* `buildDocxFromBodyXml` covers the body-only case for docx-core's own tests, but it lives
|
|
238
|
+
* in the build-excluded testing tree; this builder is exported from the package root for
|
|
239
|
+
* downstream suites (odf-core's DOCX→ODT conversion tests) and additionally accepts the
|
|
240
|
+
* optional styles/numbering/relationship parts those tests exercise.
|
|
241
|
+
*/
|
|
242
|
+
export async function buildDocxFromParts(opts) {
|
|
243
|
+
const zip = new JSZip();
|
|
244
|
+
const documentXml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>` +
|
|
245
|
+
`<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"` +
|
|
246
|
+
` xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"` +
|
|
247
|
+
` xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"` +
|
|
248
|
+
` xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"` +
|
|
249
|
+
` mc:Ignorable="w14">` +
|
|
250
|
+
`<w:body>${opts.bodyXml}<w:sectPr/></w:body></w:document>`;
|
|
251
|
+
const overrides = [
|
|
252
|
+
`<Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>`,
|
|
253
|
+
...(opts.stylesXml
|
|
254
|
+
? [`<Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>`]
|
|
255
|
+
: []),
|
|
256
|
+
...(opts.numberingXml
|
|
257
|
+
? [`<Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/>`]
|
|
258
|
+
: []),
|
|
259
|
+
];
|
|
260
|
+
const contentTypesXml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>` +
|
|
261
|
+
`<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">` +
|
|
262
|
+
`<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>` +
|
|
263
|
+
`<Default Extension="xml" ContentType="application/xml"/>` +
|
|
264
|
+
overrides.join('') +
|
|
265
|
+
`</Types>`;
|
|
266
|
+
const rootRelsXml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>` +
|
|
267
|
+
`<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">` +
|
|
268
|
+
`<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>` +
|
|
269
|
+
`</Relationships>`;
|
|
270
|
+
const docRelsXml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>` +
|
|
271
|
+
`<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">` +
|
|
272
|
+
(opts.documentRelEntries ?? []).join('') +
|
|
273
|
+
`</Relationships>`;
|
|
274
|
+
zip.file('[Content_Types].xml', contentTypesXml);
|
|
275
|
+
zip.file('_rels/.rels', rootRelsXml);
|
|
276
|
+
zip.file('word/document.xml', documentXml);
|
|
277
|
+
zip.file('word/_rels/document.xml.rels', docRelsXml);
|
|
278
|
+
if (opts.stylesXml)
|
|
279
|
+
zip.file('word/styles.xml', opts.stylesXml);
|
|
280
|
+
if (opts.numberingXml)
|
|
281
|
+
zip.file('word/numbering.xml', opts.numberingXml);
|
|
282
|
+
return (await zip.generateAsync({ type: 'nodebuffer' }));
|
|
283
|
+
}
|
|
158
284
|
export async function getResultParts(resultBuffer) {
|
|
159
285
|
const archive = await DocxArchive.load(resultBuffer);
|
|
160
286
|
return {
|
|
@@ -163,6 +289,7 @@ export async function getResultParts(resultBuffer) {
|
|
|
163
289
|
endnotesXml: await archive.getFile('word/endnotes.xml'),
|
|
164
290
|
commentsXml: await archive.getFile('word/comments.xml'),
|
|
165
291
|
commentsExtendedXml: await archive.getFile('word/commentsExtended.xml'),
|
|
292
|
+
commentsIdsXml: await archive.getFile('word/commentsIds.xml'),
|
|
166
293
|
peopleXml: await archive.getFile('word/people.xml'),
|
|
167
294
|
contentTypesXml: await archive.getFile('[Content_Types].xml'),
|
|
168
295
|
relsXml: await archive.getFile('word/_rels/document.xml.rels'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synthetic-docx-fixture.js","sourceRoot":"","sources":["../../src/integration/synthetic-docx-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"synthetic-docx-fixture.js","sourceRoot":"","sources":["../../src/integration/synthetic-docx-fixture.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* - Unwrapping w:ins elements (promoting children)
|
|
7
7
|
* - Removing w:moveFrom (source), unwrapping w:moveTo (destination)
|
|
8
8
|
* - Removing all *PrChange property change records
|
|
9
|
-
* - Stripping paragraph-level revision markers
|
|
9
|
+
* - Stripping paragraph-level revision markers, merging a paragraph whose
|
|
10
|
+
* mark was a tracked deletion into the following paragraph
|
|
10
11
|
* - Cleaning up move range markers and rsidDel attributes
|
|
11
12
|
*
|
|
12
13
|
* Operates on the W3C DOM (`@xmldom/xmldom`) — the same API used
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accept_changes.d.ts","sourceRoot":"","sources":["../../src/primitives/accept_changes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"accept_changes.d.ts","sourceRoot":"","sources":["../../src/primitives/accept_changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,MAAM,MAAM,mBAAmB,GAAG;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,EAAE,MAAM,CAAC;CACjC,CAAC;AA+NF;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,mBAAmB,CA8FhE"}
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* - Unwrapping w:ins elements (promoting children)
|
|
7
7
|
* - Removing w:moveFrom (source), unwrapping w:moveTo (destination)
|
|
8
8
|
* - Removing all *PrChange property change records
|
|
9
|
-
* - Stripping paragraph-level revision markers
|
|
9
|
+
* - Stripping paragraph-level revision markers, merging a paragraph whose
|
|
10
|
+
* mark was a tracked deletion into the following paragraph
|
|
10
11
|
* - Cleaning up move range markers and rsidDel attributes
|
|
11
12
|
*
|
|
12
13
|
* Operates on the W3C DOM (`@xmldom/xmldom`) — the same API used
|
|
@@ -89,6 +90,144 @@ const PR_CHANGE_LOCALS = [
|
|
|
89
90
|
'rPrChange', 'pPrChange', 'sectPrChange',
|
|
90
91
|
'tblPrChange', 'trPrChange', 'tcPrChange',
|
|
91
92
|
];
|
|
93
|
+
// Marker-ish elements that may sit between two paragraphs at block level
|
|
94
|
+
// without ending the search for a merge target: the full EG_RangeMarkupElements
|
|
95
|
+
// schema group (wml.xsd), plus permStart/permEnd range markers and proofErr
|
|
96
|
+
// proofing anchors.
|
|
97
|
+
const RANGE_MARKUP_BLOCK_SIBLING_LOCALS = new Set([
|
|
98
|
+
'bookmarkStart', 'bookmarkEnd',
|
|
99
|
+
'commentRangeStart', 'commentRangeEnd',
|
|
100
|
+
'moveFromRangeStart', 'moveFromRangeEnd',
|
|
101
|
+
'moveToRangeStart', 'moveToRangeEnd',
|
|
102
|
+
'customXmlInsRangeStart', 'customXmlInsRangeEnd',
|
|
103
|
+
'customXmlDelRangeStart', 'customXmlDelRangeEnd',
|
|
104
|
+
'customXmlMoveFromRangeStart', 'customXmlMoveFromRangeEnd',
|
|
105
|
+
'customXmlMoveToRangeStart', 'customXmlMoveToRangeEnd',
|
|
106
|
+
'permStart', 'permEnd',
|
|
107
|
+
'proofErr',
|
|
108
|
+
]);
|
|
109
|
+
/**
|
|
110
|
+
* Find the next sibling paragraph a paragraph-mark revision can merge into,
|
|
111
|
+
* skipping block-level range/annotation markers. Returns null when the next
|
|
112
|
+
* block is not a paragraph (table, sdt, sectPr, end of parent).
|
|
113
|
+
*/
|
|
114
|
+
function findFollowingSiblingParagraph(p) {
|
|
115
|
+
let sibling = p.nextSibling;
|
|
116
|
+
while (sibling) {
|
|
117
|
+
if (sibling.nodeType === 1) {
|
|
118
|
+
if (isW(sibling, 'p'))
|
|
119
|
+
return sibling;
|
|
120
|
+
const el = sibling;
|
|
121
|
+
if (el.namespaceURI === W_NS && RANGE_MARKUP_BLOCK_SIBLING_LOCALS.has(el.localName ?? '')) {
|
|
122
|
+
sibling = sibling.nextSibling;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
sibling = sibling.nextSibling;
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
/** True iff the paragraph still holds content beyond w:pPr and bare annotation markers. */
|
|
132
|
+
function paragraphHasContent(p) {
|
|
133
|
+
for (let i = 0; i < p.childNodes.length; i++) {
|
|
134
|
+
const child = p.childNodes[i];
|
|
135
|
+
if (child.nodeType !== 1)
|
|
136
|
+
continue;
|
|
137
|
+
if (isW(child, 'pPr'))
|
|
138
|
+
continue;
|
|
139
|
+
const el = child;
|
|
140
|
+
if (el.namespaceURI === W_NS && RANGE_MARKUP_BLOCK_SIBLING_LOCALS.has(el.localName ?? ''))
|
|
141
|
+
continue;
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* True iff removing an emptied mark-revised paragraph keeps its parent
|
|
148
|
+
* structurally valid for Word: the parent must retain at least one block
|
|
149
|
+
* element, must not end on a w:tbl (a trailing table needs a following
|
|
150
|
+
* paragraph), and two tables must not become adjacent (Word merges
|
|
151
|
+
* back-to-back tables). w:sectPr is ignored — a trailing body sectPr is not a
|
|
152
|
+
* block element.
|
|
153
|
+
*/
|
|
154
|
+
function canSafelyRemoveEmptyParagraph(p) {
|
|
155
|
+
const blockSibling = (start, dir) => {
|
|
156
|
+
let sibling = start;
|
|
157
|
+
while (sibling) {
|
|
158
|
+
if (sibling.nodeType === 1) {
|
|
159
|
+
const el = sibling;
|
|
160
|
+
if ((el.namespaceURI === W_NS && RANGE_MARKUP_BLOCK_SIBLING_LOCALS.has(el.localName ?? '')) ||
|
|
161
|
+
isW(el, 'sectPr')) {
|
|
162
|
+
sibling = sibling[dir];
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
return el;
|
|
166
|
+
}
|
|
167
|
+
sibling = sibling[dir];
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
};
|
|
171
|
+
const prev = blockSibling(p.previousSibling, 'previousSibling');
|
|
172
|
+
const next = blockSibling(p.nextSibling, 'nextSibling');
|
|
173
|
+
if (!prev && !next)
|
|
174
|
+
return false;
|
|
175
|
+
if (prev && isW(prev, 'tbl') && !next)
|
|
176
|
+
return false;
|
|
177
|
+
if (prev && next && isW(prev, 'tbl') && isW(next, 'tbl'))
|
|
178
|
+
return false;
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Resolve a paragraph whose paragraph MARK revision was applied (deleted mark
|
|
183
|
+
* accepted): the paragraph break disappears, so the paragraph's remaining
|
|
184
|
+
* content merges into the FOLLOWING paragraph. The surviving (following)
|
|
185
|
+
* paragraph keeps its own w:pPr — formatting follows the surviving paragraph
|
|
186
|
+
* mark — and the merged-away paragraph's w:pPr is dropped.
|
|
187
|
+
*
|
|
188
|
+
* The revision targets only the mark, never the paragraph's contents, so the
|
|
189
|
+
* contents must not be dropped wholesale. When no following sibling paragraph
|
|
190
|
+
* exists (last block, or the next block is a table), there is no break to
|
|
191
|
+
* remove into: content-bearing paragraphs are kept, and emptied ones are
|
|
192
|
+
* removed only where removal keeps the parent structurally valid
|
|
193
|
+
* (canSafelyRemoveEmptyParagraph).
|
|
194
|
+
*
|
|
195
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.13.5.15
|
|
196
|
+
* @see https://github.com/UseJunior/safe-docx/issues/431
|
|
197
|
+
*/
|
|
198
|
+
function resolveParagraphMarkRevision(p) {
|
|
199
|
+
const parent = p.parentNode;
|
|
200
|
+
if (!parent)
|
|
201
|
+
return;
|
|
202
|
+
const target = findFollowingSiblingParagraph(p);
|
|
203
|
+
if (!target) {
|
|
204
|
+
if (!paragraphHasContent(p) && canSafelyRemoveEmptyParagraph(p)) {
|
|
205
|
+
parent.removeChild(p);
|
|
206
|
+
}
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
// Insertion point: before the target's first non-pPr child (the merged
|
|
210
|
+
// content precedes the target's own content in document order).
|
|
211
|
+
let ref = null;
|
|
212
|
+
for (let i = 0; i < target.childNodes.length; i++) {
|
|
213
|
+
const c = target.childNodes[i];
|
|
214
|
+
if (c.nodeType === 1 && isW(c, 'pPr'))
|
|
215
|
+
continue;
|
|
216
|
+
ref = c;
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
const toMove = [];
|
|
220
|
+
for (let i = 0; i < p.childNodes.length; i++) {
|
|
221
|
+
const c = p.childNodes[i];
|
|
222
|
+
if (c.nodeType === 1 && isW(c, 'pPr'))
|
|
223
|
+
continue;
|
|
224
|
+
toMove.push(c);
|
|
225
|
+
}
|
|
226
|
+
for (const c of toMove) {
|
|
227
|
+
target.insertBefore(c, ref);
|
|
228
|
+
}
|
|
229
|
+
parent.removeChild(p);
|
|
230
|
+
}
|
|
92
231
|
// ── Public API ──────────────────────────────────────────────────────
|
|
93
232
|
/**
|
|
94
233
|
* Accept all tracked changes in the document body or story root, producing a
|
|
@@ -102,20 +241,22 @@ export function acceptChanges(doc) {
|
|
|
102
241
|
if (!root) {
|
|
103
242
|
return { insertionsAccepted: 0, deletionsAccepted: 0, movesResolved: 0, propertyChangesResolved: 0 };
|
|
104
243
|
}
|
|
105
|
-
// Phase A — Identify paragraphs
|
|
106
|
-
const
|
|
244
|
+
// Phase A — Identify paragraphs whose MARK is a tracked deletion
|
|
245
|
+
const markDeletedParagraphs = [];
|
|
107
246
|
const allParagraphs = collectByLocalName(root, 'p');
|
|
108
247
|
for (const p of allParagraphs) {
|
|
109
|
-
//
|
|
110
|
-
//
|
|
111
|
-
//
|
|
248
|
+
// A paragraph-mark deletion (w:p > w:pPr > w:rPr > w:del) means the
|
|
249
|
+
// paragraph BREAK was deleted — accepting it merges the paragraph into the
|
|
250
|
+
// following one (resolveParagraphMarkRevision); the contents are deleted
|
|
251
|
+
// only via their own run-level w:del wrappers.
|
|
252
|
+
// We deliberately do NOT touch a paragraph based on content ("all runs inside
|
|
112
253
|
// w:del/w:moveFrom"): a run-level deletion under an untracked mark means text was
|
|
113
254
|
// deleted from a pre-existing paragraph, which Word/LibreOffice keep (empty) on
|
|
114
255
|
// accept. safe-docx's deleted paragraphs always carry the mark now, so the
|
|
115
256
|
// mark-based rule suffices and is Word-faithful. (Mirrors acceptAllChanges and the
|
|
116
257
|
// reject-side rule.)
|
|
117
258
|
if (paragraphHasParaMarker(p, 'del')) {
|
|
118
|
-
|
|
259
|
+
markDeletedParagraphs.push(p);
|
|
119
260
|
}
|
|
120
261
|
}
|
|
121
262
|
// Phase B — Remove deletions and move sources
|
|
@@ -158,11 +299,11 @@ export function acceptChanges(doc) {
|
|
|
158
299
|
}
|
|
159
300
|
}
|
|
160
301
|
}
|
|
161
|
-
//
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
302
|
+
// Resolve paragraphs collected in Phase A: merge each into its following
|
|
303
|
+
// paragraph (document order, so consecutive mark-deleted paragraphs cascade
|
|
304
|
+
// forward into the first surviving one).
|
|
305
|
+
for (const p of markDeletedParagraphs) {
|
|
306
|
+
resolveParagraphMarkRevision(p);
|
|
166
307
|
}
|
|
167
308
|
// Strip w:rsidDel attributes on remaining elements
|
|
168
309
|
const allElements = root.getElementsByTagNameNS(W_NS, '*');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accept_changes.js","sourceRoot":"","sources":["../../src/primitives/accept_changes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"accept_changes.js","sourceRoot":"","sources":["../../src/primitives/accept_changes.ts"],"names":[],"mappings":"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"}
|