@usejunior/docx-core 0.9.1 → 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 +28 -8
- package/dist/atomizer.d.ts.map +1 -1
- package/dist/atomizer.js +96 -25
- 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 +333 -112
- package/dist/baselines/atomizer/documentReconstructor.js.map +1 -1
- package/dist/baselines/atomizer/formattingFidelity.d.ts +99 -0
- package/dist/baselines/atomizer/formattingFidelity.d.ts.map +1 -0
- package/dist/baselines/atomizer/formattingFidelity.js +449 -0
- package/dist/baselines/atomizer/formattingFidelity.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts +37 -0
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js +189 -0
- package/dist/baselines/atomizer/inPlaceModifier-bookmarks.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts +74 -0
- package/dist/baselines/atomizer/inPlaceModifier-containers.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-containers.js +171 -0
- package/dist/baselines/atomizer/inPlaceModifier-containers.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts +88 -0
- package/dist/baselines/atomizer/inPlaceModifier-deletion.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-deletion.js +326 -0
- package/dist/baselines/atomizer/inPlaceModifier-deletion.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts +85 -0
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.js +402 -0
- package/dist/baselines/atomizer/inPlaceModifier-postprocess.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts +39 -0
- package/dist/baselines/atomizer/inPlaceModifier-presplit.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-presplit.js +265 -0
- package/dist/baselines/atomizer/inPlaceModifier-presplit.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts +62 -0
- package/dist/baselines/atomizer/inPlaceModifier-shared.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-shared.js +139 -0
- package/dist/baselines/atomizer/inPlaceModifier-shared.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +198 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +475 -0
- package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +1 -0
- package/dist/baselines/atomizer/inPlaceModifier.d.ts +6 -290
- package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -1
- package/dist/baselines/atomizer/inPlaceModifier.js +23 -1828
- package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -1
- package/dist/baselines/atomizer/pipeline.d.ts +36 -2
- package/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
- package/dist/baselines/atomizer/pipeline.js +216 -144
- 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 +199 -173
- 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 +197 -0
- package/dist/compare-types.d.ts.map +1 -0
- package/dist/compare-types.js +2 -0
- package/dist/compare-types.js.map +1 -0
- package/dist/core-types.d.ts +5 -1
- package/dist/core-types.d.ts.map +1 -1
- package/dist/core-types.js +5 -1
- package/dist/core-types.js.map +1 -1
- package/dist/footnotes.d.ts +8 -3
- package/dist/footnotes.d.ts.map +1 -1
- package/dist/footnotes.js +8 -3
- package/dist/footnotes.js.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 +9 -150
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -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 +49 -0
- package/dist/integration/libreoffice-oracle.d.ts.map +1 -0
- package/dist/integration/libreoffice-oracle.js +290 -0
- package/dist/integration/libreoffice-oracle.js.map +1 -0
- 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 +4 -3
- package/dist/primitives/accept_changes.d.ts.map +1 -1
- package/dist/primitives/accept_changes.js +163 -77
- package/dist/primitives/accept_changes.js.map +1 -1
- package/dist/primitives/comments.d.ts +12 -3
- package/dist/primitives/comments.d.ts.map +1 -1
- package/dist/primitives/comments.js +374 -97
- package/dist/primitives/comments.js.map +1 -1
- package/dist/primitives/content_fingerprint.d.ts +29 -0
- package/dist/primitives/content_fingerprint.d.ts.map +1 -0
- package/dist/primitives/content_fingerprint.js +63 -0
- package/dist/primitives/content_fingerprint.js.map +1 -0
- package/dist/primitives/document.d.ts +94 -15
- package/dist/primitives/document.d.ts.map +1 -1
- package/dist/primitives/document.js +373 -36
- package/dist/primitives/document.js.map +1 -1
- package/dist/primitives/document_view-comments.d.ts +18 -0
- package/dist/primitives/document_view-comments.d.ts.map +1 -0
- package/dist/primitives/document_view-comments.js +160 -0
- package/dist/primitives/document_view-comments.js.map +1 -0
- package/dist/primitives/document_view-headings.d.ts +45 -0
- package/dist/primitives/document_view-headings.d.ts.map +1 -0
- package/dist/primitives/document_view-headings.js +247 -0
- package/dist/primitives/document_view-headings.js.map +1 -0
- package/dist/primitives/document_view-styles.d.ts +11 -0
- package/dist/primitives/document_view-styles.d.ts.map +1 -0
- package/dist/primitives/document_view-styles.js +104 -0
- package/dist/primitives/document_view-styles.js.map +1 -0
- package/dist/primitives/document_view-toon.d.ts +37 -0
- package/dist/primitives/document_view-toon.d.ts.map +1 -0
- package/dist/primitives/document_view-toon.js +199 -0
- package/dist/primitives/document_view-toon.js.map +1 -0
- package/dist/primitives/document_view-types.d.ts +152 -0
- package/dist/primitives/document_view-types.d.ts.map +1 -0
- package/dist/primitives/document_view-types.js +2 -0
- package/dist/primitives/document_view-types.js.map +1 -0
- package/dist/primitives/document_view.d.ts +8 -106
- package/dist/primitives/document_view.d.ts.map +1 -1
- package/dist/primitives/document_view.js +153 -312
- package/dist/primitives/document_view.js.map +1 -1
- package/dist/primitives/dom-helpers.d.ts +9 -0
- package/dist/primitives/dom-helpers.d.ts.map +1 -1
- package/dist/primitives/dom-helpers.js +10 -1
- package/dist/primitives/dom-helpers.js.map +1 -1
- package/dist/primitives/footnotes.d.ts +4 -3
- package/dist/primitives/footnotes.d.ts.map +1 -1
- package/dist/primitives/footnotes.js +232 -44
- package/dist/primitives/footnotes.js.map +1 -1
- package/dist/primitives/formatting_tags.d.ts +7 -0
- package/dist/primitives/formatting_tags.d.ts.map +1 -1
- package/dist/primitives/formatting_tags.js +22 -11
- package/dist/primitives/formatting_tags.js.map +1 -1
- package/dist/primitives/index.d.ts +10 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +9 -0
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/layout.d.ts +4 -3
- package/dist/primitives/layout.d.ts.map +1 -1
- package/dist/primitives/layout.js +45 -3
- package/dist/primitives/layout.js.map +1 -1
- package/dist/primitives/merge_runs.d.ts +21 -3
- package/dist/primitives/merge_runs.d.ts.map +1 -1
- package/dist/primitives/merge_runs.js +32 -10
- package/dist/primitives/merge_runs.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 +47 -0
- package/dist/primitives/namespaces.d.ts.map +1 -1
- package/dist/primitives/namespaces.js +52 -0
- package/dist/primitives/namespaces.js.map +1 -1
- package/dist/primitives/reject_changes.d.ts +6 -4
- package/dist/primitives/reject_changes.d.ts.map +1 -1
- package/dist/primitives/reject_changes.js +187 -91
- 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 +7 -0
- package/dist/primitives/semantic_tags.d.ts.map +1 -1
- package/dist/primitives/semantic_tags.js +23 -4
- package/dist/primitives/semantic_tags.js.map +1 -1
- package/dist/primitives/serialize_html.d.ts +37 -0
- package/dist/primitives/serialize_html.d.ts.map +1 -0
- package/dist/primitives/serialize_html.js +395 -0
- package/dist/primitives/serialize_html.js.map +1 -0
- package/dist/primitives/serialize_markdown.d.ts +16 -0
- package/dist/primitives/serialize_markdown.d.ts.map +1 -0
- package/dist/primitives/serialize_markdown.js +300 -0
- package/dist/primitives/serialize_markdown.js.map +1 -0
- package/dist/primitives/serialize_plaintext.d.ts +15 -0
- package/dist/primitives/serialize_plaintext.d.ts.map +1 -0
- package/dist/primitives/serialize_plaintext.js +154 -0
- package/dist/primitives/serialize_plaintext.js.map +1 -0
- package/dist/primitives/styles.d.ts +15 -0
- package/dist/primitives/styles.d.ts.map +1 -1
- package/dist/primitives/styles.js +33 -22
- package/dist/primitives/styles.js.map +1 -1
- package/dist/primitives/tables.d.ts.map +1 -1
- package/dist/primitives/tables.js +13 -3
- package/dist/primitives/tables.js.map +1 -1
- package/dist/primitives/text.d.ts +2 -1
- package/dist/primitives/text.d.ts.map +1 -1
- package/dist/primitives/text.js +116 -12
- package/dist/primitives/text.js.map +1 -1
- package/dist/primitives/track-changes-emitter.d.ts +148 -0
- package/dist/primitives/track-changes-emitter.d.ts.map +1 -0
- package/dist/primitives/track-changes-emitter.js +291 -0
- package/dist/primitives/track-changes-emitter.js.map +1 -0
- 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-helpers.d.ts +29 -0
- package/dist/primitives/xml-helpers.d.ts.map +1 -0
- package/dist/primitives/xml-helpers.js +35 -0
- package/dist/primitives/xml-helpers.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/dist/shared/ooxml/namespaces.d.ts +4 -1
- package/dist/shared/ooxml/namespaces.d.ts.map +1 -1
- package/dist/shared/ooxml/namespaces.js +4 -1
- package/dist/shared/ooxml/namespaces.js.map +1 -1
- package/package.json +13 -9
|
@@ -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
|
|
@@ -20,8 +21,8 @@ export type AcceptChangesResult = {
|
|
|
20
21
|
propertyChangesResolved: number;
|
|
21
22
|
};
|
|
22
23
|
/**
|
|
23
|
-
* Accept all tracked changes in the document body, producing a
|
|
24
|
-
* document with no revision markup.
|
|
24
|
+
* Accept all tracked changes in the document body or story root, producing a
|
|
25
|
+
* clean document with no revision markup.
|
|
25
26
|
*
|
|
26
27
|
* Mutates the Document in place (same convention as simplifyRedlines
|
|
27
28
|
* and mergeRuns).
|
|
@@ -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
|
|
@@ -21,9 +22,6 @@ function isW(node, localName) {
|
|
|
21
22
|
node.namespaceURI === W_NS &&
|
|
22
23
|
node.localName === localName);
|
|
23
24
|
}
|
|
24
|
-
function isWElement(node) {
|
|
25
|
-
return node.nodeType === 1 && node.namespaceURI === W_NS;
|
|
26
|
-
}
|
|
27
25
|
function getDepth(node) {
|
|
28
26
|
let depth = 0;
|
|
29
27
|
let cur = node.parentNode;
|
|
@@ -87,110 +85,198 @@ function paragraphHasParaMarker(p, markerLocalName) {
|
|
|
87
85
|
}
|
|
88
86
|
return false;
|
|
89
87
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
// Tags that are "removed" content — should not count as live content
|
|
103
|
-
const REMOVED_LOCALS = new Set(['del', 'moveFrom']);
|
|
104
|
-
// Tags that are "kept" content — their presence means the paragraph has live content
|
|
105
|
-
const KEPT_LOCALS = new Set(['ins', 'moveTo']);
|
|
106
|
-
// Range marker tags to ignore when scanning paragraph children
|
|
107
|
-
const RANGE_MARKER_LOCALS = new Set([
|
|
88
|
+
// Property change element local names (all 6 types)
|
|
89
|
+
const PR_CHANGE_LOCALS = [
|
|
90
|
+
'rPrChange', 'pPrChange', 'sectPrChange',
|
|
91
|
+
'tblPrChange', 'trPrChange', 'tcPrChange',
|
|
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',
|
|
108
100
|
'moveFromRangeStart', 'moveFromRangeEnd',
|
|
109
101
|
'moveToRangeStart', 'moveToRangeEnd',
|
|
102
|
+
'customXmlInsRangeStart', 'customXmlInsRangeEnd',
|
|
103
|
+
'customXmlDelRangeStart', 'customXmlDelRangeEnd',
|
|
104
|
+
'customXmlMoveFromRangeStart', 'customXmlMoveFromRangeEnd',
|
|
105
|
+
'customXmlMoveToRangeStart', 'customXmlMoveToRangeEnd',
|
|
106
|
+
'permStart', 'permEnd',
|
|
107
|
+
'proofErr',
|
|
110
108
|
]);
|
|
111
109
|
/**
|
|
112
|
-
*
|
|
113
|
-
*
|
|
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).
|
|
114
113
|
*/
|
|
115
|
-
function
|
|
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) {
|
|
116
133
|
for (let i = 0; i < p.childNodes.length; i++) {
|
|
117
134
|
const child = p.childNodes[i];
|
|
118
135
|
if (child.nodeType !== 1)
|
|
119
136
|
continue;
|
|
137
|
+
if (isW(child, 'pPr'))
|
|
138
|
+
continue;
|
|
120
139
|
const el = child;
|
|
121
|
-
if (el.namespaceURI
|
|
140
|
+
if (el.namespaceURI === W_NS && RANGE_MARKUP_BLOCK_SIBLING_LOCALS.has(el.localName ?? ''))
|
|
122
141
|
continue;
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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'))
|
|
129
215
|
continue;
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
return false;
|
|
216
|
+
ref = c;
|
|
217
|
+
break;
|
|
133
218
|
}
|
|
134
|
-
|
|
135
|
-
// at least one removed wrapper for this to be a "removed content" paragraph
|
|
219
|
+
const toMove = [];
|
|
136
220
|
for (let i = 0; i < p.childNodes.length; i++) {
|
|
137
|
-
const
|
|
138
|
-
if (
|
|
139
|
-
|
|
140
|
-
|
|
221
|
+
const c = p.childNodes[i];
|
|
222
|
+
if (c.nodeType === 1 && isW(c, 'pPr'))
|
|
223
|
+
continue;
|
|
224
|
+
toMove.push(c);
|
|
141
225
|
}
|
|
142
|
-
|
|
226
|
+
for (const c of toMove) {
|
|
227
|
+
target.insertBefore(c, ref);
|
|
228
|
+
}
|
|
229
|
+
parent.removeChild(p);
|
|
143
230
|
}
|
|
144
|
-
// Property change element local names (all 6 types)
|
|
145
|
-
const PR_CHANGE_LOCALS = [
|
|
146
|
-
'rPrChange', 'pPrChange', 'sectPrChange',
|
|
147
|
-
'tblPrChange', 'trPrChange', 'tcPrChange',
|
|
148
|
-
];
|
|
149
231
|
// ── Public API ──────────────────────────────────────────────────────
|
|
150
232
|
/**
|
|
151
|
-
* Accept all tracked changes in the document body, producing a
|
|
152
|
-
* document with no revision markup.
|
|
233
|
+
* Accept all tracked changes in the document body or story root, producing a
|
|
234
|
+
* clean document with no revision markup.
|
|
153
235
|
*
|
|
154
236
|
* Mutates the Document in place (same convention as simplifyRedlines
|
|
155
237
|
* and mergeRuns).
|
|
156
238
|
*/
|
|
157
239
|
export function acceptChanges(doc) {
|
|
158
|
-
const
|
|
159
|
-
if (!
|
|
240
|
+
const root = doc.getElementsByTagNameNS(W_NS, 'body').item(0) ?? doc.documentElement;
|
|
241
|
+
if (!root) {
|
|
160
242
|
return { insertionsAccepted: 0, deletionsAccepted: 0, movesResolved: 0, propertyChangesResolved: 0 };
|
|
161
243
|
}
|
|
162
|
-
// Phase A — Identify paragraphs
|
|
163
|
-
const
|
|
164
|
-
const allParagraphs = collectByLocalName(
|
|
244
|
+
// Phase A — Identify paragraphs whose MARK is a tracked deletion
|
|
245
|
+
const markDeletedParagraphs = [];
|
|
246
|
+
const allParagraphs = collectByLocalName(root, 'p');
|
|
165
247
|
for (const p of allParagraphs) {
|
|
166
|
-
//
|
|
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
|
|
253
|
+
// w:del/w:moveFrom"): a run-level deletion under an untracked mark means text was
|
|
254
|
+
// deleted from a pre-existing paragraph, which Word/LibreOffice keep (empty) on
|
|
255
|
+
// accept. safe-docx's deleted paragraphs always carry the mark now, so the
|
|
256
|
+
// mark-based rule suffices and is Word-faithful. (Mirrors acceptAllChanges and the
|
|
257
|
+
// reject-side rule.)
|
|
167
258
|
if (paragraphHasParaMarker(p, 'del')) {
|
|
168
|
-
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
// Paragraphs whose only content is inside w:del or w:moveFrom
|
|
172
|
-
if (paragraphHasOnlyRemovedContent(p)) {
|
|
173
|
-
paragraphsToRemove.add(p);
|
|
259
|
+
markDeletedParagraphs.push(p);
|
|
174
260
|
}
|
|
175
261
|
}
|
|
176
262
|
// Phase B — Remove deletions and move sources
|
|
177
|
-
const deletionsAccepted = removeAllByLocalName(
|
|
178
|
-
const moveFromRemoved = removeAllByLocalName(
|
|
179
|
-
removeAllByLocalName(
|
|
180
|
-
removeAllByLocalName(
|
|
181
|
-
removeAllByLocalName(
|
|
182
|
-
removeAllByLocalName(
|
|
263
|
+
const deletionsAccepted = removeAllByLocalName(root, 'del');
|
|
264
|
+
const moveFromRemoved = removeAllByLocalName(root, 'moveFrom');
|
|
265
|
+
removeAllByLocalName(root, 'moveFromRangeStart');
|
|
266
|
+
removeAllByLocalName(root, 'moveFromRangeEnd');
|
|
267
|
+
removeAllByLocalName(root, 'moveToRangeStart');
|
|
268
|
+
removeAllByLocalName(root, 'moveToRangeEnd');
|
|
183
269
|
// Phase C — Unwrap insertions and move destinations (depth-sorted)
|
|
184
|
-
const insertionsAccepted = unwrapAllByLocalName(
|
|
185
|
-
const moveToUnwrapped = unwrapAllByLocalName(
|
|
270
|
+
const insertionsAccepted = unwrapAllByLocalName(root, 'ins');
|
|
271
|
+
const moveToUnwrapped = unwrapAllByLocalName(root, 'moveTo');
|
|
186
272
|
// Phase D — Remove property change records
|
|
187
273
|
let propertyChangesResolved = 0;
|
|
188
274
|
for (const localName of PR_CHANGE_LOCALS) {
|
|
189
|
-
propertyChangesResolved += removeAllByLocalName(
|
|
275
|
+
propertyChangesResolved += removeAllByLocalName(root, localName);
|
|
190
276
|
}
|
|
191
277
|
// Phase E — Cleanup
|
|
192
278
|
// Strip paragraph-level revision markers from w:pPr/w:rPr
|
|
193
|
-
for (const p of collectByLocalName(
|
|
279
|
+
for (const p of collectByLocalName(root, 'p')) {
|
|
194
280
|
for (let i = 0; i < p.childNodes.length; i++) {
|
|
195
281
|
const child = p.childNodes[i];
|
|
196
282
|
if (!isW(child, 'pPr'))
|
|
@@ -213,14 +299,14 @@ export function acceptChanges(doc) {
|
|
|
213
299
|
}
|
|
214
300
|
}
|
|
215
301
|
}
|
|
216
|
-
//
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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);
|
|
221
307
|
}
|
|
222
308
|
// Strip w:rsidDel attributes on remaining elements
|
|
223
|
-
const allElements =
|
|
309
|
+
const allElements = root.getElementsByTagNameNS(W_NS, '*');
|
|
224
310
|
for (let i = 0; i < allElements.length; i++) {
|
|
225
311
|
const el = allElements[i];
|
|
226
312
|
if (el.hasAttributeNS(W_NS, 'rsidDel')) {
|
|
@@ -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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"}
|