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
|
@@ -32,6 +32,7 @@ import { logParagraphContent, logParsing, logTextDirection } from '../utils/diag
|
|
|
32
32
|
import { getGlobalLogger, createScopedLogger, defaultLogger } from '../utils/logger.js';
|
|
33
33
|
import { safeParseInt, isExplicitlySet, parseOoxmlBoolean, parseOnOffAttribute, } from '../utils/parsingHelpers.js';
|
|
34
34
|
import { halfPointsToPoints } from '../utils/units.js';
|
|
35
|
+
import { normalizeAnchorSizeRel } from '../utils/xmlSanitization.js';
|
|
35
36
|
function getLogger() {
|
|
36
37
|
return createScopedLogger(getGlobalLogger(), 'DocumentParser');
|
|
37
38
|
}
|
|
@@ -213,9 +214,13 @@ export class DocumentParser {
|
|
|
213
214
|
const parsed = XMLParser.parseToObject(elementXml, {
|
|
214
215
|
trimValues: false,
|
|
215
216
|
});
|
|
216
|
-
const sdt = await this.parseSDTFromObject(parsed['w:sdt'], relationshipManager, zipHandler, imageManager);
|
|
217
|
-
if (sdt)
|
|
217
|
+
const sdt = await this.parseSDTFromObject(parsed['w:sdt'], relationshipManager, zipHandler, imageManager, elementXml);
|
|
218
|
+
if (sdt) {
|
|
218
219
|
bodyElements.push(sdt);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
bodyElements.push(new PreservedElement(elementXml, 'sdt', 'block'));
|
|
223
|
+
}
|
|
219
224
|
pos = next.pos + elementXml.length;
|
|
220
225
|
}
|
|
221
226
|
else {
|
|
@@ -641,6 +646,7 @@ export class DocumentParser {
|
|
|
641
646
|
let permEndIndex = 0;
|
|
642
647
|
let oMathIndex = 0;
|
|
643
648
|
let rubyIndex = 0;
|
|
649
|
+
let sdtIndex = 0;
|
|
644
650
|
let commentRangeStartIndex = 0;
|
|
645
651
|
let commentRangeEndIndex = 0;
|
|
646
652
|
const findClosingTagEnd = (content, tagName, startPos) => {
|
|
@@ -792,6 +798,14 @@ export class DocumentParser {
|
|
|
792
798
|
});
|
|
793
799
|
searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:ruby', tagEnd);
|
|
794
800
|
}
|
|
801
|
+
else if (tagName === 'w:sdt') {
|
|
802
|
+
children.push({
|
|
803
|
+
type: 'w:sdt',
|
|
804
|
+
pos: tagStart,
|
|
805
|
+
index: sdtIndex++,
|
|
806
|
+
});
|
|
807
|
+
searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:sdt', tagEnd);
|
|
808
|
+
}
|
|
795
809
|
else {
|
|
796
810
|
searchPos = tagEnd + 1;
|
|
797
811
|
}
|
|
@@ -872,12 +886,35 @@ export class DocumentParser {
|
|
|
872
886
|
paragraph.addContent(new PreservedElement(runXml, 'w:r', 'inline'));
|
|
873
887
|
}
|
|
874
888
|
}
|
|
889
|
+
else if (runObj['mc:AlternateContent']) {
|
|
890
|
+
const runXml = extractRunXmlAtPosition(child.pos);
|
|
891
|
+
if (runXml) {
|
|
892
|
+
paragraph.addContent(new PreservedElement(runXml, 'w:r', 'inline'));
|
|
893
|
+
}
|
|
894
|
+
}
|
|
875
895
|
else if (runObj['w:drawing']) {
|
|
896
|
+
let imageRun = null;
|
|
876
897
|
if (zipHandler && imageManager) {
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
898
|
+
imageRun = await this.parseDrawingFromObject(runObj['w:drawing'], zipHandler, relationshipManager, imageManager);
|
|
899
|
+
}
|
|
900
|
+
if (imageRun) {
|
|
901
|
+
this.parseRunPropertiesFromObject(runObj['w:rPr'], imageRun);
|
|
902
|
+
paragraph.addRun(imageRun);
|
|
903
|
+
if (runObj['w:t'] ||
|
|
904
|
+
runObj['w:tab'] ||
|
|
905
|
+
runObj['w:br'] ||
|
|
906
|
+
runObj['w:cr'] ||
|
|
907
|
+
runObj['w:noBreakHyphen']) {
|
|
908
|
+
const siblingRun = this.parseRunFromObject(runObj);
|
|
909
|
+
if (siblingRun) {
|
|
910
|
+
paragraph.addRun(siblingRun);
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
else {
|
|
915
|
+
const runXml = extractRunXmlAtPosition(child.pos);
|
|
916
|
+
if (runXml) {
|
|
917
|
+
paragraph.addContent(new PreservedElement(runXml, 'w:r', 'inline'));
|
|
881
918
|
}
|
|
882
919
|
}
|
|
883
920
|
}
|
|
@@ -1064,6 +1101,12 @@ export class DocumentParser {
|
|
|
1064
1101
|
paragraph.addContent(new PreservedElement(elementXml, child.type, 'inline'));
|
|
1065
1102
|
}
|
|
1066
1103
|
}
|
|
1104
|
+
else if (child.type === 'w:sdt') {
|
|
1105
|
+
const sdtXml = extractElementXmlAtPosition(child.pos, 'w:sdt');
|
|
1106
|
+
if (sdtXml) {
|
|
1107
|
+
paragraph.addContent(new PreservedElement(sdtXml, 'w:sdt', 'inline'));
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1067
1110
|
}
|
|
1068
1111
|
}
|
|
1069
1112
|
async parseRevisionFromXml(revisionXml, tagName, relationshipManager, zipHandler, imageManager) {
|
|
@@ -1098,19 +1141,63 @@ export class DocumentParser {
|
|
|
1098
1141
|
const hyperlinkXmls = XMLParser.extractElements(revisionXml, 'w:hyperlink');
|
|
1099
1142
|
let xmlWithoutHyperlinks = revisionXml;
|
|
1100
1143
|
for (const hyperlinkXml of hyperlinkXmls) {
|
|
1101
|
-
xmlWithoutHyperlinks = xmlWithoutHyperlinks
|
|
1144
|
+
xmlWithoutHyperlinks = xmlWithoutHyperlinks
|
|
1145
|
+
.split(hyperlinkXml)
|
|
1146
|
+
.join(' '.repeat(hyperlinkXml.length));
|
|
1102
1147
|
}
|
|
1103
1148
|
const runXmls = XMLParser.extractElements(xmlWithoutHyperlinks, 'w:r');
|
|
1104
|
-
const
|
|
1149
|
+
const orderedChildren = [];
|
|
1150
|
+
let runCursor = 0;
|
|
1105
1151
|
for (const runXml of runXmls) {
|
|
1152
|
+
const pos = xmlWithoutHyperlinks.indexOf(runXml, runCursor);
|
|
1153
|
+
orderedChildren.push({ pos: pos === -1 ? runCursor : pos, type: 'w:r', xml: runXml });
|
|
1154
|
+
if (pos !== -1) {
|
|
1155
|
+
runCursor = pos + runXml.length;
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
let hyperlinkCursor = 0;
|
|
1159
|
+
for (const hyperlinkXml of hyperlinkXmls) {
|
|
1160
|
+
const pos = revisionXml.indexOf(hyperlinkXml, hyperlinkCursor);
|
|
1161
|
+
orderedChildren.push({
|
|
1162
|
+
pos: pos === -1 ? hyperlinkCursor : pos,
|
|
1163
|
+
type: 'w:hyperlink',
|
|
1164
|
+
xml: hyperlinkXml,
|
|
1165
|
+
});
|
|
1166
|
+
if (pos !== -1) {
|
|
1167
|
+
hyperlinkCursor = pos + hyperlinkXml.length;
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
orderedChildren.sort((a, b) => a.pos - b.pos);
|
|
1171
|
+
const content = [];
|
|
1172
|
+
for (const child of orderedChildren) {
|
|
1173
|
+
if (child.type === 'w:hyperlink') {
|
|
1174
|
+
const hyperlinkObj = XMLParser.parseToObject(child.xml, { trimValues: false });
|
|
1175
|
+
const hyperlinkResult = this.parseHyperlinkFromObject(hyperlinkObj['w:hyperlink'], relationshipManager);
|
|
1176
|
+
if (hyperlinkResult.hyperlink) {
|
|
1177
|
+
content.push(hyperlinkResult.hyperlink);
|
|
1178
|
+
}
|
|
1179
|
+
result.bookmarkStarts.push(...hyperlinkResult.bookmarkStarts);
|
|
1180
|
+
result.bookmarkEnds.push(...hyperlinkResult.bookmarkEnds);
|
|
1181
|
+
continue;
|
|
1182
|
+
}
|
|
1183
|
+
const runXml = child.xml;
|
|
1106
1184
|
const runObj = XMLParser.parseToObject(runXml, { trimValues: false });
|
|
1107
1185
|
const runElement = runObj['w:r'];
|
|
1108
1186
|
if (runElement?.['w:drawing']) {
|
|
1187
|
+
let imageRun = null;
|
|
1109
1188
|
if (zipHandler && imageManager) {
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1189
|
+
imageRun = await this.parseDrawingFromObject(runElement['w:drawing'], zipHandler, relationshipManager, imageManager);
|
|
1190
|
+
}
|
|
1191
|
+
if (imageRun) {
|
|
1192
|
+
imageRun.setRawRunXml(runXml);
|
|
1193
|
+
content.push(imageRun);
|
|
1194
|
+
}
|
|
1195
|
+
else {
|
|
1196
|
+
const drawingXmls = XMLParser.extractElements(runXml, 'w:drawing');
|
|
1197
|
+
if (drawingXmls.length > 0 && drawingXmls[0]) {
|
|
1198
|
+
const run = Run.createFromContent([{ type: 'vml', rawXml: drawingXmls[0] }]);
|
|
1199
|
+
this.parseRunPropertiesFromObject(runElement['w:rPr'], run);
|
|
1200
|
+
content.push(run);
|
|
1114
1201
|
}
|
|
1115
1202
|
}
|
|
1116
1203
|
}
|
|
@@ -1121,15 +1208,6 @@ export class DocumentParser {
|
|
|
1121
1208
|
}
|
|
1122
1209
|
}
|
|
1123
1210
|
}
|
|
1124
|
-
for (const hyperlinkXml of hyperlinkXmls) {
|
|
1125
|
-
const hyperlinkObj = XMLParser.parseToObject(hyperlinkXml, { trimValues: false });
|
|
1126
|
-
const hyperlinkResult = this.parseHyperlinkFromObject(hyperlinkObj['w:hyperlink'], relationshipManager);
|
|
1127
|
-
if (hyperlinkResult.hyperlink) {
|
|
1128
|
-
content.push(hyperlinkResult.hyperlink);
|
|
1129
|
-
}
|
|
1130
|
-
result.bookmarkStarts.push(...hyperlinkResult.bookmarkStarts);
|
|
1131
|
-
result.bookmarkEnds.push(...hyperlinkResult.bookmarkEnds);
|
|
1132
|
-
}
|
|
1133
1211
|
const bookmarkStartXmls = XMLParser.extractElements(xmlWithoutHyperlinks, 'w:bookmarkStart');
|
|
1134
1212
|
const bookmarkEndXmls = XMLParser.extractElements(xmlWithoutHyperlinks, 'w:bookmarkEnd');
|
|
1135
1213
|
for (const bookmarkXml of bookmarkStartXmls) {
|
|
@@ -1170,18 +1248,33 @@ export class DocumentParser {
|
|
|
1170
1248
|
return result;
|
|
1171
1249
|
}
|
|
1172
1250
|
}
|
|
1173
|
-
parseCommentsXml(commentsXml) {
|
|
1251
|
+
parseCommentsXml(commentsXml, commentsExtendedXml) {
|
|
1174
1252
|
const comments = [];
|
|
1253
|
+
const doneByParaId = commentsExtendedXml
|
|
1254
|
+
? this.parseCommentsExtendedDone(commentsExtendedXml)
|
|
1255
|
+
: undefined;
|
|
1175
1256
|
const commentXmls = XMLParser.extractElements(commentsXml, 'w:comment');
|
|
1176
1257
|
for (const commentXml of commentXmls) {
|
|
1177
|
-
const comment = this.parseCommentFromXml(commentXml);
|
|
1258
|
+
const comment = this.parseCommentFromXml(commentXml, doneByParaId);
|
|
1178
1259
|
if (comment) {
|
|
1179
1260
|
comments.push(comment);
|
|
1180
1261
|
}
|
|
1181
1262
|
}
|
|
1182
1263
|
return comments;
|
|
1183
1264
|
}
|
|
1184
|
-
|
|
1265
|
+
parseCommentsExtendedDone(commentsExtendedXml) {
|
|
1266
|
+
const doneByParaId = new Map();
|
|
1267
|
+
for (const commentExXml of XMLParser.extractElements(commentsExtendedXml, 'w15:commentEx')) {
|
|
1268
|
+
const paraId = XMLParser.extractAttribute(commentExXml, 'w15:paraId');
|
|
1269
|
+
if (!paraId) {
|
|
1270
|
+
continue;
|
|
1271
|
+
}
|
|
1272
|
+
const done = parseOnOffAttribute(XMLParser.extractAttribute(commentExXml, 'w15:done'));
|
|
1273
|
+
doneByParaId.set(paraId.toUpperCase(), done);
|
|
1274
|
+
}
|
|
1275
|
+
return doneByParaId;
|
|
1276
|
+
}
|
|
1277
|
+
parseCommentFromXml(commentXml, doneByParaId) {
|
|
1185
1278
|
try {
|
|
1186
1279
|
const idAttr = XMLParser.extractAttribute(commentXml, 'w:id');
|
|
1187
1280
|
const author = XMLParser.extractAttribute(commentXml, 'w:author') || 'Unknown';
|
|
@@ -1197,15 +1290,33 @@ export class DocumentParser {
|
|
|
1197
1290
|
const id = parseInt(idAttr, 10);
|
|
1198
1291
|
const date = dateAttr ? new Date(dateAttr) : new Date();
|
|
1199
1292
|
const parentId = parentIdAttr ? parseInt(parentIdAttr, 10) : undefined;
|
|
1200
|
-
|
|
1293
|
+
let done = parseOnOffAttribute(doneAttr);
|
|
1201
1294
|
const runs = [];
|
|
1202
|
-
const
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1295
|
+
const paragraphs = [];
|
|
1296
|
+
const paraXmls = XMLParser.extractElements(commentXml, 'w:p');
|
|
1297
|
+
const runSources = paraXmls.length > 0 ? paraXmls : [commentXml];
|
|
1298
|
+
if (doneByParaId && paraXmls.length > 0) {
|
|
1299
|
+
const lastParaXml = paraXmls[paraXmls.length - 1];
|
|
1300
|
+
const lastParaId = XMLParser.extractAttribute(lastParaXml, 'w14:paraId');
|
|
1301
|
+
if (lastParaId) {
|
|
1302
|
+
const extendedDone = doneByParaId.get(lastParaId.toUpperCase());
|
|
1303
|
+
if (extendedDone !== undefined) {
|
|
1304
|
+
done = extendedDone;
|
|
1305
|
+
}
|
|
1306
|
+
}
|
|
1307
|
+
}
|
|
1308
|
+
for (const sourceXml of runSources) {
|
|
1309
|
+
const content = this.parseCommentParagraphContent(sourceXml);
|
|
1310
|
+
for (const item of content) {
|
|
1311
|
+
if (item instanceof Run) {
|
|
1312
|
+
runs.push(item);
|
|
1313
|
+
}
|
|
1314
|
+
else {
|
|
1315
|
+
runs.push(...item.runs);
|
|
1316
|
+
}
|
|
1208
1317
|
}
|
|
1318
|
+
const pPr = paraXmls.length > 0 ? XMLParser.extractElements(sourceXml, 'w:pPr')[0] : undefined;
|
|
1319
|
+
paragraphs.push({ pPr, content });
|
|
1209
1320
|
}
|
|
1210
1321
|
const comment = new Comment({
|
|
1211
1322
|
id,
|
|
@@ -1216,6 +1327,9 @@ export class DocumentParser {
|
|
|
1216
1327
|
parentId,
|
|
1217
1328
|
done,
|
|
1218
1329
|
});
|
|
1330
|
+
if (paraXmls.length > 0) {
|
|
1331
|
+
comment.setParagraphs(paragraphs);
|
|
1332
|
+
}
|
|
1219
1333
|
return comment;
|
|
1220
1334
|
}
|
|
1221
1335
|
catch (error) {
|
|
@@ -1223,18 +1337,59 @@ export class DocumentParser {
|
|
|
1223
1337
|
return null;
|
|
1224
1338
|
}
|
|
1225
1339
|
}
|
|
1226
|
-
|
|
1340
|
+
parseCommentParagraphContent(sourceXml) {
|
|
1341
|
+
const positioned = [];
|
|
1342
|
+
const hyperlinkRanges = [];
|
|
1343
|
+
let hyperlinkCursor = 0;
|
|
1344
|
+
for (const hyperlinkXml of XMLParser.extractElements(sourceXml, 'w:hyperlink')) {
|
|
1345
|
+
const start = sourceXml.indexOf(hyperlinkXml, hyperlinkCursor);
|
|
1346
|
+
if (start === -1) {
|
|
1347
|
+
continue;
|
|
1348
|
+
}
|
|
1349
|
+
hyperlinkCursor = start + hyperlinkXml.length;
|
|
1350
|
+
hyperlinkRanges.push({ start, end: hyperlinkCursor });
|
|
1351
|
+
const innerRuns = [];
|
|
1352
|
+
for (const runXml of XMLParser.extractElements(hyperlinkXml, 'w:r')) {
|
|
1353
|
+
const run = this.parseCommentRun(runXml);
|
|
1354
|
+
if (run) {
|
|
1355
|
+
innerRuns.push(run);
|
|
1356
|
+
}
|
|
1357
|
+
}
|
|
1358
|
+
positioned.push({ pos: start, item: { rawXml: hyperlinkXml, runs: innerRuns } });
|
|
1359
|
+
}
|
|
1360
|
+
let runCursor = 0;
|
|
1361
|
+
for (const runXml of XMLParser.extractElements(sourceXml, 'w:r')) {
|
|
1362
|
+
const start = sourceXml.indexOf(runXml, runCursor);
|
|
1363
|
+
if (start === -1) {
|
|
1364
|
+
continue;
|
|
1365
|
+
}
|
|
1366
|
+
runCursor = start + runXml.length;
|
|
1367
|
+
if (hyperlinkRanges.some((range) => start >= range.start && start < range.end)) {
|
|
1368
|
+
continue;
|
|
1369
|
+
}
|
|
1370
|
+
const run = this.parseCommentRun(runXml);
|
|
1371
|
+
if (run) {
|
|
1372
|
+
positioned.push({ pos: start, item: run });
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
return positioned.sort((a, b) => a.pos - b.pos).map((entry) => entry.item);
|
|
1376
|
+
}
|
|
1377
|
+
parseCommentRun(runXml) {
|
|
1378
|
+
const runObj = XMLParser.parseToObject(runXml, { trimValues: false });
|
|
1379
|
+
return this.parseRunFromObject(runObj['w:r']);
|
|
1380
|
+
}
|
|
1381
|
+
parseFootnotesXml(footnotesXml, partRels) {
|
|
1227
1382
|
const footnotes = [];
|
|
1228
1383
|
const footnoteXmls = XMLParser.extractElements(footnotesXml, 'w:footnote');
|
|
1229
1384
|
for (const footnoteXml of footnoteXmls) {
|
|
1230
|
-
const footnote = this.parseFootnoteFromXml(footnoteXml);
|
|
1385
|
+
const footnote = this.parseFootnoteFromXml(footnoteXml, partRels);
|
|
1231
1386
|
if (footnote) {
|
|
1232
1387
|
footnotes.push(footnote);
|
|
1233
1388
|
}
|
|
1234
1389
|
}
|
|
1235
1390
|
return footnotes;
|
|
1236
1391
|
}
|
|
1237
|
-
parseFootnoteFromXml(footnoteXml) {
|
|
1392
|
+
parseFootnoteFromXml(footnoteXml, partRels) {
|
|
1238
1393
|
try {
|
|
1239
1394
|
const idAttr = XMLParser.extractAttribute(footnoteXml, 'w:id');
|
|
1240
1395
|
const typeAttr = XMLParser.extractAttribute(footnoteXml, 'w:type');
|
|
@@ -1255,7 +1410,7 @@ export class DocumentParser {
|
|
|
1255
1410
|
const footnote = new Footnote({ id, type });
|
|
1256
1411
|
const paraXmls = XMLParser.extractElements(footnoteXml, 'w:p');
|
|
1257
1412
|
for (const paraXml of paraXmls) {
|
|
1258
|
-
const para = this.parseNoteParaFromXml(paraXml);
|
|
1413
|
+
const para = this.parseNoteParaFromXml(paraXml, partRels);
|
|
1259
1414
|
if (para) {
|
|
1260
1415
|
footnote.addParagraph(para);
|
|
1261
1416
|
}
|
|
@@ -1267,18 +1422,18 @@ export class DocumentParser {
|
|
|
1267
1422
|
return null;
|
|
1268
1423
|
}
|
|
1269
1424
|
}
|
|
1270
|
-
parseEndnotesXml(endnotesXml) {
|
|
1425
|
+
parseEndnotesXml(endnotesXml, partRels) {
|
|
1271
1426
|
const endnotes = [];
|
|
1272
1427
|
const endnoteXmls = XMLParser.extractElements(endnotesXml, 'w:endnote');
|
|
1273
1428
|
for (const endnoteXml of endnoteXmls) {
|
|
1274
|
-
const endnote = this.parseEndnoteFromXml(endnoteXml);
|
|
1429
|
+
const endnote = this.parseEndnoteFromXml(endnoteXml, partRels);
|
|
1275
1430
|
if (endnote) {
|
|
1276
1431
|
endnotes.push(endnote);
|
|
1277
1432
|
}
|
|
1278
1433
|
}
|
|
1279
1434
|
return endnotes;
|
|
1280
1435
|
}
|
|
1281
|
-
parseEndnoteFromXml(endnoteXml) {
|
|
1436
|
+
parseEndnoteFromXml(endnoteXml, partRels) {
|
|
1282
1437
|
try {
|
|
1283
1438
|
const idAttr = XMLParser.extractAttribute(endnoteXml, 'w:id');
|
|
1284
1439
|
const typeAttr = XMLParser.extractAttribute(endnoteXml, 'w:type');
|
|
@@ -1299,7 +1454,7 @@ export class DocumentParser {
|
|
|
1299
1454
|
const endnote = new Endnote({ id, type });
|
|
1300
1455
|
const paraXmls = XMLParser.extractElements(endnoteXml, 'w:p');
|
|
1301
1456
|
for (const paraXml of paraXmls) {
|
|
1302
|
-
const para = this.parseNoteParaFromXml(paraXml);
|
|
1457
|
+
const para = this.parseNoteParaFromXml(paraXml, partRels);
|
|
1303
1458
|
if (para) {
|
|
1304
1459
|
endnote.addParagraph(para);
|
|
1305
1460
|
}
|
|
@@ -1311,15 +1466,60 @@ export class DocumentParser {
|
|
|
1311
1466
|
return null;
|
|
1312
1467
|
}
|
|
1313
1468
|
}
|
|
1314
|
-
parseNoteParaFromXml(paraXml) {
|
|
1469
|
+
parseNoteParaFromXml(paraXml, partRels) {
|
|
1315
1470
|
try {
|
|
1316
1471
|
const para = new Paragraph();
|
|
1317
|
-
const
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1472
|
+
const paraObj = XMLParser.parseToObject(paraXml, { trimValues: false });
|
|
1473
|
+
const pElement = paraObj['w:p'];
|
|
1474
|
+
if (pElement?.['w:pPr']) {
|
|
1475
|
+
this.parseParagraphPropertiesFromObject(pElement['w:pPr'], para);
|
|
1476
|
+
}
|
|
1477
|
+
const pPrEnd = paraXml.indexOf('</w:pPr>');
|
|
1478
|
+
const contentStart = pPrEnd !== -1 ? pPrEnd + '</w:pPr>'.length : paraXml.indexOf('>') + 1;
|
|
1479
|
+
const contentEnd = paraXml.lastIndexOf('</w:p>');
|
|
1480
|
+
if (contentEnd <= contentStart) {
|
|
1481
|
+
return para;
|
|
1482
|
+
}
|
|
1483
|
+
const content = paraXml.substring(contentStart, contentEnd);
|
|
1484
|
+
let searchPos = 0;
|
|
1485
|
+
while (searchPos < content.length) {
|
|
1486
|
+
const tagStart = content.indexOf('<', searchPos);
|
|
1487
|
+
if (tagStart === -1)
|
|
1488
|
+
break;
|
|
1489
|
+
const tagEnd = content.indexOf('>', tagStart);
|
|
1490
|
+
if (tagEnd === -1)
|
|
1491
|
+
break;
|
|
1492
|
+
const tagBody = content.substring(tagStart + 1, tagEnd);
|
|
1493
|
+
const tagName = tagBody.split(/[\s/>]/)[0];
|
|
1494
|
+
const selfClosing = tagBody.endsWith('/');
|
|
1495
|
+
if ((tagName === 'w:r' || tagName === 'w:hyperlink') && !selfClosing) {
|
|
1496
|
+
const closingTag = `</${tagName}>`;
|
|
1497
|
+
const closingPos = content.indexOf(closingTag, tagEnd);
|
|
1498
|
+
const childEnd = closingPos === -1 ? tagEnd + 1 : closingPos + closingTag.length;
|
|
1499
|
+
const childXml = content.substring(tagStart, childEnd);
|
|
1500
|
+
const childObj = XMLParser.parseToObject(childXml, { trimValues: false });
|
|
1501
|
+
if (tagName === 'w:r') {
|
|
1502
|
+
const run = this.parseRunFromObject(childObj['w:r']);
|
|
1503
|
+
if (run) {
|
|
1504
|
+
para.addRun(run);
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
else {
|
|
1508
|
+
const result = this.parseHyperlinkFromObject(childObj['w:hyperlink'], partRels ?? RelationshipManager.create());
|
|
1509
|
+
if (result.hyperlink) {
|
|
1510
|
+
para.addHyperlink(result.hyperlink);
|
|
1511
|
+
}
|
|
1512
|
+
for (const bookmark of result.bookmarkStarts) {
|
|
1513
|
+
para.addBookmarkStart(bookmark);
|
|
1514
|
+
}
|
|
1515
|
+
for (const bookmark of result.bookmarkEnds) {
|
|
1516
|
+
para.addBookmarkEnd(bookmark);
|
|
1517
|
+
}
|
|
1518
|
+
}
|
|
1519
|
+
searchPos = childEnd;
|
|
1520
|
+
}
|
|
1521
|
+
else {
|
|
1522
|
+
searchPos = tagEnd + 1;
|
|
1323
1523
|
}
|
|
1324
1524
|
}
|
|
1325
1525
|
return para;
|
|
@@ -1417,11 +1617,28 @@ export class DocumentParser {
|
|
|
1417
1617
|
if (elementIndex < runArray.length) {
|
|
1418
1618
|
const child = runArray[elementIndex];
|
|
1419
1619
|
if (child['w:drawing']) {
|
|
1620
|
+
let imageRun = null;
|
|
1420
1621
|
if (zipHandler && imageManager) {
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1622
|
+
imageRun = await this.parseDrawingFromObject(child['w:drawing'], zipHandler, relationshipManager, imageManager);
|
|
1623
|
+
}
|
|
1624
|
+
if (imageRun) {
|
|
1625
|
+
this.parseRunPropertiesFromObject(child['w:rPr'], imageRun);
|
|
1626
|
+
paragraph.addRun(imageRun);
|
|
1627
|
+
if (child['w:t'] ||
|
|
1628
|
+
child['w:tab'] ||
|
|
1629
|
+
child['w:br'] ||
|
|
1630
|
+
child['w:cr'] ||
|
|
1631
|
+
child['w:noBreakHyphen']) {
|
|
1632
|
+
const siblingRun = this.parseRunFromObject(child);
|
|
1633
|
+
if (siblingRun) {
|
|
1634
|
+
paragraph.addRun(siblingRun);
|
|
1635
|
+
}
|
|
1636
|
+
}
|
|
1637
|
+
}
|
|
1638
|
+
else {
|
|
1639
|
+
const runXml = this.objectToXml({ 'w:r': child });
|
|
1640
|
+
if (runXml) {
|
|
1641
|
+
paragraph.addContent(new PreservedElement(runXml, 'w:r', 'inline'));
|
|
1425
1642
|
}
|
|
1426
1643
|
}
|
|
1427
1644
|
}
|
|
@@ -1470,11 +1687,28 @@ export class DocumentParser {
|
|
|
1470
1687
|
const runChildren = Array.isArray(runs) ? runs : runs ? [runs] : [];
|
|
1471
1688
|
for (const child of runChildren) {
|
|
1472
1689
|
if (child['w:drawing']) {
|
|
1690
|
+
let imageRun = null;
|
|
1473
1691
|
if (zipHandler && imageManager) {
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1692
|
+
imageRun = await this.parseDrawingFromObject(child['w:drawing'], zipHandler, relationshipManager, imageManager);
|
|
1693
|
+
}
|
|
1694
|
+
if (imageRun) {
|
|
1695
|
+
this.parseRunPropertiesFromObject(child['w:rPr'], imageRun);
|
|
1696
|
+
paragraph.addRun(imageRun);
|
|
1697
|
+
if (child['w:t'] ||
|
|
1698
|
+
child['w:tab'] ||
|
|
1699
|
+
child['w:br'] ||
|
|
1700
|
+
child['w:cr'] ||
|
|
1701
|
+
child['w:noBreakHyphen']) {
|
|
1702
|
+
const siblingRun = this.parseRunFromObject(child);
|
|
1703
|
+
if (siblingRun) {
|
|
1704
|
+
paragraph.addRun(siblingRun);
|
|
1705
|
+
}
|
|
1706
|
+
}
|
|
1707
|
+
}
|
|
1708
|
+
else {
|
|
1709
|
+
const runXml = this.objectToXml({ 'w:r': child });
|
|
1710
|
+
if (runXml) {
|
|
1711
|
+
paragraph.addContent(new PreservedElement(runXml, 'w:r', 'inline'));
|
|
1478
1712
|
}
|
|
1479
1713
|
}
|
|
1480
1714
|
}
|
|
@@ -2899,9 +3133,9 @@ export class DocumentParser {
|
|
|
2899
3133
|
return '';
|
|
2900
3134
|
}
|
|
2901
3135
|
if (typeof node === 'object') {
|
|
2902
|
-
return
|
|
3136
|
+
return node['#text'] != null ? String(node['#text']) : '';
|
|
2903
3137
|
}
|
|
2904
|
-
return
|
|
3138
|
+
return String(node);
|
|
2905
3139
|
};
|
|
2906
3140
|
const parseBooleanAttr = (value) => {
|
|
2907
3141
|
if (value === undefined || value === null) {
|
|
@@ -3504,13 +3738,18 @@ export class DocumentParser {
|
|
|
3504
3738
|
anchor: finalAnchor,
|
|
3505
3739
|
text: displayText,
|
|
3506
3740
|
formatting,
|
|
3741
|
+
preserveFormatting: true,
|
|
3507
3742
|
tooltip,
|
|
3508
3743
|
relationshipId: finalRelationshipId,
|
|
3509
3744
|
tgtFrame,
|
|
3510
3745
|
history,
|
|
3511
3746
|
docLocation,
|
|
3512
3747
|
});
|
|
3513
|
-
if (
|
|
3748
|
+
if (parsedRuns.length > 1 && (text || parsedRuns.some((r) => r.getContent().length > 1))) {
|
|
3749
|
+
hyperlink.setRuns(parsedRuns);
|
|
3750
|
+
}
|
|
3751
|
+
else if (parsedRun &&
|
|
3752
|
+
((parsedRuns.length === 1 && text) || parsedRun.getContent().length > 1)) {
|
|
3514
3753
|
hyperlink.setRun(parsedRun);
|
|
3515
3754
|
}
|
|
3516
3755
|
result.hyperlink = hyperlink;
|
|
@@ -3664,6 +3903,26 @@ export class DocumentParser {
|
|
|
3664
3903
|
fldLock,
|
|
3665
3904
|
dirty,
|
|
3666
3905
|
});
|
|
3906
|
+
const resultRuns = fieldObj['w:r'];
|
|
3907
|
+
const resultRunArray = Array.isArray(resultRuns)
|
|
3908
|
+
? resultRuns
|
|
3909
|
+
: resultRuns
|
|
3910
|
+
? [resultRuns]
|
|
3911
|
+
: [];
|
|
3912
|
+
const cachedRuns = [];
|
|
3913
|
+
for (const runObj of resultRunArray) {
|
|
3914
|
+
const run = this.parseRunFromObject(runObj);
|
|
3915
|
+
if (run) {
|
|
3916
|
+
const runFormatting = run.getFormatting();
|
|
3917
|
+
cachedRuns.push({
|
|
3918
|
+
text: run.getText(),
|
|
3919
|
+
formatting: Object.keys(runFormatting).length > 0 ? runFormatting : undefined,
|
|
3920
|
+
});
|
|
3921
|
+
}
|
|
3922
|
+
}
|
|
3923
|
+
if (cachedRuns.length > 0) {
|
|
3924
|
+
field.setCachedResultRuns(cachedRuns);
|
|
3925
|
+
}
|
|
3667
3926
|
return field;
|
|
3668
3927
|
}
|
|
3669
3928
|
catch (error) {
|
|
@@ -3850,7 +4109,7 @@ export class DocumentParser {
|
|
|
3850
4109
|
if (rPrObj['w:rFonts']) {
|
|
3851
4110
|
const rFonts = rPrObj['w:rFonts'];
|
|
3852
4111
|
if (rFonts['@_w:ascii'] !== undefined)
|
|
3853
|
-
run.
|
|
4112
|
+
run.setFontAscii(String(rFonts['@_w:ascii']));
|
|
3854
4113
|
if (rFonts['@_w:hAnsi'] !== undefined)
|
|
3855
4114
|
run.setFontHAnsi(String(rFonts['@_w:hAnsi']));
|
|
3856
4115
|
if (rFonts['@_w:eastAsia'] !== undefined)
|
|
@@ -4625,8 +4884,9 @@ export class DocumentParser {
|
|
|
4625
4884
|
'wp:cNvGraphicFramePr',
|
|
4626
4885
|
'a:graphic',
|
|
4627
4886
|
]);
|
|
4628
|
-
if (anchorExtras)
|
|
4629
|
-
image._setRawPassthrough('anchor-extra', anchorExtras);
|
|
4887
|
+
if (anchorExtras) {
|
|
4888
|
+
image._setRawPassthrough('anchor-extra', normalizeAnchorSizeRel(anchorExtras));
|
|
4889
|
+
}
|
|
4630
4890
|
}
|
|
4631
4891
|
if (docPrObj) {
|
|
4632
4892
|
const docPrExtras = this.collectUnmodeledChildren(docPrObj, []);
|
|
@@ -4675,7 +4935,9 @@ export class DocumentParser {
|
|
|
4675
4935
|
type = 'none';
|
|
4676
4936
|
return {
|
|
4677
4937
|
type,
|
|
4678
|
-
side:
|
|
4938
|
+
side: type === 'none' || type === 'topAndBottom'
|
|
4939
|
+
? wrapObj['@_wrapText']
|
|
4940
|
+
: wrapObj['@_wrapText'] || 'bothSides',
|
|
4679
4941
|
distanceTop: wrapObj['@_distT'] ? parseInt(wrapObj['@_distT'], 10) : undefined,
|
|
4680
4942
|
distanceBottom: wrapObj['@_distB'] ? parseInt(wrapObj['@_distB'], 10) : undefined,
|
|
4681
4943
|
distanceLeft: wrapObj['@_distL'] ? parseInt(wrapObj['@_distL'], 10) : undefined,
|
|
@@ -5663,7 +5925,7 @@ export class DocumentParser {
|
|
|
5663
5925
|
}
|
|
5664
5926
|
return depth === 0 ? pos : -1;
|
|
5665
5927
|
}
|
|
5666
|
-
async parseSDTFromObject(sdtObj, relationshipManager, zipHandler, imageManager) {
|
|
5928
|
+
async parseSDTFromObject(sdtObj, relationshipManager, zipHandler, imageManager, rawSdtXml) {
|
|
5667
5929
|
try {
|
|
5668
5930
|
if (!sdtObj)
|
|
5669
5931
|
return null;
|
|
@@ -5724,10 +5986,14 @@ export class DocumentParser {
|
|
|
5724
5986
|
else if (sdtPr['w14:checkbox']) {
|
|
5725
5987
|
properties.controlType = 'checkbox';
|
|
5726
5988
|
const checkboxElement = sdtPr['w14:checkbox'];
|
|
5989
|
+
const rawCheckedFont = checkboxElement?.['w14:checkedState']?.['@_w14:font'];
|
|
5990
|
+
const rawUncheckedFont = checkboxElement?.['w14:uncheckedState']?.['@_w14:font'];
|
|
5727
5991
|
properties.checkbox = {
|
|
5728
5992
|
checked: parseOoxmlBoolean(checkboxElement?.['w14:checked'], '@_w14:val'),
|
|
5729
5993
|
checkedState: String(checkboxElement?.['w14:checkedState']?.['@_w14:val'] ?? ''),
|
|
5730
5994
|
uncheckedState: String(checkboxElement?.['w14:uncheckedState']?.['@_w14:val'] ?? ''),
|
|
5995
|
+
checkedFont: rawCheckedFont === undefined ? undefined : String(rawCheckedFont),
|
|
5996
|
+
uncheckedFont: rawUncheckedFont === undefined ? undefined : String(rawUncheckedFont),
|
|
5731
5997
|
};
|
|
5732
5998
|
}
|
|
5733
5999
|
else if (sdtPr['w:picture']) {
|
|
@@ -5782,6 +6048,32 @@ export class DocumentParser {
|
|
|
5782
6048
|
properties.showingPlcHdr = parseOoxmlBoolean(showingPlcHdr);
|
|
5783
6049
|
}
|
|
5784
6050
|
}
|
|
6051
|
+
let rawSdtPrXml;
|
|
6052
|
+
if (sdtPr !== undefined) {
|
|
6053
|
+
if (rawSdtXml) {
|
|
6054
|
+
const prPos = rawSdtXml.indexOf('<w:sdtPr');
|
|
6055
|
+
if (prPos !== -1) {
|
|
6056
|
+
rawSdtPrXml = this.extractSingleElement(rawSdtXml, 'w:sdtPr', prPos) || undefined;
|
|
6057
|
+
}
|
|
6058
|
+
}
|
|
6059
|
+
if (rawSdtPrXml === undefined) {
|
|
6060
|
+
rawSdtPrXml = this.objectToXml({ 'w:sdtPr': sdtPr }) || undefined;
|
|
6061
|
+
}
|
|
6062
|
+
}
|
|
6063
|
+
let rawSdtEndPrXml;
|
|
6064
|
+
const sdtEndPr = sdtObj['w:sdtEndPr'];
|
|
6065
|
+
if (sdtEndPr !== undefined) {
|
|
6066
|
+
if (rawSdtXml) {
|
|
6067
|
+
const endPrPos = rawSdtXml.indexOf('<w:sdtEndPr');
|
|
6068
|
+
if (endPrPos !== -1) {
|
|
6069
|
+
rawSdtEndPrXml =
|
|
6070
|
+
this.extractSingleElement(rawSdtXml, 'w:sdtEndPr', endPrPos) || undefined;
|
|
6071
|
+
}
|
|
6072
|
+
}
|
|
6073
|
+
if (rawSdtEndPrXml === undefined) {
|
|
6074
|
+
rawSdtEndPrXml = this.objectToXml({ 'w:sdtEndPr': sdtEndPr }) || undefined;
|
|
6075
|
+
}
|
|
6076
|
+
}
|
|
5785
6077
|
const content = [];
|
|
5786
6078
|
const sdtContent = sdtObj['w:sdtContent'];
|
|
5787
6079
|
if (sdtContent) {
|
|
@@ -5825,6 +6117,19 @@ export class DocumentParser {
|
|
|
5825
6117
|
content.push(nestedSdt);
|
|
5826
6118
|
}
|
|
5827
6119
|
}
|
|
6120
|
+
else if (!elementType.startsWith('@_') && elementType !== '#text') {
|
|
6121
|
+
const others = sdtContent[elementType];
|
|
6122
|
+
const otherArray = Array.isArray(others)
|
|
6123
|
+
? others
|
|
6124
|
+
: others !== undefined
|
|
6125
|
+
? [others]
|
|
6126
|
+
: [];
|
|
6127
|
+
if (elementIndex < otherArray.length) {
|
|
6128
|
+
const rawXml = this.objectToXml({ [elementType]: otherArray[elementIndex] });
|
|
6129
|
+
if (rawXml)
|
|
6130
|
+
content.push(new PreservedElement(rawXml, elementType, 'block'));
|
|
6131
|
+
}
|
|
6132
|
+
}
|
|
5828
6133
|
}
|
|
5829
6134
|
}
|
|
5830
6135
|
else {
|
|
@@ -5850,6 +6155,27 @@ export class DocumentParser {
|
|
|
5850
6155
|
if (nestedSdt)
|
|
5851
6156
|
content.push(nestedSdt);
|
|
5852
6157
|
}
|
|
6158
|
+
for (const key of Object.keys(sdtContent)) {
|
|
6159
|
+
if (key === 'w:p' ||
|
|
6160
|
+
key === 'w:tbl' ||
|
|
6161
|
+
key === 'w:sdt' ||
|
|
6162
|
+
key === '#text' ||
|
|
6163
|
+
key === '_orderedChildren' ||
|
|
6164
|
+
key.startsWith('@_')) {
|
|
6165
|
+
continue;
|
|
6166
|
+
}
|
|
6167
|
+
const others = sdtContent[key];
|
|
6168
|
+
const otherArray = Array.isArray(others)
|
|
6169
|
+
? others
|
|
6170
|
+
: others !== undefined
|
|
6171
|
+
? [others]
|
|
6172
|
+
: [];
|
|
6173
|
+
for (const otherObj of otherArray) {
|
|
6174
|
+
const rawXml = this.objectToXml({ [key]: otherObj });
|
|
6175
|
+
if (rawXml)
|
|
6176
|
+
content.push(new PreservedElement(rawXml, key, 'block'));
|
|
6177
|
+
}
|
|
6178
|
+
}
|
|
5853
6179
|
}
|
|
5854
6180
|
}
|
|
5855
6181
|
if (properties.buildingBlock?.gallery === 'Table of Contents') {
|
|
@@ -5858,7 +6184,12 @@ export class DocumentParser {
|
|
|
5858
6184
|
return new TableOfContentsElement(toc);
|
|
5859
6185
|
}
|
|
5860
6186
|
}
|
|
5861
|
-
|
|
6187
|
+
const sdt = new StructuredDocumentTag(properties, content);
|
|
6188
|
+
if (rawSdtPrXml !== undefined)
|
|
6189
|
+
sdt._setRawSdtPrXml(rawSdtPrXml);
|
|
6190
|
+
if (rawSdtEndPrXml !== undefined)
|
|
6191
|
+
sdt._setRawSdtEndPrXml(rawSdtEndPrXml);
|
|
6192
|
+
return sdt;
|
|
5862
6193
|
}
|
|
5863
6194
|
catch (error) {
|
|
5864
6195
|
defaultLogger.warn('[DocumentParser] Failed to parse SDT:', error instanceof Error
|
|
@@ -6117,10 +6448,10 @@ export class DocumentParser {
|
|
|
6117
6448
|
}
|
|
6118
6449
|
objectToXml(obj) {
|
|
6119
6450
|
const buildXml = (o, name) => {
|
|
6120
|
-
if (typeof o
|
|
6121
|
-
|
|
6122
|
-
|
|
6123
|
-
|
|
6451
|
+
if (typeof o !== 'object' || o === null) {
|
|
6452
|
+
const text = String(o ?? '');
|
|
6453
|
+
return name ? `<${name}>${text}</${name}>` : text;
|
|
6454
|
+
}
|
|
6124
6455
|
const keys = Object.keys(o);
|
|
6125
6456
|
if (keys.length === 0 && !name)
|
|
6126
6457
|
return '';
|
|
@@ -6391,6 +6722,8 @@ export class DocumentParser {
|
|
|
6391
6722
|
return null;
|
|
6392
6723
|
}
|
|
6393
6724
|
}
|
|
6725
|
+
const sectPrWithChange = sectPr;
|
|
6726
|
+
sectPr = sectPr.replace(/<w:sectPrChange[\s\S]*?<\/w:sectPrChange>/, '');
|
|
6394
6727
|
const sectionProps = {};
|
|
6395
6728
|
const pgSzElements = XMLParser.extractElements(sectPr, 'w:pgSz');
|
|
6396
6729
|
if (pgSzElements.length > 0) {
|
|
@@ -6752,7 +7085,7 @@ export class DocumentParser {
|
|
|
6752
7085
|
}
|
|
6753
7086
|
}
|
|
6754
7087
|
const section = new Section(sectionProps);
|
|
6755
|
-
const sectPrChangeElements = XMLParser.extractElements(
|
|
7088
|
+
const sectPrChangeElements = XMLParser.extractElements(sectPrWithChange, 'w:sectPrChange');
|
|
6756
7089
|
if (sectPrChangeElements.length > 0 && sectPrChangeElements[0]) {
|
|
6757
7090
|
const changeXml = sectPrChangeElements[0];
|
|
6758
7091
|
const id = XMLParser.extractAttribute(changeXml, 'w:id') || '0';
|
|
@@ -6799,17 +7132,20 @@ export class DocumentParser {
|
|
|
6799
7132
|
}
|
|
6800
7133
|
}
|
|
6801
7134
|
}
|
|
6802
|
-
|
|
6803
|
-
const
|
|
6804
|
-
|
|
6805
|
-
:
|
|
6806
|
-
|
|
6807
|
-
|
|
6808
|
-
|
|
6809
|
-
|
|
7135
|
+
let basedOn;
|
|
7136
|
+
const basedOnAttrs = XMLParser.extractSelfClosingTag(styleXml, 'w:basedOn');
|
|
7137
|
+
if (basedOnAttrs) {
|
|
7138
|
+
basedOn = XMLParser.extractAttribute(`<w:basedOn${basedOnAttrs}/>`, 'w:val');
|
|
7139
|
+
}
|
|
7140
|
+
let next;
|
|
7141
|
+
const nextAttrs = XMLParser.extractSelfClosingTag(styleXml, 'w:next');
|
|
7142
|
+
if (nextAttrs) {
|
|
7143
|
+
next = XMLParser.extractAttribute(`<w:next${nextAttrs}/>`, 'w:val');
|
|
7144
|
+
}
|
|
7145
|
+
const styleBase = styleXml.replace(/<w:tblStylePr[\s\S]*?<\/w:tblStylePr>/g, '');
|
|
6810
7146
|
let paragraphFormatting;
|
|
6811
7147
|
let styleNumPr;
|
|
6812
|
-
const pPrXml = XMLParser.extractBetweenTags(
|
|
7148
|
+
const pPrXml = XMLParser.extractBetweenTags(styleBase, '<w:pPr>', '</w:pPr>');
|
|
6813
7149
|
if (pPrXml) {
|
|
6814
7150
|
paragraphFormatting = this.parseParagraphFormattingFromXml(pPrXml);
|
|
6815
7151
|
const numPrXml = XMLParser.extractBetweenTags(pPrXml, '<w:numPr>', '</w:numPr>');
|
|
@@ -6826,7 +7162,7 @@ export class DocumentParser {
|
|
|
6826
7162
|
}
|
|
6827
7163
|
}
|
|
6828
7164
|
let runFormatting;
|
|
6829
|
-
const rPrXml = XMLParser.extractBetweenTags(
|
|
7165
|
+
const rPrXml = XMLParser.extractBetweenTags(styleBase, '<w:rPr>', '</w:rPr>');
|
|
6830
7166
|
if (rPrXml) {
|
|
6831
7167
|
runFormatting = this.parseRunFormattingFromXml(rPrXml);
|
|
6832
7168
|
}
|
|
@@ -8029,11 +8365,21 @@ export class DocumentParser {
|
|
|
8029
8365
|
return namespaces;
|
|
8030
8366
|
}
|
|
8031
8367
|
parseDocumentBackground(docXml) {
|
|
8032
|
-
const bgMatch = /<w:background([^>]*?)
|
|
8033
|
-
if (!bgMatch
|
|
8368
|
+
const bgMatch = /<w:background([^>]*?)(\/>|>)/.exec(docXml);
|
|
8369
|
+
if (!bgMatch)
|
|
8034
8370
|
return undefined;
|
|
8035
|
-
const attrStr = bgMatch[1];
|
|
8371
|
+
const attrStr = bgMatch[1] ?? '';
|
|
8036
8372
|
const result = {};
|
|
8373
|
+
if (bgMatch[2] === '>') {
|
|
8374
|
+
const innerStart = bgMatch.index + bgMatch[0].length;
|
|
8375
|
+
const closeIndex = docXml.indexOf('</w:background>', innerStart);
|
|
8376
|
+
if (closeIndex !== -1) {
|
|
8377
|
+
const inner = docXml.substring(innerStart, closeIndex);
|
|
8378
|
+
if (inner.length > 0) {
|
|
8379
|
+
result.rawInnerXml = inner;
|
|
8380
|
+
}
|
|
8381
|
+
}
|
|
8382
|
+
}
|
|
8037
8383
|
const colorMatch = /w:color="([^"]+)"/.exec(attrStr);
|
|
8038
8384
|
if (colorMatch?.[1])
|
|
8039
8385
|
result.color = colorMatch[1];
|