docxmlater 11.0.10 → 12.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -13
- package/dist/core/Document.d.ts +28 -2
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +725 -170
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts +1 -0
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +77 -25
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentParser.d.ts +7 -3
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +427 -81
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/RelationshipManager.d.ts.map +1 -1
- package/dist/core/RelationshipManager.js +2 -2
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/Comment.d.ts +15 -1
- package/dist/elements/Comment.d.ts.map +1 -1
- package/dist/elements/Comment.js +67 -12
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts +4 -0
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +74 -16
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/EndnoteManager.d.ts.map +1 -1
- package/dist/elements/EndnoteManager.js.map +1 -1
- package/dist/elements/Field.d.ts +10 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +76 -34
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts +1 -0
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js +8 -4
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/Footer.d.ts +3 -1
- package/dist/elements/Footer.d.ts.map +1 -1
- package/dist/elements/Footer.js +39 -53
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/FootnoteManager.d.ts.map +1 -1
- package/dist/elements/FootnoteManager.js.map +1 -1
- package/dist/elements/Header.d.ts +3 -1
- package/dist/elements/Header.d.ts.map +1 -1
- package/dist/elements/Header.js +39 -53
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/HeaderFooterManager.d.ts +4 -2
- package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
- package/dist/elements/HeaderFooterManager.js +36 -6
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts +6 -1
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +69 -44
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +33 -6
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts +1 -0
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +11 -0
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +3 -0
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +91 -26
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/Revision.d.ts +4 -0
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +369 -29
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/Run.d.ts +1 -0
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +24 -4
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +17 -7
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js +50 -42
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts +9 -1
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +46 -6
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +2 -0
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +90 -42
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +1 -0
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +32 -13
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- package/dist/elements/TableOfContents.js +5 -7
- package/dist/elements/TableOfContents.js.map +1 -1
- package/dist/elements/TableRow.d.ts +1 -0
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +16 -1
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +55 -42
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/esm/core/Document.js +726 -171
- package/dist/esm/core/Document.js.map +1 -1
- package/dist/esm/core/DocumentGenerator.js +77 -25
- package/dist/esm/core/DocumentGenerator.js.map +1 -1
- package/dist/esm/core/DocumentParser.js +427 -81
- package/dist/esm/core/DocumentParser.js.map +1 -1
- package/dist/esm/core/RelationshipManager.js +2 -2
- package/dist/esm/core/RelationshipManager.js.map +1 -1
- package/dist/esm/elements/Comment.js +67 -12
- package/dist/esm/elements/Comment.js.map +1 -1
- package/dist/esm/elements/CommentManager.js +74 -16
- package/dist/esm/elements/CommentManager.js.map +1 -1
- package/dist/esm/elements/EndnoteManager.js.map +1 -1
- package/dist/esm/elements/Field.js +77 -35
- package/dist/esm/elements/Field.js.map +1 -1
- package/dist/esm/elements/FieldHelpers.js +7 -4
- package/dist/esm/elements/FieldHelpers.js.map +1 -1
- package/dist/esm/elements/Footer.js +39 -53
- package/dist/esm/elements/Footer.js.map +1 -1
- package/dist/esm/elements/FootnoteManager.js.map +1 -1
- package/dist/esm/elements/Header.js +39 -53
- package/dist/esm/elements/Header.js.map +1 -1
- package/dist/esm/elements/HeaderFooterManager.js +36 -6
- package/dist/esm/elements/HeaderFooterManager.js.map +1 -1
- package/dist/esm/elements/Hyperlink.js +69 -44
- package/dist/esm/elements/Hyperlink.js.map +1 -1
- package/dist/esm/elements/Image.js +33 -6
- package/dist/esm/elements/Image.js.map +1 -1
- package/dist/esm/elements/ImageManager.js +11 -0
- package/dist/esm/elements/ImageManager.js.map +1 -1
- package/dist/esm/elements/Paragraph.js +91 -26
- package/dist/esm/elements/Paragraph.js.map +1 -1
- package/dist/esm/elements/Revision.js +369 -29
- package/dist/esm/elements/Revision.js.map +1 -1
- package/dist/esm/elements/Run.js +24 -4
- package/dist/esm/elements/Run.js.map +1 -1
- package/dist/esm/elements/Section.js +17 -7
- package/dist/esm/elements/Section.js.map +1 -1
- package/dist/esm/elements/Shape.js +50 -42
- package/dist/esm/elements/Shape.js.map +1 -1
- package/dist/esm/elements/StructuredDocumentTag.js +46 -6
- package/dist/esm/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/esm/elements/Table.js +90 -42
- package/dist/esm/elements/Table.js.map +1 -1
- package/dist/esm/elements/TableCell.js +32 -13
- package/dist/esm/elements/TableCell.js.map +1 -1
- package/dist/esm/elements/TableOfContents.js +5 -7
- package/dist/esm/elements/TableOfContents.js.map +1 -1
- package/dist/esm/elements/TableRow.js +16 -1
- package/dist/esm/elements/TableRow.js.map +1 -1
- package/dist/esm/elements/TextBox.js +55 -42
- package/dist/esm/elements/TextBox.js.map +1 -1
- package/dist/esm/formatting/AbstractNumbering.js +1 -1
- package/dist/esm/formatting/AbstractNumbering.js.map +1 -1
- package/dist/esm/formatting/NumberingLevel.js +8 -6
- package/dist/esm/formatting/NumberingLevel.js.map +1 -1
- package/dist/esm/formatting/NumberingManager.js +16 -1
- package/dist/esm/formatting/NumberingManager.js.map +1 -1
- package/dist/esm/formatting/Style.js +14 -0
- package/dist/esm/formatting/Style.js.map +1 -1
- package/dist/esm/formatting/StylesManager.js +14 -2
- package/dist/esm/formatting/StylesManager.js.map +1 -1
- package/dist/esm/helpers/CleanupHelper.js +103 -26
- package/dist/esm/helpers/CleanupHelper.js.map +1 -1
- package/dist/esm/images/ImageOptimizer.js +52 -4
- package/dist/esm/images/ImageOptimizer.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal.js +1 -1
- package/dist/esm/internal.js.map +1 -1
- package/dist/esm/processors/CompatibilityUpgrader.js +7 -1
- package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -1
- package/dist/esm/processors/InMemoryRevisionAcceptor.js +134 -13
- package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/esm/processors/RevisionWalker.js +58 -8
- package/dist/esm/processors/RevisionWalker.js.map +1 -1
- package/dist/esm/processors/SelectiveRevisionAcceptor.js +116 -17
- package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/esm/processors/cnfStyleDecoder.js +7 -7
- package/dist/esm/processors/cnfStyleDecoder.js.map +1 -1
- package/dist/esm/processors/stripTrackedChanges.js +16 -5
- package/dist/esm/processors/stripTrackedChanges.js.map +1 -1
- package/dist/esm/utils/deepClone.js +24 -11
- package/dist/esm/utils/deepClone.js.map +1 -1
- package/dist/esm/utils/units.js +1 -1
- package/dist/esm/utils/units.js.map +1 -1
- package/dist/esm/utils/validation.js +11 -23
- package/dist/esm/utils/validation.js.map +1 -1
- package/dist/esm/utils/xmlSanitization.js +131 -7
- package/dist/esm/utils/xmlSanitization.js.map +1 -1
- package/dist/esm/validation/RevisionAutoFixer.js +69 -55
- package/dist/esm/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/esm/validation/RevisionValidator.js +24 -20
- package/dist/esm/validation/RevisionValidator.js.map +1 -1
- package/dist/esm/xml/XMLBuilder.js +52 -20
- package/dist/esm/xml/XMLBuilder.js.map +1 -1
- package/dist/esm/xml/XMLParser.js +55 -13
- package/dist/esm/xml/XMLParser.js.map +1 -1
- package/dist/esm/zip/ZipHandler.js +37 -13
- package/dist/esm/zip/ZipHandler.js.map +1 -1
- package/dist/esm/zip/ZipReader.js +53 -6
- package/dist/esm/zip/ZipReader.js.map +1 -1
- package/dist/esm/zip/errors.js +7 -0
- package/dist/esm/zip/errors.js.map +1 -1
- package/dist/esm/zip/types.js +4 -0
- package/dist/esm/zip/types.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +1 -1
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts +1 -1
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +8 -6
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js +16 -1
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +14 -0
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +2 -0
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js +14 -2
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.d.ts.map +1 -1
- package/dist/helpers/CleanupHelper.js +103 -26
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/images/ImageOptimizer.d.ts.map +1 -1
- package/dist/images/ImageOptimizer.js +52 -4
- package/dist/images/ImageOptimizer.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +2 -1
- package/dist/internal.js.map +1 -1
- package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -1
- package/dist/processors/CompatibilityUpgrader.js +7 -1
- package/dist/processors/CompatibilityUpgrader.js.map +1 -1
- package/dist/processors/InMemoryRevisionAcceptor.d.ts +1 -0
- package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -1
- package/dist/processors/InMemoryRevisionAcceptor.js +135 -13
- package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/processors/RevisionWalker.d.ts +2 -0
- package/dist/processors/RevisionWalker.d.ts.map +1 -1
- package/dist/processors/RevisionWalker.js +58 -8
- package/dist/processors/RevisionWalker.js.map +1 -1
- package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -1
- package/dist/processors/SelectiveRevisionAcceptor.js +116 -17
- package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/processors/cnfStyleDecoder.d.ts.map +1 -1
- package/dist/processors/cnfStyleDecoder.js +7 -7
- package/dist/processors/cnfStyleDecoder.js.map +1 -1
- package/dist/processors/stripTrackedChanges.d.ts.map +1 -1
- package/dist/processors/stripTrackedChanges.js +16 -5
- package/dist/processors/stripTrackedChanges.js.map +1 -1
- package/dist/utils/deepClone.d.ts.map +1 -1
- package/dist/utils/deepClone.js +24 -11
- package/dist/utils/deepClone.js.map +1 -1
- package/dist/utils/units.d.ts.map +1 -1
- package/dist/utils/units.js +1 -1
- package/dist/utils/units.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +11 -23
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/xmlSanitization.d.ts +2 -0
- package/dist/utils/xmlSanitization.d.ts.map +1 -1
- package/dist/utils/xmlSanitization.js +133 -7
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.d.ts +6 -2
- package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
- package/dist/validation/RevisionAutoFixer.js +68 -54
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.d.ts +2 -0
- package/dist/validation/RevisionValidator.d.ts.map +1 -1
- package/dist/validation/RevisionValidator.js +26 -21
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts +1 -0
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +52 -20
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.d.ts +1 -0
- package/dist/xml/XMLParser.d.ts.map +1 -1
- package/dist/xml/XMLParser.js +55 -13
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.d.ts.map +1 -1
- package/dist/zip/ZipHandler.js +37 -13
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.d.ts.map +1 -1
- package/dist/zip/ZipReader.js +52 -5
- package/dist/zip/ZipReader.js.map +1 -1
- package/dist/zip/errors.d.ts +3 -0
- package/dist/zip/errors.d.ts.map +1 -1
- package/dist/zip/errors.js +9 -1
- package/dist/zip/errors.js.map +1 -1
- package/dist/zip/types.d.ts +4 -0
- package/dist/zip/types.d.ts.map +1 -1
- package/dist/zip/types.js +4 -0
- package/dist/zip/types.js.map +1 -1
- package/package.json +2 -2
- package/src/core/Document.ts +1159 -240
- package/src/core/DocumentGenerator.ts +106 -26
- package/src/core/DocumentParser.ts +681 -114
- package/src/core/RelationshipManager.ts +446 -442
- package/src/elements/Comment.ts +123 -18
- package/src/elements/CommentManager.ts +121 -22
- package/src/elements/EndnoteManager.ts +4 -1
- package/src/elements/Field.ts +134 -43
- package/src/elements/FieldHelpers.ts +20 -4
- package/src/elements/Footer.ts +62 -67
- package/src/elements/FootnoteManager.ts +4 -1
- package/src/elements/Header.ts +62 -67
- package/src/elements/HeaderFooterManager.ts +56 -8
- package/src/elements/Hyperlink.ts +150 -55
- package/src/elements/Image.ts +51 -7
- package/src/elements/ImageManager.ts +24 -0
- package/src/elements/Paragraph.ts +161 -40
- package/src/elements/Revision.ts +446 -47
- package/src/elements/Run.ts +44 -6
- package/src/elements/Section.ts +25 -9
- package/src/elements/Shape.ts +52 -44
- package/src/elements/StructuredDocumentTag.ts +83 -8
- package/src/elements/Table.ts +151 -50
- package/src/elements/TableCell.ts +57 -17
- package/src/elements/TableOfContents.ts +10 -9
- package/src/elements/TableRow.ts +35 -3
- package/src/elements/TextBox.ts +58 -43
- package/src/formatting/AbstractNumbering.ts +4 -2
- package/src/formatting/NumberingLevel.ts +50 -12
- package/src/formatting/NumberingManager.ts +32 -3
- package/src/formatting/Style.ts +14 -0
- package/src/formatting/StylesManager.ts +29 -2
- package/src/helpers/CleanupHelper.ts +122 -30
- package/src/images/ImageOptimizer.ts +64 -5
- package/src/index.ts +7 -0
- package/src/internal.ts +1 -0
- package/src/processors/CompatibilityUpgrader.ts +15 -2
- package/src/processors/InMemoryRevisionAcceptor.ts +276 -17
- package/src/processors/RevisionWalker.ts +83 -7
- package/src/processors/SelectiveRevisionAcceptor.ts +164 -28
- package/src/processors/cnfStyleDecoder.ts +18 -12
- package/src/processors/stripTrackedChanges.ts +47 -10
- package/src/utils/deepClone.ts +48 -14
- package/src/utils/units.ts +3 -1
- package/src/utils/validation.ts +30 -32
- package/src/utils/xmlSanitization.ts +218 -22
- package/src/validation/RevisionAutoFixer.ts +109 -65
- package/src/validation/RevisionValidator.ts +48 -23
- package/src/xml/XMLBuilder.ts +82 -22
- package/src/xml/XMLParser.ts +87 -20
- package/src/zip/ZipHandler.ts +61 -21
- package/src/zip/ZipReader.ts +135 -13
- package/src/zip/errors.ts +15 -0
- package/src/zip/types.ts +44 -2
|
@@ -3,15 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SelectiveRevisionAcceptor = void 0;
|
|
4
4
|
const Revision_js_1 = require("../elements/Revision.js");
|
|
5
5
|
const RevisionContent_js_1 = require("../elements/RevisionContent.js");
|
|
6
|
+
const InMemoryRevisionAcceptor_js_1 = require("./InMemoryRevisionAcceptor.js");
|
|
6
7
|
class SelectiveRevisionAcceptor {
|
|
7
8
|
static accept(doc, criteria) {
|
|
8
9
|
const accepted = [];
|
|
9
10
|
const remaining = [];
|
|
10
11
|
const hasFullApi = typeof doc.getAllParagraphs === 'function';
|
|
11
12
|
if (hasFullApi) {
|
|
13
|
+
const acceptedMarkDeletions = [];
|
|
12
14
|
this.walkAllParagraphs(doc, (paragraph) => {
|
|
13
|
-
this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);
|
|
15
|
+
this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining, acceptedMarkDeletions);
|
|
14
16
|
});
|
|
17
|
+
if (acceptedMarkDeletions.length > 0) {
|
|
18
|
+
(0, InMemoryRevisionAcceptor_js_1.mergeParagraphsWithDeletedMarks)(doc, new Set(acceptedMarkDeletions));
|
|
19
|
+
}
|
|
15
20
|
}
|
|
16
21
|
else {
|
|
17
22
|
const revisionManager = doc.getRevisionManager();
|
|
@@ -151,19 +156,22 @@ class SelectiveRevisionAcceptor {
|
|
|
151
156
|
}
|
|
152
157
|
}
|
|
153
158
|
}
|
|
154
|
-
static processSelectiveParagraph(paragraph, criteria, action, processedIds, remainingIds) {
|
|
159
|
+
static processSelectiveParagraph(paragraph, criteria, action, processedIds, remainingIds, acceptedMarkDeletions) {
|
|
155
160
|
const content = paragraph.getContent();
|
|
156
161
|
const newContent = [];
|
|
157
162
|
for (const item of content) {
|
|
158
163
|
if (item instanceof Revision_js_1.Revision) {
|
|
159
164
|
const revisionId = item.getId().toString();
|
|
160
165
|
if (this.matchesCriteria(item, criteria)) {
|
|
161
|
-
processedIds.push(revisionId);
|
|
162
166
|
if (action === 'accept') {
|
|
167
|
+
processedIds.push(revisionId);
|
|
163
168
|
this.acceptRevisionItem(item, newContent);
|
|
164
169
|
}
|
|
170
|
+
else if (this.rejectRevisionItem(item, newContent, paragraph)) {
|
|
171
|
+
processedIds.push(revisionId);
|
|
172
|
+
}
|
|
165
173
|
else {
|
|
166
|
-
|
|
174
|
+
remainingIds.push(revisionId);
|
|
167
175
|
}
|
|
168
176
|
}
|
|
169
177
|
else {
|
|
@@ -180,6 +188,9 @@ class SelectiveRevisionAcceptor {
|
|
|
180
188
|
if (formatting.paragraphMarkDeletion) {
|
|
181
189
|
const del = formatting.paragraphMarkDeletion;
|
|
182
190
|
if (this.matchesMarkerCriteria(del, criteria)) {
|
|
191
|
+
if (action === 'accept') {
|
|
192
|
+
acceptedMarkDeletions?.push(paragraph);
|
|
193
|
+
}
|
|
183
194
|
paragraph.clearParagraphMarkDeletion();
|
|
184
195
|
processedIds.push(del.id.toString());
|
|
185
196
|
}
|
|
@@ -262,13 +273,13 @@ class SelectiveRevisionAcceptor {
|
|
|
262
273
|
newContent.push(revision);
|
|
263
274
|
}
|
|
264
275
|
}
|
|
265
|
-
static rejectRevisionItem(revision, newContent) {
|
|
276
|
+
static rejectRevisionItem(revision, newContent, paragraph) {
|
|
266
277
|
const revisionType = revision.getType();
|
|
267
278
|
const childContent = revision.getContent();
|
|
268
279
|
switch (revisionType) {
|
|
269
280
|
case 'insert':
|
|
270
281
|
case 'moveTo':
|
|
271
|
-
|
|
282
|
+
return true;
|
|
272
283
|
case 'delete':
|
|
273
284
|
case 'moveFrom':
|
|
274
285
|
for (const child of childContent) {
|
|
@@ -279,15 +290,34 @@ class SelectiveRevisionAcceptor {
|
|
|
279
290
|
newContent.push(child);
|
|
280
291
|
}
|
|
281
292
|
}
|
|
282
|
-
|
|
283
|
-
case 'runPropertiesChange':
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
293
|
+
return true;
|
|
294
|
+
case 'runPropertiesChange': {
|
|
295
|
+
const previous = revision.getPreviousProperties();
|
|
296
|
+
if (!previous) {
|
|
297
|
+
newContent.push(revision);
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
for (const child of childContent) {
|
|
301
|
+
if ((0, RevisionContent_js_1.isRunContent)(child)) {
|
|
302
|
+
const run = child;
|
|
303
|
+
run.formatting = {
|
|
304
|
+
...previous,
|
|
305
|
+
};
|
|
306
|
+
newContent.push(run);
|
|
307
|
+
}
|
|
308
|
+
else if ((0, RevisionContent_js_1.isHyperlinkContent)(child)) {
|
|
309
|
+
newContent.push(child);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
case 'paragraphPropertiesChange': {
|
|
315
|
+
const previous = revision.getPreviousProperties();
|
|
316
|
+
if (!previous) {
|
|
317
|
+
newContent.push(revision);
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
Object.assign(paragraph.formatting, previous);
|
|
291
321
|
for (const child of childContent) {
|
|
292
322
|
if ((0, RevisionContent_js_1.isRunContent)(child)) {
|
|
293
323
|
newContent.push(child);
|
|
@@ -296,13 +326,82 @@ class SelectiveRevisionAcceptor {
|
|
|
296
326
|
newContent.push(child);
|
|
297
327
|
}
|
|
298
328
|
}
|
|
299
|
-
|
|
329
|
+
return true;
|
|
330
|
+
}
|
|
331
|
+
case 'tablePropertiesChange':
|
|
332
|
+
case 'tableExceptionPropertiesChange':
|
|
333
|
+
case 'tableRowPropertiesChange':
|
|
334
|
+
case 'tableCellPropertiesChange':
|
|
335
|
+
case 'sectionPropertiesChange':
|
|
336
|
+
case 'numberingChange':
|
|
337
|
+
newContent.push(revision);
|
|
338
|
+
return false;
|
|
300
339
|
default:
|
|
301
340
|
newContent.push(revision);
|
|
341
|
+
return true;
|
|
302
342
|
}
|
|
303
343
|
}
|
|
304
344
|
static preview(doc, criteria, action) {
|
|
305
|
-
|
|
345
|
+
const processed = [];
|
|
346
|
+
const remaining = [];
|
|
347
|
+
const hasFullApi = typeof doc.getAllParagraphs === 'function';
|
|
348
|
+
if (hasFullApi) {
|
|
349
|
+
this.walkAllParagraphs(doc, (paragraph) => {
|
|
350
|
+
for (const item of paragraph.getContent()) {
|
|
351
|
+
if (item instanceof Revision_js_1.Revision) {
|
|
352
|
+
if (this.matchesCriteria(item, criteria)) {
|
|
353
|
+
processed.push(item.getId().toString());
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
remaining.push(item.getId().toString());
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
const formatting = paragraph.getFormatting();
|
|
361
|
+
if (formatting.paragraphMarkDeletion) {
|
|
362
|
+
const del = formatting.paragraphMarkDeletion;
|
|
363
|
+
if (this.matchesMarkerCriteria(del, criteria)) {
|
|
364
|
+
processed.push(del.id.toString());
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
remaining.push(del.id.toString());
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
if (formatting.paragraphMarkInsertion) {
|
|
371
|
+
const ins = formatting.paragraphMarkInsertion;
|
|
372
|
+
if (this.matchesMarkerCriteria(ins, criteria)) {
|
|
373
|
+
processed.push(ins.id.toString());
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
remaining.push(ins.id.toString());
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
else {
|
|
382
|
+
const revisionManager = doc.getRevisionManager();
|
|
383
|
+
if (revisionManager) {
|
|
384
|
+
for (const rev of revisionManager.getAllRevisions()) {
|
|
385
|
+
if (this.matchesCriteria(rev, criteria)) {
|
|
386
|
+
processed.push(rev.getId().toString());
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
remaining.push(rev.getId().toString());
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return {
|
|
395
|
+
accepted: action === 'accept' ? processed : [],
|
|
396
|
+
rejected: action === 'reject' ? processed : [],
|
|
397
|
+
remaining,
|
|
398
|
+
summary: {
|
|
399
|
+
totalProcessed: processed.length + remaining.length,
|
|
400
|
+
acceptedCount: action === 'accept' ? processed.length : 0,
|
|
401
|
+
rejectedCount: action === 'reject' ? processed.length : 0,
|
|
402
|
+
remainingCount: remaining.length,
|
|
403
|
+
},
|
|
404
|
+
};
|
|
306
405
|
}
|
|
307
406
|
static acceptByAuthor(doc, author) {
|
|
308
407
|
return this.accept(doc, { authors: [author] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectiveRevisionAcceptor.js","sourceRoot":"","sources":["../../src/processors/SelectiveRevisionAcceptor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SelectiveRevisionAcceptor - Accept or reject specific revisions based on criteria\n *\n * Provides granular control over revision acceptance using in-memory DOM transformation.\n * Extends the all-or-nothing approach with selective acceptance by author, type, date,\n * and custom criteria.\n *\n * Uses the industry-standard in-memory transformation approach (like OpenXML PowerTools),\n * allowing subsequent modifications to be saved correctly.\n *\n * @module SelectiveRevisionAcceptor\n * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs\n */\n\nimport type { Document } from '../core/Document.js';\nimport type { Paragraph, ParagraphContent } from '../elements/Paragraph.js';\nimport { Revision, RevisionType } from '../elements/Revision.js';\nimport type { Run } from '../elements/Run.js';\nimport { isRunContent, isHyperlinkContent } from '../elements/RevisionContent.js';\nimport { ChangeCategory } from './ChangelogGenerator.js';\nimport { SelectionCriteria } from './RevisionAwareProcessor.js';\n\n/**\n * Result of selective revision acceptance.\n */\nexport interface SelectiveAcceptResult {\n /** IDs of accepted revisions */\n accepted: string[];\n /** IDs of rejected/removed revisions */\n rejected: string[];\n /** IDs of revisions that remain */\n remaining: string[];\n /** Summary of actions taken */\n summary: {\n totalProcessed: number;\n acceptedCount: number;\n rejectedCount: number;\n remainingCount: number;\n };\n}\n\n/**\n * Provides granular control over revision acceptance using in-memory DOM transformation.\n * Allows subsequent modifications to be saved correctly.\n */\nexport class SelectiveRevisionAcceptor {\n /**\n * Accept revisions matching criteria using in-memory DOM transformation.\n * Matching revisions: content kept, revision wrapper removed.\n * Non-matching revisions: preserved in the document.\n *\n * @param doc - Document to process\n * @param criteria - Selection criteria\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static accept(doc: Document, criteria: SelectionCriteria): SelectiveAcceptResult {\n const accepted: string[] = [];\n const remaining: string[] = [];\n\n // Check if doc has full Document API (getAllParagraphs, getTables)\n // or if it's a minimal mock (only getRevisionManager)\n const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';\n\n if (hasFullApi) {\n this.walkAllParagraphs(doc, (paragraph) => {\n this.processSelectiveParagraph(paragraph, criteria, 'accept', accepted, remaining);\n });\n } else {\n // Fallback: Filter revisions from RevisionManager only (for backward compatibility)\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n const allRevisions = revisionManager.getAllRevisions();\n for (const rev of allRevisions) {\n if (this.matchesCriteria(rev, criteria)) {\n accepted.push(rev.getId().toString());\n } else {\n remaining.push(rev.getId().toString());\n }\n }\n }\n }\n\n // Clear accepted revisions from RevisionManager\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n for (const id of accepted) {\n revisionManager.removeById(parseInt(id, 10));\n }\n }\n\n return {\n accepted,\n rejected: [],\n remaining,\n summary: {\n totalProcessed: accepted.length + remaining.length,\n acceptedCount: accepted.length,\n rejectedCount: 0,\n remainingCount: remaining.length,\n },\n };\n }\n\n /**\n * Reject revisions matching criteria using in-memory DOM transformation.\n * Matching revisions: content AND wrapper removed (opposite of accept).\n * Non-matching revisions: preserved in the document.\n *\n * For insertions: Rejecting removes the inserted content entirely.\n * For deletions: Rejecting keeps the deleted content (opposite of accepting).\n *\n * @param doc - Document to process\n * @param criteria - Selection criteria\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static reject(doc: Document, criteria: SelectionCriteria): SelectiveAcceptResult {\n const rejected: string[] = [];\n const remaining: string[] = [];\n\n // Check if doc has full Document API (getAllParagraphs, getTables)\n // or if it's a minimal mock (only getRevisionManager)\n const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';\n\n if (hasFullApi) {\n this.walkAllParagraphs(doc, (paragraph) => {\n this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);\n });\n } else {\n // Fallback: Filter revisions from RevisionManager only (for backward compatibility)\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n const allRevisions = revisionManager.getAllRevisions();\n for (const rev of allRevisions) {\n if (this.matchesCriteria(rev, criteria)) {\n rejected.push(rev.getId().toString());\n } else {\n remaining.push(rev.getId().toString());\n }\n }\n }\n }\n\n // Clear rejected revisions from RevisionManager\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n for (const id of rejected) {\n revisionManager.removeById(parseInt(id, 10));\n }\n }\n\n return {\n accepted: [],\n rejected,\n remaining,\n summary: {\n totalProcessed: rejected.length + remaining.length,\n acceptedCount: 0,\n rejectedCount: rejected.length,\n remainingCount: remaining.length,\n },\n };\n }\n\n /**\n * Walk every paragraph that can carry tracked-change content per\n * ECMA-376: body, tables (recursively), headers, footers, footnotes,\n * and endnotes. Mirrors the in-memory acceptor traversal so\n * selective accept / reject covers the same surface as\n * `acceptRevisionsInMemory`. Comments are deliberately excluded —\n * `Comment` stores `Run[]` rather than `Paragraph[]`, so revisions\n * are never represented in the in-memory model and must be cleaned\n * via the raw-XML path on load.\n */\n private static walkAllParagraphs(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n doc: any,\n visit: (paragraph: Paragraph) => void\n ): void {\n // Body paragraphs\n for (const paragraph of doc.getAllParagraphs()) {\n visit(paragraph);\n }\n\n // Tables (body-level)\n for (const table of doc.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n visit(paragraph);\n }\n }\n }\n }\n\n // Headers and footers\n const hfManager = doc.getHeaderFooterManager?.();\n if (hfManager) {\n for (const headerEntry of hfManager.getAllHeaders()) {\n for (const element of headerEntry.header.getElements()) {\n if (typeof element.getContent === 'function' && typeof element.getRuns === 'function') {\n // Paragraph\n visit(element);\n } else if (typeof element.getRows === 'function') {\n // Table\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n visit(paragraph);\n }\n }\n }\n }\n }\n }\n for (const footerEntry of hfManager.getAllFooters()) {\n for (const element of footerEntry.footer.getElements()) {\n if (typeof element.getContent === 'function' && typeof element.getRuns === 'function') {\n visit(element);\n } else if (typeof element.getRows === 'function') {\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n visit(paragraph);\n }\n }\n }\n }\n }\n }\n }\n\n // Footnotes and endnotes\n const footnoteManager = doc.getFootnoteManager?.();\n if (footnoteManager) {\n for (const fn of footnoteManager.getAllFootnotes()) {\n for (const paragraph of fn.getParagraphs()) {\n visit(paragraph);\n }\n }\n }\n const endnoteManager = doc.getEndnoteManager?.();\n if (endnoteManager) {\n for (const en of endnoteManager.getAllEndnotes()) {\n for (const paragraph of en.getParagraphs()) {\n visit(paragraph);\n }\n }\n }\n }\n\n /**\n * Process a paragraph for selective revision acceptance/rejection.\n * Transforms matching revisions in-place using DOM transformation.\n */\n private static processSelectiveParagraph(\n paragraph: Paragraph,\n criteria: SelectionCriteria,\n action: 'accept' | 'reject',\n processedIds: string[],\n remainingIds: string[]\n ): void {\n const content = paragraph.getContent();\n const newContent: ParagraphContent[] = [];\n\n for (const item of content) {\n if (item instanceof Revision) {\n const revisionId = item.getId().toString();\n\n if (this.matchesCriteria(item, criteria)) {\n // This revision matches the criteria - process it\n processedIds.push(revisionId);\n\n if (action === 'accept') {\n // Accept: Transform based on revision type\n this.acceptRevisionItem(item, newContent);\n } else {\n // Reject: Transform opposite of accept\n this.rejectRevisionItem(item, newContent);\n }\n } else {\n // This revision doesn't match - keep it\n remainingIds.push(revisionId);\n newContent.push(item);\n }\n } else {\n // Non-revision content - keep as-is\n newContent.push(item);\n }\n }\n\n // Replace paragraph content with the transformed content\n paragraph.setContent(newContent);\n\n // Handle paragraph mark revision markers (w:del/w:ins in w:pPr/w:rPr)\n // Both accept and reject clear the marker — these are metadata-only markers (no content),\n // so there is no content to add or remove, only the marker itself to clear.\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkDeletion) {\n const del = formatting.paragraphMarkDeletion;\n if (this.matchesMarkerCriteria(del, criteria)) {\n paragraph.clearParagraphMarkDeletion();\n processedIds.push(del.id.toString());\n } else {\n remainingIds.push(del.id.toString());\n }\n }\n if (formatting.paragraphMarkInsertion) {\n const ins = formatting.paragraphMarkInsertion;\n if (this.matchesMarkerCriteria(ins, criteria)) {\n paragraph.clearParagraphMarkInsertion();\n processedIds.push(ins.id.toString());\n } else {\n remainingIds.push(ins.id.toString());\n }\n }\n }\n\n /**\n * Check if a paragraph mark revision marker matches the given criteria.\n * Simplified version of matchesCriteria for non-Revision marker objects.\n */\n private static matchesMarkerCriteria(\n marker: { id: number; author: string; date: Date },\n criteria: SelectionCriteria\n ): boolean {\n // If no criteria specified, match nothing\n if (\n !criteria.ids &&\n !criteria.types &&\n !criteria.authors &&\n !criteria.dateRange &&\n !criteria.categories &&\n !criteria.custom\n ) {\n return false;\n }\n\n // Filter by IDs\n if (criteria.ids && !criteria.ids.includes(marker.id)) {\n return false;\n }\n\n // Filter by authors\n if (criteria.authors && !criteria.authors.includes(marker.author)) {\n return false;\n }\n\n // Filter by date range\n if (criteria.dateRange) {\n if (marker.date < criteria.dateRange.start || marker.date > criteria.dateRange.end) {\n return false;\n }\n }\n\n // types, categories, and custom filters don't apply to paragraph mark markers\n // (they are not Revision objects with a type/category)\n // If criteria only specifies types/categories/custom, markers won't match\n if (criteria.types || criteria.categories || criteria.custom) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Accept a single revision item (unwrap insertions, remove deletions).\n */\n private static acceptRevisionItem(revision: Revision, newContent: ParagraphContent[]): void {\n const revisionType = revision.getType();\n const childContent = revision.getContent();\n\n switch (revisionType) {\n case 'insert':\n case 'moveTo':\n // Unwrap: Extract child content into parent position\n for (const child of childContent) {\n if (isRunContent(child)) {\n newContent.push(child as Run);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n break;\n\n case 'delete':\n case 'moveFrom':\n // Remove: Don't add to newContent - content is deleted\n break;\n\n case 'runPropertiesChange':\n case 'paragraphPropertiesChange':\n case 'tablePropertiesChange':\n case 'tableExceptionPropertiesChange':\n case 'tableRowPropertiesChange':\n case 'tableCellPropertiesChange':\n case 'sectionPropertiesChange':\n case 'numberingChange':\n // Property changes: Keep content, remove change metadata\n for (const child of childContent) {\n if (isRunContent(child)) {\n newContent.push(child as Run);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n break;\n\n default:\n // Unknown type - keep the revision as-is for safety\n newContent.push(revision);\n }\n }\n\n /**\n * Reject a single revision item (opposite of accept).\n * - Rejecting an insertion removes the content\n * - Rejecting a deletion keeps the content (unwraps it)\n */\n private static rejectRevisionItem(revision: Revision, newContent: ParagraphContent[]): void {\n const revisionType = revision.getType();\n const childContent = revision.getContent();\n\n switch (revisionType) {\n case 'insert':\n case 'moveTo':\n // Reject insertion: Remove the inserted content entirely\n break;\n\n case 'delete':\n case 'moveFrom':\n // Reject deletion: Keep the deleted content (unwrap)\n for (const child of childContent) {\n if (isRunContent(child)) {\n newContent.push(child as Run);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n break;\n\n case 'runPropertiesChange':\n case 'paragraphPropertiesChange':\n case 'tablePropertiesChange':\n case 'tableExceptionPropertiesChange':\n case 'tableRowPropertiesChange':\n case 'tableCellPropertiesChange':\n case 'sectionPropertiesChange':\n case 'numberingChange':\n // Rejecting property changes: Would need to restore old properties\n // For now, just keep content without the change metadata\n // (Full implementation would restore previousProperties)\n for (const child of childContent) {\n if (isRunContent(child)) {\n newContent.push(child as Run);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n break;\n\n default:\n // Unknown type - keep the revision as-is for safety\n newContent.push(revision);\n }\n }\n\n /**\n * Preview what would happen without making changes.\n *\n * @param doc - Document to analyze\n * @param criteria - Selection criteria\n * @param action - Action to preview\n * @returns Preview of what would happen\n */\n static preview(\n doc: Document,\n criteria: SelectionCriteria,\n action: 'accept' | 'reject'\n ): SelectiveAcceptResult {\n // Preview is the same as the actual operation but without side effects\n return action === 'accept' ? this.accept(doc, criteria) : this.reject(doc, criteria);\n }\n\n /**\n * Accept all revisions by a specific author.\n *\n * @param doc - Document to process\n * @param author - Author name to accept\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptByAuthor(doc: Document, author: string): SelectiveAcceptResult {\n return this.accept(doc, { authors: [author] });\n }\n\n /**\n * Reject all revisions by a specific author.\n *\n * @param doc - Document to process\n * @param author - Author name to reject\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static rejectByAuthor(doc: Document, author: string): SelectiveAcceptResult {\n return this.reject(doc, { authors: [author] });\n }\n\n /**\n * Accept all revisions of specific types.\n *\n * @param doc - Document to process\n * @param types - Revision types to accept\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptByType(doc: Document, types: RevisionType[]): SelectiveAcceptResult {\n return this.accept(doc, { types });\n }\n\n /**\n * Reject all revisions of specific types.\n *\n * @param doc - Document to process\n * @param types - Revision types to reject\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static rejectByType(doc: Document, types: RevisionType[]): SelectiveAcceptResult {\n return this.reject(doc, { types });\n }\n\n /**\n * Accept all revisions before a specific date.\n *\n * @param doc - Document to process\n * @param date - Cutoff date (exclusive)\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptBeforeDate(doc: Document, date: Date): SelectiveAcceptResult {\n return this.accept(doc, {\n dateRange: { start: new Date(0), end: date },\n });\n }\n\n /**\n * Accept all revisions after a specific date.\n *\n * @param doc - Document to process\n * @param date - Start date (exclusive)\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptAfterDate(doc: Document, date: Date): SelectiveAcceptResult {\n return this.accept(doc, {\n dateRange: { start: date, end: new Date() },\n });\n }\n\n /**\n * Accept all insertions only.\n *\n * @param doc - Document to process\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptInsertionsOnly(doc: Document): SelectiveAcceptResult {\n return this.accept(doc, { types: ['insert'] });\n }\n\n /**\n * Accept all deletions only.\n *\n * @param doc - Document to process\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptDeletionsOnly(doc: Document): SelectiveAcceptResult {\n return this.accept(doc, { types: ['delete'] });\n }\n\n /**\n * Reject all formatting changes (keep content changes).\n *\n * @param doc - Document to process\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static rejectFormattingChanges(doc: Document): SelectiveAcceptResult {\n return this.reject(doc, { categories: ['formatting'] });\n }\n\n /**\n * Accept content changes only (reject formatting).\n *\n * @param doc - Document to process\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptContentChangesOnly(doc: Document): SelectiveAcceptResult {\n return this.accept(doc, { categories: ['content'] });\n }\n\n /**\n * Check if a revision matches the given criteria.\n */\n private static matchesCriteria(revision: Revision, criteria: SelectionCriteria): boolean {\n // If no criteria specified, match nothing\n if (\n !criteria.ids &&\n !criteria.types &&\n !criteria.authors &&\n !criteria.dateRange &&\n !criteria.categories &&\n !criteria.custom\n ) {\n return false;\n }\n\n // Filter by IDs\n if (criteria.ids && !criteria.ids.includes(revision.getId())) {\n return false;\n }\n\n // Filter by types\n if (criteria.types && !criteria.types.includes(revision.getType())) {\n return false;\n }\n\n // Filter by authors\n if (criteria.authors && !criteria.authors.includes(revision.getAuthor())) {\n return false;\n }\n\n // Filter by date range\n if (criteria.dateRange) {\n const date = revision.getDate();\n if (date < criteria.dateRange.start || date > criteria.dateRange.end) {\n return false;\n }\n }\n\n // Filter by categories\n if (criteria.categories) {\n const category = this.getRevisionCategory(revision);\n if (!criteria.categories.includes(category)) {\n return false;\n }\n }\n\n // Custom filter\n if (criteria.custom && !criteria.custom(revision)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Get the semantic category of a revision.\n */\n private static getRevisionCategory(revision: Revision): ChangeCategory {\n const type = revision.getType();\n\n if (type === 'insert' || type === 'delete') {\n return 'content';\n }\n if (\n type === 'runPropertiesChange' ||\n type === 'paragraphPropertiesChange' ||\n type === 'numberingChange'\n ) {\n return 'formatting';\n }\n if (type === 'moveFrom' || type === 'moveTo' || type === 'sectionPropertiesChange') {\n return 'structural';\n }\n if (\n type === 'tablePropertiesChange' ||\n type === 'tableExceptionPropertiesChange' ||\n type === 'tableRowPropertiesChange' ||\n type === 'tableCellPropertiesChange' ||\n type === 'tableCellInsert' ||\n type === 'tableCellDelete' ||\n type === 'tableCellMerge'\n ) {\n return 'table';\n }\n\n return 'content';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SelectiveRevisionAcceptor.js","sourceRoot":"","sources":["../../src/processors/SelectiveRevisionAcceptor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SelectiveRevisionAcceptor - Accept or reject specific revisions based on criteria\n *\n * Provides granular control over revision acceptance using in-memory DOM transformation.\n * Extends the all-or-nothing approach with selective acceptance by author, type, date,\n * and custom criteria.\n *\n * Uses the industry-standard in-memory transformation approach (like OpenXML PowerTools),\n * allowing subsequent modifications to be saved correctly.\n *\n * @module SelectiveRevisionAcceptor\n * @see https://github.com/OfficeDev/Open-Xml-PowerTools - RevisionAccepter.cs\n */\n\nimport type { Document } from '../core/Document.js';\nimport type { Paragraph, ParagraphContent } from '../elements/Paragraph.js';\nimport { Revision, RevisionType } from '../elements/Revision.js';\nimport type { Run, RunFormatting } from '../elements/Run.js';\nimport { isRunContent, isHyperlinkContent } from '../elements/RevisionContent.js';\nimport { ChangeCategory } from './ChangelogGenerator.js';\nimport { SelectionCriteria } from './RevisionAwareProcessor.js';\nimport { mergeParagraphsWithDeletedMarks } from './InMemoryRevisionAcceptor.js';\n\n/**\n * Result of selective revision acceptance.\n */\nexport interface SelectiveAcceptResult {\n /** IDs of accepted revisions */\n accepted: string[];\n /** IDs of rejected/removed revisions */\n rejected: string[];\n /** IDs of revisions that remain */\n remaining: string[];\n /** Summary of actions taken */\n summary: {\n totalProcessed: number;\n acceptedCount: number;\n rejectedCount: number;\n remainingCount: number;\n };\n}\n\n/**\n * Provides granular control over revision acceptance using in-memory DOM transformation.\n * Allows subsequent modifications to be saved correctly.\n */\nexport class SelectiveRevisionAcceptor {\n /**\n * Accept revisions matching criteria using in-memory DOM transformation.\n * Matching revisions: content kept, revision wrapper removed.\n * Non-matching revisions: preserved in the document.\n *\n * @param doc - Document to process\n * @param criteria - Selection criteria\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static accept(doc: Document, criteria: SelectionCriteria): SelectiveAcceptResult {\n const accepted: string[] = [];\n const remaining: string[] = [];\n\n // Check if doc has full Document API (getAllParagraphs, getTables)\n // or if it's a minimal mock (only getRevisionManager)\n const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';\n\n if (hasFullApi) {\n const acceptedMarkDeletions: Paragraph[] = [];\n this.walkAllParagraphs(doc, (paragraph) => {\n this.processSelectiveParagraph(\n paragraph,\n criteria,\n 'accept',\n accepted,\n remaining,\n acceptedMarkDeletions\n );\n });\n // Accepted paragraph-mark deletions combine the paragraph with its\n // following sibling (ECMA-376 §17.13.5.15) — same merge the all-or-\n // nothing acceptor performs.\n if (acceptedMarkDeletions.length > 0) {\n mergeParagraphsWithDeletedMarks(doc, new Set(acceptedMarkDeletions));\n }\n } else {\n // Fallback: Filter revisions from RevisionManager only (for backward compatibility)\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n const allRevisions = revisionManager.getAllRevisions();\n for (const rev of allRevisions) {\n if (this.matchesCriteria(rev, criteria)) {\n accepted.push(rev.getId().toString());\n } else {\n remaining.push(rev.getId().toString());\n }\n }\n }\n }\n\n // Clear accepted revisions from RevisionManager\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n for (const id of accepted) {\n revisionManager.removeById(parseInt(id, 10));\n }\n }\n\n return {\n accepted,\n rejected: [],\n remaining,\n summary: {\n totalProcessed: accepted.length + remaining.length,\n acceptedCount: accepted.length,\n rejectedCount: 0,\n remainingCount: remaining.length,\n },\n };\n }\n\n /**\n * Reject revisions matching criteria using in-memory DOM transformation.\n * Matching revisions: content AND wrapper removed (opposite of accept).\n * Non-matching revisions: preserved in the document.\n *\n * For insertions: Rejecting removes the inserted content entirely.\n * For deletions: Rejecting keeps the deleted content (opposite of accepting).\n *\n * @param doc - Document to process\n * @param criteria - Selection criteria\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static reject(doc: Document, criteria: SelectionCriteria): SelectiveAcceptResult {\n const rejected: string[] = [];\n const remaining: string[] = [];\n\n // Check if doc has full Document API (getAllParagraphs, getTables)\n // or if it's a minimal mock (only getRevisionManager)\n const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';\n\n if (hasFullApi) {\n this.walkAllParagraphs(doc, (paragraph) => {\n this.processSelectiveParagraph(paragraph, criteria, 'reject', rejected, remaining);\n });\n } else {\n // Fallback: Filter revisions from RevisionManager only (for backward compatibility)\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n const allRevisions = revisionManager.getAllRevisions();\n for (const rev of allRevisions) {\n if (this.matchesCriteria(rev, criteria)) {\n rejected.push(rev.getId().toString());\n } else {\n remaining.push(rev.getId().toString());\n }\n }\n }\n }\n\n // Clear rejected revisions from RevisionManager\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n for (const id of rejected) {\n revisionManager.removeById(parseInt(id, 10));\n }\n }\n\n return {\n accepted: [],\n rejected,\n remaining,\n summary: {\n totalProcessed: rejected.length + remaining.length,\n acceptedCount: 0,\n rejectedCount: rejected.length,\n remainingCount: remaining.length,\n },\n };\n }\n\n /**\n * Walk every paragraph that can carry tracked-change content per\n * ECMA-376: body, tables (recursively), headers, footers, footnotes,\n * and endnotes. Mirrors the in-memory acceptor traversal so\n * selective accept / reject covers the same surface as\n * `acceptRevisionsInMemory`. Comments are deliberately excluded —\n * `Comment` stores `Run[]` rather than `Paragraph[]`, so revisions\n * are never represented in the in-memory model and must be cleaned\n * via the raw-XML path on load.\n */\n private static walkAllParagraphs(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n doc: any,\n visit: (paragraph: Paragraph) => void\n ): void {\n // Body paragraphs\n for (const paragraph of doc.getAllParagraphs()) {\n visit(paragraph);\n }\n\n // Tables (body-level)\n for (const table of doc.getTables()) {\n for (const row of table.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n visit(paragraph);\n }\n }\n }\n }\n\n // Headers and footers\n const hfManager = doc.getHeaderFooterManager?.();\n if (hfManager) {\n for (const headerEntry of hfManager.getAllHeaders()) {\n for (const element of headerEntry.header.getElements()) {\n if (typeof element.getContent === 'function' && typeof element.getRuns === 'function') {\n // Paragraph\n visit(element);\n } else if (typeof element.getRows === 'function') {\n // Table\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n visit(paragraph);\n }\n }\n }\n }\n }\n }\n for (const footerEntry of hfManager.getAllFooters()) {\n for (const element of footerEntry.footer.getElements()) {\n if (typeof element.getContent === 'function' && typeof element.getRuns === 'function') {\n visit(element);\n } else if (typeof element.getRows === 'function') {\n for (const row of element.getRows()) {\n for (const cell of row.getCells()) {\n for (const paragraph of cell.getParagraphs()) {\n visit(paragraph);\n }\n }\n }\n }\n }\n }\n }\n\n // Footnotes and endnotes\n const footnoteManager = doc.getFootnoteManager?.();\n if (footnoteManager) {\n for (const fn of footnoteManager.getAllFootnotes()) {\n for (const paragraph of fn.getParagraphs()) {\n visit(paragraph);\n }\n }\n }\n const endnoteManager = doc.getEndnoteManager?.();\n if (endnoteManager) {\n for (const en of endnoteManager.getAllEndnotes()) {\n for (const paragraph of en.getParagraphs()) {\n visit(paragraph);\n }\n }\n }\n }\n\n /**\n * Process a paragraph for selective revision acceptance/rejection.\n * Transforms matching revisions in-place using DOM transformation.\n */\n private static processSelectiveParagraph(\n paragraph: Paragraph,\n criteria: SelectionCriteria,\n action: 'accept' | 'reject',\n processedIds: string[],\n remainingIds: string[],\n acceptedMarkDeletions?: Paragraph[]\n ): void {\n const content = paragraph.getContent();\n const newContent: ParagraphContent[] = [];\n\n for (const item of content) {\n if (item instanceof Revision) {\n const revisionId = item.getId().toString();\n\n if (this.matchesCriteria(item, criteria)) {\n if (action === 'accept') {\n // Accept: Transform based on revision type\n processedIds.push(revisionId);\n this.acceptRevisionItem(item, newContent);\n } else if (this.rejectRevisionItem(item, newContent, paragraph)) {\n // Reject: Transform opposite of accept\n processedIds.push(revisionId);\n } else {\n // The revision was kept in place (its previous-property\n // snapshot could not be restored), so report it as remaining\n // rather than rejected — it must stay in the RevisionManager.\n remainingIds.push(revisionId);\n }\n } else {\n // This revision doesn't match - keep it\n remainingIds.push(revisionId);\n newContent.push(item);\n }\n } else {\n // Non-revision content - keep as-is\n newContent.push(item);\n }\n }\n\n // Replace paragraph content with the transformed content\n paragraph.setContent(newContent);\n\n // Handle paragraph mark revision markers (w:del/w:ins in w:pPr/w:rPr).\n // Rejecting a mark deletion just restores the mark (clear the marker);\n // ACCEPTING one means the paragraph's contents combine with the following\n // paragraph (ECMA-376 §17.13.5.15), so the paragraph is recorded for the\n // post-walk merge pass in addition to clearing the marker.\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkDeletion) {\n const del = formatting.paragraphMarkDeletion;\n if (this.matchesMarkerCriteria(del, criteria)) {\n if (action === 'accept') {\n acceptedMarkDeletions?.push(paragraph);\n }\n paragraph.clearParagraphMarkDeletion();\n processedIds.push(del.id.toString());\n } else {\n remainingIds.push(del.id.toString());\n }\n }\n if (formatting.paragraphMarkInsertion) {\n const ins = formatting.paragraphMarkInsertion;\n if (this.matchesMarkerCriteria(ins, criteria)) {\n paragraph.clearParagraphMarkInsertion();\n processedIds.push(ins.id.toString());\n } else {\n remainingIds.push(ins.id.toString());\n }\n }\n }\n\n /**\n * Check if a paragraph mark revision marker matches the given criteria.\n * Simplified version of matchesCriteria for non-Revision marker objects.\n */\n private static matchesMarkerCriteria(\n marker: { id: number; author: string; date: Date },\n criteria: SelectionCriteria\n ): boolean {\n // If no criteria specified, match nothing\n if (\n !criteria.ids &&\n !criteria.types &&\n !criteria.authors &&\n !criteria.dateRange &&\n !criteria.categories &&\n !criteria.custom\n ) {\n return false;\n }\n\n // Filter by IDs\n if (criteria.ids && !criteria.ids.includes(marker.id)) {\n return false;\n }\n\n // Filter by authors\n if (criteria.authors && !criteria.authors.includes(marker.author)) {\n return false;\n }\n\n // Filter by date range\n if (criteria.dateRange) {\n if (marker.date < criteria.dateRange.start || marker.date > criteria.dateRange.end) {\n return false;\n }\n }\n\n // types, categories, and custom filters don't apply to paragraph mark markers\n // (they are not Revision objects with a type/category)\n // If criteria only specifies types/categories/custom, markers won't match\n if (criteria.types || criteria.categories || criteria.custom) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Accept a single revision item (unwrap insertions, remove deletions).\n */\n private static acceptRevisionItem(revision: Revision, newContent: ParagraphContent[]): void {\n const revisionType = revision.getType();\n const childContent = revision.getContent();\n\n switch (revisionType) {\n case 'insert':\n case 'moveTo':\n // Unwrap: Extract child content into parent position\n for (const child of childContent) {\n if (isRunContent(child)) {\n newContent.push(child as Run);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n break;\n\n case 'delete':\n case 'moveFrom':\n // Remove: Don't add to newContent - content is deleted\n break;\n\n case 'runPropertiesChange':\n case 'paragraphPropertiesChange':\n case 'tablePropertiesChange':\n case 'tableExceptionPropertiesChange':\n case 'tableRowPropertiesChange':\n case 'tableCellPropertiesChange':\n case 'sectionPropertiesChange':\n case 'numberingChange':\n // Property changes: Keep content, remove change metadata\n for (const child of childContent) {\n if (isRunContent(child)) {\n newContent.push(child as Run);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n break;\n\n default:\n // Unknown type - keep the revision as-is for safety\n newContent.push(revision);\n }\n }\n\n /**\n * Reject a single revision item (opposite of accept).\n * - Rejecting an insertion removes the content\n * - Rejecting a deletion keeps the content (unwraps it)\n * - Rejecting a run/paragraph property change restores the previous\n * properties snapshot (ECMA-376 §17.13.5.30/§17.13.5.31)\n *\n * @returns true if the revision was rejected, false if it was kept in\n * place because its previous-property snapshot could not be restored\n */\n private static rejectRevisionItem(\n revision: Revision,\n newContent: ParagraphContent[],\n paragraph: Paragraph\n ): boolean {\n const revisionType = revision.getType();\n const childContent = revision.getContent();\n\n switch (revisionType) {\n case 'insert':\n case 'moveTo':\n // Reject insertion: Remove the inserted content entirely\n return true;\n\n case 'delete':\n case 'moveFrom':\n // Reject deletion: Keep the deleted content (unwrap)\n for (const child of childContent) {\n if (isRunContent(child)) {\n newContent.push(child as Run);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n return true;\n\n case 'runPropertiesChange': {\n const previous = revision.getPreviousProperties();\n if (!previous) {\n // No snapshot to restore from — keep the tracked change so the\n // prior formatting is not silently lost.\n newContent.push(revision);\n return false;\n }\n for (const child of childContent) {\n if (isRunContent(child)) {\n const run = child as Run;\n // w:rPrChange carries the complete pre-change run properties,\n // so rejecting replaces (not merges) the run's formatting.\n // Run.formatting is private; written directly the same way\n // DocumentParser populates parsed properties.\n (run as unknown as { formatting: RunFormatting }).formatting = {\n ...(previous as RunFormatting),\n };\n newContent.push(run);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n return true;\n }\n\n case 'paragraphPropertiesChange': {\n const previous = revision.getPreviousProperties();\n if (!previous) {\n newContent.push(revision);\n return false;\n }\n // The snapshot uses the same key names as ParagraphFormatting\n // (see Revision.PROPERTY_KEY_TO_ELEMENT), so the recorded values\n // are written back onto the containing paragraph. Only recorded\n // keys are touched: internal bookkeeping fields (revision markers,\n // paraId) are not part of a w:pPrChange snapshot.\n Object.assign(paragraph.formatting, previous);\n for (const child of childContent) {\n if (isRunContent(child)) {\n newContent.push(child as Run);\n } else if (isHyperlinkContent(child)) {\n newContent.push(child);\n }\n }\n return true;\n }\n\n case 'tablePropertiesChange':\n case 'tableExceptionPropertiesChange':\n case 'tableRowPropertiesChange':\n case 'tableCellPropertiesChange':\n case 'sectionPropertiesChange':\n case 'numberingChange':\n // The element these snapshots belong to (table/row/cell/section/\n // numbering definition) is not reachable from paragraph content,\n // so the previous properties cannot be restored here. Keep the\n // revision in place rather than discarding the snapshot.\n newContent.push(revision);\n return false;\n\n default:\n // Unknown type - keep the revision as-is for safety\n newContent.push(revision);\n return true;\n }\n }\n\n /**\n * Preview what would happen without making changes.\n *\n * @param doc - Document to analyze\n * @param criteria - Selection criteria\n * @param action - Action to preview\n * @returns Preview of what would happen\n */\n static preview(\n doc: Document,\n criteria: SelectionCriteria,\n action: 'accept' | 'reject'\n ): SelectiveAcceptResult {\n const processed: string[] = [];\n const remaining: string[] = [];\n\n // Delegating to accept()/reject() would mutate paragraph content and\n // splice revisions out of the RevisionManager, so preview classifies\n // with the same traversal and criteria but never transforms anything.\n const hasFullApi = typeof (doc as any).getAllParagraphs === 'function';\n\n if (hasFullApi) {\n this.walkAllParagraphs(doc, (paragraph) => {\n for (const item of paragraph.getContent()) {\n if (item instanceof Revision) {\n if (this.matchesCriteria(item, criteria)) {\n processed.push(item.getId().toString());\n } else {\n remaining.push(item.getId().toString());\n }\n }\n }\n\n const formatting = paragraph.getFormatting();\n if (formatting.paragraphMarkDeletion) {\n const del = formatting.paragraphMarkDeletion;\n if (this.matchesMarkerCriteria(del, criteria)) {\n processed.push(del.id.toString());\n } else {\n remaining.push(del.id.toString());\n }\n }\n if (formatting.paragraphMarkInsertion) {\n const ins = formatting.paragraphMarkInsertion;\n if (this.matchesMarkerCriteria(ins, criteria)) {\n processed.push(ins.id.toString());\n } else {\n remaining.push(ins.id.toString());\n }\n }\n });\n } else {\n // Fallback: Filter revisions from RevisionManager only (for backward compatibility)\n const revisionManager = doc.getRevisionManager();\n if (revisionManager) {\n for (const rev of revisionManager.getAllRevisions()) {\n if (this.matchesCriteria(rev, criteria)) {\n processed.push(rev.getId().toString());\n } else {\n remaining.push(rev.getId().toString());\n }\n }\n }\n }\n\n return {\n accepted: action === 'accept' ? processed : [],\n rejected: action === 'reject' ? processed : [],\n remaining,\n summary: {\n totalProcessed: processed.length + remaining.length,\n acceptedCount: action === 'accept' ? processed.length : 0,\n rejectedCount: action === 'reject' ? processed.length : 0,\n remainingCount: remaining.length,\n },\n };\n }\n\n /**\n * Accept all revisions by a specific author.\n *\n * @param doc - Document to process\n * @param author - Author name to accept\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptByAuthor(doc: Document, author: string): SelectiveAcceptResult {\n return this.accept(doc, { authors: [author] });\n }\n\n /**\n * Reject all revisions by a specific author.\n *\n * @param doc - Document to process\n * @param author - Author name to reject\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static rejectByAuthor(doc: Document, author: string): SelectiveAcceptResult {\n return this.reject(doc, { authors: [author] });\n }\n\n /**\n * Accept all revisions of specific types.\n *\n * @param doc - Document to process\n * @param types - Revision types to accept\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptByType(doc: Document, types: RevisionType[]): SelectiveAcceptResult {\n return this.accept(doc, { types });\n }\n\n /**\n * Reject all revisions of specific types.\n *\n * @param doc - Document to process\n * @param types - Revision types to reject\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static rejectByType(doc: Document, types: RevisionType[]): SelectiveAcceptResult {\n return this.reject(doc, { types });\n }\n\n /**\n * Accept all revisions before a specific date.\n *\n * @param doc - Document to process\n * @param date - Cutoff date (exclusive)\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptBeforeDate(doc: Document, date: Date): SelectiveAcceptResult {\n return this.accept(doc, {\n dateRange: { start: new Date(0), end: date },\n });\n }\n\n /**\n * Accept all revisions after a specific date.\n *\n * @param doc - Document to process\n * @param date - Start date (exclusive)\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptAfterDate(doc: Document, date: Date): SelectiveAcceptResult {\n return this.accept(doc, {\n dateRange: { start: date, end: new Date() },\n });\n }\n\n /**\n * Accept all insertions only.\n *\n * @param doc - Document to process\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptInsertionsOnly(doc: Document): SelectiveAcceptResult {\n return this.accept(doc, { types: ['insert'] });\n }\n\n /**\n * Accept all deletions only.\n *\n * @param doc - Document to process\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptDeletionsOnly(doc: Document): SelectiveAcceptResult {\n return this.accept(doc, { types: ['delete'] });\n }\n\n /**\n * Reject all formatting changes (keep content changes).\n *\n * @param doc - Document to process\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static rejectFormattingChanges(doc: Document): SelectiveAcceptResult {\n return this.reject(doc, { categories: ['formatting'] });\n }\n\n /**\n * Accept content changes only (reject formatting).\n *\n * @param doc - Document to process\n * @returns Result with accepted, rejected, and remaining revision IDs\n */\n static acceptContentChangesOnly(doc: Document): SelectiveAcceptResult {\n return this.accept(doc, { categories: ['content'] });\n }\n\n /**\n * Check if a revision matches the given criteria.\n */\n private static matchesCriteria(revision: Revision, criteria: SelectionCriteria): boolean {\n // If no criteria specified, match nothing\n if (\n !criteria.ids &&\n !criteria.types &&\n !criteria.authors &&\n !criteria.dateRange &&\n !criteria.categories &&\n !criteria.custom\n ) {\n return false;\n }\n\n // Filter by IDs\n if (criteria.ids && !criteria.ids.includes(revision.getId())) {\n return false;\n }\n\n // Filter by types\n if (criteria.types && !criteria.types.includes(revision.getType())) {\n return false;\n }\n\n // Filter by authors\n if (criteria.authors && !criteria.authors.includes(revision.getAuthor())) {\n return false;\n }\n\n // Filter by date range\n if (criteria.dateRange) {\n const date = revision.getDate();\n if (date < criteria.dateRange.start || date > criteria.dateRange.end) {\n return false;\n }\n }\n\n // Filter by categories\n if (criteria.categories) {\n const category = this.getRevisionCategory(revision);\n if (!criteria.categories.includes(category)) {\n return false;\n }\n }\n\n // Custom filter\n if (criteria.custom && !criteria.custom(revision)) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Get the semantic category of a revision.\n */\n private static getRevisionCategory(revision: Revision): ChangeCategory {\n const type = revision.getType();\n\n if (type === 'insert' || type === 'delete') {\n return 'content';\n }\n if (\n type === 'runPropertiesChange' ||\n type === 'paragraphPropertiesChange' ||\n type === 'numberingChange'\n ) {\n return 'formatting';\n }\n if (type === 'moveFrom' || type === 'moveTo' || type === 'sectionPropertiesChange') {\n return 'structural';\n }\n if (\n type === 'tablePropertiesChange' ||\n type === 'tableExceptionPropertiesChange' ||\n type === 'tableRowPropertiesChange' ||\n type === 'tableCellPropertiesChange' ||\n type === 'tableCellInsert' ||\n type === 'tableCellDelete' ||\n type === 'tableCellMerge'\n ) {\n return 'table';\n }\n\n return 'content';\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cnfStyleDecoder.d.ts","sourceRoot":"","sources":["../../src/processors/cnfStyleDecoder.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAMnE,MAAM,WAAW,aAAa;IAE5B,QAAQ,EAAE,OAAO,CAAC;IAElB,OAAO,EAAE,OAAO,CAAC;IAEjB,QAAQ,EAAE,OAAO,CAAC;IAElB,OAAO,EAAE,OAAO,CAAC;IAEjB,SAAS,EAAE,OAAO,CAAC;IAEnB,SAAS,EAAE,OAAO,CAAC;IAEnB,SAAS,EAAE,OAAO,CAAC;IAEnB,SAAS,EAAE,OAAO,CAAC;IAEnB,MAAM,EAAE,OAAO,CAAC;IAEhB,MAAM,EAAE,OAAO,CAAC;IAEhB,MAAM,EAAE,OAAO,CAAC;IAEhB,MAAM,EAAE,OAAO,CAAC;CACjB;AAKD,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,aAAa,EAAE,yBAAyB,CAazF,CAAC;
|
|
1
|
+
{"version":3,"file":"cnfStyleDecoder.d.ts","sourceRoot":"","sources":["../../src/processors/cnfStyleDecoder.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAMnE,MAAM,WAAW,aAAa;IAE5B,QAAQ,EAAE,OAAO,CAAC;IAElB,OAAO,EAAE,OAAO,CAAC;IAEjB,QAAQ,EAAE,OAAO,CAAC;IAElB,OAAO,EAAE,OAAO,CAAC;IAEjB,SAAS,EAAE,OAAO,CAAC;IAEnB,SAAS,EAAE,OAAO,CAAC;IAEnB,SAAS,EAAE,OAAO,CAAC;IAEnB,SAAS,EAAE,OAAO,CAAC;IAEnB,MAAM,EAAE,OAAO,CAAC;IAEhB,MAAM,EAAE,OAAO,CAAC;IAEhB,MAAM,EAAE,OAAO,CAAC;IAEhB,MAAM,EAAE,OAAO,CAAC;CACjB;AAKD,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,aAAa,EAAE,yBAAyB,CAazF,CAAC;AAgCF,eAAO,MAAM,0BAA0B,EAAE,CAAC,MAAM,aAAa,CAAC,EAgB7D,CAAC;AAeF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAmB9D;AAcD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,MAAM,CAUpE;AAcD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,yBAAyB,EAAE,CAWnF;AAgBD,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,MAAM,GACf,yBAAyB,EAAE,CAW7B"}
|
|
@@ -34,18 +34,18 @@ const BIT_POSITIONS = {
|
|
|
34
34
|
swCell: 11,
|
|
35
35
|
};
|
|
36
36
|
exports.CONDITIONAL_PRIORITY_ORDER = [
|
|
37
|
-
'nwCell',
|
|
38
|
-
'neCell',
|
|
39
|
-
'swCell',
|
|
40
37
|
'seCell',
|
|
41
|
-
'
|
|
38
|
+
'swCell',
|
|
39
|
+
'neCell',
|
|
40
|
+
'nwCell',
|
|
42
41
|
'lastRow',
|
|
43
|
-
'
|
|
42
|
+
'firstRow',
|
|
44
43
|
'lastCol',
|
|
45
|
-
'
|
|
44
|
+
'firstCol',
|
|
46
45
|
'band2Horz',
|
|
47
|
-
'
|
|
46
|
+
'band1Horz',
|
|
48
47
|
'band2Vert',
|
|
48
|
+
'band1Vert',
|
|
49
49
|
];
|
|
50
50
|
function decodeCnfStyle(cnfStyle) {
|
|
51
51
|
const normalized = cnfStyle.padEnd(12, '0');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cnfStyleDecoder.js","sourceRoot":"","sources":["../../src/processors/cnfStyleDecoder.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"cnfStyleDecoder.js","sourceRoot":"","sources":["../../src/processors/cnfStyleDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * cnfStyle Decoder - Decodes the conditional formatting style bitmask\n * Per ECMA-376 Part 1 Section 17.4.7 (w:cnfStyle)\n *\n * The cnfStyle is a 12-character string where each character is '0' or '1'\n * representing whether a particular conditional format applies.\n */\n\nimport { ConditionalFormattingType } from '../formatting/Style.js';\n\n/**\n * Decoded cnfStyle flags\n * Each flag corresponds to a conditional formatting type that may apply to a cell\n */\nexport interface CnfStyleFlags {\n /** First row of table (header row) */\n firstRow: boolean;\n /** Last row of table */\n lastRow: boolean;\n /** First column of table */\n firstCol: boolean;\n /** Last column of table */\n lastCol: boolean;\n /** Odd vertical band (column banding) */\n band1Vert: boolean;\n /** Even vertical band (column banding) */\n band2Vert: boolean;\n /** Odd horizontal band (row banding) */\n band1Horz: boolean;\n /** Even horizontal band (row banding) */\n band2Horz: boolean;\n /** Northeast cell (top-right corner) */\n neCell: boolean;\n /** Northwest cell (top-left corner) */\n nwCell: boolean;\n /** Southeast cell (bottom-right corner) */\n seCell: boolean;\n /** Southwest cell (bottom-left corner) */\n swCell: boolean;\n}\n\n/**\n * Maps flag names to ConditionalFormattingType values\n */\nexport const CNF_TO_CONDITIONAL_MAP: Record<keyof CnfStyleFlags, ConditionalFormattingType> = {\n firstRow: 'firstRow',\n lastRow: 'lastRow',\n firstCol: 'firstCol',\n lastCol: 'lastCol',\n band1Vert: 'band1Vert',\n band2Vert: 'band2Vert',\n band1Horz: 'band1Horz',\n band2Horz: 'band2Horz',\n neCell: 'neCell',\n nwCell: 'nwCell',\n seCell: 'seCell',\n swCell: 'swCell',\n};\n\n/**\n * Bit positions in the cnfStyle string (0-indexed from left)\n * Per ECMA-376 Part 1 Section 17.4.7\n */\nconst BIT_POSITIONS: Record<keyof CnfStyleFlags, number> = {\n firstRow: 0,\n lastRow: 1,\n firstCol: 2,\n lastCol: 3,\n band1Vert: 4,\n band2Vert: 5,\n band1Horz: 6,\n band2Horz: 7,\n neCell: 8,\n nwCell: 9,\n seCell: 10,\n swCell: 11,\n};\n\n/**\n * Priority order for conditional formatting resolution\n *\n * ECMA-376 §17.7.6.6 applies conditional formats in sequence (banding, then\n * first/last row, first/last column, then corners top-left through\n * bottom-right) with subsequent formats overriding earlier ones. First-match\n * consumers need the opposite: the last-applied (winning) member of each\n * group listed first, so when two conditionals in the same group co-apply\n * (e.g. firstRow + lastRow in a single-row table) resolution picks the one\n * Word actually renders.\n */\nexport const CONDITIONAL_PRIORITY_ORDER: (keyof CnfStyleFlags)[] = [\n // Corner cells (most specific; spec applies nw, ne, sw, se — se wins)\n 'seCell',\n 'swCell',\n 'neCell',\n 'nwCell',\n // Edge rows/columns (within each pair, last is applied after first)\n 'lastRow',\n 'firstRow',\n 'lastCol',\n 'firstCol',\n // Banding (least specific; even banding is applied after odd)\n 'band2Horz',\n 'band1Horz',\n 'band2Vert',\n 'band1Vert',\n];\n\n/**\n * Decodes a cnfStyle string into individual flags\n *\n * @param cnfStyle - 12-character binary string (e.g., \"100000000000\" for firstRow)\n * @returns Decoded flags object\n *\n * @example\n * ```typescript\n * const flags = decodeCnfStyle('100000000000');\n * console.log(flags.firstRow); // true\n * console.log(flags.lastRow); // false\n * ```\n */\nexport function decodeCnfStyle(cnfStyle: string): CnfStyleFlags {\n // Pad to 12 characters if shorter (handles legacy or truncated values)\n // Use padEnd because the string represents left-to-right bit positions\n const normalized = cnfStyle.padEnd(12, '0');\n\n return {\n firstRow: normalized.startsWith('1'),\n lastRow: normalized[BIT_POSITIONS.lastRow] === '1',\n firstCol: normalized[BIT_POSITIONS.firstCol] === '1',\n lastCol: normalized[BIT_POSITIONS.lastCol] === '1',\n band1Vert: normalized[BIT_POSITIONS.band1Vert] === '1',\n band2Vert: normalized[BIT_POSITIONS.band2Vert] === '1',\n band1Horz: normalized[BIT_POSITIONS.band1Horz] === '1',\n band2Horz: normalized[BIT_POSITIONS.band2Horz] === '1',\n neCell: normalized[BIT_POSITIONS.neCell] === '1',\n nwCell: normalized[BIT_POSITIONS.nwCell] === '1',\n seCell: normalized[BIT_POSITIONS.seCell] === '1',\n swCell: normalized[BIT_POSITIONS.swCell] === '1',\n };\n}\n\n/**\n * Encodes CnfStyleFlags back to a binary string\n *\n * @param flags - Flags to encode\n * @returns 12-character binary string\n *\n * @example\n * ```typescript\n * const cnfStyle = encodeCnfStyle({ firstRow: true, lastCol: true });\n * console.log(cnfStyle); // '100100000000'\n * ```\n */\nexport function encodeCnfStyle(flags: Partial<CnfStyleFlags>): string {\n const bits = new Array(12).fill('0');\n\n for (const [key, position] of Object.entries(BIT_POSITIONS)) {\n if (flags[key as keyof CnfStyleFlags]) {\n bits[position] = '1';\n }\n }\n\n return bits.join('');\n}\n\n/**\n * Gets the active conditional formatting types from a cnfStyle\n *\n * @param cnfStyle - The cnfStyle string to decode\n * @returns Array of active ConditionalFormattingType values\n *\n * @example\n * ```typescript\n * const types = getActiveConditionals('110000000000');\n * console.log(types); // ['firstRow', 'lastRow']\n * ```\n */\nexport function getActiveConditionals(cnfStyle: string): ConditionalFormattingType[] {\n const flags = decodeCnfStyle(cnfStyle);\n const active: ConditionalFormattingType[] = [];\n\n for (const [key, isActive] of Object.entries(flags)) {\n if (isActive) {\n active.push(CNF_TO_CONDITIONAL_MAP[key as keyof CnfStyleFlags]);\n }\n }\n\n return active;\n}\n\n/**\n * Gets the active conditional formatting types in priority order\n * More specific conditions come first (corners before edges before banding)\n *\n * @param cnfStyle - The cnfStyle string to decode\n * @returns Array of active ConditionalFormattingType values in priority order\n *\n * @example\n * ```typescript\n * // Cell is both in first row and is the nwCell (top-left corner)\n * const types = getActiveConditionalsInPriorityOrder('100000000100');\n * console.log(types); // ['nwCell', 'firstRow'] - corner takes priority\n * ```\n */\nexport function getActiveConditionalsInPriorityOrder(\n cnfStyle: string\n): ConditionalFormattingType[] {\n const flags = decodeCnfStyle(cnfStyle);\n const active: ConditionalFormattingType[] = [];\n\n for (const flagName of CONDITIONAL_PRIORITY_ORDER) {\n if (flags[flagName]) {\n active.push(CNF_TO_CONDITIONAL_MAP[flagName]);\n }\n }\n\n return active;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stripTrackedChanges.d.ts","sourceRoot":"","sources":["../../src/processors/stripTrackedChanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"stripTrackedChanges.d.ts","sourceRoot":"","sources":["../../src/processors/stripTrackedChanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AA8ZlD,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/E"}
|
|
@@ -30,11 +30,12 @@ class TrackedChangesStripper {
|
|
|
30
30
|
let content = xml;
|
|
31
31
|
content = this.removeRangeMarkers(content);
|
|
32
32
|
content = this.processInsertions(content);
|
|
33
|
+
content = this.removeDeletedRows(content);
|
|
34
|
+
content = this.removeSelfClosingRevisionTags(content);
|
|
33
35
|
content = this.processDeletions(content);
|
|
34
36
|
content = this.processMoveFrom(content);
|
|
35
37
|
content = this.processMoveTo(content);
|
|
36
38
|
content = this.removePropertyChanges(content);
|
|
37
|
-
content = this.removeSelfClosingRevisionTags(content);
|
|
38
39
|
this.zipHandler.updateFile(partPath, content);
|
|
39
40
|
}
|
|
40
41
|
removeRangeMarkers(xml) {
|
|
@@ -78,6 +79,16 @@ class TrackedChangesStripper {
|
|
|
78
79
|
result = result.replace(/<w:ins[\s>][^>]*>/g, '');
|
|
79
80
|
return result;
|
|
80
81
|
}
|
|
82
|
+
removeDeletedRows(xml) {
|
|
83
|
+
const rowDelPattern = /<w:tr\b[^>]*>(?:(?!<w:tc\b|<w:tr\b|<\/w:tr>)[\s\S])*?<w:trPr\b(?:\s[^>]*)?>(?:(?!<\/w:trPr>)[\s\S])*?<w:del\b[^>]*\/>(?:(?!<\/w:trPr>)[\s\S])*?<\/w:trPr>(?:(?!<w:tr\b|<\/w:tr>)[\s\S])*?<\/w:tr>/g;
|
|
84
|
+
let result = xml;
|
|
85
|
+
let previousLength = 0;
|
|
86
|
+
while (result.length !== previousLength) {
|
|
87
|
+
previousLength = result.length;
|
|
88
|
+
result = result.replace(rowDelPattern, '');
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
81
92
|
processDeletions(xml) {
|
|
82
93
|
let result = xml;
|
|
83
94
|
let previousLength = 0;
|
|
@@ -122,10 +133,10 @@ class TrackedChangesStripper {
|
|
|
122
133
|
}
|
|
123
134
|
removeSelfClosingRevisionTags(xml) {
|
|
124
135
|
const patterns = [
|
|
125
|
-
/<w:ins\
|
|
126
|
-
/<w:del\
|
|
127
|
-
/<w:moveFrom\
|
|
128
|
-
/<w:moveTo\
|
|
136
|
+
/<w:ins\b[^>]*\/>/g,
|
|
137
|
+
/<w:del\b[^>]*\/>/g,
|
|
138
|
+
/<w:moveFrom\b[^>]*\/>/g,
|
|
139
|
+
/<w:moveTo\b[^>]*\/>/g,
|
|
129
140
|
];
|
|
130
141
|
let result = xml;
|
|
131
142
|
for (const pattern of patterns) {
|