dynamic-docx-generator 1.0.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.
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ /**
3
+ * XML template constants for Office Open XML (OOXML) DOCX format
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.escapeXml = exports.generateTable = exports.generateTableDataRow = exports.generateTableHeaderRow = exports.DEFAULT_TABLE_STYLE = exports.generateInlineImage = exports.generateImageRelationship = void 0;
7
+ /**
8
+ * Generate XML for image relationship entry in .rels file
9
+ */
10
+ const generateImageRelationship = (imageId, imageName) => {
11
+ return `<Relationship Id="${imageId}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/${imageName}" />`;
12
+ };
13
+ exports.generateImageRelationship = generateImageRelationship;
14
+ /**
15
+ * Generate XML for inline image in document
16
+ */
17
+ const generateInlineImage = (imageId, width = 914400, height = 914400, name = 'Picture') => {
18
+ return `<w:drawing>
19
+ <wp:inline distT="0" distB="0" distL="0" distR="0">
20
+ <wp:extent cx="${width}" cy="${height}" />
21
+ <wp:effectExtent l="0" t="0" r="0" b="0" />
22
+ <wp:docPr id="1" name="${name}" />
23
+ <wp:cNvGraphicFramePr>
24
+ <a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1" />
25
+ </wp:cNvGraphicFramePr>
26
+ <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
27
+ <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
28
+ <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
29
+ <pic:nvPicPr>
30
+ <pic:cNvPr id="1" name="${name}" />
31
+ <pic:cNvPicPr />
32
+ </pic:nvPicPr>
33
+ <pic:blipFill>
34
+ <a:blip r:embed="${imageId}" cstate="print" />
35
+ <a:stretch>
36
+ <a:fillRect />
37
+ </a:stretch>
38
+ </pic:blipFill>
39
+ <pic:spPr>
40
+ <a:xfrm>
41
+ <a:off x="0" y="0" />
42
+ <a:ext cx="${width}" cy="${height}" />
43
+ </a:xfrm>
44
+ <a:prstGeom prst="rect">
45
+ <a:avLst />
46
+ </a:prstGeom>
47
+ </pic:spPr>
48
+ </pic:pic>
49
+ </a:graphicData>
50
+ </a:graphic>
51
+ </wp:inline>
52
+ </w:drawing>`;
53
+ };
54
+ exports.generateInlineImage = generateInlineImage;
55
+ /**
56
+ * Default table style values
57
+ */
58
+ exports.DEFAULT_TABLE_STYLE = {
59
+ headerBgColor: 'C9DAF8',
60
+ headerTextColor: '000000',
61
+ borderColor: 'auto',
62
+ fontSize: 24, // 12pt
63
+ fontFamily: 'Times New Roman'
64
+ };
65
+ /**
66
+ * Generate table header row XML
67
+ */
68
+ const generateTableHeaderRow = (headers, style = exports.DEFAULT_TABLE_STYLE) => {
69
+ const cells = headers.map((header, index) => `
70
+ <w:tc>
71
+ <w:tcPr>
72
+ <w:tcW w:w="${header.width || 2000}" w:type="dxa" />
73
+ <w:shd w:val="clear" w:color="auto" w:fill="${style.headerBgColor}" />
74
+ <w:vAlign w:val="center" />
75
+ </w:tcPr>
76
+ <w:p>
77
+ <w:pPr>
78
+ <w:jc w:val="center" />
79
+ <w:rPr>
80
+ <w:rFonts w:ascii="${style.fontFamily}" w:hAnsi="${style.fontFamily}" />
81
+ <w:b />
82
+ <w:sz w:val="${style.fontSize}" />
83
+ <w:szCs w:val="${style.fontSize}" />
84
+ <w:color w:val="${style.headerTextColor}" />
85
+ </w:rPr>
86
+ </w:pPr>
87
+ <w:r>
88
+ <w:rPr>
89
+ <w:rFonts w:ascii="${style.fontFamily}" w:hAnsi="${style.fontFamily}" />
90
+ <w:b />
91
+ <w:sz w:val="${style.fontSize}" />
92
+ <w:szCs w:val="${style.fontSize}" />
93
+ <w:color w:val="${style.headerTextColor}" />
94
+ </w:rPr>
95
+ <w:t>${(0, exports.escapeXml)(header.name)}</w:t>
96
+ </w:r>
97
+ </w:p>
98
+ </w:tc>
99
+ `).join('');
100
+ return `
101
+ <w:tr>
102
+ <w:trPr>
103
+ <w:trHeight w:val="400" />
104
+ </w:trPr>
105
+ ${cells}
106
+ </w:tr>
107
+ `;
108
+ };
109
+ exports.generateTableHeaderRow = generateTableHeaderRow;
110
+ /**
111
+ * Generate a single table data row XML
112
+ */
113
+ const generateTableDataRow = (cells, widths, style = exports.DEFAULT_TABLE_STYLE) => {
114
+ const cellsXml = cells.map((cell, index) => `
115
+ <w:tc>
116
+ <w:tcPr>
117
+ <w:tcW w:w="${widths[index] || 2000}" w:type="dxa" />
118
+ <w:vAlign w:val="center" />
119
+ </w:tcPr>
120
+ <w:p>
121
+ <w:pPr>
122
+ <w:rPr>
123
+ <w:rFonts w:ascii="${style.fontFamily}" w:hAnsi="${style.fontFamily}" />
124
+ <w:sz w:val="${style.fontSize}" />
125
+ <w:szCs w:val="${style.fontSize}" />
126
+ </w:rPr>
127
+ </w:pPr>
128
+ <w:r>
129
+ <w:rPr>
130
+ <w:rFonts w:ascii="${style.fontFamily}" w:hAnsi="${style.fontFamily}" />
131
+ <w:sz w:val="${style.fontSize}" />
132
+ <w:szCs w:val="${style.fontSize}" />
133
+ </w:rPr>
134
+ <w:t>${(0, exports.escapeXml)(cell)}</w:t>
135
+ </w:r>
136
+ </w:p>
137
+ </w:tc>
138
+ `).join('');
139
+ return `
140
+ <w:tr>
141
+ <w:trPr>
142
+ <w:trHeight w:val="350" />
143
+ </w:trPr>
144
+ ${cellsXml}
145
+ </w:tr>
146
+ `;
147
+ };
148
+ exports.generateTableDataRow = generateTableDataRow;
149
+ /**
150
+ * Generate complete table XML
151
+ */
152
+ const generateTable = (headers, rows, style = exports.DEFAULT_TABLE_STYLE) => {
153
+ const widths = headers.map(h => h.width || 2000);
154
+ const gridCols = headers.map(h => `<w:gridCol w:w="${h.width || 2000}" />`).join('');
155
+ const headerRow = (0, exports.generateTableHeaderRow)(headers, style);
156
+ const dataRows = rows.map(row => (0, exports.generateTableDataRow)(row, widths, style)).join('');
157
+ return `
158
+ <w:tbl>
159
+ <w:tblPr>
160
+ <w:tblStyle w:val="TableGrid" />
161
+ <w:tblW w:w="5000" w:type="pct" />
162
+ <w:jc w:val="center" />
163
+ <w:tblBorders>
164
+ <w:top w:val="single" w:sz="4" w:space="0" w:color="${style.borderColor}" />
165
+ <w:left w:val="single" w:sz="4" w:space="0" w:color="${style.borderColor}" />
166
+ <w:bottom w:val="single" w:sz="4" w:space="0" w:color="${style.borderColor}" />
167
+ <w:right w:val="single" w:sz="4" w:space="0" w:color="${style.borderColor}" />
168
+ <w:insideH w:val="single" w:sz="4" w:space="0" w:color="${style.borderColor}" />
169
+ <w:insideV w:val="single" w:sz="4" w:space="0" w:color="${style.borderColor}" />
170
+ </w:tblBorders>
171
+ <w:tblLayout w:type="fixed" />
172
+ </w:tblPr>
173
+ <w:tblGrid>
174
+ ${gridCols}
175
+ </w:tblGrid>
176
+ ${headerRow}
177
+ ${dataRows}
178
+ </w:tbl>
179
+ `;
180
+ };
181
+ exports.generateTable = generateTable;
182
+ /**
183
+ * Escape special XML characters
184
+ */
185
+ const escapeXml = (text) => {
186
+ if (!text)
187
+ return '';
188
+ return text
189
+ .replace(/&/g, '&amp;')
190
+ .replace(/</g, '&lt;')
191
+ .replace(/>/g, '&gt;')
192
+ .replace(/"/g, '&quot;')
193
+ .replace(/'/g, '&apos;');
194
+ };
195
+ exports.escapeXml = escapeXml;
196
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Image processing utilities for DOCX
3
+ */
4
+ import { ImageConfig } from '../types';
5
+ /**
6
+ * Load image from file path
7
+ */
8
+ export declare const loadImageFromPath: (imagePath: string) => Promise<Buffer>;
9
+ /**
10
+ * Download image from URL
11
+ */
12
+ export declare const downloadImage: (url: string) => Promise<Buffer>;
13
+ /**
14
+ * Get image buffer from ImageConfig
15
+ */
16
+ export declare const getImageBuffer: (config: ImageConfig) => Promise<Buffer>;
17
+ /**
18
+ * Get image extension from path or URL
19
+ */
20
+ export declare const getImageExtension: (config: ImageConfig) => string;
21
+ /**
22
+ * Generate image file name for media folder
23
+ */
24
+ export declare const generateImageFileName: (index: number, extension: string) => string;
25
+ /**
26
+ * Prepare image for insertion into DOCX
27
+ */
28
+ export interface PreparedImage {
29
+ id: string;
30
+ buffer: Buffer;
31
+ fileName: string;
32
+ extension: string;
33
+ relationshipXml: string;
34
+ inlineXml: string;
35
+ placeholder: string;
36
+ }
37
+ /**
38
+ * Prepare an image config for insertion
39
+ */
40
+ export declare const prepareImage: (config: ImageConfig, index: number, existingIds: string[]) => Promise<PreparedImage>;
41
+ /**
42
+ * Default image dimensions in EMUs (914400 EMUs = 1 inch)
43
+ */
44
+ export declare const EMU_PER_INCH = 914400;
45
+ export declare const EMU_PER_CM = 360000;
46
+ export declare const EMU_PER_PIXEL = 9525;
47
+ /**
48
+ * Convert pixels to EMUs
49
+ */
50
+ export declare const pixelsToEmu: (pixels: number) => number;
51
+ /**
52
+ * Convert inches to EMUs
53
+ */
54
+ export declare const inchesToEmu: (inches: number) => number;
55
+ /**
56
+ * Convert centimeters to EMUs
57
+ */
58
+ export declare const cmToEmu: (cm: number) => number;
59
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/utils/image.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIvC;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,MAAM,CAEzE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,MAAM,CAO/D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAU,QAAQ,WAAW,KAAG,OAAO,CAAC,MAAM,CAcxE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,WAAW,KAAG,MAWvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,EAAE,WAAW,MAAM,KAAG,MAExE,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,GACrB,QAAQ,WAAW,EACnB,OAAO,MAAM,EACb,aAAa,MAAM,EAAE,KACtB,OAAO,CAAC,aAAa,CA8BvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,SAAS,CAAC;AACnC,eAAO,MAAM,UAAU,SAAS,CAAC;AACjC,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,KAAG,MAE5C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,KAAG,MAE5C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,IAAI,MAAM,KAAG,MAEpC,CAAC"}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ /**
3
+ * Image processing utilities for DOCX
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.cmToEmu = exports.inchesToEmu = exports.pixelsToEmu = exports.EMU_PER_PIXEL = exports.EMU_PER_CM = exports.EMU_PER_INCH = exports.prepareImage = exports.generateImageFileName = exports.getImageExtension = exports.getImageBuffer = exports.downloadImage = exports.loadImageFromPath = void 0;
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const axios_1 = __importDefault(require("axios"));
46
+ const string_1 = require("./string");
47
+ const constants_1 = require("./constants");
48
+ /**
49
+ * Load image from file path
50
+ */
51
+ const loadImageFromPath = async (imagePath) => {
52
+ return fs.promises.readFile(imagePath);
53
+ };
54
+ exports.loadImageFromPath = loadImageFromPath;
55
+ /**
56
+ * Download image from URL
57
+ */
58
+ const downloadImage = async (url) => {
59
+ const response = await (0, axios_1.default)({
60
+ method: 'GET',
61
+ url: url,
62
+ responseType: 'arraybuffer'
63
+ });
64
+ return Buffer.from(response.data);
65
+ };
66
+ exports.downloadImage = downloadImage;
67
+ /**
68
+ * Get image buffer from ImageConfig
69
+ */
70
+ const getImageBuffer = async (config) => {
71
+ if (config.buffer) {
72
+ return config.buffer;
73
+ }
74
+ if (config.path) {
75
+ return (0, exports.loadImageFromPath)(config.path);
76
+ }
77
+ if (config.url) {
78
+ return (0, exports.downloadImage)(config.url);
79
+ }
80
+ throw new Error(`No image source provided for placeholder: ${config.placeholder}`);
81
+ };
82
+ exports.getImageBuffer = getImageBuffer;
83
+ /**
84
+ * Get image extension from path or URL
85
+ */
86
+ const getImageExtension = (config) => {
87
+ if (config.path) {
88
+ return path.extname(config.path).toLowerCase().replace('.', '') || 'png';
89
+ }
90
+ if (config.url) {
91
+ const urlPath = new URL(config.url).pathname;
92
+ return path.extname(urlPath).toLowerCase().replace('.', '') || 'png';
93
+ }
94
+ return 'png';
95
+ };
96
+ exports.getImageExtension = getImageExtension;
97
+ /**
98
+ * Generate image file name for media folder
99
+ */
100
+ const generateImageFileName = (index, extension) => {
101
+ return `image${index + 1}.${extension}`;
102
+ };
103
+ exports.generateImageFileName = generateImageFileName;
104
+ /**
105
+ * Prepare an image config for insertion
106
+ */
107
+ const prepareImage = async (config, index, existingIds) => {
108
+ const buffer = await (0, exports.getImageBuffer)(config);
109
+ const extension = (0, exports.getImageExtension)(config);
110
+ const fileName = (0, exports.generateImageFileName)(index, extension);
111
+ // Generate unique ID
112
+ let id = config.id || (0, string_1.generateImageId)();
113
+ let counter = 1;
114
+ while (existingIds.includes(id)) {
115
+ id = `rId${100 + index + counter}`;
116
+ counter++;
117
+ }
118
+ const relationshipXml = (0, constants_1.generateImageRelationship)(id, fileName);
119
+ const inlineXml = (0, constants_1.generateInlineImage)(id, config.width || 914400, config.height || config.width || 914400, `Image ${index + 1}`);
120
+ return {
121
+ id,
122
+ buffer,
123
+ fileName,
124
+ extension,
125
+ relationshipXml,
126
+ inlineXml,
127
+ placeholder: config.placeholder
128
+ };
129
+ };
130
+ exports.prepareImage = prepareImage;
131
+ /**
132
+ * Default image dimensions in EMUs (914400 EMUs = 1 inch)
133
+ */
134
+ exports.EMU_PER_INCH = 914400;
135
+ exports.EMU_PER_CM = 360000;
136
+ exports.EMU_PER_PIXEL = 9525; // At 96 DPI
137
+ /**
138
+ * Convert pixels to EMUs
139
+ */
140
+ const pixelsToEmu = (pixels) => {
141
+ return Math.round(pixels * exports.EMU_PER_PIXEL);
142
+ };
143
+ exports.pixelsToEmu = pixelsToEmu;
144
+ /**
145
+ * Convert inches to EMUs
146
+ */
147
+ const inchesToEmu = (inches) => {
148
+ return Math.round(inches * exports.EMU_PER_INCH);
149
+ };
150
+ exports.inchesToEmu = inchesToEmu;
151
+ /**
152
+ * Convert centimeters to EMUs
153
+ */
154
+ const cmToEmu = (cm) => {
155
+ return Math.round(cm * exports.EMU_PER_CM);
156
+ };
157
+ exports.cmToEmu = cmToEmu;
158
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/utils/image.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * String manipulation utilities for DOCX template processing
3
+ */
4
+ /**
5
+ * Escape special characters for use in regular expressions
6
+ */
7
+ export declare const escapeRegExp: (string: string) => string;
8
+ /**
9
+ * Replace all occurrences of a string (case-sensitive)
10
+ */
11
+ export declare const replaceAll: (str: string, search: string, replacement: string) => string;
12
+ /**
13
+ * Replace placeholder with value, handling XML-safe escaping
14
+ * Supports both {{placeholder}} and <w:t>placeholder</w:t> formats
15
+ */
16
+ export declare const replacePlaceholder: (content: string, placeholder: string, value: string) => string;
17
+ /**
18
+ * Escape special characters for XML content
19
+ */
20
+ export declare const escapeForXml: (text: string) => string;
21
+ /**
22
+ * Unescape XML entities back to regular characters
23
+ */
24
+ export declare const unescapeXml: (text: string) => string;
25
+ /**
26
+ * Fix double-escaped XML entities
27
+ */
28
+ export declare const fixDoubleEscaping: (content: string) => string;
29
+ /**
30
+ * Strip HTML tags and return plain text
31
+ */
32
+ export declare const stripHtml: (html: string) => string;
33
+ /**
34
+ * Generate a unique ID for image relationships
35
+ */
36
+ export declare const generateImageId: () => string;
37
+ /**
38
+ * Check if a string contains any of the given placeholders
39
+ */
40
+ export declare const containsPlaceholder: (content: string, placeholders: string[]) => boolean;
41
+ /**
42
+ * Extract all placeholders from content (both {{}} and raw formats)
43
+ */
44
+ export declare const extractPlaceholders: (content: string) => string[];
45
+ /**
46
+ * Wrap text with XML preserve space attribute for proper whitespace handling
47
+ */
48
+ export declare const wrapWithPreserveSpace: (text: string) => string;
49
+ //# sourceMappingURL=string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,MAE7C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,EAAE,QAAQ,MAAM,EAAE,aAAa,MAAM,KAAG,MAK7E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC3B,SAAS,MAAM,EACf,aAAa,MAAM,EACnB,OAAO,MAAM,KACd,MAmBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,MAS3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,MAS1C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,KAAG,MAQnD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,MAQxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,QAAO,MAalC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,EAAE,cAAc,MAAM,EAAE,KAAG,OAI7E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,KAAG,MAAM,EAY3D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,KAAG,MAEpD,CAAC"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ /**
3
+ * String manipulation utilities for DOCX template processing
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.wrapWithPreserveSpace = exports.extractPlaceholders = exports.containsPlaceholder = exports.generateImageId = exports.stripHtml = exports.fixDoubleEscaping = exports.unescapeXml = exports.escapeForXml = exports.replacePlaceholder = exports.replaceAll = exports.escapeRegExp = void 0;
7
+ /**
8
+ * Escape special characters for use in regular expressions
9
+ */
10
+ const escapeRegExp = (string) => {
11
+ return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
12
+ };
13
+ exports.escapeRegExp = escapeRegExp;
14
+ /**
15
+ * Replace all occurrences of a string (case-sensitive)
16
+ */
17
+ const replaceAll = (str, search, replacement) => {
18
+ if (typeof str !== 'string') {
19
+ return str;
20
+ }
21
+ return str.replace(new RegExp((0, exports.escapeRegExp)(search), 'g'), replacement);
22
+ };
23
+ exports.replaceAll = replaceAll;
24
+ /**
25
+ * Replace placeholder with value, handling XML-safe escaping
26
+ * Supports both {{placeholder}} and <w:t>placeholder</w:t> formats
27
+ */
28
+ const replacePlaceholder = (content, placeholder, value) => {
29
+ let result = content;
30
+ // Escape the value for XML
31
+ const safeValue = (0, exports.escapeForXml)(value);
32
+ // Replace {{placeholder}} format
33
+ result = (0, exports.replaceAll)(result, `{{${placeholder}}}`, safeValue);
34
+ // Replace <w:t>placeholder</w:t> format (Word XML)
35
+ result = (0, exports.replaceAll)(result, `<w:t>${placeholder}</w:t>`, `<w:t>${safeValue}</w:t>`);
36
+ // Replace when placeholder is split across XML tags (common in Word)
37
+ // Pattern: <w:t>place</w:t></w:r><w:r><w:t>holder</w:t>
38
+ const placeholderPattern = placeholder.split('').join('[^a-zA-Z]*');
39
+ const regex = new RegExp(`<w:t[^>]*>\\s*${placeholderPattern}\\s*</w:t>`, 'gi');
40
+ result = result.replace(regex, `<w:t>${safeValue}</w:t>`);
41
+ return result;
42
+ };
43
+ exports.replacePlaceholder = replacePlaceholder;
44
+ /**
45
+ * Escape special characters for XML content
46
+ */
47
+ const escapeForXml = (text) => {
48
+ if (!text || typeof text !== 'string')
49
+ return '';
50
+ return text
51
+ .replace(/&/g, '&amp;')
52
+ .replace(/</g, '&lt;')
53
+ .replace(/>/g, '&gt;')
54
+ .replace(/"/g, '&quot;')
55
+ .replace(/'/g, '&apos;');
56
+ };
57
+ exports.escapeForXml = escapeForXml;
58
+ /**
59
+ * Unescape XML entities back to regular characters
60
+ */
61
+ const unescapeXml = (text) => {
62
+ if (!text || typeof text !== 'string')
63
+ return '';
64
+ return text
65
+ .replace(/&amp;/g, '&')
66
+ .replace(/&lt;/g, '<')
67
+ .replace(/&gt;/g, '>')
68
+ .replace(/&quot;/g, '"')
69
+ .replace(/&apos;/g, "'");
70
+ };
71
+ exports.unescapeXml = unescapeXml;
72
+ /**
73
+ * Fix double-escaped XML entities
74
+ */
75
+ const fixDoubleEscaping = (content) => {
76
+ let result = content;
77
+ result = (0, exports.replaceAll)(result, '&amp;amp;', '&amp;');
78
+ result = (0, exports.replaceAll)(result, '&amp;lt;', '&lt;');
79
+ result = (0, exports.replaceAll)(result, '&amp;gt;', '&gt;');
80
+ result = (0, exports.replaceAll)(result, '&amp;quot;', '&quot;');
81
+ result = (0, exports.replaceAll)(result, '&amp;apos;', '&apos;');
82
+ return result;
83
+ };
84
+ exports.fixDoubleEscaping = fixDoubleEscaping;
85
+ /**
86
+ * Strip HTML tags and return plain text
87
+ */
88
+ const stripHtml = (html) => {
89
+ if (!html || typeof html !== 'string')
90
+ return '';
91
+ return html
92
+ .replace(/<[^>]*>/g, '')
93
+ .replace(/&nbsp;/g, ' ')
94
+ .replace(/\s+/g, ' ')
95
+ .trim();
96
+ };
97
+ exports.stripHtml = stripHtml;
98
+ /**
99
+ * Generate a unique ID for image relationships
100
+ */
101
+ const generateImageId = () => {
102
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
103
+ const nums = '0123456789';
104
+ let id = 'rId';
105
+ for (let i = 0; i < 2; i++) {
106
+ id += chars.charAt(Math.floor(Math.random() * chars.length));
107
+ }
108
+ for (let i = 0; i < 4; i++) {
109
+ id += nums.charAt(Math.floor(Math.random() * nums.length));
110
+ }
111
+ return id;
112
+ };
113
+ exports.generateImageId = generateImageId;
114
+ /**
115
+ * Check if a string contains any of the given placeholders
116
+ */
117
+ const containsPlaceholder = (content, placeholders) => {
118
+ return placeholders.some(p => content.includes(`{{${p}}}`) || content.includes(`<w:t>${p}</w:t>`));
119
+ };
120
+ exports.containsPlaceholder = containsPlaceholder;
121
+ /**
122
+ * Extract all placeholders from content (both {{}} and raw formats)
123
+ */
124
+ const extractPlaceholders = (content) => {
125
+ const placeholders = new Set();
126
+ // Match {{placeholder}} format
127
+ const bracketMatches = content.match(/\{\{([^}]+)\}\}/g);
128
+ if (bracketMatches) {
129
+ bracketMatches.forEach(match => {
130
+ placeholders.add(match.slice(2, -2));
131
+ });
132
+ }
133
+ return Array.from(placeholders);
134
+ };
135
+ exports.extractPlaceholders = extractPlaceholders;
136
+ /**
137
+ * Wrap text with XML preserve space attribute for proper whitespace handling
138
+ */
139
+ const wrapWithPreserveSpace = (text) => {
140
+ return `<w:t xml:space="preserve">${(0, exports.escapeForXml)(text)}</w:t>`;
141
+ };
142
+ exports.wrapWithPreserveSpace = wrapWithPreserveSpace;
143
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"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"}