@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
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State for allocating monotonically increasing revision IDs.
|
|
3
|
+
*
|
|
4
|
+
* `moveRangeIds` exists so comparison-time emitters can reserve paired source
|
|
5
|
+
* and destination IDs for move ranges while sharing the same counter.
|
|
6
|
+
*/
|
|
7
|
+
export interface RevisionIdState {
|
|
8
|
+
nextId: number;
|
|
9
|
+
moveRangeIds: Map<string, {
|
|
10
|
+
sourceRangeId: number;
|
|
11
|
+
destRangeId: number;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create a revision ID allocator.
|
|
16
|
+
*
|
|
17
|
+
* @param startId - First ID to allocate. Defaults to `1`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createRevisionIdState(startId?: number): RevisionIdState;
|
|
20
|
+
/**
|
|
21
|
+
* Allocate the next revision ID from a shared state object.
|
|
22
|
+
*/
|
|
23
|
+
export declare function allocateRevisionId(state: RevisionIdState): number;
|
|
24
|
+
/**
|
|
25
|
+
* Serialized metadata shared by tracked-change emitters.
|
|
26
|
+
*/
|
|
27
|
+
export interface RevisionContext {
|
|
28
|
+
author: string;
|
|
29
|
+
date: string;
|
|
30
|
+
idState: RevisionIdState;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Options for constructing a revision context.
|
|
34
|
+
*/
|
|
35
|
+
export interface RevisionContextOptions {
|
|
36
|
+
author: string;
|
|
37
|
+
date?: Date | string;
|
|
38
|
+
idState?: RevisionIdState;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Format a revision timestamp as OOXML-friendly ISO 8601.
|
|
42
|
+
*/
|
|
43
|
+
export declare function formatDate(date: Date): string;
|
|
44
|
+
/**
|
|
45
|
+
* Escape XML attribute text used in serialized revision markup.
|
|
46
|
+
*/
|
|
47
|
+
export declare function escapeXmlAttr(text: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* Create a reusable revision context for tracked-change emission.
|
|
50
|
+
*/
|
|
51
|
+
export declare function createRevisionContext(options: RevisionContextOptions): RevisionContext;
|
|
52
|
+
/**
|
|
53
|
+
* Create a fresh tracked-change container (`<w:ins>` or `<w:del>`) into which
|
|
54
|
+
* the caller appends owned child nodes.
|
|
55
|
+
*
|
|
56
|
+
* Use this when wrapping multiple sibling elements under one revision marker.
|
|
57
|
+
* For single-element wrapping, prefer `wrapElementWithIns` / `wrapElementWithDel`.
|
|
58
|
+
*/
|
|
59
|
+
export declare function createRevisionContainer(doc: Document, kind: 'ins' | 'del', ctx: RevisionContext): Element;
|
|
60
|
+
/**
|
|
61
|
+
* Rewrite `<w:t>` → `<w:delText>` and `<w:instrText>` → `<w:delInstrText>`
|
|
62
|
+
* on the given element and all its descendants, for use inside a `<w:del>`
|
|
63
|
+
* container.
|
|
64
|
+
*
|
|
65
|
+
* **CALLERS MUST USE THE RETURN VALUE.** When the input element itself is a
|
|
66
|
+
* root `<w:t>` or `<w:instrText>`, this helper creates a renamed replacement
|
|
67
|
+
* node (you cannot rename a DOM element in place); the input element is
|
|
68
|
+
* detached from the tree and the new node is returned. Pattern:
|
|
69
|
+
*
|
|
70
|
+
* const ready = prepareElementForDeletion(detachedElement);
|
|
71
|
+
* wrapper.appendChild(ready);
|
|
72
|
+
*
|
|
73
|
+
* The element MUST already be detached from any parent. Calling on an
|
|
74
|
+
* attached element will leave the original tree in an inconsistent state.
|
|
75
|
+
*/
|
|
76
|
+
export declare function prepareElementForDeletion(element: Element): Element;
|
|
77
|
+
/**
|
|
78
|
+
* Wrap an xmldom element in `<w:ins>`.
|
|
79
|
+
*
|
|
80
|
+
* The source element is cloned; the original DOM node is left untouched.
|
|
81
|
+
*/
|
|
82
|
+
export declare function wrapElementWithIns(element: Element, ctx: RevisionContext): Element;
|
|
83
|
+
/**
|
|
84
|
+
* Wrap an xmldom element in `<w:del>`.
|
|
85
|
+
*
|
|
86
|
+
* Any descendant `<w:t>` and `<w:instrText>` nodes are converted to the OOXML
|
|
87
|
+
* deletion equivalents before the cloned element is appended.
|
|
88
|
+
*/
|
|
89
|
+
export declare function wrapElementWithDel(element: Element, ctx: RevisionContext): Element;
|
|
90
|
+
/**
|
|
91
|
+
* Build a `<w:pPrChange>` wrapper containing the previous paragraph properties.
|
|
92
|
+
*
|
|
93
|
+
* The nested snapshot excludes children that are not valid in `CT_PPrBase`.
|
|
94
|
+
*/
|
|
95
|
+
export declare function buildPPrChangeElement(oldPPr: Element | null, ctx: RevisionContext): Element;
|
|
96
|
+
/**
|
|
97
|
+
* Build a `<w:trPrChange>` wrapper containing the previous row properties.
|
|
98
|
+
*
|
|
99
|
+
* The nested snapshot excludes children that are not valid in `CT_TrPrBase`.
|
|
100
|
+
*/
|
|
101
|
+
export declare function buildTrPrChangeElement(oldTrPr: Element | null, ctx: RevisionContext): Element;
|
|
102
|
+
/**
|
|
103
|
+
* Build a `<w:tcPrChange>` wrapper containing the previous cell properties.
|
|
104
|
+
*
|
|
105
|
+
* The nested snapshot excludes children that are not valid in `CT_TcPrBase`.
|
|
106
|
+
*/
|
|
107
|
+
export declare function buildTcPrChangeElement(oldTcPr: Element | null, ctx: RevisionContext): Element;
|
|
108
|
+
/**
|
|
109
|
+
* Build a `<w:rPrChange>` wrapper containing the previous run properties.
|
|
110
|
+
*
|
|
111
|
+
* The nested snapshot excludes any existing `w:rPrChange` child. This filtering
|
|
112
|
+
* is intentional: OOXML does not permit recursively nested `w:rPrChange` (a
|
|
113
|
+
* change-of-a-change is undefined), so the helper drops it. Note this is a
|
|
114
|
+
* stricter contract than the legacy reconstructor's per-child loop, which
|
|
115
|
+
* would have passed a nested `w:rPrChange` through verbatim. The reconstructor
|
|
116
|
+
* still uses its own per-child path; this helper is for new primitive code
|
|
117
|
+
* (#136 onward).
|
|
118
|
+
*/
|
|
119
|
+
export declare function buildRPrChangeElement(oldRPr: Element | null, ctx: RevisionContext): Element;
|
|
120
|
+
/**
|
|
121
|
+
* Wrap serialized OOXML content in a `<w:ins>` element.
|
|
122
|
+
*
|
|
123
|
+
* This keeps the reconstructor on its string-based emission path while sharing
|
|
124
|
+
* revision metadata handling with the DOM-aware helpers above.
|
|
125
|
+
*/
|
|
126
|
+
export declare function wrapSerializedContentWithIns(content: string, ctx: RevisionContext): string;
|
|
127
|
+
/**
|
|
128
|
+
* Wrap serialized OOXML content in a `<w:del>` element.
|
|
129
|
+
*
|
|
130
|
+
* Visible text nodes are rewritten to their deletion-tag equivalents before
|
|
131
|
+
* the wrapper is serialized.
|
|
132
|
+
*/
|
|
133
|
+
export declare function wrapSerializedContentWithDel(content: string, ctx: RevisionContext): string;
|
|
134
|
+
/**
|
|
135
|
+
* Convert serialized run content from insertion-style text tags to deletion
|
|
136
|
+
* equivalents (`w:t` -> `w:delText`, `w:instrText` -> `w:delInstrText`).
|
|
137
|
+
*
|
|
138
|
+
* The fragment is parsed into a DOM and renamed via the same traversal as
|
|
139
|
+
* `prepareElementForDeletion`, so attribute order is preserved and shapes a
|
|
140
|
+
* regex sweep mishandles (self-closing `<w:t/>`, attribute values containing
|
|
141
|
+
* `>`) convert correctly. Namespace prefixes the fragment uses without an
|
|
142
|
+
* inline declaration are bound on a temporary wrapper root that is stripped
|
|
143
|
+
* from the returned serialization.
|
|
144
|
+
*
|
|
145
|
+
* @see https://github.com/UseJunior/safe-docx/issues/102
|
|
146
|
+
*/
|
|
147
|
+
export declare function convertSerializedDeletionContent(content: string): string;
|
|
148
|
+
//# sourceMappingURL=track-changes-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-changes-emitter.d.ts","sourceRoot":"","sources":["../../src/primitives/track-changes-emitter.ts"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3E;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,MAAU,GAAG,eAAe,CAK1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAOtF;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,KAAK,GAAG,KAAK,EACnB,GAAG,EAAE,eAAe,GACnB,OAAO,CAET;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAEnE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAIlF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAKlF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAkB3F;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAkB7F;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAkB7F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAkB3F;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAE1F;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAE1F;AASD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAcxE"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { parseXml, serializeXml } from './xml.js';
|
|
2
|
+
import { childElements, createWmlElement, renameElement } from './dom-helpers.js';
|
|
3
|
+
import { OOXML } from './namespaces.js';
|
|
4
|
+
const SYNTHETIC_DOC = parseXml('<root xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"/>');
|
|
5
|
+
const EXCLUDED_PPR_CHANGE_CHILDREN = new Set(['w:rPr', 'w:rPrChange', 'w:pPrChange', 'w:sectPr']);
|
|
6
|
+
const EXCLUDED_TRPR_CHANGE_CHILDREN = new Set(['w:trPrChange', 'w:ins', 'w:del']);
|
|
7
|
+
// CT_TcPrInner (the inner pPr under <w:tcPrChange>) preserves cell-topology
|
|
8
|
+
// revision children (w:cellIns, w:cellDel, w:cellMerge). Only the
|
|
9
|
+
// change-of-a-change marker w:tcPrChange itself is excluded. See:
|
|
10
|
+
// https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.wordprocessing.previoustablecellproperties
|
|
11
|
+
const EXCLUDED_TCPR_CHANGE_CHILDREN = new Set(['w:tcPrChange']);
|
|
12
|
+
const EXCLUDED_RPR_CHANGE_CHILDREN = new Set(['w:rPrChange']);
|
|
13
|
+
/**
|
|
14
|
+
* Create a revision ID allocator.
|
|
15
|
+
*
|
|
16
|
+
* @param startId - First ID to allocate. Defaults to `1`.
|
|
17
|
+
*/
|
|
18
|
+
export function createRevisionIdState(startId = 1) {
|
|
19
|
+
return {
|
|
20
|
+
nextId: startId,
|
|
21
|
+
moveRangeIds: new Map(),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Allocate the next revision ID from a shared state object.
|
|
26
|
+
*/
|
|
27
|
+
export function allocateRevisionId(state) {
|
|
28
|
+
return state.nextId++;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Format a revision timestamp as OOXML-friendly ISO 8601.
|
|
32
|
+
*/
|
|
33
|
+
export function formatDate(date) {
|
|
34
|
+
return date.toISOString().replace(/\.\d{3}Z$/, 'Z');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Escape XML attribute text used in serialized revision markup.
|
|
38
|
+
*/
|
|
39
|
+
export function escapeXmlAttr(text) {
|
|
40
|
+
return text
|
|
41
|
+
.replace(/&/g, '&')
|
|
42
|
+
.replace(/</g, '<')
|
|
43
|
+
.replace(/>/g, '>')
|
|
44
|
+
.replace(/"/g, '"');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Create a reusable revision context for tracked-change emission.
|
|
48
|
+
*/
|
|
49
|
+
export function createRevisionContext(options) {
|
|
50
|
+
const { author, date, idState = createRevisionIdState() } = options;
|
|
51
|
+
return {
|
|
52
|
+
author,
|
|
53
|
+
date: typeof date === 'string' ? date : formatDate(date ?? new Date()),
|
|
54
|
+
idState,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Create a fresh tracked-change container (`<w:ins>` or `<w:del>`) into which
|
|
59
|
+
* the caller appends owned child nodes.
|
|
60
|
+
*
|
|
61
|
+
* Use this when wrapping multiple sibling elements under one revision marker.
|
|
62
|
+
* For single-element wrapping, prefer `wrapElementWithIns` / `wrapElementWithDel`.
|
|
63
|
+
*/
|
|
64
|
+
export function createRevisionContainer(doc, kind, ctx) {
|
|
65
|
+
return createRevisionWrapperElement(doc, kind, ctx);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Rewrite `<w:t>` → `<w:delText>` and `<w:instrText>` → `<w:delInstrText>`
|
|
69
|
+
* on the given element and all its descendants, for use inside a `<w:del>`
|
|
70
|
+
* container.
|
|
71
|
+
*
|
|
72
|
+
* **CALLERS MUST USE THE RETURN VALUE.** When the input element itself is a
|
|
73
|
+
* root `<w:t>` or `<w:instrText>`, this helper creates a renamed replacement
|
|
74
|
+
* node (you cannot rename a DOM element in place); the input element is
|
|
75
|
+
* detached from the tree and the new node is returned. Pattern:
|
|
76
|
+
*
|
|
77
|
+
* const ready = prepareElementForDeletion(detachedElement);
|
|
78
|
+
* wrapper.appendChild(ready);
|
|
79
|
+
*
|
|
80
|
+
* The element MUST already be detached from any parent. Calling on an
|
|
81
|
+
* attached element will leave the original tree in an inconsistent state.
|
|
82
|
+
*/
|
|
83
|
+
export function prepareElementForDeletion(element) {
|
|
84
|
+
return normalizeDeletionElement(element);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Wrap an xmldom element in `<w:ins>`.
|
|
88
|
+
*
|
|
89
|
+
* The source element is cloned; the original DOM node is left untouched.
|
|
90
|
+
*/
|
|
91
|
+
export function wrapElementWithIns(element, ctx) {
|
|
92
|
+
const wrapper = createRevisionContainer(getOwnerDocument(element), 'ins', ctx);
|
|
93
|
+
wrapper.appendChild(element.cloneNode(true));
|
|
94
|
+
return wrapper;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Wrap an xmldom element in `<w:del>`.
|
|
98
|
+
*
|
|
99
|
+
* Any descendant `<w:t>` and `<w:instrText>` nodes are converted to the OOXML
|
|
100
|
+
* deletion equivalents before the cloned element is appended.
|
|
101
|
+
*/
|
|
102
|
+
export function wrapElementWithDel(element, ctx) {
|
|
103
|
+
const wrapper = createRevisionContainer(getOwnerDocument(element), 'del', ctx);
|
|
104
|
+
const cloned = prepareElementForDeletion(element.cloneNode(true));
|
|
105
|
+
wrapper.appendChild(cloned);
|
|
106
|
+
return wrapper;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Build a `<w:pPrChange>` wrapper containing the previous paragraph properties.
|
|
110
|
+
*
|
|
111
|
+
* The nested snapshot excludes children that are not valid in `CT_PPrBase`.
|
|
112
|
+
*/
|
|
113
|
+
export function buildPPrChangeElement(oldPPr, ctx) {
|
|
114
|
+
const pPrChange = createWmlElement(getOwnerDocument(oldPPr), 'pPrChange', revisionAttributes(ctx));
|
|
115
|
+
const previousPPr = createWmlElement(getOwnerDocument(oldPPr), 'pPr');
|
|
116
|
+
if (oldPPr) {
|
|
117
|
+
for (const child of childElements(oldPPr)) {
|
|
118
|
+
if (!EXCLUDED_PPR_CHANGE_CHILDREN.has(child.tagName)) {
|
|
119
|
+
previousPPr.appendChild(child.cloneNode(true));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
pPrChange.appendChild(previousPPr);
|
|
124
|
+
return pPrChange;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Build a `<w:trPrChange>` wrapper containing the previous row properties.
|
|
128
|
+
*
|
|
129
|
+
* The nested snapshot excludes children that are not valid in `CT_TrPrBase`.
|
|
130
|
+
*/
|
|
131
|
+
export function buildTrPrChangeElement(oldTrPr, ctx) {
|
|
132
|
+
const trPrChange = createWmlElement(getOwnerDocument(oldTrPr), 'trPrChange', revisionAttributes(ctx));
|
|
133
|
+
const previousTrPr = createWmlElement(getOwnerDocument(oldTrPr), 'trPr');
|
|
134
|
+
if (oldTrPr) {
|
|
135
|
+
for (const child of childElements(oldTrPr)) {
|
|
136
|
+
if (!EXCLUDED_TRPR_CHANGE_CHILDREN.has(child.tagName)) {
|
|
137
|
+
previousTrPr.appendChild(child.cloneNode(true));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
trPrChange.appendChild(previousTrPr);
|
|
142
|
+
return trPrChange;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Build a `<w:tcPrChange>` wrapper containing the previous cell properties.
|
|
146
|
+
*
|
|
147
|
+
* The nested snapshot excludes children that are not valid in `CT_TcPrBase`.
|
|
148
|
+
*/
|
|
149
|
+
export function buildTcPrChangeElement(oldTcPr, ctx) {
|
|
150
|
+
const tcPrChange = createWmlElement(getOwnerDocument(oldTcPr), 'tcPrChange', revisionAttributes(ctx));
|
|
151
|
+
const previousTcPr = createWmlElement(getOwnerDocument(oldTcPr), 'tcPr');
|
|
152
|
+
if (oldTcPr) {
|
|
153
|
+
for (const child of childElements(oldTcPr)) {
|
|
154
|
+
if (!EXCLUDED_TCPR_CHANGE_CHILDREN.has(child.tagName)) {
|
|
155
|
+
previousTcPr.appendChild(child.cloneNode(true));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
tcPrChange.appendChild(previousTcPr);
|
|
160
|
+
return tcPrChange;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Build a `<w:rPrChange>` wrapper containing the previous run properties.
|
|
164
|
+
*
|
|
165
|
+
* The nested snapshot excludes any existing `w:rPrChange` child. This filtering
|
|
166
|
+
* is intentional: OOXML does not permit recursively nested `w:rPrChange` (a
|
|
167
|
+
* change-of-a-change is undefined), so the helper drops it. Note this is a
|
|
168
|
+
* stricter contract than the legacy reconstructor's per-child loop, which
|
|
169
|
+
* would have passed a nested `w:rPrChange` through verbatim. The reconstructor
|
|
170
|
+
* still uses its own per-child path; this helper is for new primitive code
|
|
171
|
+
* (#136 onward).
|
|
172
|
+
*/
|
|
173
|
+
export function buildRPrChangeElement(oldRPr, ctx) {
|
|
174
|
+
const rPrChange = createWmlElement(getOwnerDocument(oldRPr), 'rPrChange', revisionAttributes(ctx));
|
|
175
|
+
const previousRPr = createWmlElement(getOwnerDocument(oldRPr), 'rPr');
|
|
176
|
+
if (oldRPr) {
|
|
177
|
+
for (const child of childElements(oldRPr)) {
|
|
178
|
+
if (!EXCLUDED_RPR_CHANGE_CHILDREN.has(child.tagName)) {
|
|
179
|
+
previousRPr.appendChild(child.cloneNode(true));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
rPrChange.appendChild(previousRPr);
|
|
184
|
+
return rPrChange;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Wrap serialized OOXML content in a `<w:ins>` element.
|
|
188
|
+
*
|
|
189
|
+
* This keeps the reconstructor on its string-based emission path while sharing
|
|
190
|
+
* revision metadata handling with the DOM-aware helpers above.
|
|
191
|
+
*/
|
|
192
|
+
export function wrapSerializedContentWithIns(content, ctx) {
|
|
193
|
+
return `${createSerializedRevisionOpenTag('w:ins', ctx)}${content}</w:ins>`;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Wrap serialized OOXML content in a `<w:del>` element.
|
|
197
|
+
*
|
|
198
|
+
* Visible text nodes are rewritten to their deletion-tag equivalents before
|
|
199
|
+
* the wrapper is serialized.
|
|
200
|
+
*/
|
|
201
|
+
export function wrapSerializedContentWithDel(content, ctx) {
|
|
202
|
+
return `${createSerializedRevisionOpenTag('w:del', ctx)}${convertSerializedDeletionContent(content)}</w:del>`;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Matches a `<w:t>` or `<w:instrText>` open tag (including the self-closing
|
|
206
|
+
* form). Used as a fast path: content with no convertible tags is returned
|
|
207
|
+
* byte-for-byte unchanged, skipping the parse/serialize round-trip.
|
|
208
|
+
*/
|
|
209
|
+
const CONVERTIBLE_TEXT_TAG = /<w:(?:t|instrText)[\s/>]/;
|
|
210
|
+
/**
|
|
211
|
+
* Convert serialized run content from insertion-style text tags to deletion
|
|
212
|
+
* equivalents (`w:t` -> `w:delText`, `w:instrText` -> `w:delInstrText`).
|
|
213
|
+
*
|
|
214
|
+
* The fragment is parsed into a DOM and renamed via the same traversal as
|
|
215
|
+
* `prepareElementForDeletion`, so attribute order is preserved and shapes a
|
|
216
|
+
* regex sweep mishandles (self-closing `<w:t/>`, attribute values containing
|
|
217
|
+
* `>`) convert correctly. Namespace prefixes the fragment uses without an
|
|
218
|
+
* inline declaration are bound on a temporary wrapper root that is stripped
|
|
219
|
+
* from the returned serialization.
|
|
220
|
+
*
|
|
221
|
+
* @see https://github.com/UseJunior/safe-docx/issues/102
|
|
222
|
+
*/
|
|
223
|
+
export function convertSerializedDeletionContent(content) {
|
|
224
|
+
if (!CONVERTIBLE_TEXT_TAG.test(content)) {
|
|
225
|
+
return content;
|
|
226
|
+
}
|
|
227
|
+
const doc = parseXml(`<root${declareContentPrefixes(content)}>${content}</root>`);
|
|
228
|
+
for (const child of childElements(doc.documentElement)) {
|
|
229
|
+
normalizeDeletionElement(child);
|
|
230
|
+
}
|
|
231
|
+
// Strip the wrapper root: everything between the end of its open tag and
|
|
232
|
+
// the start of its close tag. Safe because the declared URIs contain no '>'.
|
|
233
|
+
const serialized = serializeXml(doc);
|
|
234
|
+
return serialized.slice(serialized.indexOf('>') + 1, serialized.lastIndexOf('<'));
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Matches a `prefix:` occurrence in markup context — after `<`, `</`, or
|
|
238
|
+
* whitespace (attribute position). May over-match inside text content, which
|
|
239
|
+
* is harmless: it only yields an unused declaration on the wrapper root.
|
|
240
|
+
*/
|
|
241
|
+
const PREFIX_SCAN = /[<\s]\/?([A-Za-z_][A-Za-z0-9_.-]*):/g;
|
|
242
|
+
/**
|
|
243
|
+
* Build `xmlns` declarations for every namespace prefix a serialized fragment
|
|
244
|
+
* uses, so the fragment parses under a wrapper root (xmldom rejects
|
|
245
|
+
* undeclared prefixes). `w` binds to the real WordprocessingML namespace —
|
|
246
|
+
* the deletion rename produces elements in that namespace — while unknown
|
|
247
|
+
* prefixes get placeholder URIs. The wrapper root carrying these declarations
|
|
248
|
+
* is stripped after serialization, so placeholders never reach the output;
|
|
249
|
+
* fragments serialized from a real document carry their own inline
|
|
250
|
+
* declarations, which take precedence over the wrapper's.
|
|
251
|
+
*/
|
|
252
|
+
function declareContentPrefixes(content) {
|
|
253
|
+
const declarations = new Map([['w', OOXML.W_NS]]);
|
|
254
|
+
for (const match of content.matchAll(PREFIX_SCAN)) {
|
|
255
|
+
const prefix = match[1];
|
|
256
|
+
if (prefix !== 'xml' && prefix !== 'xmlns' && !declarations.has(prefix)) {
|
|
257
|
+
declarations.set(prefix, `urn:safe-docx:undeclared-prefix:${prefix}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return [...declarations].map(([prefix, uri]) => ` xmlns:${prefix}="${uri}"`).join('');
|
|
261
|
+
}
|
|
262
|
+
function getOwnerDocument(element) {
|
|
263
|
+
return element?.ownerDocument ?? SYNTHETIC_DOC;
|
|
264
|
+
}
|
|
265
|
+
function revisionAttributes(ctx) {
|
|
266
|
+
return {
|
|
267
|
+
'w:id': String(allocateRevisionId(ctx.idState)),
|
|
268
|
+
'w:author': ctx.author,
|
|
269
|
+
'w:date': ctx.date,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function createRevisionWrapperElement(doc, tag, ctx) {
|
|
273
|
+
return createWmlElement(doc, tag, revisionAttributes(ctx));
|
|
274
|
+
}
|
|
275
|
+
function createSerializedRevisionOpenTag(tagName, ctx) {
|
|
276
|
+
const id = allocateRevisionId(ctx.idState);
|
|
277
|
+
return `<${tagName} w:id="${id}" w:author="${escapeXmlAttr(ctx.author)}" w:date="${ctx.date}">`;
|
|
278
|
+
}
|
|
279
|
+
function normalizeDeletionElement(element) {
|
|
280
|
+
for (const child of childElements(element)) {
|
|
281
|
+
normalizeDeletionElement(child);
|
|
282
|
+
}
|
|
283
|
+
if (element.tagName === 'w:t') {
|
|
284
|
+
return renameElement(element, 'w:delText');
|
|
285
|
+
}
|
|
286
|
+
if (element.tagName === 'w:instrText') {
|
|
287
|
+
return renameElement(element, 'w:delInstrText');
|
|
288
|
+
}
|
|
289
|
+
return element;
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=track-changes-emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-changes-emitter.js","sourceRoot":"","sources":["../../src/primitives/track-changes-emitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { DocxZip } from './zip.js';
|
|
2
|
+
export type AiRevisionSeverity = 'error' | 'warning';
|
|
3
|
+
export type AiRevisionDiagnostic = {
|
|
4
|
+
severity: AiRevisionSeverity;
|
|
5
|
+
code: string;
|
|
6
|
+
message: string;
|
|
7
|
+
part?: string;
|
|
8
|
+
element?: string;
|
|
9
|
+
id?: string;
|
|
10
|
+
author?: string | null;
|
|
11
|
+
};
|
|
12
|
+
export type ValidateAiRevisionsResult = {
|
|
13
|
+
valid: boolean;
|
|
14
|
+
errors: AiRevisionDiagnostic[];
|
|
15
|
+
warnings: AiRevisionDiagnostic[];
|
|
16
|
+
};
|
|
17
|
+
export type AiRevisionValidationTouchedContext = {
|
|
18
|
+
revisionIds?: Iterable<string | number>;
|
|
19
|
+
rangeIds?: Iterable<string | number>;
|
|
20
|
+
relationshipParts?: Iterable<string>;
|
|
21
|
+
sideParts?: Iterable<string>;
|
|
22
|
+
};
|
|
23
|
+
export type AiRevisionStoryInput = {
|
|
24
|
+
part: string;
|
|
25
|
+
doc: Document;
|
|
26
|
+
};
|
|
27
|
+
export type ValidateAiRevisionsOptions = {
|
|
28
|
+
aiAuthor: string;
|
|
29
|
+
stories: AiRevisionStoryInput[];
|
|
30
|
+
packageZip?: DocxZip;
|
|
31
|
+
touched?: AiRevisionValidationTouchedContext;
|
|
32
|
+
};
|
|
33
|
+
export declare function validateAiRevisions(options: ValidateAiRevisionsOptions): Promise<ValidateAiRevisionsResult>;
|
|
34
|
+
export declare const AI_REVISION_VALIDATION_STORY_PARTS: readonly ["word/footnotes.xml", "word/endnotes.xml", "word/comments.xml", "word/glossary/document.xml"];
|
|
35
|
+
//# sourceMappingURL=validate_ai_revisions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate_ai_revisions.d.ts","sourceRoot":"","sources":["../../src/primitives/validate_ai_revisions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAcnC,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAAC;AAErD,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC,iBAAiB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,QAAQ,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,kCAAkC,CAAC;CAC9C,CAAC;AAoVF,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,yBAAyB,CAAC,CAgCpC;AAED,eAAO,MAAM,kCAAkC,yGAA4B,CAAC"}
|