docgen-utils 1.0.12 → 1.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle.js +3221 -1225
- package/dist/bundle.min.js +100 -98
- package/dist/cli.js +26687 -1208
- package/dist/packages/cli/commands/export-docs.d.ts +10 -1
- package/dist/packages/cli/commands/export-docs.d.ts.map +1 -1
- package/dist/packages/cli/commands/export-docs.js +352 -5
- package/dist/packages/cli/commands/export-docs.js.map +1 -1
- package/dist/packages/cli/commands/export-slides.d.ts +1 -1
- package/dist/packages/cli/commands/export-slides.d.ts.map +1 -1
- package/dist/packages/cli/commands/export-slides.js +89 -8
- package/dist/packages/cli/commands/export-slides.js.map +1 -1
- package/dist/packages/cli/commands/import-docx.d.ts +1 -1
- package/dist/packages/cli/commands/import-docx.d.ts.map +1 -1
- package/dist/packages/cli/commands/import-docx.js +3 -3
- package/dist/packages/cli/commands/import-docx.js.map +1 -1
- package/dist/packages/cli/commands/import-pptx.d.ts +1 -1
- package/dist/packages/cli/commands/import-pptx.d.ts.map +1 -1
- package/dist/packages/cli/commands/import-pptx.js +2 -2
- package/dist/packages/cli/commands/import-pptx.js.map +1 -1
- package/dist/packages/cli/index.js +14 -8
- package/dist/packages/cli/index.js.map +1 -1
- package/dist/packages/docs/common.d.ts +10 -0
- package/dist/packages/docs/common.d.ts.map +1 -1
- package/dist/packages/docs/common.js.map +1 -1
- package/dist/packages/docs/convert.d.ts.map +1 -1
- package/dist/packages/docs/convert.js +246 -218
- package/dist/packages/docs/convert.js.map +1 -1
- package/dist/packages/docs/create-document.d.ts.map +1 -1
- package/dist/packages/docs/create-document.js +43 -3
- package/dist/packages/docs/create-document.js.map +1 -1
- package/dist/packages/docs/export.d.ts +9 -8
- package/dist/packages/docs/export.d.ts.map +1 -1
- package/dist/packages/docs/export.js +23 -36
- package/dist/packages/docs/export.js.map +1 -1
- package/dist/packages/docs/parse-colors.d.ts +37 -0
- package/dist/packages/docs/parse-colors.d.ts.map +1 -0
- package/dist/packages/docs/parse-colors.js +507 -0
- package/dist/packages/docs/parse-colors.js.map +1 -0
- package/dist/packages/docs/parse-css.d.ts +98 -0
- package/dist/packages/docs/parse-css.d.ts.map +1 -0
- package/dist/packages/docs/parse-css.js +1592 -0
- package/dist/packages/docs/parse-css.js.map +1 -0
- package/dist/packages/docs/parse-helpers.d.ts +45 -0
- package/dist/packages/docs/parse-helpers.d.ts.map +1 -0
- package/dist/packages/docs/parse-helpers.js +220 -0
- package/dist/packages/docs/parse-helpers.js.map +1 -0
- package/dist/packages/docs/parse-inline.d.ts +41 -0
- package/dist/packages/docs/parse-inline.d.ts.map +1 -0
- package/dist/packages/docs/parse-inline.js +473 -0
- package/dist/packages/docs/parse-inline.js.map +1 -0
- package/dist/packages/docs/parse-layout.d.ts +57 -0
- package/dist/packages/docs/parse-layout.d.ts.map +1 -0
- package/dist/packages/docs/parse-layout.js +295 -0
- package/dist/packages/docs/parse-layout.js.map +1 -0
- package/dist/packages/docs/parse-special.d.ts +51 -0
- package/dist/packages/docs/parse-special.d.ts.map +1 -0
- package/dist/packages/docs/parse-special.js +251 -0
- package/dist/packages/docs/parse-special.js.map +1 -0
- package/dist/packages/docs/parse-units.d.ts +68 -0
- package/dist/packages/docs/parse-units.d.ts.map +1 -0
- package/dist/packages/docs/parse-units.js +275 -0
- package/dist/packages/docs/parse-units.js.map +1 -0
- package/dist/packages/docs/parse.d.ts.map +1 -1
- package/dist/packages/docs/parse.js +957 -2800
- package/dist/packages/docs/parse.js.map +1 -1
- package/dist/packages/slides/common.d.ts +7 -0
- package/dist/packages/slides/common.d.ts.map +1 -1
- package/dist/packages/slides/convert.d.ts.map +1 -1
- package/dist/packages/slides/convert.js +92 -7
- package/dist/packages/slides/convert.js.map +1 -1
- package/dist/packages/slides/createPresentation.d.ts.map +1 -1
- package/dist/packages/slides/createPresentation.js +20 -0
- package/dist/packages/slides/createPresentation.js.map +1 -1
- package/dist/packages/slides/parse.d.ts.map +1 -1
- package/dist/packages/slides/parse.js +723 -40
- package/dist/packages/slides/parse.js.map +1 -1
- package/dist/packages/slides/transform.d.ts.map +1 -1
- package/dist/packages/slides/transform.js +57 -7
- package/dist/packages/slides/transform.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Export docs command - converts HTML to DOCX
|
|
3
|
+
*
|
|
4
|
+
* Handles images in a general way:
|
|
5
|
+
* - External <img> tags: fetched via HTTP and embedded
|
|
6
|
+
* - SVG charts: rendered to PNG using Playwright's browser canvas
|
|
7
|
+
* - Data URLs: passed through directly
|
|
3
8
|
*/
|
|
4
|
-
export
|
|
9
|
+
export interface ExportDocsOptions {
|
|
10
|
+
name?: string;
|
|
11
|
+
pageless?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function exportDocs(filePath: string, outDir: string, options?: ExportDocsOptions): Promise<void>;
|
|
5
14
|
//# sourceMappingURL=export-docs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-docs.d.ts","sourceRoot":"","sources":["../../../../packages/cli/commands/export-docs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"export-docs.d.ts","sourceRoot":"","sources":["../../../../packages/cli/commands/export-docs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmZH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCjH"}
|
|
@@ -1,10 +1,345 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Export docs command - converts HTML to DOCX
|
|
3
|
+
*
|
|
4
|
+
* Handles images in a general way:
|
|
5
|
+
* - External <img> tags: fetched via HTTP and embedded
|
|
6
|
+
* - SVG charts: rendered to PNG using Playwright's browser canvas
|
|
7
|
+
* - Data URLs: passed through directly
|
|
3
8
|
*/
|
|
4
9
|
import * as fs from "node:fs";
|
|
5
10
|
import * as path from "node:path";
|
|
11
|
+
import { chromium } from "playwright";
|
|
6
12
|
import { createDocxBuffer } from "../../docs/create-document";
|
|
7
|
-
|
|
13
|
+
import { parseHtmlContent } from "../../docs/parse";
|
|
14
|
+
/**
|
|
15
|
+
* Recursively find all image elements from parsed elements.
|
|
16
|
+
* Searches top-level elements and also nested structures like blockquotes and two-column layouts.
|
|
17
|
+
*/
|
|
18
|
+
function findAllImageElements(elements) {
|
|
19
|
+
const images = [];
|
|
20
|
+
for (const el of elements) {
|
|
21
|
+
if (el.type === "image") {
|
|
22
|
+
images.push(el);
|
|
23
|
+
}
|
|
24
|
+
// Recursively search blockquote/callout content
|
|
25
|
+
if (el.type === "blockquote" && el.content) {
|
|
26
|
+
images.push(...findAllImageElements(el.content));
|
|
27
|
+
}
|
|
28
|
+
// Recursively search two-column-layout content
|
|
29
|
+
if (el.type === "two-column-layout") {
|
|
30
|
+
images.push(...findAllImageElements(el.sidebar.content));
|
|
31
|
+
images.push(...findAllImageElements(el.main.content));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return images;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Fetch external images from parsed elements and convert to image data.
|
|
38
|
+
* Uses Node.js native fetch API to download images.
|
|
39
|
+
* Returns a Map of image src URL to ChartImageData.
|
|
40
|
+
*/
|
|
41
|
+
async function fetchExternalImages(elements) {
|
|
42
|
+
const imageMap = new Map();
|
|
43
|
+
// Find all image elements (including nested ones)
|
|
44
|
+
const imageElements = findAllImageElements(elements);
|
|
45
|
+
// Filter to only external HTTP/HTTPS images (skip data URLs)
|
|
46
|
+
const externalImages = imageElements.filter((el) => el.src.startsWith("http://") || el.src.startsWith("https://"));
|
|
47
|
+
if (externalImages.length === 0) {
|
|
48
|
+
return imageMap;
|
|
49
|
+
}
|
|
50
|
+
console.log(`Fetching ${externalImages.length} external image(s)...`);
|
|
51
|
+
// Maximum content width in DOCX (6.5 inches at 96 DPI = 624 pixels, but we use 468 for some margin)
|
|
52
|
+
const maxWidth = 468;
|
|
53
|
+
for (const imgEl of externalImages) {
|
|
54
|
+
try {
|
|
55
|
+
const src = imgEl.src;
|
|
56
|
+
// Fetch the image
|
|
57
|
+
const response = await fetch(src, {
|
|
58
|
+
headers: {
|
|
59
|
+
// Some servers require a User-Agent
|
|
60
|
+
"User-Agent": "Mozilla/5.0 (compatible; DocxExporter/1.0)",
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
console.warn(`Failed to fetch image: ${src} (${response.status})`);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
68
|
+
const data = Buffer.from(arrayBuffer);
|
|
69
|
+
// Determine image dimensions
|
|
70
|
+
// For now, use a reasonable default size that fits the document
|
|
71
|
+
// The actual image will be scaled by the DOCX renderer
|
|
72
|
+
let width = imgEl.width || 468;
|
|
73
|
+
let height = imgEl.height || 300;
|
|
74
|
+
// Try to get actual dimensions from the image data
|
|
75
|
+
const dimensions = getImageDimensions(data);
|
|
76
|
+
if (dimensions) {
|
|
77
|
+
width = dimensions.width;
|
|
78
|
+
height = dimensions.height;
|
|
79
|
+
}
|
|
80
|
+
// Scale to fit within document width
|
|
81
|
+
if (width > maxWidth) {
|
|
82
|
+
const scale = maxWidth / width;
|
|
83
|
+
height = Math.round(height * scale);
|
|
84
|
+
width = maxWidth;
|
|
85
|
+
}
|
|
86
|
+
imageMap.set(src, { data, width, height });
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
console.warn(`Error fetching image ${imgEl.src}:`, err);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return imageMap;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Extract image dimensions from binary data.
|
|
97
|
+
* Supports PNG, JPEG, GIF, and WebP formats.
|
|
98
|
+
*/
|
|
99
|
+
function getImageDimensions(data) {
|
|
100
|
+
// PNG: Check for PNG signature and read IHDR chunk
|
|
101
|
+
if (data[0] === 0x89 && data[1] === 0x50 && data[2] === 0x4E && data[3] === 0x47) {
|
|
102
|
+
// PNG signature found, IHDR chunk starts at byte 8
|
|
103
|
+
// Width is at bytes 16-19, Height at bytes 20-23 (big-endian)
|
|
104
|
+
const width = data.readUInt32BE(16);
|
|
105
|
+
const height = data.readUInt32BE(20);
|
|
106
|
+
return { width, height };
|
|
107
|
+
}
|
|
108
|
+
// JPEG: Look for SOF0 marker (0xFF 0xC0) or SOF2 (0xFF 0xC2)
|
|
109
|
+
if (data[0] === 0xFF && data[1] === 0xD8) {
|
|
110
|
+
let offset = 2;
|
|
111
|
+
while (offset < data.length - 8) {
|
|
112
|
+
if (data[offset] !== 0xFF) {
|
|
113
|
+
offset++;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const marker = data[offset + 1];
|
|
117
|
+
// SOF0, SOF1, SOF2 markers contain dimensions
|
|
118
|
+
if (marker >= 0xC0 && marker <= 0xC2) {
|
|
119
|
+
const height = data.readUInt16BE(offset + 5);
|
|
120
|
+
const width = data.readUInt16BE(offset + 7);
|
|
121
|
+
return { width, height };
|
|
122
|
+
}
|
|
123
|
+
// Skip to next marker
|
|
124
|
+
const length = data.readUInt16BE(offset + 2);
|
|
125
|
+
offset += 2 + length;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// GIF: Check for GIF87a or GIF89a signature
|
|
129
|
+
if (data[0] === 0x47 && data[1] === 0x49 && data[2] === 0x46) {
|
|
130
|
+
const width = data.readUInt16LE(6);
|
|
131
|
+
const height = data.readUInt16LE(8);
|
|
132
|
+
return { width, height };
|
|
133
|
+
}
|
|
134
|
+
// WebP: Check for RIFF....WEBP signature
|
|
135
|
+
if (data[0] === 0x52 && data[1] === 0x49 && data[2] === 0x46 && data[3] === 0x46 &&
|
|
136
|
+
data[8] === 0x57 && data[9] === 0x45 && data[10] === 0x42 && data[11] === 0x50) {
|
|
137
|
+
// VP8 format (lossy)
|
|
138
|
+
if (data[12] === 0x56 && data[13] === 0x50 && data[14] === 0x38 && data[15] === 0x20) {
|
|
139
|
+
const width = data.readUInt16LE(26) & 0x3FFF;
|
|
140
|
+
const height = data.readUInt16LE(28) & 0x3FFF;
|
|
141
|
+
return { width, height };
|
|
142
|
+
}
|
|
143
|
+
// VP8L format (lossless)
|
|
144
|
+
if (data[12] === 0x56 && data[13] === 0x50 && data[14] === 0x38 && data[15] === 0x4C) {
|
|
145
|
+
const bits = data.readUInt32LE(21);
|
|
146
|
+
const width = (bits & 0x3FFF) + 1;
|
|
147
|
+
const height = ((bits >> 14) & 0x3FFF) + 1;
|
|
148
|
+
return { width, height };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Render SVG chart elements to PNG images using Playwright browser canvas.
|
|
155
|
+
* This allows Node.js CLI to render SVGs the same way the browser export does.
|
|
156
|
+
*/
|
|
157
|
+
async function renderSvgChartsWithPlaywright(elements) {
|
|
158
|
+
const chartImages = new Map();
|
|
159
|
+
// Find all svg-chart elements
|
|
160
|
+
const svgCharts = elements.filter((el) => el.type === "svg-chart");
|
|
161
|
+
if (svgCharts.length === 0) {
|
|
162
|
+
return chartImages;
|
|
163
|
+
}
|
|
164
|
+
// Launch browser
|
|
165
|
+
const launchOptions = { headless: true };
|
|
166
|
+
const proxyServer = process.env.HTTPS_PROXY || process.env.HTTP_PROXY;
|
|
167
|
+
if (proxyServer) {
|
|
168
|
+
launchOptions.proxy = { server: proxyServer };
|
|
169
|
+
}
|
|
170
|
+
const browser = await chromium.launch(launchOptions);
|
|
171
|
+
try {
|
|
172
|
+
const context = await browser.newContext({
|
|
173
|
+
bypassCSP: true,
|
|
174
|
+
viewport: { width: 1280, height: 800 },
|
|
175
|
+
});
|
|
176
|
+
const page = await context.newPage();
|
|
177
|
+
// Process each SVG chart
|
|
178
|
+
let svgIndex = 0;
|
|
179
|
+
for (const chart of svgCharts) {
|
|
180
|
+
try {
|
|
181
|
+
const imageData = await renderSvgInBrowser(page, chart.svgContent, chart.width, chart.height, chart.backgroundColor);
|
|
182
|
+
if (imageData) {
|
|
183
|
+
chartImages.set(`svg-chart-${svgIndex}`, imageData);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
console.warn(`Failed to render SVG chart ${svgIndex}:`, err);
|
|
188
|
+
}
|
|
189
|
+
svgIndex++;
|
|
190
|
+
}
|
|
191
|
+
await page.close();
|
|
192
|
+
await context.close();
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
await browser.close();
|
|
196
|
+
}
|
|
197
|
+
return chartImages;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Render a single SVG to PNG in the browser using Canvas.
|
|
201
|
+
*/
|
|
202
|
+
async function renderSvgInBrowser(page, svgContent, width, height, backgroundColor) {
|
|
203
|
+
// Create HTML page with the SVG rendering logic
|
|
204
|
+
const renderPage = `<!DOCTYPE html>
|
|
205
|
+
<html>
|
|
206
|
+
<head>
|
|
207
|
+
<style>
|
|
208
|
+
body { margin: 0; padding: 0; }
|
|
209
|
+
#svg-container { display: inline-block; }
|
|
210
|
+
</style>
|
|
211
|
+
</head>
|
|
212
|
+
<body>
|
|
213
|
+
<div id="svg-container"></div>
|
|
214
|
+
<canvas id="canvas"></canvas>
|
|
215
|
+
<script>
|
|
216
|
+
window.renderSvgToPng = async function(svgContent, width, height, backgroundColor) {
|
|
217
|
+
// Parse SVG to get dimensions if not provided
|
|
218
|
+
const parser = new DOMParser();
|
|
219
|
+
const svgDoc = parser.parseFromString(svgContent, "image/svg+xml");
|
|
220
|
+
const svgElement = svgDoc.querySelector("svg");
|
|
221
|
+
|
|
222
|
+
if (!svgElement) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Get dimensions from SVG
|
|
227
|
+
let svgWidth = width;
|
|
228
|
+
let svgHeight = height;
|
|
229
|
+
|
|
230
|
+
if (!svgWidth || !svgHeight) {
|
|
231
|
+
const viewBox = svgElement.getAttribute("viewBox");
|
|
232
|
+
if (viewBox) {
|
|
233
|
+
const parts = viewBox.split(/\\s+/).map(Number);
|
|
234
|
+
if (parts.length >= 4) {
|
|
235
|
+
svgWidth = svgWidth || parts[2];
|
|
236
|
+
svgHeight = svgHeight || parts[3];
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (!svgWidth) {
|
|
240
|
+
const widthAttr = svgElement.getAttribute("width");
|
|
241
|
+
if (widthAttr && !widthAttr.includes("%")) {
|
|
242
|
+
svgWidth = parseFloat(widthAttr);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (!svgHeight) {
|
|
246
|
+
const heightAttr = svgElement.getAttribute("height");
|
|
247
|
+
if (heightAttr && !heightAttr.includes("%")) {
|
|
248
|
+
svgHeight = parseFloat(heightAttr);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Default dimensions if still not found
|
|
254
|
+
svgWidth = svgWidth || 624;
|
|
255
|
+
svgHeight = svgHeight || 468;
|
|
256
|
+
|
|
257
|
+
// Ensure SVG has explicit dimensions
|
|
258
|
+
svgElement.setAttribute("width", String(svgWidth));
|
|
259
|
+
svgElement.setAttribute("height", String(svgHeight));
|
|
260
|
+
|
|
261
|
+
// Ensure SVG has proper XML namespace
|
|
262
|
+
if (!svgElement.getAttribute("xmlns")) {
|
|
263
|
+
svgElement.setAttribute("xmlns", "http://www.w3.org/2000/svg");
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Serialize the modified SVG
|
|
267
|
+
const serializer = new XMLSerializer();
|
|
268
|
+
const svgString = serializer.serializeToString(svgElement);
|
|
269
|
+
|
|
270
|
+
// Create a blob URL for the SVG
|
|
271
|
+
const svgBlob = new Blob([svgString], { type: "image/svg+xml;charset=utf-8" });
|
|
272
|
+
const svgUrl = URL.createObjectURL(svgBlob);
|
|
273
|
+
|
|
274
|
+
try {
|
|
275
|
+
// Create an image from the SVG
|
|
276
|
+
const img = new Image();
|
|
277
|
+
await new Promise((resolve, reject) => {
|
|
278
|
+
img.onload = resolve;
|
|
279
|
+
img.onerror = reject;
|
|
280
|
+
img.src = svgUrl;
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
// Create canvas
|
|
284
|
+
const scale = window.devicePixelRatio || 1;
|
|
285
|
+
const canvas = document.getElementById("canvas");
|
|
286
|
+
canvas.width = svgWidth * scale;
|
|
287
|
+
canvas.height = svgHeight * scale;
|
|
288
|
+
|
|
289
|
+
const ctx = canvas.getContext("2d");
|
|
290
|
+
if (!ctx) return null;
|
|
291
|
+
|
|
292
|
+
// Fill with background color
|
|
293
|
+
ctx.fillStyle = backgroundColor ? "#" + backgroundColor : "white";
|
|
294
|
+
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
295
|
+
|
|
296
|
+
// Scale for device pixel ratio
|
|
297
|
+
ctx.scale(scale, scale);
|
|
298
|
+
|
|
299
|
+
// Draw the SVG
|
|
300
|
+
ctx.drawImage(img, 0, 0, svgWidth, svgHeight);
|
|
301
|
+
|
|
302
|
+
// Convert to PNG data URL
|
|
303
|
+
const dataUrl = canvas.toDataURL("image/png");
|
|
304
|
+
|
|
305
|
+
// Scale dimensions to fit within DOCX content width
|
|
306
|
+
const maxWidth = 624;
|
|
307
|
+
const aspectRatio = svgHeight / svgWidth;
|
|
308
|
+
const finalWidth = Math.min(svgWidth, maxWidth);
|
|
309
|
+
const finalHeight = finalWidth * aspectRatio;
|
|
310
|
+
|
|
311
|
+
return {
|
|
312
|
+
dataUrl,
|
|
313
|
+
width: Math.round(finalWidth),
|
|
314
|
+
height: Math.round(finalHeight),
|
|
315
|
+
};
|
|
316
|
+
} finally {
|
|
317
|
+
URL.revokeObjectURL(svgUrl);
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
</script>
|
|
321
|
+
</body>
|
|
322
|
+
</html>`;
|
|
323
|
+
await page.setContent(renderPage, { waitUntil: "domcontentloaded" });
|
|
324
|
+
// Call the rendering function in the browser
|
|
325
|
+
const result = await page.evaluate(async ({ svgContent, width, height, backgroundColor }) => {
|
|
326
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
327
|
+
return window.renderSvgToPng(svgContent, width, height, backgroundColor);
|
|
328
|
+
}, { svgContent, width, height, backgroundColor });
|
|
329
|
+
if (!result || !result.dataUrl) {
|
|
330
|
+
return null;
|
|
331
|
+
}
|
|
332
|
+
// Convert data URL to Buffer
|
|
333
|
+
const base64Data = result.dataUrl.replace(/^data:image\/png;base64,/, "");
|
|
334
|
+
const data = Buffer.from(base64Data, "base64");
|
|
335
|
+
return {
|
|
336
|
+
data,
|
|
337
|
+
width: result.width,
|
|
338
|
+
height: result.height,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
export async function exportDocs(filePath, outDir, options = {}) {
|
|
342
|
+
const { name: outputName, pageless } = options;
|
|
8
343
|
const absolutePath = path.resolve(filePath);
|
|
9
344
|
if (!fs.existsSync(absolutePath)) {
|
|
10
345
|
throw new Error(`File not found: ${absolutePath}`);
|
|
@@ -12,10 +347,22 @@ export async function exportDocs(filePath, outDir) {
|
|
|
12
347
|
console.log(`Exporting to DOCX: ${filePath}`);
|
|
13
348
|
// Read the HTML file
|
|
14
349
|
const html = fs.readFileSync(absolutePath, "utf-8");
|
|
15
|
-
// Get filename for title
|
|
16
|
-
const baseName = path.basename(filePath, ".html");
|
|
17
|
-
//
|
|
18
|
-
const
|
|
350
|
+
// Get filename for title - use provided name or derive from input file
|
|
351
|
+
const baseName = outputName || path.basename(filePath, ".html");
|
|
352
|
+
// Parse HTML to get elements
|
|
353
|
+
const elements = parseHtmlContent(html);
|
|
354
|
+
// Fetch external images (for <img> tags with HTTP URLs)
|
|
355
|
+
const imageMap = await fetchExternalImages(elements);
|
|
356
|
+
// Render SVG charts to PNG using Playwright browser canvas
|
|
357
|
+
const chartImages = await renderSvgChartsWithPlaywright(elements);
|
|
358
|
+
// Create DOCX buffer with pre-parsed elements, external images, and rendered charts
|
|
359
|
+
const buffer = await createDocxBuffer(html, {
|
|
360
|
+
title: baseName,
|
|
361
|
+
elements,
|
|
362
|
+
imageMap: imageMap.size > 0 ? imageMap : undefined,
|
|
363
|
+
chartImages: chartImages.size > 0 ? chartImages : undefined,
|
|
364
|
+
pageless,
|
|
365
|
+
});
|
|
19
366
|
// Write output
|
|
20
367
|
const outputPath = path.join(outDir, `${baseName}.docx`);
|
|
21
368
|
fs.writeFileSync(outputPath, buffer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-docs.js","sourceRoot":"","sources":["../../../../packages/cli/commands/export-docs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"export-docs.js","sourceRoot":"","sources":["../../../../packages/cli/commands/export-docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Export slides command - converts HTML slides to PPTX using Playwright
|
|
3
3
|
*/
|
|
4
|
-
export declare function exportSlides(filePaths: string[], outDir: string): Promise<void>;
|
|
4
|
+
export declare function exportSlides(filePaths: string[], outDir: string, outputName?: string): Promise<void>;
|
|
5
5
|
//# sourceMappingURL=export-slides.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-slides.d.ts","sourceRoot":"","sources":["../../../../packages/cli/commands/export-slides.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"export-slides.d.ts","sourceRoot":"","sources":["../../../../packages/cli/commands/export-slides.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwFH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuH1G"}
|
|
@@ -7,7 +7,73 @@ import { fileURLToPath } from "node:url";
|
|
|
7
7
|
import { chromium } from "playwright";
|
|
8
8
|
const __filename = fileURLToPath(import.meta.url);
|
|
9
9
|
const __dirname = path.dirname(__filename);
|
|
10
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Create a fetch function that respects HTTP_PROXY/HTTPS_PROXY environment variables.
|
|
12
|
+
* Uses undici's ProxyAgent for proxy support.
|
|
13
|
+
*/
|
|
14
|
+
async function fetchWithProxy(url) {
|
|
15
|
+
const proxyUrl = process.env.HTTPS_PROXY || process.env.HTTP_PROXY ||
|
|
16
|
+
process.env.https_proxy || process.env.http_proxy;
|
|
17
|
+
if (proxyUrl) {
|
|
18
|
+
// Use undici directly for proxy support
|
|
19
|
+
const undici = await import('undici');
|
|
20
|
+
const agent = new undici.ProxyAgent(proxyUrl);
|
|
21
|
+
const response = await undici.fetch(url, {
|
|
22
|
+
dispatcher: agent,
|
|
23
|
+
headers: {
|
|
24
|
+
'User-Agent': 'Mozilla/5.0 (compatible; DocGen/1.0)',
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
return response;
|
|
28
|
+
}
|
|
29
|
+
return fetch(url, {
|
|
30
|
+
headers: {
|
|
31
|
+
'User-Agent': 'Mozilla/5.0 (compatible; DocGen/1.0)',
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Pre-fetch external images and convert them to data URIs.
|
|
37
|
+
* This bypasses CORS restrictions by fetching images in Node.js
|
|
38
|
+
* before passing HTML to the browser context.
|
|
39
|
+
*/
|
|
40
|
+
async function embedExternalImages(html) {
|
|
41
|
+
// Find all external image URLs in src attributes
|
|
42
|
+
const imgRegex = /<img\s+([^>]*?)src="(https?:\/\/[^"]+)"([^>]*)>/gi;
|
|
43
|
+
const matches = [...html.matchAll(imgRegex)];
|
|
44
|
+
if (matches.length === 0) {
|
|
45
|
+
return html;
|
|
46
|
+
}
|
|
47
|
+
// Collect unique URLs
|
|
48
|
+
const urls = new Set();
|
|
49
|
+
for (const match of matches) {
|
|
50
|
+
urls.add(match[2]);
|
|
51
|
+
}
|
|
52
|
+
// Fetch all images in parallel
|
|
53
|
+
const urlToDataUri = new Map();
|
|
54
|
+
await Promise.all(Array.from(urls).map(async (url) => {
|
|
55
|
+
try {
|
|
56
|
+
const response = await fetchWithProxy(url);
|
|
57
|
+
if (response.ok) {
|
|
58
|
+
const buffer = await response.arrayBuffer();
|
|
59
|
+
const contentType = response.headers.get('content-type') || 'image/jpeg';
|
|
60
|
+
const base64 = Buffer.from(buffer).toString('base64');
|
|
61
|
+
const dataUri = `data:${contentType};base64,${base64}`;
|
|
62
|
+
urlToDataUri.set(url, dataUri);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Failed to fetch - image will be skipped during conversion
|
|
67
|
+
console.warn(`Failed to fetch image: ${url}`);
|
|
68
|
+
}
|
|
69
|
+
}));
|
|
70
|
+
// Replace URLs with data URIs
|
|
71
|
+
for (const [url, dataUri] of urlToDataUri) {
|
|
72
|
+
html = html.split(url).join(dataUri);
|
|
73
|
+
}
|
|
74
|
+
return html;
|
|
75
|
+
}
|
|
76
|
+
export async function exportSlides(filePaths, outDir, outputName) {
|
|
11
77
|
if (filePaths.length === 0) {
|
|
12
78
|
throw new Error("No input files provided");
|
|
13
79
|
}
|
|
@@ -22,21 +88,36 @@ export async function exportSlides(filePaths, outDir) {
|
|
|
22
88
|
}
|
|
23
89
|
console.log(`Exporting ${absolutePaths.length} slide(s) to PPTX`);
|
|
24
90
|
// Read the bundle.js which contains all the PPTX generation code
|
|
25
|
-
|
|
91
|
+
let bundlePath = path.resolve(__dirname, "bundle.min.js");
|
|
92
|
+
if (!fs.existsSync(bundlePath)) {
|
|
93
|
+
bundlePath = path.resolve(__dirname, "..", "..", "..", "dist/bundle.min.js");
|
|
94
|
+
}
|
|
26
95
|
if (!fs.existsSync(bundlePath)) {
|
|
27
96
|
throw new Error(`Bundle not found: ${bundlePath}. Run 'npm run build' first.`);
|
|
28
97
|
}
|
|
29
98
|
const bundleCode = fs.readFileSync(bundlePath, "utf-8");
|
|
30
99
|
// Launch browser
|
|
31
|
-
const
|
|
100
|
+
const launchOptions = { headless: true };
|
|
101
|
+
const proxyServer = process.env.HTTPS_PROXY || process.env.HTTP_PROXY;
|
|
102
|
+
if (proxyServer) {
|
|
103
|
+
launchOptions.proxy = { server: proxyServer };
|
|
104
|
+
}
|
|
105
|
+
const browser = await chromium.launch(launchOptions);
|
|
32
106
|
try {
|
|
33
107
|
const context = await browser.newContext({
|
|
34
108
|
bypassCSP: true,
|
|
35
109
|
viewport: { width: 960, height: 540 },
|
|
110
|
+
ignoreHTTPSErrors: true,
|
|
36
111
|
});
|
|
37
112
|
const page = await context.newPage();
|
|
38
|
-
// Read all HTML files
|
|
39
|
-
|
|
113
|
+
// Read all HTML files and embed external images as data URIs
|
|
114
|
+
// This bypasses CORS restrictions by fetching images in Node.js
|
|
115
|
+
const htmlContents = [];
|
|
116
|
+
for (const p of absolutePaths) {
|
|
117
|
+
let html = fs.readFileSync(p, "utf-8");
|
|
118
|
+
html = await embedExternalImages(html);
|
|
119
|
+
htmlContents.push(html);
|
|
120
|
+
}
|
|
40
121
|
// Create a minimal HTML page with the bundle injected
|
|
41
122
|
const pageHtml = `<!DOCTYPE html>
|
|
42
123
|
<html>
|
|
@@ -70,10 +151,10 @@ export async function exportSlides(filePaths, outDir) {
|
|
|
70
151
|
}, { htmlContents });
|
|
71
152
|
await page.close();
|
|
72
153
|
await context.close();
|
|
73
|
-
// Determine output filename
|
|
154
|
+
// Determine output filename - use provided name, or derive from input file(s)
|
|
74
155
|
const firstBaseName = path.basename(absolutePaths[0], ".html");
|
|
75
|
-
const
|
|
76
|
-
const outputPath = path.join(outDir, `${
|
|
156
|
+
const finalName = outputName || (absolutePaths.length === 1 ? firstBaseName : "presentation");
|
|
157
|
+
const outputPath = path.join(outDir, `${finalName}.pptx`);
|
|
77
158
|
// Convert base64 to buffer and write to file
|
|
78
159
|
const buffer = Buffer.from(pptxBuffer, "base64");
|
|
79
160
|
fs.writeFileSync(outputPath, buffer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-slides.js","sourceRoot":"","sources":["../../../../packages/cli/commands/export-slides.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"export-slides.js","sourceRoot":"","sources":["../../../../packages/cli/commands/export-slides.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Import DOCX command - converts a DOCX file to HTML
|
|
3
3
|
*/
|
|
4
|
-
export declare function importDocx(filePath: string, outDir: string): Promise<void>;
|
|
4
|
+
export declare function importDocx(filePath: string, outDir: string, outputName?: string): Promise<void>;
|
|
5
5
|
//# sourceMappingURL=import-docx.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-docx.d.ts","sourceRoot":"","sources":["../../../../packages/cli/commands/import-docx.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"import-docx.d.ts","sourceRoot":"","sources":["../../../../packages/cli/commands/import-docx.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BrG"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import * as fs from "node:fs";
|
|
5
5
|
import * as path from "node:path";
|
|
6
6
|
import importDocxFn from "../../docs/import-docx";
|
|
7
|
-
export async function importDocx(filePath, outDir) {
|
|
7
|
+
export async function importDocx(filePath, outDir, outputName) {
|
|
8
8
|
const absolutePath = path.resolve(filePath);
|
|
9
9
|
if (!fs.existsSync(absolutePath)) {
|
|
10
10
|
throw new Error(`File not found: ${absolutePath}`);
|
|
@@ -18,8 +18,8 @@ export async function importDocx(filePath, outDir) {
|
|
|
18
18
|
if (!html) {
|
|
19
19
|
throw new Error("DOCX file produced no HTML content");
|
|
20
20
|
}
|
|
21
|
-
// Write output
|
|
22
|
-
const baseName = path.basename(filePath, ".docx");
|
|
21
|
+
// Write output - use provided name or derive from input file
|
|
22
|
+
const baseName = outputName || path.basename(filePath, ".docx");
|
|
23
23
|
const outputPath = path.join(outDir, `${baseName}.html`);
|
|
24
24
|
fs.writeFileSync(outputPath, html);
|
|
25
25
|
console.log(`Output: ${outputPath}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-docx.js","sourceRoot":"","sources":["../../../../packages/cli/commands/import-docx.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,YAAY,MAAM,wBAAwB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,MAAc;
|
|
1
|
+
{"version":3,"file":"import-docx.js","sourceRoot":"","sources":["../../../../packages/cli/commands/import-docx.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,YAAY,MAAM,wBAAwB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,MAAc,EAAE,UAAmB;IACpF,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IAE3C,oCAAoC;IACpC,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CACzC,UAAU,CAAC,UAAU,EACrB,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAC9C,CAAC;IAEF,kBAAkB;IAClB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAE7C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;IACzD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Import PPTX command - converts a PPTX file to HTML (one file per slide)
|
|
3
3
|
*/
|
|
4
|
-
export declare function importPptx(filePath: string, outDir: string): Promise<void>;
|
|
4
|
+
export declare function importPptx(filePath: string, outDir: string, outputName?: string): Promise<void>;
|
|
5
5
|
//# sourceMappingURL=import-pptx.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-pptx.d.ts","sourceRoot":"","sources":["../../../../packages/cli/commands/import-pptx.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"import-pptx.d.ts","sourceRoot":"","sources":["../../../../packages/cli/commands/import-pptx.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDrG"}
|