docxmlater 10.0.2 → 10.0.3
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 +2 -2
- package/dist/constants/legacyCompatFlags.d.ts.map +1 -1
- package/dist/constants/legacyCompatFlags.js.map +1 -1
- package/dist/constants/limits.d.ts +0 -27
- package/dist/constants/limits.d.ts.map +1 -1
- package/dist/constants/limits.js +13 -13
- package/dist/constants/limits.js.map +1 -1
- package/dist/core/Document.d.ts +23 -19
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +197 -63
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentContent.d.ts.map +1 -1
- package/dist/core/DocumentContent.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +59 -24
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentIdManager.d.ts.map +1 -1
- package/dist/core/DocumentIdManager.js.map +1 -1
- package/dist/core/DocumentParser.d.ts +6 -6
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +60 -54
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/DocumentValidator.d.ts.map +1 -1
- package/dist/core/DocumentValidator.js.map +1 -1
- package/dist/core/Relationship.d.ts.map +1 -1
- package/dist/core/Relationship.js +1 -1
- package/dist/core/Relationship.js.map +1 -1
- package/dist/core/RelationshipManager.js +3 -3
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/AlternateContent.js.map +1 -1
- package/dist/elements/Bookmark.d.ts.map +1 -1
- package/dist/elements/Bookmark.js.map +1 -1
- package/dist/elements/BookmarkManager.d.ts.map +1 -1
- package/dist/elements/BookmarkManager.js.map +1 -1
- package/dist/elements/Comment.js +1 -1
- package/dist/elements/Comment.js.map +1 -1
- package/dist/elements/CommentManager.d.ts.map +1 -1
- package/dist/elements/CommentManager.js +8 -2
- package/dist/elements/CommentManager.js.map +1 -1
- package/dist/elements/CommonTypes.d.ts.map +1 -1
- package/dist/elements/CommonTypes.js +1 -2
- package/dist/elements/CommonTypes.js.map +1 -1
- package/dist/elements/CustomXml.js.map +1 -1
- package/dist/elements/Endnote.d.ts.map +1 -1
- package/dist/elements/Endnote.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.map +1 -1
- package/dist/elements/Field.js +31 -28
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/FieldHelpers.d.ts.map +1 -1
- package/dist/elements/FieldHelpers.js +6 -6
- package/dist/elements/FieldHelpers.js.map +1 -1
- package/dist/elements/FontManager.d.ts.map +1 -1
- package/dist/elements/FontManager.js.map +1 -1
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/Footnote.d.ts.map +1 -1
- package/dist/elements/Footnote.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.js.map +1 -1
- package/dist/elements/HeaderFooterManager.js.map +1 -1
- package/dist/elements/Hyperlink.d.ts.map +1 -1
- package/dist/elements/Hyperlink.js +5 -5
- package/dist/elements/Hyperlink.js.map +1 -1
- package/dist/elements/Image.d.ts +2 -2
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +21 -5
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/ImageManager.d.ts.map +1 -1
- package/dist/elements/ImageManager.js +2 -2
- package/dist/elements/ImageManager.js.map +1 -1
- package/dist/elements/ImageRun.js.map +1 -1
- package/dist/elements/MathElement.js.map +1 -1
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +128 -117
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/PreservedElement.js.map +1 -1
- package/dist/elements/PropertyChangeTypes.js.map +1 -1
- package/dist/elements/RangeMarker.js.map +1 -1
- package/dist/elements/Revision.d.ts +1 -0
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +44 -5
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/RevisionContent.js.map +1 -1
- package/dist/elements/RevisionManager.d.ts.map +1 -1
- package/dist/elements/RevisionManager.js.map +1 -1
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +1 -3
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +127 -118
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts.map +1 -1
- package/dist/elements/Shape.js +21 -0
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +20 -8
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +2 -2
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +29 -35
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +2 -2
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +63 -67
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableGridChange.js.map +1 -1
- package/dist/elements/TableOfContents.d.ts +6 -6
- package/dist/elements/TableOfContents.d.ts.map +1 -1
- package/dist/elements/TableOfContents.js.map +1 -1
- package/dist/elements/TableOfContentsElement.js.map +1 -1
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +65 -47
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts.map +1 -1
- package/dist/elements/TextBox.js +1 -1
- package/dist/elements/TextBox.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts +1 -1
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +11 -11
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingInstance.d.ts.map +1 -1
- package/dist/formatting/NumberingInstance.js +4 -4
- package/dist/formatting/NumberingInstance.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +26 -26
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/NumberingManager.d.ts +1 -1
- package/dist/formatting/NumberingManager.d.ts.map +1 -1
- package/dist/formatting/NumberingManager.js.map +1 -1
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +87 -95
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +3 -3
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/images/ImageOptimizer.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/managers/DrawingManager.d.ts.map +1 -1
- package/dist/managers/DrawingManager.js.map +1 -1
- package/dist/tracking/DocumentTrackingContext.js.map +1 -1
- package/dist/tracking/TrackingContext.js.map +1 -1
- package/dist/types/compatibility-types.js.map +1 -1
- package/dist/types/formatting.js.map +1 -1
- package/dist/types/list-types.d.ts +4 -4
- package/dist/types/list-types.d.ts.map +1 -1
- package/dist/types/list-types.js.map +1 -1
- package/dist/types/settings-types.js.map +1 -1
- package/dist/types/styleConfig.js.map +1 -1
- package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
- package/dist/utils/ChangelogGenerator.js.map +1 -1
- package/dist/utils/CompatibilityUpgrader.d.ts.map +1 -1
- package/dist/utils/CompatibilityUpgrader.js +7 -7
- package/dist/utils/CompatibilityUpgrader.js.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/utils/MoveOperationHelper.js.map +1 -1
- package/dist/utils/RevisionAwareProcessor.js.map +1 -1
- package/dist/utils/RevisionWalker.js.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/utils/ShadingResolver.js +1 -1
- package/dist/utils/ShadingResolver.js.map +1 -1
- package/dist/utils/acceptRevisions.d.ts +0 -28
- package/dist/utils/acceptRevisions.d.ts.map +1 -1
- package/dist/utils/acceptRevisions.js +5 -7
- package/dist/utils/acceptRevisions.js.map +1 -1
- package/dist/utils/cnfStyleDecoder.js +1 -1
- package/dist/utils/cnfStyleDecoder.js.map +1 -1
- package/dist/utils/corruptionDetection.js.map +1 -1
- package/dist/utils/dateFormatting.js.map +1 -1
- package/dist/utils/deepClone.d.ts +0 -1
- package/dist/utils/deepClone.d.ts.map +1 -1
- package/dist/utils/deepClone.js +0 -7
- package/dist/utils/deepClone.js.map +1 -1
- package/dist/utils/diagnostics.d.ts +2 -2
- package/dist/utils/diagnostics.d.ts.map +1 -1
- package/dist/utils/diagnostics.js.map +1 -1
- package/dist/utils/errorHandling.js.map +1 -1
- package/dist/utils/formatting.js.map +1 -1
- package/dist/utils/list-detection.d.ts +2 -2
- package/dist/utils/list-detection.d.ts.map +1 -1
- package/dist/utils/list-detection.js +3 -3
- package/dist/utils/list-detection.js.map +1 -1
- package/dist/utils/logger.d.ts +2 -4
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +0 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/parsingHelpers.js.map +1 -1
- package/dist/utils/stripTrackedChanges.d.ts +0 -19
- package/dist/utils/stripTrackedChanges.d.ts.map +1 -1
- package/dist/utils/stripTrackedChanges.js +0 -2
- package/dist/utils/stripTrackedChanges.js.map +1 -1
- package/dist/utils/textDiff.js.map +1 -1
- package/dist/utils/units.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/xmlSanitization.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/dist/validation/RevisionValidator.js.map +1 -1
- package/dist/validation/ValidationRules.js.map +1 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +10 -0
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.d.ts.map +1 -1
- package/dist/xml/XMLParser.js +4 -5
- package/dist/xml/XMLParser.js.map +1 -1
- package/dist/zip/ZipHandler.js.map +1 -1
- package/dist/zip/ZipReader.js.map +1 -1
- package/dist/zip/ZipWriter.js.map +1 -1
- package/dist/zip/errors.js.map +1 -1
- package/dist/zip/types.js.map +1 -1
- package/package.json +34 -4
- package/src/__tests__/helper-methods.test.ts +512 -0
- package/src/constants/legacyCompatFlags.ts +138 -0
- package/src/constants/limits.ts +50 -0
- package/src/core/CLAUDE.md +109 -0
- package/src/core/Document.ts +15569 -0
- package/src/core/DocumentContent.ts +467 -0
- package/src/core/DocumentGenerator.ts +1104 -0
- package/src/core/DocumentIdManager.ts +158 -0
- package/src/core/DocumentParser.ts +10107 -0
- package/src/core/DocumentValidator.ts +372 -0
- package/src/core/Relationship.ts +367 -0
- package/src/core/RelationshipManager.ts +428 -0
- package/src/elements/AlternateContent.ts +42 -0
- package/src/elements/Bookmark.ts +210 -0
- package/src/elements/BookmarkManager.ts +250 -0
- package/src/elements/CLAUDE.md +126 -0
- package/src/elements/Comment.ts +359 -0
- package/src/elements/CommentManager.ts +502 -0
- package/src/elements/CommonTypes.ts +549 -0
- package/src/elements/CustomXml.ts +36 -0
- package/src/elements/Endnote.ts +217 -0
- package/src/elements/EndnoteManager.ts +249 -0
- package/src/elements/Field.ts +1233 -0
- package/src/elements/FieldHelpers.ts +333 -0
- package/src/elements/FontManager.ts +339 -0
- package/src/elements/Footer.ts +269 -0
- package/src/elements/Footnote.ts +217 -0
- package/src/elements/FootnoteManager.ts +249 -0
- package/src/elements/Header.ts +269 -0
- package/src/elements/HeaderFooterManager.ts +219 -0
- package/src/elements/Hyperlink.ts +1146 -0
- package/src/elements/Image.ts +1756 -0
- package/src/elements/ImageManager.ts +432 -0
- package/src/elements/ImageRun.ts +59 -0
- package/src/elements/MathElement.ts +65 -0
- package/src/elements/Paragraph.ts +4227 -0
- package/src/elements/PreservedElement.ts +53 -0
- package/src/elements/PropertyChangeTypes.ts +442 -0
- package/src/elements/RangeMarker.ts +400 -0
- package/src/elements/Revision.ts +1217 -0
- package/src/elements/RevisionContent.ts +73 -0
- package/src/elements/RevisionManager.ts +1070 -0
- package/src/elements/Run.ts +3068 -0
- package/src/elements/Section.ts +1421 -0
- package/src/elements/Shape.ts +873 -0
- package/src/elements/StructuredDocumentTag.ts +978 -0
- package/src/elements/Table.ts +2524 -0
- package/src/elements/TableCell.ts +1586 -0
- package/src/elements/TableGridChange.ts +151 -0
- package/src/elements/TableOfContents.ts +691 -0
- package/src/elements/TableOfContentsElement.ts +89 -0
- package/src/elements/TableRow.ts +906 -0
- package/src/elements/TextBox.ts +768 -0
- package/src/formatting/AbstractNumbering.ts +548 -0
- package/src/formatting/CLAUDE.md +74 -0
- package/src/formatting/NumberingInstance.ts +212 -0
- package/src/formatting/NumberingLevel.ts +1006 -0
- package/src/formatting/NumberingManager.ts +827 -0
- package/src/formatting/Style.ts +1833 -0
- package/src/formatting/StylesManager.ts +1005 -0
- package/src/helpers/CleanupHelper.ts +524 -0
- package/src/images/ImageOptimizer.ts +274 -0
- package/src/index.ts +554 -0
- package/src/managers/CLAUDE.md +47 -0
- package/src/managers/DrawingManager.ts +319 -0
- package/src/tracking/DocumentTrackingContext.ts +643 -0
- package/src/tracking/TrackingContext.ts +173 -0
- package/src/types/compatibility-types.ts +49 -0
- package/src/types/formatting.ts +210 -0
- package/src/types/list-types.ts +152 -0
- package/src/types/settings-types.ts +59 -0
- package/src/types/styleConfig.ts +189 -0
- package/src/utils/CLAUDE.md +153 -0
- package/src/utils/ChangelogGenerator.ts +1581 -0
- package/src/utils/CompatibilityUpgrader.ts +237 -0
- package/src/utils/InMemoryRevisionAcceptor.ts +668 -0
- package/src/utils/MoveOperationHelper.ts +238 -0
- package/src/utils/RevisionAwareProcessor.ts +526 -0
- package/src/utils/RevisionWalker.ts +457 -0
- package/src/utils/SelectiveRevisionAcceptor.ts +613 -0
- package/src/utils/ShadingResolver.ts +107 -0
- package/src/utils/acceptRevisions.ts +714 -0
- package/src/utils/cnfStyleDecoder.ts +217 -0
- package/src/utils/corruptionDetection.ts +345 -0
- package/src/utils/dateFormatting.ts +20 -0
- package/src/utils/deepClone.ts +78 -0
- package/src/utils/diagnostics.ts +129 -0
- package/src/utils/errorHandling.ts +80 -0
- package/src/utils/formatting.ts +213 -0
- package/src/utils/list-detection.ts +274 -0
- package/src/utils/logger.ts +404 -0
- package/src/utils/parsingHelpers.ts +190 -0
- package/src/utils/stripTrackedChanges.ts +353 -0
- package/src/utils/textDiff.ts +100 -0
- package/src/utils/units.ts +421 -0
- package/src/utils/validation.ts +542 -0
- package/src/utils/xmlSanitization.ts +182 -0
- package/src/validation/RevisionAutoFixer.ts +542 -0
- package/src/validation/RevisionValidator.ts +460 -0
- package/src/validation/ValidationRules.ts +338 -0
- package/src/validation/index.ts +30 -0
- package/src/xml/CLAUDE.md +65 -0
- package/src/xml/XMLBuilder.ts +871 -0
- package/src/xml/XMLParser.ts +919 -0
- package/src/zip/CLAUDE.md +55 -0
- package/src/zip/ZipHandler.ts +637 -0
- package/src/zip/ZipReader.ts +299 -0
- package/src/zip/ZipWriter.ts +390 -0
- package/src/zip/errors.ts +69 -0
- package/src/zip/types.ts +116 -0
- package/dist/core/ListNormalizer.d.ts +0 -23
- package/dist/core/ListNormalizer.d.ts.map +0 -1
- package/dist/core/ListNormalizer.js +0 -624
- package/dist/core/ListNormalizer.js.map +0 -1
- package/dist/images/index.d.ts +0 -2
- package/dist/images/index.d.ts.map +0 -1
- package/dist/images/index.js +0 -8
- package/dist/images/index.js.map +0 -1
- package/dist/ms-doc/cfb/CFBReader.d.ts +0 -35
- package/dist/ms-doc/cfb/CFBReader.d.ts.map +0 -1
- package/dist/ms-doc/cfb/CFBReader.js +0 -360
- package/dist/ms-doc/cfb/CFBReader.js.map +0 -1
- package/dist/ms-doc/converter/DocToDocxConverter.d.ts +0 -55
- package/dist/ms-doc/converter/DocToDocxConverter.d.ts.map +0 -1
- package/dist/ms-doc/converter/DocToDocxConverter.js +0 -324
- package/dist/ms-doc/converter/DocToDocxConverter.js.map +0 -1
- package/dist/ms-doc/fib/FIB.d.ts +0 -18
- package/dist/ms-doc/fib/FIB.d.ts.map +0 -1
- package/dist/ms-doc/fib/FIB.js +0 -342
- package/dist/ms-doc/fib/FIB.js.map +0 -1
- package/dist/ms-doc/fields/FieldParser.d.ts +0 -31
- package/dist/ms-doc/fields/FieldParser.d.ts.map +0 -1
- package/dist/ms-doc/fields/FieldParser.js +0 -266
- package/dist/ms-doc/fields/FieldParser.js.map +0 -1
- package/dist/ms-doc/images/PictureExtractor.d.ts +0 -22
- package/dist/ms-doc/images/PictureExtractor.d.ts.map +0 -1
- package/dist/ms-doc/images/PictureExtractor.js +0 -233
- package/dist/ms-doc/images/PictureExtractor.js.map +0 -1
- package/dist/ms-doc/index.d.ts +0 -20
- package/dist/ms-doc/index.d.ts.map +0 -1
- package/dist/ms-doc/index.js +0 -59
- package/dist/ms-doc/index.js.map +0 -1
- package/dist/ms-doc/properties/SPRM.d.ts +0 -210
- package/dist/ms-doc/properties/SPRM.d.ts.map +0 -1
- package/dist/ms-doc/properties/SPRM.js +0 -633
- package/dist/ms-doc/properties/SPRM.js.map +0 -1
- package/dist/ms-doc/sections/SectionParser.d.ts +0 -25
- package/dist/ms-doc/sections/SectionParser.d.ts.map +0 -1
- package/dist/ms-doc/sections/SectionParser.js +0 -214
- package/dist/ms-doc/sections/SectionParser.js.map +0 -1
- package/dist/ms-doc/styles/StyleSheet.d.ts +0 -23
- package/dist/ms-doc/styles/StyleSheet.d.ts.map +0 -1
- package/dist/ms-doc/styles/StyleSheet.js +0 -268
- package/dist/ms-doc/styles/StyleSheet.js.map +0 -1
- package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts +0 -61
- package/dist/ms-doc/subdocuments/SubdocumentParser.d.ts.map +0 -1
- package/dist/ms-doc/subdocuments/SubdocumentParser.js +0 -208
- package/dist/ms-doc/subdocuments/SubdocumentParser.js.map +0 -1
- package/dist/ms-doc/tables/TableParser.d.ts +0 -29
- package/dist/ms-doc/tables/TableParser.d.ts.map +0 -1
- package/dist/ms-doc/tables/TableParser.js +0 -176
- package/dist/ms-doc/tables/TableParser.js.map +0 -1
- package/dist/ms-doc/text/PieceTable.d.ts +0 -21
- package/dist/ms-doc/text/PieceTable.d.ts.map +0 -1
- package/dist/ms-doc/text/PieceTable.js +0 -171
- package/dist/ms-doc/text/PieceTable.js.map +0 -1
- package/dist/ms-doc/types/Constants.d.ts +0 -99
- package/dist/ms-doc/types/Constants.d.ts.map +0 -1
- package/dist/ms-doc/types/Constants.js +0 -102
- package/dist/ms-doc/types/Constants.js.map +0 -1
- package/dist/ms-doc/types/DocTypes.d.ts +0 -368
- package/dist/ms-doc/types/DocTypes.d.ts.map +0 -1
- package/dist/ms-doc/types/DocTypes.js +0 -3
- package/dist/ms-doc/types/DocTypes.js.map +0 -1
- package/dist/tracking/index.d.ts +0 -3
- package/dist/tracking/index.d.ts.map +0 -1
- package/dist/tracking/index.js +0 -6
- package/dist/tracking/index.js.map +0 -1
|
@@ -0,0 +1,768 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TextBox - Represents a floating text box in a Word document
|
|
3
|
+
*
|
|
4
|
+
* Text boxes use DrawingML (a:) and WordprocessingML Drawing (wp:) namespaces,
|
|
5
|
+
* plus WordprocessingShape (wps:) namespace for Word 2010+ features.
|
|
6
|
+
*
|
|
7
|
+
* Per ECMA-376 Part 4 (Transitional) and Office Open XML extensions,
|
|
8
|
+
* text boxes in Word documents use the wps:wsp element with wps:txbx content.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { XMLBuilder, XMLElement } from '../xml/XMLBuilder';
|
|
12
|
+
import { UNITS } from '../utils/units';
|
|
13
|
+
import { Paragraph } from './Paragraph';
|
|
14
|
+
import {
|
|
15
|
+
ImagePosition,
|
|
16
|
+
ImageAnchor,
|
|
17
|
+
PositionAnchor,
|
|
18
|
+
HorizontalAlignment,
|
|
19
|
+
VerticalAlignment
|
|
20
|
+
} from './Image';
|
|
21
|
+
import { BorderDefinition } from './Paragraph';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* TextBox margins configuration
|
|
25
|
+
*/
|
|
26
|
+
export interface TextBoxMargins {
|
|
27
|
+
/** Top margin in EMUs */
|
|
28
|
+
top: number;
|
|
29
|
+
/** Bottom margin in EMUs */
|
|
30
|
+
bottom: number;
|
|
31
|
+
/** Left margin in EMUs */
|
|
32
|
+
left: number;
|
|
33
|
+
/** Right margin in EMUs */
|
|
34
|
+
right: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* TextBox fill configuration
|
|
39
|
+
*/
|
|
40
|
+
export interface TextBoxFill {
|
|
41
|
+
/** Fill color in hex (e.g., 'F0F0F0') */
|
|
42
|
+
color: string;
|
|
43
|
+
/** Transparency percentage (0-100) */
|
|
44
|
+
transparency?: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* TextBox properties
|
|
49
|
+
*/
|
|
50
|
+
export interface TextBoxProperties {
|
|
51
|
+
/** Width in EMUs */
|
|
52
|
+
width: number;
|
|
53
|
+
/** Height in EMUs */
|
|
54
|
+
height: number;
|
|
55
|
+
/** Paragraphs within the text box */
|
|
56
|
+
paragraphs?: Paragraph[];
|
|
57
|
+
/** Position configuration */
|
|
58
|
+
position?: ImagePosition;
|
|
59
|
+
/** Anchor configuration */
|
|
60
|
+
anchor?: ImageAnchor;
|
|
61
|
+
/** Fill color and transparency */
|
|
62
|
+
fill?: TextBoxFill;
|
|
63
|
+
/** Border configuration */
|
|
64
|
+
borders?: BorderDefinition;
|
|
65
|
+
/** Internal margins */
|
|
66
|
+
margins?: TextBoxMargins;
|
|
67
|
+
/** TextBox name */
|
|
68
|
+
name?: string;
|
|
69
|
+
/** TextBox description (for accessibility) */
|
|
70
|
+
description?: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Represents a floating text box
|
|
75
|
+
*/
|
|
76
|
+
export class TextBox {
|
|
77
|
+
private width: number;
|
|
78
|
+
private height: number;
|
|
79
|
+
private paragraphs: Paragraph[] = [];
|
|
80
|
+
private position?: ImagePosition;
|
|
81
|
+
private anchor?: ImageAnchor;
|
|
82
|
+
private fill?: TextBoxFill;
|
|
83
|
+
private borders?: BorderDefinition;
|
|
84
|
+
private margins?: TextBoxMargins;
|
|
85
|
+
private name: string;
|
|
86
|
+
private description: string;
|
|
87
|
+
private docPrId = 1;
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Creates a new text box
|
|
91
|
+
* @param properties TextBox properties
|
|
92
|
+
* @private Use static factory methods instead (create)
|
|
93
|
+
*/
|
|
94
|
+
private constructor(properties: TextBoxProperties) {
|
|
95
|
+
this.width = properties.width;
|
|
96
|
+
this.height = properties.height;
|
|
97
|
+
if (properties.paragraphs) {
|
|
98
|
+
this.paragraphs = properties.paragraphs;
|
|
99
|
+
}
|
|
100
|
+
this.position = properties.position;
|
|
101
|
+
this.anchor = properties.anchor;
|
|
102
|
+
this.fill = properties.fill;
|
|
103
|
+
this.borders = properties.borders;
|
|
104
|
+
this.margins = properties.margins;
|
|
105
|
+
this.name = properties.name || 'TextBox';
|
|
106
|
+
this.description = properties.description || '';
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Factory method for creating a text box
|
|
111
|
+
* @param width Width in EMUs
|
|
112
|
+
* @param height Height in EMUs
|
|
113
|
+
* @returns New TextBox instance
|
|
114
|
+
* @example
|
|
115
|
+
* const textbox = TextBox.create(inchesToEmus(3), inchesToEmus(2));
|
|
116
|
+
*/
|
|
117
|
+
static create(width: number, height: number): TextBox {
|
|
118
|
+
return new TextBox({ width, height });
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Gets the width in EMUs
|
|
123
|
+
* @returns Width
|
|
124
|
+
*/
|
|
125
|
+
getWidth(): number {
|
|
126
|
+
return this.width;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Gets the height in EMUs
|
|
131
|
+
* @returns Height
|
|
132
|
+
*/
|
|
133
|
+
getHeight(): number {
|
|
134
|
+
return this.height;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Adds a paragraph to the text box
|
|
139
|
+
* @param paragraph Paragraph to add
|
|
140
|
+
* @returns This text box for chaining
|
|
141
|
+
*/
|
|
142
|
+
addParagraph(paragraph: Paragraph): this {
|
|
143
|
+
this.paragraphs.push(paragraph);
|
|
144
|
+
return this;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Gets all paragraphs
|
|
149
|
+
* @returns Array of paragraphs
|
|
150
|
+
*/
|
|
151
|
+
getParagraphs(): Paragraph[] {
|
|
152
|
+
return this.paragraphs;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Sets text box position (for floating text boxes)
|
|
157
|
+
* @param horizontal Horizontal positioning configuration
|
|
158
|
+
* @param vertical Vertical positioning configuration
|
|
159
|
+
* @returns This text box for chaining
|
|
160
|
+
*/
|
|
161
|
+
setPosition(
|
|
162
|
+
horizontal: { anchor: PositionAnchor; offset?: number; alignment?: HorizontalAlignment },
|
|
163
|
+
vertical: { anchor: PositionAnchor; offset?: number; alignment?: VerticalAlignment }
|
|
164
|
+
): this {
|
|
165
|
+
this.position = { horizontal, vertical };
|
|
166
|
+
return this;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Gets the position configuration
|
|
171
|
+
* @returns Position or undefined
|
|
172
|
+
*/
|
|
173
|
+
getPosition(): ImagePosition | undefined {
|
|
174
|
+
return this.position;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Sets anchor configuration
|
|
179
|
+
* @param options Anchor configuration
|
|
180
|
+
* @returns This text box for chaining
|
|
181
|
+
*/
|
|
182
|
+
setAnchor(options: ImageAnchor): this {
|
|
183
|
+
this.anchor = options;
|
|
184
|
+
return this;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Gets the anchor configuration
|
|
189
|
+
* @returns Anchor configuration or undefined
|
|
190
|
+
*/
|
|
191
|
+
getAnchor(): ImageAnchor | undefined {
|
|
192
|
+
return this.anchor;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Sets the fill color
|
|
197
|
+
* @param color Fill color in hex
|
|
198
|
+
* @param transparency Optional transparency percentage (0-100)
|
|
199
|
+
* @returns This text box for chaining
|
|
200
|
+
*/
|
|
201
|
+
setFill(color: string, transparency?: number): this {
|
|
202
|
+
this.fill = { color, transparency };
|
|
203
|
+
return this;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Gets the fill configuration
|
|
208
|
+
* @returns Fill or undefined
|
|
209
|
+
*/
|
|
210
|
+
getFill(): TextBoxFill | undefined {
|
|
211
|
+
return this.fill;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Sets the borders
|
|
216
|
+
* @param borders Border configuration
|
|
217
|
+
* @returns This text box for chaining
|
|
218
|
+
*/
|
|
219
|
+
setBorders(borders: BorderDefinition): this {
|
|
220
|
+
this.borders = borders;
|
|
221
|
+
return this;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Gets the borders configuration
|
|
226
|
+
* @returns Borders or undefined
|
|
227
|
+
*/
|
|
228
|
+
getBorders(): BorderDefinition | undefined {
|
|
229
|
+
return this.borders;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Sets internal margins
|
|
234
|
+
* @param margins Margin configuration
|
|
235
|
+
* @returns This text box for chaining
|
|
236
|
+
*/
|
|
237
|
+
setMargins(margins: TextBoxMargins): this {
|
|
238
|
+
this.margins = margins;
|
|
239
|
+
return this;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Gets the margins configuration
|
|
244
|
+
* @returns Margins or undefined
|
|
245
|
+
*/
|
|
246
|
+
getMargins(): TextBoxMargins | undefined {
|
|
247
|
+
return this.margins;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Sets the text box name
|
|
252
|
+
* @param name TextBox name
|
|
253
|
+
* @returns This text box for chaining
|
|
254
|
+
*/
|
|
255
|
+
setName(name: string): this {
|
|
256
|
+
this.name = name;
|
|
257
|
+
return this;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Gets the text box name
|
|
262
|
+
* @returns TextBox name
|
|
263
|
+
*/
|
|
264
|
+
getName(): string {
|
|
265
|
+
return this.name;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Sets the text box description (for accessibility)
|
|
270
|
+
* @param description TextBox description
|
|
271
|
+
* @returns This text box for chaining
|
|
272
|
+
*/
|
|
273
|
+
setDescription(description: string): this {
|
|
274
|
+
this.description = description;
|
|
275
|
+
return this;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Gets the text box description
|
|
280
|
+
* @returns TextBox description
|
|
281
|
+
*/
|
|
282
|
+
getDescription(): string {
|
|
283
|
+
return this.description;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Sets the docPr ID (drawing object ID)
|
|
288
|
+
* @param id Document property ID
|
|
289
|
+
* @returns This text box for chaining
|
|
290
|
+
*/
|
|
291
|
+
setDocPrId(id: number): this {
|
|
292
|
+
this.docPrId = id;
|
|
293
|
+
return this;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Checks if this text box is floating (has anchor or position configuration)
|
|
298
|
+
* @returns True if floating, false if inline
|
|
299
|
+
*/
|
|
300
|
+
isFloating(): boolean {
|
|
301
|
+
return this.anchor !== undefined || this.position !== undefined;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Generates DrawingML XML for the text box
|
|
306
|
+
* Creates either inline or floating (anchor) text box based on configuration
|
|
307
|
+
* @returns XML element representing the text box
|
|
308
|
+
*/
|
|
309
|
+
toXML(): XMLElement {
|
|
310
|
+
// Text boxes are typically floating, but support inline as well
|
|
311
|
+
const textboxElement = this.isFloating() ? this.createAnchor() : this.createInline();
|
|
312
|
+
|
|
313
|
+
// Create the drawing structure
|
|
314
|
+
return XMLBuilder.w('drawing', undefined, [textboxElement]);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Creates the wp:inline element for inline text boxes
|
|
319
|
+
* @private
|
|
320
|
+
*/
|
|
321
|
+
private createInline(): XMLElement {
|
|
322
|
+
const children: XMLElement[] = [];
|
|
323
|
+
|
|
324
|
+
// Extent (size)
|
|
325
|
+
children.push({
|
|
326
|
+
name: 'wp:extent',
|
|
327
|
+
attributes: {
|
|
328
|
+
cx: this.width.toString(),
|
|
329
|
+
cy: this.height.toString(),
|
|
330
|
+
},
|
|
331
|
+
selfClosing: true,
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
// Effect extent
|
|
335
|
+
children.push({
|
|
336
|
+
name: 'wp:effectExtent',
|
|
337
|
+
attributes: {
|
|
338
|
+
l: '0',
|
|
339
|
+
t: '0',
|
|
340
|
+
r: '0',
|
|
341
|
+
b: '0',
|
|
342
|
+
},
|
|
343
|
+
selfClosing: true,
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
// Document properties
|
|
347
|
+
children.push({
|
|
348
|
+
name: 'wp:docPr',
|
|
349
|
+
attributes: {
|
|
350
|
+
id: this.docPrId.toString(),
|
|
351
|
+
name: this.name,
|
|
352
|
+
descr: this.description,
|
|
353
|
+
},
|
|
354
|
+
selfClosing: true,
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
// Non-visual graphic frame properties
|
|
358
|
+
children.push({
|
|
359
|
+
name: 'wp:cNvGraphicFramePr',
|
|
360
|
+
selfClosing: true,
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
// Graphic data (the text box)
|
|
364
|
+
children.push(this.createGraphic());
|
|
365
|
+
|
|
366
|
+
return {
|
|
367
|
+
name: 'wp:inline',
|
|
368
|
+
attributes: {
|
|
369
|
+
distT: '0',
|
|
370
|
+
distB: '0',
|
|
371
|
+
distL: '0',
|
|
372
|
+
distR: '0',
|
|
373
|
+
},
|
|
374
|
+
children,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Creates the wp:anchor element for floating text boxes
|
|
380
|
+
* @private
|
|
381
|
+
*/
|
|
382
|
+
private createAnchor(): XMLElement {
|
|
383
|
+
const children: XMLElement[] = [];
|
|
384
|
+
|
|
385
|
+
const anchorConfig = this.anchor || {
|
|
386
|
+
behindDoc: false,
|
|
387
|
+
locked: false,
|
|
388
|
+
layoutInCell: true,
|
|
389
|
+
allowOverlap: false,
|
|
390
|
+
relativeHeight: 251658240,
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
// Position H (horizontal)
|
|
394
|
+
if (this.position) {
|
|
395
|
+
const posH = this.position.horizontal;
|
|
396
|
+
const posHChildren: XMLElement[] = [];
|
|
397
|
+
|
|
398
|
+
if (posH.offset !== undefined) {
|
|
399
|
+
posHChildren.push({
|
|
400
|
+
name: 'wp:posOffset',
|
|
401
|
+
children: [posH.offset.toString()],
|
|
402
|
+
});
|
|
403
|
+
} else if (posH.alignment) {
|
|
404
|
+
posHChildren.push({
|
|
405
|
+
name: 'wp:align',
|
|
406
|
+
children: [posH.alignment],
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
children.push({
|
|
411
|
+
name: 'wp:positionH',
|
|
412
|
+
attributes: {
|
|
413
|
+
relativeFrom: posH.anchor,
|
|
414
|
+
},
|
|
415
|
+
children: posHChildren,
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// Position V (vertical)
|
|
420
|
+
if (this.position) {
|
|
421
|
+
const posV = this.position.vertical;
|
|
422
|
+
const posVChildren: XMLElement[] = [];
|
|
423
|
+
|
|
424
|
+
if (posV.offset !== undefined) {
|
|
425
|
+
posVChildren.push({
|
|
426
|
+
name: 'wp:posOffset',
|
|
427
|
+
children: [posV.offset.toString()],
|
|
428
|
+
});
|
|
429
|
+
} else if (posV.alignment) {
|
|
430
|
+
posVChildren.push({
|
|
431
|
+
name: 'wp:align',
|
|
432
|
+
children: [posV.alignment],
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
children.push({
|
|
437
|
+
name: 'wp:positionV',
|
|
438
|
+
attributes: {
|
|
439
|
+
relativeFrom: posV.anchor,
|
|
440
|
+
},
|
|
441
|
+
children: posVChildren,
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// Extent (size)
|
|
446
|
+
children.push({
|
|
447
|
+
name: 'wp:extent',
|
|
448
|
+
attributes: {
|
|
449
|
+
cx: this.width.toString(),
|
|
450
|
+
cy: this.height.toString(),
|
|
451
|
+
},
|
|
452
|
+
selfClosing: true,
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
// Effect extent
|
|
456
|
+
children.push({
|
|
457
|
+
name: 'wp:effectExtent',
|
|
458
|
+
attributes: {
|
|
459
|
+
l: '0',
|
|
460
|
+
t: '0',
|
|
461
|
+
r: '0',
|
|
462
|
+
b: '0',
|
|
463
|
+
},
|
|
464
|
+
selfClosing: true,
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
// Wrap square (default for text boxes)
|
|
468
|
+
children.push({
|
|
469
|
+
name: 'wp:wrapSquare',
|
|
470
|
+
attributes: {
|
|
471
|
+
wrapText: 'bothSides',
|
|
472
|
+
},
|
|
473
|
+
selfClosing: true,
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
// Document properties
|
|
477
|
+
children.push({
|
|
478
|
+
name: 'wp:docPr',
|
|
479
|
+
attributes: {
|
|
480
|
+
id: this.docPrId.toString(),
|
|
481
|
+
name: this.name,
|
|
482
|
+
descr: this.description,
|
|
483
|
+
},
|
|
484
|
+
selfClosing: true,
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
// Non-visual graphic frame properties
|
|
488
|
+
children.push({
|
|
489
|
+
name: 'wp:cNvGraphicFramePr',
|
|
490
|
+
selfClosing: true,
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
// Graphic data (the text box)
|
|
494
|
+
children.push(this.createGraphic());
|
|
495
|
+
|
|
496
|
+
return {
|
|
497
|
+
name: 'wp:anchor',
|
|
498
|
+
attributes: {
|
|
499
|
+
distT: '0',
|
|
500
|
+
distB: '0',
|
|
501
|
+
distL: '0',
|
|
502
|
+
distR: '0',
|
|
503
|
+
simplePos: '0',
|
|
504
|
+
relativeHeight: anchorConfig.relativeHeight.toString(),
|
|
505
|
+
behindDoc: anchorConfig.behindDoc ? '1' : '0',
|
|
506
|
+
locked: anchorConfig.locked ? '1' : '0',
|
|
507
|
+
layoutInCell: anchorConfig.layoutInCell ? '1' : '0',
|
|
508
|
+
allowOverlap: anchorConfig.allowOverlap ? '1' : '0',
|
|
509
|
+
},
|
|
510
|
+
children,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* Creates the a:graphic element containing the text box
|
|
516
|
+
* @private
|
|
517
|
+
*/
|
|
518
|
+
private createGraphic(): XMLElement {
|
|
519
|
+
return {
|
|
520
|
+
name: 'a:graphic',
|
|
521
|
+
attributes: {
|
|
522
|
+
'xmlns:a': 'http://schemas.openxmlformats.org/drawingml/2006/main',
|
|
523
|
+
},
|
|
524
|
+
children: [
|
|
525
|
+
{
|
|
526
|
+
name: 'a:graphicData',
|
|
527
|
+
attributes: {
|
|
528
|
+
uri: 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape',
|
|
529
|
+
},
|
|
530
|
+
children: [this.createWps()],
|
|
531
|
+
},
|
|
532
|
+
],
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/**
|
|
537
|
+
* Creates the wps:wsp element (WordprocessingShape for text box)
|
|
538
|
+
* @private
|
|
539
|
+
*/
|
|
540
|
+
private createWps(): XMLElement {
|
|
541
|
+
const children: XMLElement[] = [];
|
|
542
|
+
|
|
543
|
+
// Non-visual shape properties
|
|
544
|
+
children.push({
|
|
545
|
+
name: 'wps:cNvSpPr',
|
|
546
|
+
attributes: {
|
|
547
|
+
'xmlns:wps': 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape',
|
|
548
|
+
txBox: '1', // Indicates this is a text box
|
|
549
|
+
},
|
|
550
|
+
selfClosing: true,
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
// Shape properties (size, fill, borders)
|
|
554
|
+
children.push(this.createSpPr());
|
|
555
|
+
|
|
556
|
+
// Text box content
|
|
557
|
+
children.push(this.createTextBoxContent());
|
|
558
|
+
|
|
559
|
+
// Body properties (margins/insets)
|
|
560
|
+
children.push(this.createBodyPr());
|
|
561
|
+
|
|
562
|
+
return {
|
|
563
|
+
name: 'wps:wsp',
|
|
564
|
+
attributes: {
|
|
565
|
+
'xmlns:wps': 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape',
|
|
566
|
+
},
|
|
567
|
+
children,
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
/**
|
|
572
|
+
* Creates the wps:bodyPr element (text body properties including margins)
|
|
573
|
+
* Per ECMA-376 Part 4, bodyPr specifies inset margins via lIns/tIns/rIns/bIns attributes
|
|
574
|
+
* @private
|
|
575
|
+
*/
|
|
576
|
+
private createBodyPr(): XMLElement {
|
|
577
|
+
const attrs: Record<string, string> = {
|
|
578
|
+
rot: '0',
|
|
579
|
+
vert: 'horz',
|
|
580
|
+
wrap: 'square',
|
|
581
|
+
anchor: 't',
|
|
582
|
+
};
|
|
583
|
+
|
|
584
|
+
// Add margin insets if set
|
|
585
|
+
if (this.margins) {
|
|
586
|
+
if (this.margins.left !== undefined) attrs.lIns = this.margins.left.toString();
|
|
587
|
+
if (this.margins.top !== undefined) attrs.tIns = this.margins.top.toString();
|
|
588
|
+
if (this.margins.right !== undefined) attrs.rIns = this.margins.right.toString();
|
|
589
|
+
if (this.margins.bottom !== undefined) attrs.bIns = this.margins.bottom.toString();
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
return {
|
|
593
|
+
name: 'wps:bodyPr',
|
|
594
|
+
attributes: attrs,
|
|
595
|
+
selfClosing: true,
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
* Creates the wps:spPr element (shape properties for text box)
|
|
601
|
+
* @private
|
|
602
|
+
*/
|
|
603
|
+
private createSpPr(): XMLElement {
|
|
604
|
+
const children: XMLElement[] = [];
|
|
605
|
+
|
|
606
|
+
// Transform (position and size)
|
|
607
|
+
children.push({
|
|
608
|
+
name: 'a:xfrm',
|
|
609
|
+
children: [
|
|
610
|
+
{
|
|
611
|
+
name: 'a:off',
|
|
612
|
+
attributes: { x: '0', y: '0' },
|
|
613
|
+
selfClosing: true,
|
|
614
|
+
},
|
|
615
|
+
{
|
|
616
|
+
name: 'a:ext',
|
|
617
|
+
attributes: {
|
|
618
|
+
cx: this.width.toString(),
|
|
619
|
+
cy: this.height.toString(),
|
|
620
|
+
},
|
|
621
|
+
selfClosing: true,
|
|
622
|
+
},
|
|
623
|
+
],
|
|
624
|
+
});
|
|
625
|
+
|
|
626
|
+
// Preset geometry (rectangle for text box)
|
|
627
|
+
children.push({
|
|
628
|
+
name: 'a:prstGeom',
|
|
629
|
+
attributes: {
|
|
630
|
+
prst: 'rect',
|
|
631
|
+
},
|
|
632
|
+
children: [
|
|
633
|
+
{
|
|
634
|
+
name: 'a:avLst',
|
|
635
|
+
selfClosing: true,
|
|
636
|
+
},
|
|
637
|
+
],
|
|
638
|
+
});
|
|
639
|
+
|
|
640
|
+
// Fill
|
|
641
|
+
if (this.fill) {
|
|
642
|
+
const fillChildren: XMLElement[] = [];
|
|
643
|
+
|
|
644
|
+
// Transparency
|
|
645
|
+
if (this.fill.transparency !== undefined) {
|
|
646
|
+
const alpha = 100 - this.fill.transparency;
|
|
647
|
+
fillChildren.push({
|
|
648
|
+
name: 'a:alpha',
|
|
649
|
+
attributes: {
|
|
650
|
+
val: Math.round(alpha * 1000).toString(),
|
|
651
|
+
},
|
|
652
|
+
selfClosing: true,
|
|
653
|
+
});
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
children.push({
|
|
657
|
+
name: 'a:solidFill',
|
|
658
|
+
children: [
|
|
659
|
+
{
|
|
660
|
+
name: 'a:srgbClr',
|
|
661
|
+
attributes: {
|
|
662
|
+
val: this.fill.color.toUpperCase(),
|
|
663
|
+
},
|
|
664
|
+
...(fillChildren.length > 0 ? { children: fillChildren } : { selfClosing: true }),
|
|
665
|
+
},
|
|
666
|
+
],
|
|
667
|
+
});
|
|
668
|
+
} else {
|
|
669
|
+
// No fill (transparent background)
|
|
670
|
+
children.push({
|
|
671
|
+
name: 'a:noFill',
|
|
672
|
+
selfClosing: true,
|
|
673
|
+
});
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
// Borders
|
|
677
|
+
if (this.borders?.size !== undefined) {
|
|
678
|
+
const lnAttrs: Record<string, string> = {
|
|
679
|
+
w: (this.borders.size * UNITS.EMUS_PER_POINT).toString(), // Convert points to EMUs
|
|
680
|
+
};
|
|
681
|
+
|
|
682
|
+
const lnChildren: XMLElement[] = [];
|
|
683
|
+
|
|
684
|
+
// Border color
|
|
685
|
+
lnChildren.push({
|
|
686
|
+
name: 'a:solidFill',
|
|
687
|
+
children: [
|
|
688
|
+
{
|
|
689
|
+
name: 'a:srgbClr',
|
|
690
|
+
attributes: {
|
|
691
|
+
val: (this.borders.color || '000000').toUpperCase(),
|
|
692
|
+
},
|
|
693
|
+
selfClosing: true,
|
|
694
|
+
},
|
|
695
|
+
],
|
|
696
|
+
});
|
|
697
|
+
|
|
698
|
+
// Border style
|
|
699
|
+
if (this.borders.style && this.borders.style !== 'single') {
|
|
700
|
+
const dashMap: Record<string, string> = {
|
|
701
|
+
dash: 'dash',
|
|
702
|
+
dot: 'dot',
|
|
703
|
+
dashDot: 'dashDot',
|
|
704
|
+
dashDotDot: 'lgDashDotDot',
|
|
705
|
+
};
|
|
706
|
+
const dashStyle = dashMap[this.borders.style] || 'solid';
|
|
707
|
+
if (dashStyle !== 'solid') {
|
|
708
|
+
lnChildren.push({
|
|
709
|
+
name: 'a:prstDash',
|
|
710
|
+
attributes: {
|
|
711
|
+
val: dashStyle,
|
|
712
|
+
},
|
|
713
|
+
selfClosing: true,
|
|
714
|
+
});
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
children.push({
|
|
719
|
+
name: 'a:ln',
|
|
720
|
+
attributes: lnAttrs,
|
|
721
|
+
children: lnChildren,
|
|
722
|
+
});
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
return {
|
|
726
|
+
name: 'wps:spPr',
|
|
727
|
+
children,
|
|
728
|
+
};
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
/**
|
|
732
|
+
* Creates the wps:txbx element (text box content)
|
|
733
|
+
* @private
|
|
734
|
+
*/
|
|
735
|
+
private createTextBoxContent(): XMLElement {
|
|
736
|
+
if (this.paragraphs.length === 0) {
|
|
737
|
+
// Empty text box - create empty paragraph
|
|
738
|
+
return {
|
|
739
|
+
name: 'wps:txbx',
|
|
740
|
+
children: [
|
|
741
|
+
{
|
|
742
|
+
name: 'w:txbxContent',
|
|
743
|
+
children: [
|
|
744
|
+
XMLBuilder.w('p', undefined, [
|
|
745
|
+
XMLBuilder.w('r', undefined, [
|
|
746
|
+
XMLBuilder.w('t', undefined, [''])
|
|
747
|
+
])
|
|
748
|
+
])
|
|
749
|
+
],
|
|
750
|
+
},
|
|
751
|
+
],
|
|
752
|
+
};
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
// Convert paragraphs to XML
|
|
756
|
+
const paragraphXml = this.paragraphs.map(p => p.toXML());
|
|
757
|
+
|
|
758
|
+
return {
|
|
759
|
+
name: 'wps:txbx',
|
|
760
|
+
children: [
|
|
761
|
+
{
|
|
762
|
+
name: 'w:txbxContent',
|
|
763
|
+
children: paragraphXml,
|
|
764
|
+
},
|
|
765
|
+
],
|
|
766
|
+
};
|
|
767
|
+
}
|
|
768
|
+
}
|