docxmlater 0.2.0 → 0.4.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 (40) hide show
  1. package/README.md +69 -0
  2. package/dist/core/Document.d.ts +9 -21
  3. package/dist/core/Document.d.ts.map +1 -1
  4. package/dist/core/Document.js +65 -590
  5. package/dist/core/Document.js.map +1 -1
  6. package/dist/core/DocumentGenerator.d.ts +22 -0
  7. package/dist/core/DocumentGenerator.d.ts.map +1 -0
  8. package/dist/core/DocumentGenerator.js +161 -0
  9. package/dist/core/DocumentGenerator.js.map +1 -0
  10. package/dist/core/DocumentParser.d.ts +32 -0
  11. package/dist/core/DocumentParser.d.ts.map +1 -0
  12. package/dist/core/DocumentParser.js +404 -0
  13. package/dist/core/DocumentParser.js.map +1 -0
  14. package/dist/core/DocumentValidator.d.ts +46 -0
  15. package/dist/core/DocumentValidator.d.ts.map +1 -0
  16. package/dist/core/DocumentValidator.js +223 -0
  17. package/dist/core/DocumentValidator.js.map +1 -0
  18. package/dist/core/RelationshipManager.d.ts.map +1 -1
  19. package/dist/core/RelationshipManager.js +19 -3
  20. package/dist/core/RelationshipManager.js.map +1 -1
  21. package/dist/elements/Hyperlink.d.ts +1 -0
  22. package/dist/elements/Hyperlink.d.ts.map +1 -1
  23. package/dist/elements/Hyperlink.js +27 -2
  24. package/dist/elements/Hyperlink.js.map +1 -1
  25. package/dist/elements/Image.d.ts +5 -1
  26. package/dist/elements/Image.d.ts.map +1 -1
  27. package/dist/elements/Image.js +118 -12
  28. package/dist/elements/Image.js.map +1 -1
  29. package/dist/elements/ImageManager.d.ts +11 -3
  30. package/dist/elements/ImageManager.d.ts.map +1 -1
  31. package/dist/elements/ImageManager.js +72 -6
  32. package/dist/elements/ImageManager.js.map +1 -1
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +7 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/utils/validation.d.ts.map +1 -1
  38. package/dist/utils/validation.js +10 -1
  39. package/dist/utils/validation.js.map +1 -1
  40. package/package.json +1 -2
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DocumentValidator = void 0;
4
+ const Paragraph_1 = require("../elements/Paragraph");
5
+ const Table_1 = require("../elements/Table");
6
+ class DocumentValidator {
7
+ constructor(maxMemoryUsagePercent = 80, options = {}) {
8
+ const memoryPercent = options.maxMemoryUsagePercent ?? maxMemoryUsagePercent;
9
+ if (memoryPercent < 1 ||
10
+ memoryPercent > 100 ||
11
+ !Number.isFinite(memoryPercent)) {
12
+ throw new Error('maxMemoryUsagePercent must be between 1 and 100');
13
+ }
14
+ this.maxMemoryUsagePercent = memoryPercent;
15
+ this.maxRssMB = options.maxRssMB ?? 2048;
16
+ this.useAbsoluteLimit = options.useAbsoluteLimit ?? true;
17
+ }
18
+ static validateProperties(properties) {
19
+ const MAX_STRING_LENGTH = 10000;
20
+ const MAX_REVISION = 999999;
21
+ const validated = {};
22
+ if (properties.title !== undefined) {
23
+ if (typeof properties.title !== 'string') {
24
+ throw new Error('DocumentProperties.title must be a string');
25
+ }
26
+ if (properties.title.length > MAX_STRING_LENGTH) {
27
+ throw new Error(`DocumentProperties.title exceeds maximum length of ${MAX_STRING_LENGTH} characters`);
28
+ }
29
+ validated.title = properties.title;
30
+ }
31
+ if (properties.subject !== undefined) {
32
+ if (typeof properties.subject !== 'string') {
33
+ throw new Error('DocumentProperties.subject must be a string');
34
+ }
35
+ if (properties.subject.length > MAX_STRING_LENGTH) {
36
+ throw new Error(`DocumentProperties.subject exceeds maximum length of ${MAX_STRING_LENGTH} characters`);
37
+ }
38
+ validated.subject = properties.subject;
39
+ }
40
+ if (properties.creator !== undefined) {
41
+ if (typeof properties.creator !== 'string') {
42
+ throw new Error('DocumentProperties.creator must be a string');
43
+ }
44
+ if (properties.creator.length > MAX_STRING_LENGTH) {
45
+ throw new Error(`DocumentProperties.creator exceeds maximum length of ${MAX_STRING_LENGTH} characters`);
46
+ }
47
+ validated.creator = properties.creator;
48
+ }
49
+ if (properties.keywords !== undefined) {
50
+ if (typeof properties.keywords !== 'string') {
51
+ throw new Error('DocumentProperties.keywords must be a string');
52
+ }
53
+ if (properties.keywords.length > MAX_STRING_LENGTH) {
54
+ throw new Error(`DocumentProperties.keywords exceeds maximum length of ${MAX_STRING_LENGTH} characters`);
55
+ }
56
+ validated.keywords = properties.keywords;
57
+ }
58
+ if (properties.description !== undefined) {
59
+ if (typeof properties.description !== 'string') {
60
+ throw new Error('DocumentProperties.description must be a string');
61
+ }
62
+ if (properties.description.length > MAX_STRING_LENGTH) {
63
+ throw new Error(`DocumentProperties.description exceeds maximum length of ${MAX_STRING_LENGTH} characters`);
64
+ }
65
+ validated.description = properties.description;
66
+ }
67
+ if (properties.lastModifiedBy !== undefined) {
68
+ if (typeof properties.lastModifiedBy !== 'string') {
69
+ throw new Error('DocumentProperties.lastModifiedBy must be a string');
70
+ }
71
+ if (properties.lastModifiedBy.length > MAX_STRING_LENGTH) {
72
+ throw new Error(`DocumentProperties.lastModifiedBy exceeds maximum length of ${MAX_STRING_LENGTH} characters`);
73
+ }
74
+ validated.lastModifiedBy = properties.lastModifiedBy;
75
+ }
76
+ if (properties.revision !== undefined) {
77
+ if (typeof properties.revision !== 'number' ||
78
+ !Number.isInteger(properties.revision)) {
79
+ throw new Error('DocumentProperties.revision must be an integer');
80
+ }
81
+ if (properties.revision < 0 || properties.revision > MAX_REVISION) {
82
+ throw new Error(`DocumentProperties.revision must be between 0 and ${MAX_REVISION}`);
83
+ }
84
+ validated.revision = properties.revision;
85
+ }
86
+ if (properties.created !== undefined) {
87
+ if (!(properties.created instanceof Date)) {
88
+ throw new Error('DocumentProperties.created must be a Date object');
89
+ }
90
+ if (!Number.isFinite(properties.created.getTime())) {
91
+ throw new Error('DocumentProperties.created is an invalid date');
92
+ }
93
+ validated.created = properties.created;
94
+ }
95
+ if (properties.modified !== undefined) {
96
+ if (!(properties.modified instanceof Date)) {
97
+ throw new Error('DocumentProperties.modified must be a Date object');
98
+ }
99
+ if (!Number.isFinite(properties.modified.getTime())) {
100
+ throw new Error('DocumentProperties.modified is an invalid date');
101
+ }
102
+ validated.modified = properties.modified;
103
+ }
104
+ return validated;
105
+ }
106
+ validateBeforeSave(bodyElements) {
107
+ const paragraphs = bodyElements.filter((el) => el instanceof Paragraph_1.Paragraph);
108
+ if (paragraphs.length === 0) {
109
+ console.warn('\nDocXML Save Warning:\n' +
110
+ 'Document has no paragraphs. You are saving an empty document.\n');
111
+ return;
112
+ }
113
+ let totalRuns = 0;
114
+ let emptyRuns = 0;
115
+ for (const para of paragraphs) {
116
+ const runs = para.getRuns();
117
+ totalRuns += runs.length;
118
+ for (const run of runs) {
119
+ if (run.getText().length === 0) {
120
+ emptyRuns++;
121
+ }
122
+ }
123
+ }
124
+ if (totalRuns > 0) {
125
+ const emptyPercentage = (emptyRuns / totalRuns) * 100;
126
+ if (emptyPercentage > 90 && emptyRuns > 10) {
127
+ console.warn('\nDocXML Save Warning:\n' +
128
+ `You are about to save a document where ${emptyRuns} out of ${totalRuns} runs (${emptyPercentage.toFixed(1)}%) are empty.\n` +
129
+ 'This may result in a document with no visible text content.\n' +
130
+ 'If this is unintentional, please review the document before saving.\n');
131
+ }
132
+ }
133
+ }
134
+ checkMemoryThreshold() {
135
+ const { heapUsed, heapTotal, external, rss } = process.memoryUsage();
136
+ const heapPercent = (heapUsed / heapTotal) * 100;
137
+ const heapMB = heapUsed / (1024 * 1024);
138
+ const heapTotalMB = heapTotal / (1024 * 1024);
139
+ const rssMB = rss / (1024 * 1024);
140
+ const externalMB = external / (1024 * 1024);
141
+ const heapExceeded = heapPercent > this.maxMemoryUsagePercent;
142
+ const rssExceeded = this.useAbsoluteLimit && rssMB > this.maxRssMB;
143
+ if (heapExceeded && rssExceeded) {
144
+ throw new Error(`Memory usage critical:\n` +
145
+ ` Heap: ${heapMB.toFixed(0)}MB / ${heapTotalMB.toFixed(0)}MB (${heapPercent.toFixed(1)}%)\n` +
146
+ ` RSS: ${rssMB.toFixed(0)}MB (limit: ${this.maxRssMB}MB)\n` +
147
+ ` External: ${externalMB.toFixed(0)}MB\n` +
148
+ `Cannot process document safely. Consider:\n` +
149
+ ` - Reducing document size (remove/compress images)\n` +
150
+ ` - Splitting into multiple documents\n` +
151
+ ` - Increasing memory limits in DocumentOptions\n` +
152
+ ` - Increasing Node.js heap size (--max-old-space-size)`);
153
+ }
154
+ if (heapExceeded && !rssExceeded && this.useAbsoluteLimit) {
155
+ console.warn(`DocXML Memory Warning: Heap usage high (${heapPercent.toFixed(1)}%) ` +
156
+ `but RSS (${rssMB.toFixed(0)}MB) is below limit. ` +
157
+ `This might be temporary heap fragmentation.`);
158
+ }
159
+ }
160
+ estimateSize(bodyElements, imageManager) {
161
+ const paragraphs = bodyElements.filter((el) => el instanceof Paragraph_1.Paragraph);
162
+ const tables = bodyElements.filter((el) => el instanceof Table_1.Table);
163
+ const paragraphCount = paragraphs.length;
164
+ const tableCount = tables.length;
165
+ const imageCount = imageManager.getImageCount();
166
+ const estimatedXml = paragraphCount * 200 + tableCount * 1000 + 50000;
167
+ const imageBytes = imageManager.getTotalSize();
168
+ const totalBytes = estimatedXml + imageBytes;
169
+ const totalMB = totalBytes / (1024 * 1024);
170
+ const WARNING_MB = 50;
171
+ const ERROR_MB = 100;
172
+ let warning;
173
+ if (totalMB > ERROR_MB) {
174
+ warning =
175
+ `Document size (${totalMB.toFixed(1)}MB) exceeds recommended maximum of ${ERROR_MB}MB. ` +
176
+ `This may cause memory issues. Consider splitting into multiple documents or optimizing images.`;
177
+ }
178
+ else if (totalMB > WARNING_MB) {
179
+ warning =
180
+ `Document size (${totalMB.toFixed(1)}MB) exceeds ${WARNING_MB}MB. ` +
181
+ `Large documents may take longer to process and use significant memory.`;
182
+ }
183
+ return {
184
+ paragraphs: paragraphCount,
185
+ tables: tableCount,
186
+ images: imageCount,
187
+ estimatedXmlBytes: estimatedXml,
188
+ imageBytes,
189
+ totalEstimatedBytes: totalBytes,
190
+ totalEstimatedMB: parseFloat(totalMB.toFixed(2)),
191
+ warning,
192
+ };
193
+ }
194
+ getSizeStats(bodyElements, imageManager) {
195
+ const estimate = this.estimateSize(bodyElements, imageManager);
196
+ const warnings = [];
197
+ if (estimate.warning) {
198
+ warnings.push(estimate.warning);
199
+ }
200
+ const formatBytes = (bytes) => {
201
+ if (bytes < 1024)
202
+ return `${bytes} B`;
203
+ if (bytes < 1024 * 1024)
204
+ return `${(bytes / 1024).toFixed(1)} KB`;
205
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
206
+ };
207
+ return {
208
+ elements: {
209
+ paragraphs: estimate.paragraphs,
210
+ tables: estimate.tables,
211
+ images: estimate.images,
212
+ },
213
+ size: {
214
+ xml: formatBytes(estimate.estimatedXmlBytes),
215
+ images: formatBytes(estimate.imageBytes),
216
+ total: formatBytes(estimate.totalEstimatedBytes),
217
+ },
218
+ warnings,
219
+ };
220
+ }
221
+ }
222
+ exports.DocumentValidator = DocumentValidator;
223
+ //# sourceMappingURL=DocumentValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentValidator.js","sourceRoot":"","sources":["../../src/core/DocumentValidator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RelationshipManager.d.ts","sourceRoot":"","sources":["../../src/core/RelationshipManager.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAKhE,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,MAAM,CAAS;;IAevB,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY;IAmBzD,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAOrD,mBAAmB,IAAI,YAAY,EAAE;IAQrC,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,YAAY,EAAE;IAQvE,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IASpC,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAOvC,QAAQ,IAAI,MAAM;IAOlB,KAAK,IAAI,IAAI;IAUb,UAAU,IAAI,MAAM;IAQpB,SAAS,IAAI,YAAY;IASzB,YAAY,IAAI,YAAY;IAU5B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAUtC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAUvC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAUvC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY;IASvC,WAAW,IAAI,YAAY;IAS3B,WAAW,IAAI,MAAM;IAmBrB,MAAM,CAAC,iBAAiB,IAAI,mBAAmB;IAW/C,MAAM,CAAC,MAAM,IAAI,mBAAmB;IASpC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB;IA6ChD,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAMhC"}
1
+ {"version":3,"file":"RelationshipManager.d.ts","sourceRoot":"","sources":["../../src/core/RelationshipManager.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAKhE,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,MAAM,CAAS;;IAevB,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY;IAmBzD,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAOrD,mBAAmB,IAAI,YAAY,EAAE;IAQrC,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,YAAY,EAAE;IAQvE,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IASpC,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAOvC,QAAQ,IAAI,MAAM;IAOlB,KAAK,IAAI,IAAI;IAUb,UAAU,IAAI,MAAM;IAQpB,SAAS,IAAI,YAAY;IASzB,YAAY,IAAI,YAAY;IAU5B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAUtC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAUvC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAUvC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY;IASvC,WAAW,IAAI,YAAY;IAS3B,WAAW,IAAI,MAAM;IAmBrB,MAAM,CAAC,iBAAiB,IAAI,mBAAmB;IAW/C,MAAM,CAAC,MAAM,IAAI,mBAAmB;IASpC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB;IAgEhD,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAehC"}
@@ -93,9 +93,18 @@ class RelationshipManager {
93
93
  }
94
94
  static fromXml(xml) {
95
95
  const manager = new RelationshipManager();
96
- const relationshipPattern = /<Relationship\s+([^>]+)\/>/g;
96
+ if (xml.length > 100000) {
97
+ throw new Error('Relationships XML file too large (>100KB). Possible malicious input or corrupted file.');
98
+ }
99
+ const relationshipPattern = /<Relationship\s+(.*?)\/>/g;
97
100
  let match;
101
+ let iterations = 0;
102
+ const MAX_ITERATIONS = 1000;
98
103
  while ((match = relationshipPattern.exec(xml)) !== null) {
104
+ iterations++;
105
+ if (iterations > MAX_ITERATIONS) {
106
+ throw new Error('Too many relationships in XML file (>1000). Possible malicious input.');
107
+ }
99
108
  const attributesString = match[1];
100
109
  if (!attributesString) {
101
110
  continue;
@@ -105,11 +114,14 @@ class RelationshipManager {
105
114
  const target = this.extractAttribute(attributesString, 'Target');
106
115
  const targetMode = this.extractAttribute(attributesString, 'TargetMode');
107
116
  if (id !== undefined && type !== undefined && target !== undefined) {
117
+ const validatedTargetMode = targetMode === 'Internal' || targetMode === 'External' || targetMode === undefined
118
+ ? targetMode
119
+ : undefined;
108
120
  const relationship = Relationship_1.Relationship.create({
109
121
  id,
110
122
  type,
111
123
  target,
112
- targetMode: targetMode || 'Internal',
124
+ targetMode: validatedTargetMode || 'Internal',
113
125
  });
114
126
  manager.addRelationship(relationship);
115
127
  }
@@ -117,7 +129,11 @@ class RelationshipManager {
117
129
  return manager;
118
130
  }
119
131
  static extractAttribute(attributesString, attributeName) {
120
- const pattern = new RegExp(`${attributeName}=["']([^"']+)["']`, 'i');
132
+ if (attributesString.length > 10000) {
133
+ return undefined;
134
+ }
135
+ const escapedName = attributeName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
136
+ const pattern = new RegExp(`${escapedName}=["'](.*?)["']`, 'i');
121
137
  const match = attributesString.match(pattern);
122
138
  return match ? match[1] : undefined;
123
139
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RelationshipManager.js","sourceRoot":"","sources":["../../src/core/RelationshipManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RelationshipManager.js","sourceRoot":"","sources":["../../src/core/RelationshipManager.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@ export declare class Hyperlink {
24
24
  setTooltip(tooltip: string): this;
25
25
  getRelationshipId(): string | undefined;
26
26
  setRelationshipId(id: string): this;
27
+ setUrl(url: string | undefined): this;
27
28
  getRun(): Run;
28
29
  setFormatting(formatting: RunFormatting): this;
29
30
  getFormatting(): RunFormatting;
@@ -1 +1 @@
1
- {"version":3,"file":"Hyperlink.d.ts","sourceRoot":"","sources":["../../src/elements/Hyperlink.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,MAAM,WAAW,mBAAmB;IAElC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,IAAI,EAAE,MAAM,CAAC;IAEb,UAAU,CAAC,EAAE,aAAa,CAAC;IAE3B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,qBAAa,SAAS;IACpB,OAAO,CAAC,GAAG,CAAC,CAAS;IACrB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,cAAc,CAAC,CAAS;gBAMpB,UAAU,EAAE,mBAAmB;IAoB3C,MAAM,IAAI,MAAM,GAAG,SAAS;IAO5B,SAAS,IAAI,MAAM,GAAG,SAAS;IAO/B,OAAO,IAAI,MAAM;IAOjB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS3B,UAAU,IAAI,MAAM,GAAG,SAAS;IAOhC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQjC,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAOvC,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQnC,MAAM,IAAI,GAAG;IAOb,aAAa,CAAC,UAAU,EAAE,aAAa,GAAG,IAAI;IAS9C,aAAa,IAAI,aAAa;IAO9B,UAAU,IAAI,OAAO;IAOrB,UAAU,IAAI,OAAO;IAQrB,KAAK,IAAI,UAAU;IAkCnB,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS;IAUvF,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS;IAU1F,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS;IAcvF,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS;IAYvF,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,mBAAmB,GAAG,SAAS;CAG1D"}
1
+ {"version":3,"file":"Hyperlink.d.ts","sourceRoot":"","sources":["../../src/elements/Hyperlink.ts"],"names":[],"mappings":"AAkDA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,MAAM,WAAW,mBAAmB;IAElC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,IAAI,EAAE,MAAM,CAAC;IAEb,UAAU,CAAC,EAAE,aAAa,CAAC;IAE3B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,qBAAa,SAAS;IACpB,OAAO,CAAC,GAAG,CAAC,CAAS;IACrB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,cAAc,CAAC,CAAS;gBAUpB,UAAU,EAAE,mBAAmB;IAgC3C,MAAM,IAAI,MAAM,GAAG,SAAS;IAO5B,SAAS,IAAI,MAAM,GAAG,SAAS;IAO/B,OAAO,IAAI,MAAM;IAOjB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS3B,UAAU,IAAI,MAAM,GAAG,SAAS;IAOhC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQjC,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAOvC,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAyBnC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAyBrC,MAAM,IAAI,GAAG;IAOb,aAAa,CAAC,UAAU,EAAE,aAAa,GAAG,IAAI;IAS9C,aAAa,IAAI,aAAa;IAO9B,UAAU,IAAI,OAAO;IAOrB,UAAU,IAAI,OAAO;IAcrB,KAAK,IAAI,UAAU;IAwDnB,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS;IAUvF,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS;IAU1F,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS;IAcvF,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS;IAYvF,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,mBAAmB,GAAG,SAAS;CAG1D"}
@@ -6,15 +6,20 @@ class Hyperlink {
6
6
  constructor(properties) {
7
7
  this.url = properties.url;
8
8
  this.anchor = properties.anchor;
9
- this.text = properties.text;
10
9
  this.tooltip = properties.tooltip;
11
10
  this.relationshipId = properties.relationshipId;
11
+ if (this.url && this.anchor) {
12
+ console.warn(`DocXML Warning: Hyperlink has both URL ("${this.url}") and anchor ("${this.anchor}"). ` +
13
+ `This is ambiguous per ECMA-376 spec. URL will take precedence. ` +
14
+ `Use Hyperlink.createExternal() or Hyperlink.createInternal() to avoid ambiguity.`);
15
+ }
16
+ this.text = properties.text || this.url || this.anchor || 'Link';
12
17
  const formatting = {
13
18
  color: '0563C1',
14
19
  underline: 'single',
15
20
  ...properties.formatting,
16
21
  };
17
- this.run = new Run_1.Run(properties.text, formatting);
22
+ this.run = new Run_1.Run(this.text, formatting);
18
23
  }
19
24
  getUrl() {
20
25
  return this.url;
@@ -44,6 +49,16 @@ class Hyperlink {
44
49
  this.relationshipId = id;
45
50
  return this;
46
51
  }
52
+ setUrl(url) {
53
+ const oldUrl = this.url;
54
+ this.url = url;
55
+ this.relationshipId = undefined;
56
+ if (this.text === oldUrl) {
57
+ this.text = url || this.anchor || 'Link';
58
+ this.run.setText(this.text);
59
+ }
60
+ return this;
61
+ }
47
62
  getRun() {
48
63
  return this.run;
49
64
  }
@@ -62,6 +77,16 @@ class Hyperlink {
62
77
  return this.anchor !== undefined;
63
78
  }
64
79
  toXML() {
80
+ if (!this.url && !this.anchor) {
81
+ throw new Error('CRITICAL: Hyperlink must have either a URL (external link) or anchor (internal link). ' +
82
+ 'Cannot generate valid XML for empty hyperlink.');
83
+ }
84
+ if (this.url && !this.relationshipId) {
85
+ throw new Error(`CRITICAL: External hyperlink to "${this.url}" is missing relationship ID. ` +
86
+ `This would create an invalid OpenXML document per ECMA-376 §17.16.22. ` +
87
+ `Solution: Use Document.save() which automatically registers relationships, ` +
88
+ `or manually call relationshipManager.addHyperlink(url) and set the relationship ID.`);
89
+ }
65
90
  const attributes = {};
66
91
  if (this.url && this.relationshipId) {
67
92
  attributes['r:id'] = this.relationshipId;
@@ -1 +1 @@
1
- {"version":3,"file":"Hyperlink.js","sourceRoot":"","sources":["../../src/elements/Hyperlink.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Hyperlink.js","sourceRoot":"","sources":["../../src/elements/Hyperlink.ts"],"names":[],"mappings":"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"}
@@ -25,9 +25,13 @@ export declare class Image {
25
25
  releaseData(): void;
26
26
  private detectExtension;
27
27
  private detectDimensions;
28
+ private detectPngDimensions;
29
+ private detectGifDimensions;
30
+ private detectBmpDimensions;
31
+ private detectTiffDimensions;
28
32
  private detectJpegDimensions;
29
- getImageData(): Buffer;
30
33
  getImageDataAsync(): Promise<Buffer>;
34
+ getImageData(): Buffer;
31
35
  getExtension(): string;
32
36
  getWidth(): number;
33
37
  getHeight(): number;
@@ -1 +1 @@
1
- {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../../src/elements/Image.ts"],"names":[],"mappings":"AAQA,OAAO,EAAc,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAM3D,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAK1E,MAAM,WAAW,eAAe;IAE9B,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAa;IAO5B,OAAO;YAuBO,0BAA0B;IAwClC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBvC,WAAW,IAAI,IAAI;IAUnB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,gBAAgB;IAyCxB,OAAO,CAAC,oBAAoB;IAmI5B,YAAY,IAAI,MAAM;IAWhB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAc1C,YAAY,IAAI,MAAM;IAOtB,QAAQ,IAAI,MAAM;IAOlB,SAAS,IAAI,MAAM;IASnB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,mBAAmB,GAAE,OAAc,GAAG,IAAI;IAclE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAE,OAAc,GAAG,IAAI;IAcpE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAU5C,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAQ/C,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAQvC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAS5B,KAAK,IAAI,UAAU;IAgBnB,OAAO,CAAC,YAAY;IAqEpB,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,aAAa;WAkGR,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;WA6B3E,UAAU,CACrB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC;WAsBJ,MAAM,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC;CAgBjE"}
1
+ {"version":3,"file":"Image.d.ts","sourceRoot":"","sources":["../../src/elements/Image.ts"],"names":[],"mappings":"AAQA,OAAO,EAAc,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAM3D,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAK1E,MAAM,WAAW,eAAe;IAE9B,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAa;IAO5B,OAAO;YAuBO,0BAA0B;IAwClC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBvC,WAAW,IAAI,IAAI;IAUnB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,gBAAgB;IAoDxB,OAAO,CAAC,mBAAmB;IAuB3B,OAAO,CAAC,mBAAmB;IA6B3B,OAAO,CAAC,mBAAmB;IA6B3B,OAAO,CAAC,oBAAoB;IA8E5B,OAAO,CAAC,oBAAoB;IAmItB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAkB1C,YAAY,IAAI,MAAM;IAatB,YAAY,IAAI,MAAM;IAOtB,QAAQ,IAAI,MAAM;IAOlB,SAAS,IAAI,MAAM;IASnB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,mBAAmB,GAAE,OAAc,GAAG,IAAI;IAclE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAE,OAAc,GAAG,IAAI;IAcpE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAU5C,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAQ/C,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAQvC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAS5B,KAAK,IAAI,UAAU;IAgBnB,OAAO,CAAC,YAAY;IAqEpB,OAAO,CAAC,aAAa;IAqBrB,OAAO,CAAC,aAAa;WAkGR,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;WA6B3E,UAAU,CACrB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC;WAsBJ,MAAM,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC;CAgBjE"}
@@ -81,18 +81,123 @@ class Image {
81
81
  this.imageData[1] === 0x50 &&
82
82
  this.imageData[2] === 0x4e &&
83
83
  this.imageData[3] === 0x47) {
84
- const width = this.imageData.readUInt32BE(16);
85
- const height = this.imageData.readUInt32BE(20);
84
+ return this.detectPngDimensions();
85
+ }
86
+ if (this.imageData[0] === 0xff && this.imageData[1] === 0xd8) {
87
+ return this.detectJpegDimensions();
88
+ }
89
+ if (this.imageData[0] === 0x47 &&
90
+ this.imageData[1] === 0x49 &&
91
+ this.imageData[2] === 0x46) {
92
+ return this.detectGifDimensions();
93
+ }
94
+ if (this.imageData[0] === 0x42 && this.imageData[1] === 0x4d) {
95
+ return this.detectBmpDimensions();
96
+ }
97
+ if ((this.imageData[0] === 0x49 && this.imageData[1] === 0x49 && this.imageData[2] === 0x2a) ||
98
+ (this.imageData[0] === 0x4d && this.imageData[1] === 0x4d && this.imageData[2] === 0x00)) {
99
+ return this.detectTiffDimensions();
100
+ }
101
+ }
102
+ catch (error) {
103
+ }
104
+ return null;
105
+ }
106
+ detectPngDimensions() {
107
+ if (!this.imageData || this.imageData.length < 24) {
108
+ return null;
109
+ }
110
+ try {
111
+ const width = this.imageData.readUInt32BE(16);
112
+ const height = this.imageData.readUInt32BE(20);
113
+ return {
114
+ width: Math.round((width / 96) * 914400),
115
+ height: Math.round((height / 96) * 914400),
116
+ };
117
+ }
118
+ catch (error) {
119
+ return null;
120
+ }
121
+ }
122
+ detectGifDimensions() {
123
+ if (!this.imageData || this.imageData.length < 10) {
124
+ return null;
125
+ }
126
+ try {
127
+ const width = this.imageData.readUInt16LE(6);
128
+ const height = this.imageData.readUInt16LE(8);
129
+ if (width > 0 && height > 0 && width < 65535 && height < 65535) {
86
130
  return {
87
131
  width: Math.round((width / 96) * 914400),
88
132
  height: Math.round((height / 96) * 914400),
89
133
  };
90
134
  }
91
- if (this.imageData[0] === 0xff && this.imageData[1] === 0xd8) {
92
- const jpegDims = this.detectJpegDimensions();
93
- if (jpegDims) {
94
- return jpegDims;
135
+ }
136
+ catch (error) {
137
+ }
138
+ return null;
139
+ }
140
+ detectBmpDimensions() {
141
+ if (!this.imageData || this.imageData.length < 26) {
142
+ return null;
143
+ }
144
+ try {
145
+ const width = this.imageData.readInt32LE(18);
146
+ const height = Math.abs(this.imageData.readInt32LE(22));
147
+ if (width > 0 && height > 0 && width < 65535 && height < 65535) {
148
+ return {
149
+ width: Math.round((width / 96) * 914400),
150
+ height: Math.round((height / 96) * 914400),
151
+ };
152
+ }
153
+ }
154
+ catch (error) {
155
+ }
156
+ return null;
157
+ }
158
+ detectTiffDimensions() {
159
+ if (!this.imageData || this.imageData.length < 14) {
160
+ return null;
161
+ }
162
+ try {
163
+ const isLittleEndian = this.imageData[0] === 0x49;
164
+ const ifdOffset = isLittleEndian
165
+ ? this.imageData.readUInt32LE(4)
166
+ : this.imageData.readUInt32BE(4);
167
+ if (ifdOffset + 14 > this.imageData.length) {
168
+ return null;
169
+ }
170
+ const numEntries = isLittleEndian
171
+ ? this.imageData.readUInt16LE(ifdOffset)
172
+ : this.imageData.readUInt16BE(ifdOffset);
173
+ let width = 0;
174
+ let height = 0;
175
+ for (let i = 0; i < numEntries; i++) {
176
+ const entryOffset = ifdOffset + 2 + i * 12;
177
+ if (entryOffset + 12 > this.imageData.length) {
178
+ break;
179
+ }
180
+ const tag = isLittleEndian
181
+ ? this.imageData.readUInt16LE(entryOffset)
182
+ : this.imageData.readUInt16BE(entryOffset);
183
+ const value = isLittleEndian
184
+ ? this.imageData.readUInt32LE(entryOffset + 8)
185
+ : this.imageData.readUInt32BE(entryOffset + 8);
186
+ if (tag === 256 || tag === 0x100) {
187
+ width = value;
95
188
  }
189
+ else if (tag === 257 || tag === 0x101) {
190
+ height = value;
191
+ }
192
+ if (width > 0 && height > 0) {
193
+ break;
194
+ }
195
+ }
196
+ if (width > 0 && height > 0 && width < 65535 && height < 65535) {
197
+ return {
198
+ width: Math.round((width / 96) * 914400),
199
+ height: Math.round((height / 96) * 914400),
200
+ };
96
201
  }
97
202
  }
98
203
  catch (error) {
@@ -162,12 +267,6 @@ class Image {
162
267
  }
163
268
  return null;
164
269
  }
165
- getImageData() {
166
- if (!this.imageData) {
167
- throw new Error('Image data not loaded. Call await ensureDataLoaded() first.');
168
- }
169
- return this.imageData;
170
- }
171
270
  async getImageDataAsync() {
172
271
  await this.ensureDataLoaded();
173
272
  if (this.imageData) {
@@ -175,6 +274,13 @@ class Image {
175
274
  }
176
275
  throw new Error('Failed to load image data');
177
276
  }
277
+ getImageData() {
278
+ if (!this.imageData) {
279
+ throw new Error('Image data not loaded. ' +
280
+ 'Call await image.ensureDataLoaded() or await imageManager.loadAllImageData() first.');
281
+ }
282
+ return this.imageData;
283
+ }
178
284
  getExtension() {
179
285
  return this.extension;
180
286
  }