docxmlater 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +624 -0
  3. package/dist/core/Document.d.ts +215 -0
  4. package/dist/core/Document.d.ts.map +1 -0
  5. package/dist/core/Document.js +980 -0
  6. package/dist/core/Document.js.map +1 -0
  7. package/dist/core/Relationship.d.ts +42 -0
  8. package/dist/core/Relationship.d.ts.map +1 -0
  9. package/dist/core/Relationship.js +115 -0
  10. package/dist/core/Relationship.js.map +1 -0
  11. package/dist/core/RelationshipManager.d.ts +28 -0
  12. package/dist/core/RelationshipManager.d.ts.map +1 -0
  13. package/dist/core/RelationshipManager.js +126 -0
  14. package/dist/core/RelationshipManager.js.map +1 -0
  15. package/dist/elements/Bookmark.d.ts +22 -0
  16. package/dist/elements/Bookmark.d.ts.map +1 -0
  17. package/dist/elements/Bookmark.js +75 -0
  18. package/dist/elements/Bookmark.js.map +1 -0
  19. package/dist/elements/BookmarkManager.d.ts +22 -0
  20. package/dist/elements/BookmarkManager.d.ts.map +1 -0
  21. package/dist/elements/BookmarkManager.js +76 -0
  22. package/dist/elements/BookmarkManager.js.map +1 -0
  23. package/dist/elements/Comment.d.ts +42 -0
  24. package/dist/elements/Comment.d.ts.map +1 -0
  25. package/dist/elements/Comment.js +156 -0
  26. package/dist/elements/Comment.js.map +1 -0
  27. package/dist/elements/CommentManager.d.ts +40 -0
  28. package/dist/elements/CommentManager.d.ts.map +1 -0
  29. package/dist/elements/CommentManager.js +177 -0
  30. package/dist/elements/CommentManager.js.map +1 -0
  31. package/dist/elements/Field.d.ts +36 -0
  32. package/dist/elements/Field.d.ts.map +1 -0
  33. package/dist/elements/Field.js +216 -0
  34. package/dist/elements/Field.js.map +1 -0
  35. package/dist/elements/Footer.d.ts +32 -0
  36. package/dist/elements/Footer.d.ts.map +1 -0
  37. package/dist/elements/Footer.js +125 -0
  38. package/dist/elements/Footer.js.map +1 -0
  39. package/dist/elements/Header.d.ts +32 -0
  40. package/dist/elements/Header.d.ts.map +1 -0
  41. package/dist/elements/Header.js +125 -0
  42. package/dist/elements/Header.js.map +1 -0
  43. package/dist/elements/HeaderFooterManager.d.ts +37 -0
  44. package/dist/elements/HeaderFooterManager.d.ts.map +1 -0
  45. package/dist/elements/HeaderFooterManager.js +87 -0
  46. package/dist/elements/HeaderFooterManager.js.map +1 -0
  47. package/dist/elements/Hyperlink.d.ts +39 -0
  48. package/dist/elements/Hyperlink.d.ts.map +1 -0
  49. package/dist/elements/Hyperlink.js +107 -0
  50. package/dist/elements/Hyperlink.js.map +1 -0
  51. package/dist/elements/Image.d.ts +48 -0
  52. package/dist/elements/Image.d.ts.map +1 -0
  53. package/dist/elements/Image.js +431 -0
  54. package/dist/elements/Image.js.map +1 -0
  55. package/dist/elements/ImageManager.d.ts +33 -0
  56. package/dist/elements/ImageManager.d.ts.map +1 -0
  57. package/dist/elements/ImageManager.js +109 -0
  58. package/dist/elements/ImageManager.js.map +1 -0
  59. package/dist/elements/Paragraph.d.ts +82 -0
  60. package/dist/elements/Paragraph.d.ts.map +1 -0
  61. package/dist/elements/Paragraph.js +272 -0
  62. package/dist/elements/Paragraph.js.map +1 -0
  63. package/dist/elements/Revision.d.ts +34 -0
  64. package/dist/elements/Revision.d.ts.map +1 -0
  65. package/dist/elements/Revision.js +115 -0
  66. package/dist/elements/Revision.js.map +1 -0
  67. package/dist/elements/RevisionManager.d.ts +31 -0
  68. package/dist/elements/RevisionManager.d.ts.map +1 -0
  69. package/dist/elements/RevisionManager.js +96 -0
  70. package/dist/elements/RevisionManager.js.map +1 -0
  71. package/dist/elements/Run.d.ts +39 -0
  72. package/dist/elements/Run.d.ts.map +1 -0
  73. package/dist/elements/Run.js +140 -0
  74. package/dist/elements/Run.js.map +1 -0
  75. package/dist/elements/Section.d.ts +65 -0
  76. package/dist/elements/Section.d.ts.map +1 -0
  77. package/dist/elements/Section.js +232 -0
  78. package/dist/elements/Section.js.map +1 -0
  79. package/dist/elements/Table.d.ts +49 -0
  80. package/dist/elements/Table.d.ts.map +1 -0
  81. package/dist/elements/Table.js +159 -0
  82. package/dist/elements/Table.js.map +1 -0
  83. package/dist/elements/TableCell.d.ts +46 -0
  84. package/dist/elements/TableCell.d.ts.map +1 -0
  85. package/dist/elements/TableCell.js +128 -0
  86. package/dist/elements/TableCell.js.map +1 -0
  87. package/dist/elements/TableOfContents.d.ts +36 -0
  88. package/dist/elements/TableOfContents.d.ts.map +1 -0
  89. package/dist/elements/TableOfContents.js +197 -0
  90. package/dist/elements/TableOfContents.js.map +1 -0
  91. package/dist/elements/TableOfContentsElement.d.ts +14 -0
  92. package/dist/elements/TableOfContentsElement.d.ts.map +1 -0
  93. package/dist/elements/TableOfContentsElement.js +32 -0
  94. package/dist/elements/TableOfContentsElement.js.map +1 -0
  95. package/dist/elements/TableRow.d.ts +25 -0
  96. package/dist/elements/TableRow.d.ts.map +1 -0
  97. package/dist/elements/TableRow.js +84 -0
  98. package/dist/elements/TableRow.js.map +1 -0
  99. package/dist/formatting/AbstractNumbering.d.ts +31 -0
  100. package/dist/formatting/AbstractNumbering.d.ts.map +1 -0
  101. package/dist/formatting/AbstractNumbering.js +132 -0
  102. package/dist/formatting/AbstractNumbering.js.map +1 -0
  103. package/dist/formatting/NumberingInstance.d.ts +16 -0
  104. package/dist/formatting/NumberingInstance.d.ts.map +1 -0
  105. package/dist/formatting/NumberingInstance.js +35 -0
  106. package/dist/formatting/NumberingInstance.js.map +1 -0
  107. package/dist/formatting/NumberingLevel.d.ts +37 -0
  108. package/dist/formatting/NumberingLevel.d.ts.map +1 -0
  109. package/dist/formatting/NumberingLevel.js +164 -0
  110. package/dist/formatting/NumberingLevel.js.map +1 -0
  111. package/dist/formatting/NumberingManager.d.ts +33 -0
  112. package/dist/formatting/NumberingManager.d.ts.map +1 -0
  113. package/dist/formatting/NumberingManager.js +162 -0
  114. package/dist/formatting/NumberingManager.js.map +1 -0
  115. package/dist/formatting/Style.d.ts +38 -0
  116. package/dist/formatting/Style.d.ts.map +1 -0
  117. package/dist/formatting/Style.js +298 -0
  118. package/dist/formatting/Style.js.map +1 -0
  119. package/dist/formatting/StylesManager.d.ts +30 -0
  120. package/dist/formatting/StylesManager.d.ts.map +1 -0
  121. package/dist/formatting/StylesManager.js +165 -0
  122. package/dist/formatting/StylesManager.js.map +1 -0
  123. package/dist/index.d.ts +40 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +135 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/utils/units.d.ts +89 -0
  128. package/dist/utils/units.d.ts.map +1 -0
  129. package/dist/utils/units.js +176 -0
  130. package/dist/utils/units.js.map +1 -0
  131. package/dist/utils/validation.d.ts +16 -0
  132. package/dist/utils/validation.d.ts.map +1 -0
  133. package/dist/utils/validation.js +151 -0
  134. package/dist/utils/validation.js.map +1 -0
  135. package/dist/xml/XMLBuilder.d.ts +24 -0
  136. package/dist/xml/XMLBuilder.d.ts.map +1 -0
  137. package/dist/xml/XMLBuilder.js +126 -0
  138. package/dist/xml/XMLBuilder.js.map +1 -0
  139. package/dist/xml/XMLParser.d.ts +10 -0
  140. package/dist/xml/XMLParser.d.ts.map +1 -0
  141. package/dist/xml/XMLParser.js +120 -0
  142. package/dist/xml/XMLParser.js.map +1 -0
  143. package/dist/zip/ZipHandler.d.ts +50 -0
  144. package/dist/zip/ZipHandler.d.ts.map +1 -0
  145. package/dist/zip/ZipHandler.js +307 -0
  146. package/dist/zip/ZipHandler.js.map +1 -0
  147. package/dist/zip/ZipReader.d.ts +21 -0
  148. package/dist/zip/ZipReader.d.ts.map +1 -0
  149. package/dist/zip/ZipReader.js +152 -0
  150. package/dist/zip/ZipReader.js.map +1 -0
  151. package/dist/zip/ZipWriter.d.ts +20 -0
  152. package/dist/zip/ZipWriter.d.ts.map +1 -0
  153. package/dist/zip/ZipWriter.js +118 -0
  154. package/dist/zip/ZipWriter.js.map +1 -0
  155. package/dist/zip/errors.d.ts +19 -0
  156. package/dist/zip/errors.d.ts.map +1 -0
  157. package/dist/zip/errors.js +52 -0
  158. package/dist/zip/errors.js.map +1 -0
  159. package/dist/zip/types.d.ts +37 -0
  160. package/dist/zip/types.d.ts.map +1 -0
  161. package/dist/zip/types.js +23 -0
  162. package/dist/zip/types.js.map +1 -0
  163. package/package.json +59 -0
@@ -0,0 +1,980 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Document = void 0;
37
+ const ZipHandler_1 = require("../zip/ZipHandler");
38
+ const types_1 = require("../zip/types");
39
+ const Paragraph_1 = require("../elements/Paragraph");
40
+ const Table_1 = require("../elements/Table");
41
+ const Section_1 = require("../elements/Section");
42
+ const ImageManager_1 = require("../elements/ImageManager");
43
+ const HeaderFooterManager_1 = require("../elements/HeaderFooterManager");
44
+ const Hyperlink_1 = require("../elements/Hyperlink");
45
+ const TableOfContents_1 = require("../elements/TableOfContents");
46
+ const TableOfContentsElement_1 = require("../elements/TableOfContentsElement");
47
+ const BookmarkManager_1 = require("../elements/BookmarkManager");
48
+ const Revision_1 = require("../elements/Revision");
49
+ const RevisionManager_1 = require("../elements/RevisionManager");
50
+ const CommentManager_1 = require("../elements/CommentManager");
51
+ const Run_1 = require("../elements/Run");
52
+ const XMLBuilder_1 = require("../xml/XMLBuilder");
53
+ const XMLParser_1 = require("../xml/XMLParser");
54
+ const StylesManager_1 = require("../formatting/StylesManager");
55
+ const NumberingManager_1 = require("../formatting/NumberingManager");
56
+ const RelationshipManager_1 = require("./RelationshipManager");
57
+ class ImageRun {
58
+ constructor(image) {
59
+ this.image = image;
60
+ }
61
+ toXML() {
62
+ const drawing = this.image.toXML();
63
+ return {
64
+ name: 'w:r',
65
+ children: [drawing]
66
+ };
67
+ }
68
+ }
69
+ class Document {
70
+ constructor(zipHandler, options = {}, initDefaults = true) {
71
+ this.bodyElements = [];
72
+ this.parseErrors = [];
73
+ this.zipHandler = zipHandler || new ZipHandler_1.ZipHandler();
74
+ this.properties = options.properties || {};
75
+ this.maxMemoryUsagePercent = options.maxMemoryUsagePercent ?? 80;
76
+ this.strictParsing = options.strictParsing ?? false;
77
+ this.stylesManager = StylesManager_1.StylesManager.create();
78
+ this.numberingManager = NumberingManager_1.NumberingManager.create();
79
+ this.section = Section_1.Section.createLetter();
80
+ this.imageManager = ImageManager_1.ImageManager.create();
81
+ this.relationshipManager = RelationshipManager_1.RelationshipManager.create();
82
+ this.headerFooterManager = HeaderFooterManager_1.HeaderFooterManager.create();
83
+ this.bookmarkManager = BookmarkManager_1.BookmarkManager.create();
84
+ this.revisionManager = RevisionManager_1.RevisionManager.create();
85
+ this.commentManager = CommentManager_1.CommentManager.create();
86
+ if (initDefaults) {
87
+ this.relationshipManager.addStyles();
88
+ this.relationshipManager.addNumbering();
89
+ }
90
+ }
91
+ static create(options) {
92
+ const doc = new Document(undefined, options);
93
+ doc.initializeRequiredFiles();
94
+ return doc;
95
+ }
96
+ static async load(filePath, options) {
97
+ const zipHandler = new ZipHandler_1.ZipHandler();
98
+ await zipHandler.load(filePath);
99
+ const doc = new Document(zipHandler, options, false);
100
+ await doc.parseDocument();
101
+ return doc;
102
+ }
103
+ static async loadFromBuffer(buffer, options) {
104
+ const zipHandler = new ZipHandler_1.ZipHandler();
105
+ await zipHandler.loadFromBuffer(buffer);
106
+ const doc = new Document(zipHandler, options, false);
107
+ await doc.parseDocument();
108
+ return doc;
109
+ }
110
+ initializeRequiredFiles() {
111
+ this.zipHandler.addFile(types_1.DOCX_PATHS.CONTENT_TYPES, this.generateContentTypes());
112
+ this.zipHandler.addFile(types_1.DOCX_PATHS.RELS, this.generateRels());
113
+ this.zipHandler.addFile(types_1.DOCX_PATHS.DOCUMENT, this.generateDocumentXml());
114
+ this.zipHandler.addFile('word/_rels/document.xml.rels', this.relationshipManager.generateXml());
115
+ this.zipHandler.addFile(types_1.DOCX_PATHS.STYLES, this.stylesManager.generateStylesXml());
116
+ this.zipHandler.addFile(types_1.DOCX_PATHS.NUMBERING, this.numberingManager.generateNumberingXml());
117
+ this.zipHandler.addFile(types_1.DOCX_PATHS.CORE_PROPS, this.generateCoreProps());
118
+ this.zipHandler.addFile(types_1.DOCX_PATHS.APP_PROPS, this.generateAppProps());
119
+ }
120
+ async parseDocument() {
121
+ const docXml = this.zipHandler.getFileAsString(types_1.DOCX_PATHS.DOCUMENT);
122
+ if (!docXml) {
123
+ throw new Error('Invalid document: word/document.xml not found');
124
+ }
125
+ this.parseRelationships();
126
+ this.parseProperties();
127
+ this.parseBodyElements(docXml);
128
+ }
129
+ parseBodyElements(docXml) {
130
+ this.bodyElements = [];
131
+ try {
132
+ XMLParser_1.XMLParser.validateSize(docXml);
133
+ }
134
+ catch (error) {
135
+ const err = error instanceof Error ? error : new Error(String(error));
136
+ this.parseErrors.push({ element: 'document', error: err });
137
+ if (this.strictParsing) {
138
+ throw err;
139
+ }
140
+ return;
141
+ }
142
+ const bodyContent = XMLParser_1.XMLParser.extractBody(docXml);
143
+ if (!bodyContent) {
144
+ return;
145
+ }
146
+ const paragraphXmls = XMLParser_1.XMLParser.extractElements(bodyContent, 'w:p');
147
+ for (const paraXml of paragraphXmls) {
148
+ const paragraph = this.parseParagraph(paraXml);
149
+ if (paragraph) {
150
+ this.bodyElements.push(paragraph);
151
+ }
152
+ }
153
+ const hasTable = bodyContent.includes('<w:tbl');
154
+ if (hasTable) {
155
+ const err = new Error('Document contains tables which are not yet fully supported in Phase 2. Tables will be ignored.');
156
+ this.parseErrors.push({ element: 'table', error: err });
157
+ if (this.strictParsing) {
158
+ throw err;
159
+ }
160
+ }
161
+ }
162
+ parseParagraph(paraXml) {
163
+ try {
164
+ const paragraph = new Paragraph_1.Paragraph();
165
+ this.parseParagraphProperties(paraXml, paragraph);
166
+ const runXmls = XMLParser_1.XMLParser.extractElements(paraXml, 'w:r');
167
+ for (const runXml of runXmls) {
168
+ const run = this.parseRun(runXml);
169
+ if (run) {
170
+ paragraph.addRun(run);
171
+ }
172
+ }
173
+ return paragraph;
174
+ }
175
+ catch (error) {
176
+ const err = error instanceof Error ? error : new Error(String(error));
177
+ this.parseErrors.push({ element: 'paragraph', error: err });
178
+ if (this.strictParsing) {
179
+ throw new Error(`Failed to parse paragraph: ${err.message}`);
180
+ }
181
+ return null;
182
+ }
183
+ }
184
+ parseParagraphProperties(paraXml, paragraph) {
185
+ const pPrMatch = paraXml.match(/<w:pPr[^>]*>([\s\S]*?)<\/w:pPr>/);
186
+ if (!pPrMatch || !pPrMatch[1]) {
187
+ return;
188
+ }
189
+ const pPr = pPrMatch[1];
190
+ const alignMatch = pPr.match(/<w:jc\s+w:val="([^"]+)"/);
191
+ if (alignMatch && alignMatch[1]) {
192
+ const alignment = alignMatch[1];
193
+ paragraph.setAlignment(alignment);
194
+ }
195
+ const styleMatch = pPr.match(/<w:pStyle\s+w:val="([^"]+)"/);
196
+ if (styleMatch && styleMatch[1]) {
197
+ paragraph.setStyle(styleMatch[1]);
198
+ }
199
+ const indMatch = pPr.match(/<w:ind([^>]+)\/>/);
200
+ if (indMatch && indMatch[1]) {
201
+ const indStr = indMatch[1];
202
+ const leftMatch = indStr.match(/w:left="(\d+)"/);
203
+ const rightMatch = indStr.match(/w:right="(\d+)"/);
204
+ const firstLineMatch = indStr.match(/w:firstLine="(\d+)"/);
205
+ if (leftMatch && leftMatch[1]) {
206
+ paragraph.setLeftIndent(parseInt(leftMatch[1], 10));
207
+ }
208
+ if (rightMatch && rightMatch[1]) {
209
+ paragraph.setRightIndent(parseInt(rightMatch[1], 10));
210
+ }
211
+ if (firstLineMatch && firstLineMatch[1]) {
212
+ paragraph.setFirstLineIndent(parseInt(firstLineMatch[1], 10));
213
+ }
214
+ }
215
+ const spacingMatch = pPr.match(/<w:spacing([^>]+)\/>/);
216
+ if (spacingMatch && spacingMatch[1]) {
217
+ const spacingStr = spacingMatch[1];
218
+ const beforeMatch = spacingStr.match(/w:before="(\d+)"/);
219
+ const afterMatch = spacingStr.match(/w:after="(\d+)"/);
220
+ const lineMatch = spacingStr.match(/w:line="(\d+)"/);
221
+ if (beforeMatch && beforeMatch[1]) {
222
+ paragraph.setSpaceBefore(parseInt(beforeMatch[1], 10));
223
+ }
224
+ if (afterMatch && afterMatch[1]) {
225
+ paragraph.setSpaceAfter(parseInt(afterMatch[1], 10));
226
+ }
227
+ if (lineMatch && lineMatch[1]) {
228
+ const lineRule = spacingStr.match(/w:lineRule="([^"]+)"/);
229
+ paragraph.setLineSpacing(parseInt(lineMatch[1], 10), lineRule && lineRule[1] ? lineRule[1] : undefined);
230
+ }
231
+ }
232
+ if (pPr.includes('<w:keepNext'))
233
+ paragraph.setKeepNext(true);
234
+ if (pPr.includes('<w:keepLines'))
235
+ paragraph.setKeepLines(true);
236
+ if (pPr.includes('<w:pageBreakBefore'))
237
+ paragraph.setPageBreakBefore(true);
238
+ }
239
+ parseRun(runXml) {
240
+ try {
241
+ const text = XMLBuilder_1.XMLBuilder.unescapeXml(XMLParser_1.XMLParser.extractText(runXml));
242
+ const run = new Run_1.Run(text);
243
+ this.parseRunProperties(runXml, run);
244
+ return run;
245
+ }
246
+ catch (error) {
247
+ const err = error instanceof Error ? error : new Error(String(error));
248
+ this.parseErrors.push({ element: 'run', error: err });
249
+ if (this.strictParsing) {
250
+ throw new Error(`Failed to parse run: ${err.message}`);
251
+ }
252
+ return null;
253
+ }
254
+ }
255
+ parseRunProperties(runXml, run) {
256
+ const rPrMatch = runXml.match(/<w:rPr[^>]*>([\s\S]*?)<\/w:rPr>/);
257
+ if (!rPrMatch || !rPrMatch[1]) {
258
+ return;
259
+ }
260
+ const rPr = rPrMatch[1];
261
+ if (rPr.includes('<w:b/>') || rPr.includes('<w:b ')) {
262
+ run.setBold(true);
263
+ }
264
+ if (rPr.includes('<w:i/>') || rPr.includes('<w:i ')) {
265
+ run.setItalic(true);
266
+ }
267
+ const underlineMatch = rPr.match(/<w:u\s+w:val="([^"]+)"/);
268
+ if (underlineMatch && underlineMatch[1]) {
269
+ const underlineStyle = underlineMatch[1];
270
+ run.setUnderline(underlineStyle);
271
+ }
272
+ else if (rPr.includes('<w:u/>')) {
273
+ run.setUnderline(true);
274
+ }
275
+ if (rPr.includes('<w:strike/>') || rPr.includes('<w:strike ')) {
276
+ run.setStrike(true);
277
+ }
278
+ const vertAlignMatch = rPr.match(/<w:vertAlign\s+w:val="([^"]+)"/);
279
+ if (vertAlignMatch && vertAlignMatch[1]) {
280
+ if (vertAlignMatch[1] === 'subscript') {
281
+ run.setSubscript(true);
282
+ }
283
+ else if (vertAlignMatch[1] === 'superscript') {
284
+ run.setSuperscript(true);
285
+ }
286
+ }
287
+ const fontMatch = rPr.match(/<w:rFonts[^>]+w:ascii="([^"]+)"/);
288
+ if (fontMatch && fontMatch[1]) {
289
+ run.setFont(fontMatch[1]);
290
+ }
291
+ const sizeMatch = rPr.match(/<w:sz\s+w:val="(\d+)"/);
292
+ if (sizeMatch && sizeMatch[1]) {
293
+ const halfPoints = parseInt(sizeMatch[1], 10);
294
+ run.setSize(halfPoints / 2);
295
+ }
296
+ const colorMatch = rPr.match(/<w:color\s+w:val="([^"]+)"/);
297
+ if (colorMatch && colorMatch[1]) {
298
+ run.setColor(colorMatch[1]);
299
+ }
300
+ const highlightMatch = rPr.match(/<w:highlight\s+w:val="([^"]+)"/);
301
+ if (highlightMatch && highlightMatch[1]) {
302
+ const highlightColor = highlightMatch[1];
303
+ run.setHighlight(highlightColor);
304
+ }
305
+ if (rPr.includes('<w:smallCaps/>') || rPr.includes('<w:smallCaps ')) {
306
+ run.setSmallCaps(true);
307
+ }
308
+ if (rPr.includes('<w:caps/>') || rPr.includes('<w:caps ')) {
309
+ run.setAllCaps(true);
310
+ }
311
+ }
312
+ parseRelationships() {
313
+ const relsPath = 'word/_rels/document.xml.rels';
314
+ const relsXml = this.zipHandler.getFileAsString(relsPath);
315
+ if (relsXml) {
316
+ this.relationshipManager = RelationshipManager_1.RelationshipManager.fromXml(relsXml);
317
+ }
318
+ else {
319
+ this.relationshipManager.addStyles();
320
+ this.relationshipManager.addNumbering();
321
+ }
322
+ }
323
+ parseProperties() {
324
+ const coreXml = this.zipHandler.getFileAsString(types_1.DOCX_PATHS.CORE_PROPS);
325
+ if (!coreXml) {
326
+ return;
327
+ }
328
+ const extractTag = (xml, tag) => {
329
+ const match = xml.match(new RegExp(`<${tag}[^>]*>([^<]*)</${tag}>`));
330
+ return match && match[1] ? XMLBuilder_1.XMLBuilder.unescapeXml(match[1]) : undefined;
331
+ };
332
+ this.properties = {
333
+ title: extractTag(coreXml, 'dc:title'),
334
+ subject: extractTag(coreXml, 'dc:subject'),
335
+ creator: extractTag(coreXml, 'dc:creator'),
336
+ keywords: extractTag(coreXml, 'cp:keywords'),
337
+ description: extractTag(coreXml, 'dc:description'),
338
+ lastModifiedBy: extractTag(coreXml, 'cp:lastModifiedBy'),
339
+ };
340
+ const revisionStr = extractTag(coreXml, 'cp:revision');
341
+ if (revisionStr) {
342
+ this.properties.revision = parseInt(revisionStr, 10);
343
+ }
344
+ const createdStr = extractTag(coreXml, 'dcterms:created');
345
+ if (createdStr) {
346
+ this.properties.created = new Date(createdStr);
347
+ }
348
+ const modifiedStr = extractTag(coreXml, 'dcterms:modified');
349
+ if (modifiedStr) {
350
+ this.properties.modified = new Date(modifiedStr);
351
+ }
352
+ }
353
+ addParagraph(paragraph) {
354
+ this.bodyElements.push(paragraph);
355
+ return this;
356
+ }
357
+ createParagraph(text) {
358
+ const para = new Paragraph_1.Paragraph();
359
+ if (text) {
360
+ para.addText(text);
361
+ }
362
+ this.bodyElements.push(para);
363
+ return para;
364
+ }
365
+ addTable(table) {
366
+ this.bodyElements.push(table);
367
+ return this;
368
+ }
369
+ createTable(rows, columns) {
370
+ const table = new Table_1.Table(rows, columns);
371
+ this.bodyElements.push(table);
372
+ return table;
373
+ }
374
+ addTableOfContents(toc) {
375
+ const tocElement = toc instanceof TableOfContentsElement_1.TableOfContentsElement
376
+ ? toc
377
+ : new TableOfContentsElement_1.TableOfContentsElement(toc || TableOfContents_1.TableOfContents.createStandard());
378
+ this.bodyElements.push(tocElement);
379
+ return this;
380
+ }
381
+ createTableOfContents(title) {
382
+ const tocElement = TableOfContentsElement_1.TableOfContentsElement.createStandard(title);
383
+ return this.addTableOfContents(tocElement);
384
+ }
385
+ getParagraphs() {
386
+ return this.bodyElements.filter((el) => el instanceof Paragraph_1.Paragraph);
387
+ }
388
+ getTables() {
389
+ return this.bodyElements.filter((el) => el instanceof Table_1.Table);
390
+ }
391
+ getTableOfContentsElements() {
392
+ return this.bodyElements.filter((el) => el instanceof TableOfContentsElement_1.TableOfContentsElement);
393
+ }
394
+ getBodyElements() {
395
+ return [...this.bodyElements];
396
+ }
397
+ getParagraphCount() {
398
+ return this.getParagraphs().length;
399
+ }
400
+ getTableCount() {
401
+ return this.getTables().length;
402
+ }
403
+ clearParagraphs() {
404
+ this.bodyElements = [];
405
+ return this;
406
+ }
407
+ setProperties(properties) {
408
+ this.properties = { ...this.properties, ...properties };
409
+ return this;
410
+ }
411
+ getProperties() {
412
+ return { ...this.properties };
413
+ }
414
+ async save(filePath) {
415
+ const tempPath = `${filePath}.tmp.${Date.now()}`;
416
+ try {
417
+ this.checkMemoryThreshold();
418
+ await this.imageManager.loadAllImageData();
419
+ this.checkMemoryThreshold();
420
+ const sizeInfo = this.estimateSize();
421
+ if (sizeInfo.warning) {
422
+ console.warn(`DocXML Warning: ${sizeInfo.warning}`);
423
+ }
424
+ this.processHyperlinks();
425
+ this.updateDocumentXml();
426
+ this.updateStylesXml();
427
+ this.updateNumberingXml();
428
+ this.updateCoreProps();
429
+ this.saveImages();
430
+ this.saveHeaders();
431
+ this.saveFooters();
432
+ this.saveComments();
433
+ this.updateRelationships();
434
+ this.updateContentTypesWithImagesHeadersFootersAndComments();
435
+ await this.zipHandler.save(tempPath);
436
+ const { promises: fs } = await Promise.resolve().then(() => __importStar(require('fs')));
437
+ await fs.rename(tempPath, filePath);
438
+ }
439
+ catch (error) {
440
+ try {
441
+ const { promises: fs } = await Promise.resolve().then(() => __importStar(require('fs')));
442
+ await fs.unlink(tempPath);
443
+ }
444
+ catch {
445
+ }
446
+ throw error;
447
+ }
448
+ finally {
449
+ this.imageManager.releaseAllImageData();
450
+ }
451
+ }
452
+ async toBuffer() {
453
+ try {
454
+ this.checkMemoryThreshold();
455
+ await this.imageManager.loadAllImageData();
456
+ this.checkMemoryThreshold();
457
+ const sizeInfo = this.estimateSize();
458
+ if (sizeInfo.warning) {
459
+ console.warn(`DocXML Warning: ${sizeInfo.warning}`);
460
+ }
461
+ this.processHyperlinks();
462
+ this.updateDocumentXml();
463
+ this.updateStylesXml();
464
+ this.updateNumberingXml();
465
+ this.updateCoreProps();
466
+ this.saveImages();
467
+ this.saveHeaders();
468
+ this.saveFooters();
469
+ this.saveComments();
470
+ this.updateRelationships();
471
+ this.updateContentTypesWithImagesHeadersFootersAndComments();
472
+ return await this.zipHandler.toBuffer();
473
+ }
474
+ finally {
475
+ this.imageManager.releaseAllImageData();
476
+ }
477
+ }
478
+ updateDocumentXml() {
479
+ const xml = this.generateDocumentXml();
480
+ this.zipHandler.updateFile(types_1.DOCX_PATHS.DOCUMENT, xml);
481
+ }
482
+ updateCoreProps() {
483
+ const xml = this.generateCoreProps();
484
+ this.zipHandler.updateFile(types_1.DOCX_PATHS.CORE_PROPS, xml);
485
+ }
486
+ updateStylesXml() {
487
+ const xml = this.stylesManager.generateStylesXml();
488
+ this.zipHandler.updateFile(types_1.DOCX_PATHS.STYLES, xml);
489
+ }
490
+ updateNumberingXml() {
491
+ const xml = this.numberingManager.generateNumberingXml();
492
+ this.zipHandler.updateFile(types_1.DOCX_PATHS.NUMBERING, xml);
493
+ }
494
+ generateContentTypes() {
495
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
496
+ <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
497
+ <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
498
+ <Default Extension="xml" ContentType="application/xml"/>
499
+ <Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
500
+ <Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>
501
+ <Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/>
502
+ <Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/>
503
+ <Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/>
504
+ </Types>`;
505
+ }
506
+ generateRels() {
507
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
508
+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
509
+ <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>
510
+ <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
511
+ <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/>
512
+ </Relationships>`;
513
+ }
514
+ generateDocumentXml() {
515
+ const bodyXmls = [];
516
+ for (const element of this.bodyElements) {
517
+ const xml = element.toXML();
518
+ if (Array.isArray(xml)) {
519
+ bodyXmls.push(...xml);
520
+ }
521
+ else {
522
+ bodyXmls.push(xml);
523
+ }
524
+ }
525
+ bodyXmls.push(this.section.toXML());
526
+ return XMLBuilder_1.XMLBuilder.createDocument(bodyXmls);
527
+ }
528
+ generateCoreProps() {
529
+ const now = new Date();
530
+ const created = this.properties.created || now;
531
+ const modified = this.properties.modified || now;
532
+ const formatDate = (date) => {
533
+ return date.toISOString();
534
+ };
535
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
536
+ <cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties"
537
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
538
+ xmlns:dcterms="http://purl.org/dc/terms/"
539
+ xmlns:dcmitype="http://purl.org/dc/dcmitype/"
540
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
541
+ <dc:title>${XMLBuilder_1.XMLBuilder.escapeXmlText(this.properties.title || '')}</dc:title>
542
+ <dc:subject>${XMLBuilder_1.XMLBuilder.escapeXmlText(this.properties.subject || '')}</dc:subject>
543
+ <dc:creator>${XMLBuilder_1.XMLBuilder.escapeXmlText(this.properties.creator || 'DocXML')}</dc:creator>
544
+ <cp:keywords>${XMLBuilder_1.XMLBuilder.escapeXmlText(this.properties.keywords || '')}</cp:keywords>
545
+ <dc:description>${XMLBuilder_1.XMLBuilder.escapeXmlText(this.properties.description || '')}</dc:description>
546
+ <cp:lastModifiedBy>${XMLBuilder_1.XMLBuilder.escapeXmlText(this.properties.lastModifiedBy || this.properties.creator || 'DocXML')}</cp:lastModifiedBy>
547
+ <cp:revision>${this.properties.revision || 1}</cp:revision>
548
+ <dcterms:created xsi:type="dcterms:W3CDTF">${formatDate(created)}</dcterms:created>
549
+ <dcterms:modified xsi:type="dcterms:W3CDTF">${formatDate(modified)}</dcterms:modified>
550
+ </cp:coreProperties>`;
551
+ }
552
+ generateAppProps() {
553
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
554
+ <Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"
555
+ xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
556
+ <Application>DocXML</Application>
557
+ <DocSecurity>0</DocSecurity>
558
+ <ScaleCrop>false</ScaleCrop>
559
+ <Company></Company>
560
+ <LinksUpToDate>false</LinksUpToDate>
561
+ <SharedDoc>false</SharedDoc>
562
+ <HyperlinksChanged>false</HyperlinksChanged>
563
+ <AppVersion>0.1.0</AppVersion>
564
+ </Properties>`;
565
+ }
566
+ getStylesManager() {
567
+ return this.stylesManager;
568
+ }
569
+ addStyle(style) {
570
+ this.stylesManager.addStyle(style);
571
+ return this;
572
+ }
573
+ getStyle(styleId) {
574
+ return this.stylesManager.getStyle(styleId);
575
+ }
576
+ hasStyle(styleId) {
577
+ return this.stylesManager.hasStyle(styleId);
578
+ }
579
+ getZipHandler() {
580
+ return this.zipHandler;
581
+ }
582
+ getNumberingManager() {
583
+ return this.numberingManager;
584
+ }
585
+ createBulletList(levels = 3, bullets) {
586
+ return this.numberingManager.createBulletList(levels, bullets);
587
+ }
588
+ createNumberedList(levels = 3, formats) {
589
+ return this.numberingManager.createNumberedList(levels, formats);
590
+ }
591
+ createMultiLevelList() {
592
+ return this.numberingManager.createMultiLevelList();
593
+ }
594
+ getSection() {
595
+ return this.section;
596
+ }
597
+ setSection(section) {
598
+ this.section = section;
599
+ return this;
600
+ }
601
+ setPageSize(width, height, orientation) {
602
+ this.section.setPageSize(width, height, orientation);
603
+ return this;
604
+ }
605
+ setPageOrientation(orientation) {
606
+ this.section.setOrientation(orientation);
607
+ return this;
608
+ }
609
+ setMargins(margins) {
610
+ this.section.setMargins(margins);
611
+ return this;
612
+ }
613
+ setHeader(header) {
614
+ const relationship = this.relationshipManager.addHeader(`${header.getFilename(1)}`);
615
+ this.headerFooterManager.registerHeader(header, relationship.getId());
616
+ this.section.setHeaderReference('default', relationship.getId());
617
+ return this;
618
+ }
619
+ setFirstPageHeader(header) {
620
+ this.section.setTitlePage(true);
621
+ const relationship = this.relationshipManager.addHeader(`${header.getFilename(this.headerFooterManager.getHeaderCount() + 1)}`);
622
+ this.headerFooterManager.registerHeader(header, relationship.getId());
623
+ this.section.setHeaderReference('first', relationship.getId());
624
+ return this;
625
+ }
626
+ setEvenPageHeader(header) {
627
+ const relationship = this.relationshipManager.addHeader(`${header.getFilename(this.headerFooterManager.getHeaderCount() + 1)}`);
628
+ this.headerFooterManager.registerHeader(header, relationship.getId());
629
+ this.section.setHeaderReference('even', relationship.getId());
630
+ return this;
631
+ }
632
+ setFooter(footer) {
633
+ const relationship = this.relationshipManager.addFooter(`${footer.getFilename(1)}`);
634
+ this.headerFooterManager.registerFooter(footer, relationship.getId());
635
+ this.section.setFooterReference('default', relationship.getId());
636
+ return this;
637
+ }
638
+ setFirstPageFooter(footer) {
639
+ this.section.setTitlePage(true);
640
+ const relationship = this.relationshipManager.addFooter(`${footer.getFilename(this.headerFooterManager.getFooterCount() + 1)}`);
641
+ this.headerFooterManager.registerFooter(footer, relationship.getId());
642
+ this.section.setFooterReference('first', relationship.getId());
643
+ return this;
644
+ }
645
+ setEvenPageFooter(footer) {
646
+ const relationship = this.relationshipManager.addFooter(`${footer.getFilename(this.headerFooterManager.getFooterCount() + 1)}`);
647
+ this.headerFooterManager.registerFooter(footer, relationship.getId());
648
+ this.section.setFooterReference('even', relationship.getId());
649
+ return this;
650
+ }
651
+ getHeaderFooterManager() {
652
+ return this.headerFooterManager;
653
+ }
654
+ addImage(image) {
655
+ const target = `media/image${this.imageManager.getImageCount() + 1}.${image.getExtension()}`;
656
+ const relationship = this.relationshipManager.addImage(target);
657
+ this.imageManager.registerImage(image, relationship.getId());
658
+ const para = new Paragraph_1.Paragraph();
659
+ const imageRun = this.createImageRun(image);
660
+ para.addRun(imageRun);
661
+ this.bodyElements.push(para);
662
+ return this;
663
+ }
664
+ createImageRun(image) {
665
+ return new ImageRun(image);
666
+ }
667
+ getImageManager() {
668
+ return this.imageManager;
669
+ }
670
+ getRelationshipManager() {
671
+ return this.relationshipManager;
672
+ }
673
+ processHyperlinks() {
674
+ const paragraphs = this.getParagraphs();
675
+ const headers = this.headerFooterManager.getAllHeaders();
676
+ const footers = this.headerFooterManager.getAllFooters();
677
+ for (const header of headers) {
678
+ for (const element of header.header.getElements()) {
679
+ if (element instanceof Paragraph_1.Paragraph) {
680
+ this.processHyperlinksInParagraph(element);
681
+ }
682
+ }
683
+ }
684
+ for (const footer of footers) {
685
+ for (const element of footer.footer.getElements()) {
686
+ if (element instanceof Paragraph_1.Paragraph) {
687
+ this.processHyperlinksInParagraph(element);
688
+ }
689
+ }
690
+ }
691
+ for (const para of paragraphs) {
692
+ this.processHyperlinksInParagraph(para);
693
+ }
694
+ }
695
+ processHyperlinksInParagraph(paragraph) {
696
+ const content = paragraph.getContent();
697
+ for (const item of content) {
698
+ if (item instanceof Hyperlink_1.Hyperlink && item.isExternal() && !item.getRelationshipId()) {
699
+ const url = item.getUrl();
700
+ if (url) {
701
+ const relationship = this.relationshipManager.addHyperlink(url);
702
+ item.setRelationshipId(relationship.getId());
703
+ }
704
+ }
705
+ }
706
+ }
707
+ saveImages() {
708
+ const images = this.imageManager.getAllImages();
709
+ for (const entry of images) {
710
+ const imageData = entry.image.getImageData();
711
+ if (imageData && imageData.length > 0) {
712
+ const path = `word/media/${entry.filename}`;
713
+ this.zipHandler.addFile(path, imageData);
714
+ }
715
+ }
716
+ }
717
+ saveHeaders() {
718
+ const headers = this.headerFooterManager.getAllHeaders();
719
+ for (const entry of headers) {
720
+ const xml = entry.header.toXML();
721
+ const path = `word/${entry.filename}`;
722
+ this.zipHandler.addFile(path, xml);
723
+ }
724
+ }
725
+ saveFooters() {
726
+ const footers = this.headerFooterManager.getAllFooters();
727
+ for (const entry of footers) {
728
+ const xml = entry.footer.toXML();
729
+ const path = `word/${entry.filename}`;
730
+ this.zipHandler.addFile(path, xml);
731
+ }
732
+ }
733
+ updateRelationships() {
734
+ const xml = this.relationshipManager.generateXml();
735
+ this.zipHandler.updateFile('word/_rels/document.xml.rels', xml);
736
+ }
737
+ saveComments() {
738
+ if (this.commentManager.getCount() > 0) {
739
+ const xml = this.commentManager.generateCommentsXml();
740
+ this.zipHandler.addFile('word/comments.xml', xml);
741
+ this.relationshipManager.addComments();
742
+ }
743
+ }
744
+ updateContentTypesWithImagesHeadersFootersAndComments() {
745
+ const contentTypes = this.generateContentTypesWithImagesHeadersFootersAndComments();
746
+ this.zipHandler.updateFile(types_1.DOCX_PATHS.CONTENT_TYPES, contentTypes);
747
+ }
748
+ generateContentTypesWithImagesHeadersFootersAndComments() {
749
+ const images = this.imageManager.getAllImages();
750
+ const headers = this.headerFooterManager.getAllHeaders();
751
+ const footers = this.headerFooterManager.getAllFooters();
752
+ const hasComments = this.commentManager.getCount() > 0;
753
+ const extensions = new Set();
754
+ for (const entry of images) {
755
+ extensions.add(entry.image.getExtension());
756
+ }
757
+ let xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
758
+ xml += '<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">\n';
759
+ xml += ' <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>\n';
760
+ xml += ' <Default Extension="xml" ContentType="application/xml"/>\n';
761
+ for (const ext of extensions) {
762
+ const mimeType = ImageManager_1.ImageManager.getMimeType(ext);
763
+ xml += ` <Default Extension="${ext}" ContentType="${mimeType}"/>\n`;
764
+ }
765
+ xml += ' <Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>\n';
766
+ xml += ' <Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>\n';
767
+ xml += ' <Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/>\n';
768
+ for (const entry of headers) {
769
+ xml += ` <Override PartName="/word/${entry.filename}" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml"/>\n`;
770
+ }
771
+ for (const entry of footers) {
772
+ xml += ` <Override PartName="/word/${entry.filename}" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml"/>\n`;
773
+ }
774
+ if (hasComments) {
775
+ xml += ' <Override PartName="/word/comments.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml"/>\n';
776
+ }
777
+ xml += ' <Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/>\n';
778
+ xml += ' <Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/>\n';
779
+ xml += '</Types>';
780
+ return xml;
781
+ }
782
+ getBookmarkManager() {
783
+ return this.bookmarkManager;
784
+ }
785
+ createBookmark(name) {
786
+ return this.bookmarkManager.createBookmark(name);
787
+ }
788
+ createHeadingBookmark(headingText) {
789
+ return this.bookmarkManager.createHeadingBookmark(headingText);
790
+ }
791
+ getBookmark(name) {
792
+ return this.bookmarkManager.getBookmark(name);
793
+ }
794
+ hasBookmark(name) {
795
+ return this.bookmarkManager.hasBookmark(name);
796
+ }
797
+ addBookmarkToParagraph(paragraph, bookmarkOrName) {
798
+ const bookmark = typeof bookmarkOrName === 'string'
799
+ ? this.createBookmark(bookmarkOrName)
800
+ : bookmarkOrName;
801
+ paragraph.addBookmark(bookmark);
802
+ return bookmark;
803
+ }
804
+ getRevisionManager() {
805
+ return this.revisionManager;
806
+ }
807
+ createInsertion(author, content, date) {
808
+ const revision = Revision_1.Revision.createInsertion(author, content, date);
809
+ return this.revisionManager.register(revision);
810
+ }
811
+ createDeletion(author, content, date) {
812
+ const revision = Revision_1.Revision.createDeletion(author, content, date);
813
+ return this.revisionManager.register(revision);
814
+ }
815
+ createRevisionFromText(type, author, text, date) {
816
+ const revision = Revision_1.Revision.fromText(type, author, text, date);
817
+ return this.revisionManager.register(revision);
818
+ }
819
+ trackInsertion(paragraph, author, text, date) {
820
+ const revision = this.createRevisionFromText('insert', author, text, date);
821
+ paragraph.addRevision(revision);
822
+ return revision;
823
+ }
824
+ trackDeletion(paragraph, author, text, date) {
825
+ const revision = this.createRevisionFromText('delete', author, text, date);
826
+ paragraph.addRevision(revision);
827
+ return revision;
828
+ }
829
+ isTrackingChanges() {
830
+ return this.revisionManager.isTrackingChanges();
831
+ }
832
+ getRevisionStats() {
833
+ return this.revisionManager.getStats();
834
+ }
835
+ getCommentManager() {
836
+ return this.commentManager;
837
+ }
838
+ createComment(author, content, initials) {
839
+ return this.commentManager.createComment(author, content, initials);
840
+ }
841
+ createReply(parentCommentId, author, content, initials) {
842
+ return this.commentManager.createReply(parentCommentId, author, content, initials);
843
+ }
844
+ getComment(id) {
845
+ return this.commentManager.getComment(id);
846
+ }
847
+ getAllComments() {
848
+ return this.commentManager.getAllComments();
849
+ }
850
+ addCommentToParagraph(paragraph, commentOrAuthor, content, initials) {
851
+ const comment = typeof commentOrAuthor === 'string'
852
+ ? this.createComment(commentOrAuthor, content, initials)
853
+ : commentOrAuthor;
854
+ paragraph.addComment(comment);
855
+ return comment;
856
+ }
857
+ getCommentStats() {
858
+ return this.commentManager.getStats();
859
+ }
860
+ hasNoComments() {
861
+ return this.commentManager.isEmpty();
862
+ }
863
+ hasComments() {
864
+ return !this.commentManager.isEmpty();
865
+ }
866
+ getCommentThread(commentId) {
867
+ return this.commentManager.getCommentThread(commentId);
868
+ }
869
+ findCommentsByText(searchText) {
870
+ return this.commentManager.findCommentsByText(searchText);
871
+ }
872
+ getRecentComments(count) {
873
+ return this.commentManager.getRecentComments(count);
874
+ }
875
+ hasNoRevisions() {
876
+ return this.revisionManager.isEmpty();
877
+ }
878
+ hasRevisions() {
879
+ return !this.revisionManager.isEmpty();
880
+ }
881
+ getRecentRevisions(count) {
882
+ return this.revisionManager.getRecentRevisions(count);
883
+ }
884
+ findRevisionsByText(searchText) {
885
+ return this.revisionManager.findRevisionsByText(searchText);
886
+ }
887
+ getAllInsertions() {
888
+ return this.revisionManager.getAllInsertions();
889
+ }
890
+ getAllDeletions() {
891
+ return this.revisionManager.getAllDeletions();
892
+ }
893
+ getParseWarnings() {
894
+ return [...this.parseErrors];
895
+ }
896
+ checkMemoryThreshold() {
897
+ const { heapUsed, heapTotal } = process.memoryUsage();
898
+ const usagePercent = (heapUsed / heapTotal) * 100;
899
+ if (usagePercent > this.maxMemoryUsagePercent) {
900
+ throw new Error(`Memory usage critical (${usagePercent.toFixed(1)}% of ${(heapTotal / 1024 / 1024).toFixed(0)}MB heap). ` +
901
+ `Cannot process document safely. Consider:\n` +
902
+ `- Reducing document size\n` +
903
+ `- Optimizing/compressing images\n` +
904
+ `- Splitting into multiple documents\n` +
905
+ `- Increasing Node.js heap size (--max-old-space-size)`);
906
+ }
907
+ }
908
+ estimateSize() {
909
+ const paragraphCount = this.getParagraphCount();
910
+ const tableCount = this.getTableCount();
911
+ const imageCount = this.imageManager.getImageCount();
912
+ const estimatedXml = (paragraphCount * 200) + (tableCount * 1000) + 50000;
913
+ const imageBytes = this.imageManager.getTotalSize();
914
+ const totalBytes = estimatedXml + imageBytes;
915
+ const totalMB = totalBytes / (1024 * 1024);
916
+ const WARNING_MB = 50;
917
+ const ERROR_MB = 100;
918
+ let warning;
919
+ if (totalMB > ERROR_MB) {
920
+ warning = `Document size (${totalMB.toFixed(1)}MB) exceeds recommended maximum of ${ERROR_MB}MB. ` +
921
+ `This may cause memory issues. Consider splitting into multiple documents or optimizing images.`;
922
+ }
923
+ else if (totalMB > WARNING_MB) {
924
+ warning = `Document size (${totalMB.toFixed(1)}MB) exceeds ${WARNING_MB}MB. ` +
925
+ `Large documents may take longer to process and use significant memory.`;
926
+ }
927
+ return {
928
+ paragraphs: paragraphCount,
929
+ tables: tableCount,
930
+ images: imageCount,
931
+ estimatedXmlBytes: estimatedXml,
932
+ imageBytes,
933
+ totalEstimatedBytes: totalBytes,
934
+ totalEstimatedMB: parseFloat(totalMB.toFixed(2)),
935
+ warning,
936
+ };
937
+ }
938
+ dispose() {
939
+ this.bodyElements = [];
940
+ this.parseErrors = [];
941
+ this.stylesManager = StylesManager_1.StylesManager.create();
942
+ this.numberingManager = NumberingManager_1.NumberingManager.create();
943
+ this.imageManager.clear();
944
+ this.imageManager.releaseAllImageData();
945
+ this.relationshipManager = RelationshipManager_1.RelationshipManager.create();
946
+ this.headerFooterManager = HeaderFooterManager_1.HeaderFooterManager.create();
947
+ this.bookmarkManager.clear();
948
+ this.revisionManager.clear();
949
+ this.commentManager.clear();
950
+ }
951
+ getSizeStats() {
952
+ const estimate = this.estimateSize();
953
+ const warnings = [];
954
+ if (estimate.warning) {
955
+ warnings.push(estimate.warning);
956
+ }
957
+ const formatBytes = (bytes) => {
958
+ if (bytes < 1024)
959
+ return `${bytes} B`;
960
+ if (bytes < 1024 * 1024)
961
+ return `${(bytes / 1024).toFixed(1)} KB`;
962
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
963
+ };
964
+ return {
965
+ elements: {
966
+ paragraphs: estimate.paragraphs,
967
+ tables: estimate.tables,
968
+ images: estimate.images,
969
+ },
970
+ size: {
971
+ xml: formatBytes(estimate.estimatedXmlBytes),
972
+ images: formatBytes(estimate.imageBytes),
973
+ total: formatBytes(estimate.totalEstimatedBytes),
974
+ },
975
+ warnings,
976
+ };
977
+ }
978
+ }
979
+ exports.Document = Document;
980
+ //# sourceMappingURL=Document.js.map