@bendyline/squisq-formats 0.1.0 → 1.0.1

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 (110) hide show
  1. package/README.md +105 -0
  2. package/dist/__tests__/docxExport.test.d.ts +8 -0
  3. package/dist/__tests__/docxExport.test.d.ts.map +1 -0
  4. package/dist/__tests__/docxExport.test.js +383 -0
  5. package/dist/__tests__/docxExport.test.js.map +1 -0
  6. package/dist/__tests__/docxImport.test.d.ts +8 -0
  7. package/dist/__tests__/docxImport.test.d.ts.map +1 -0
  8. package/dist/__tests__/docxImport.test.js +309 -0
  9. package/dist/__tests__/docxImport.test.js.map +1 -0
  10. package/dist/__tests__/html.test.d.ts +8 -0
  11. package/dist/__tests__/html.test.d.ts.map +1 -0
  12. package/dist/__tests__/html.test.js +243 -0
  13. package/dist/__tests__/html.test.js.map +1 -0
  14. package/dist/__tests__/ooxml.test.d.ts +5 -0
  15. package/dist/__tests__/ooxml.test.d.ts.map +1 -0
  16. package/dist/__tests__/ooxml.test.js +152 -0
  17. package/dist/__tests__/ooxml.test.js.map +1 -0
  18. package/dist/__tests__/pdfExport.test.d.ts +8 -0
  19. package/dist/__tests__/pdfExport.test.d.ts.map +1 -0
  20. package/dist/__tests__/pdfExport.test.js +275 -0
  21. package/dist/__tests__/pdfExport.test.js.map +1 -0
  22. package/dist/__tests__/pdfImport.test.d.ts +11 -0
  23. package/dist/__tests__/pdfImport.test.d.ts.map +1 -0
  24. package/dist/__tests__/pdfImport.test.js +254 -0
  25. package/dist/__tests__/pdfImport.test.js.map +1 -0
  26. package/dist/__tests__/roundTrip.test.d.ts +7 -0
  27. package/dist/__tests__/roundTrip.test.d.ts.map +1 -0
  28. package/dist/__tests__/roundTrip.test.js +173 -0
  29. package/dist/__tests__/roundTrip.test.js.map +1 -0
  30. package/dist/docx/export.d.ts +54 -0
  31. package/dist/docx/export.d.ts.map +1 -0
  32. package/dist/docx/export.js +729 -0
  33. package/dist/docx/export.js.map +1 -0
  34. package/dist/docx/import.d.ts +52 -0
  35. package/dist/docx/import.d.ts.map +1 -0
  36. package/dist/docx/import.js +687 -0
  37. package/dist/docx/import.js.map +1 -0
  38. package/dist/docx/index.d.ts +15 -100
  39. package/dist/docx/index.d.ts.map +1 -0
  40. package/dist/docx/index.js +22 -13
  41. package/dist/docx/index.js.map +1 -1
  42. package/dist/docx/styles.d.ts +68 -0
  43. package/dist/docx/styles.d.ts.map +1 -0
  44. package/dist/docx/styles.js +125 -0
  45. package/dist/docx/styles.js.map +1 -0
  46. package/dist/html/htmlTemplate.d.ts +64 -0
  47. package/dist/html/htmlTemplate.d.ts.map +1 -0
  48. package/dist/html/htmlTemplate.js +235 -0
  49. package/dist/html/htmlTemplate.js.map +1 -0
  50. package/dist/html/imageUtils.d.ts +29 -0
  51. package/dist/html/imageUtils.d.ts.map +1 -0
  52. package/dist/html/imageUtils.js +63 -0
  53. package/dist/html/imageUtils.js.map +1 -0
  54. package/dist/html/index.d.ts +9 -77
  55. package/dist/html/index.d.ts.map +1 -0
  56. package/dist/html/index.js +137 -16
  57. package/dist/html/index.js.map +1 -1
  58. package/dist/index.d.ts +36 -7
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +35 -53
  61. package/dist/index.js.map +1 -1
  62. package/dist/ooxml/index.d.ts +14 -343
  63. package/dist/ooxml/index.d.ts.map +1 -0
  64. package/dist/ooxml/index.js +22 -98
  65. package/dist/ooxml/index.js.map +1 -1
  66. package/dist/ooxml/namespaces.d.ts +67 -0
  67. package/dist/ooxml/namespaces.d.ts.map +1 -0
  68. package/dist/ooxml/namespaces.js +94 -0
  69. package/dist/ooxml/namespaces.js.map +1 -0
  70. package/dist/ooxml/reader.d.ts +52 -0
  71. package/dist/ooxml/reader.d.ts.map +1 -0
  72. package/dist/ooxml/reader.js +190 -0
  73. package/dist/ooxml/reader.js.map +1 -0
  74. package/dist/ooxml/types.d.ts +82 -0
  75. package/dist/ooxml/types.d.ts.map +1 -0
  76. package/dist/ooxml/types.js +9 -0
  77. package/dist/ooxml/types.js.map +1 -0
  78. package/dist/ooxml/writer.d.ts +71 -0
  79. package/dist/ooxml/writer.d.ts.map +1 -0
  80. package/dist/ooxml/writer.js +200 -0
  81. package/dist/ooxml/writer.js.map +1 -0
  82. package/dist/ooxml/xmlUtils.d.ts +76 -0
  83. package/dist/ooxml/xmlUtils.d.ts.map +1 -0
  84. package/dist/ooxml/xmlUtils.js +108 -0
  85. package/dist/ooxml/xmlUtils.js.map +1 -0
  86. package/dist/pdf/export.d.ts +50 -0
  87. package/dist/pdf/export.d.ts.map +1 -0
  88. package/dist/pdf/export.js +740 -0
  89. package/dist/pdf/export.js.map +1 -0
  90. package/dist/pdf/import.d.ts +78 -0
  91. package/dist/pdf/import.d.ts.map +1 -0
  92. package/dist/pdf/import.js +619 -0
  93. package/dist/pdf/import.js.map +1 -0
  94. package/dist/pdf/index.d.ts +17 -121
  95. package/dist/pdf/index.d.ts.map +1 -0
  96. package/dist/pdf/index.js +25 -14
  97. package/dist/pdf/index.js.map +1 -1
  98. package/dist/pdf/styles.d.ts +142 -0
  99. package/dist/pdf/styles.d.ts.map +1 -0
  100. package/dist/pdf/styles.js +145 -0
  101. package/dist/pdf/styles.js.map +1 -0
  102. package/dist/pptx/index.d.ts +9 -12
  103. package/dist/pptx/index.d.ts.map +1 -0
  104. package/dist/pptx/index.js +44 -12
  105. package/dist/pptx/index.js.map +1 -1
  106. package/dist/xlsx/index.d.ts +9 -12
  107. package/dist/xlsx/index.d.ts.map +1 -0
  108. package/dist/xlsx/index.js +44 -12
  109. package/dist/xlsx/index.js.map +1 -1
  110. package/package.json +5 -6
@@ -0,0 +1,235 @@
1
+ /**
2
+ * HTML Template Generation for SquisqPlayer Exports
3
+ *
4
+ * Generates complete, self-contained HTML documents that load the SquisqPlayer
5
+ * IIFE bundle and render a Doc as either an interactive slideshow or a static
6
+ * scrollable document.
7
+ *
8
+ * Two variants:
9
+ * 1. **Inline** — All JS, CSS, and images are embedded in the HTML (single file).
10
+ * 2. **External** — JS is referenced via `<script src>`, images via relative paths.
11
+ */
12
+ import { arrayBufferToBase64DataUrl, inferMimeType } from './imageUtils.js';
13
+ // ── Image Path Collection ──────────────────────────────────────────
14
+ /**
15
+ * Collect all relative image paths referenced in a Doc's layers and template blocks.
16
+ * Returns a Set of unique relative paths that need to be resolved.
17
+ */
18
+ export function collectImagePaths(doc) {
19
+ const paths = new Set();
20
+ function addIfRelative(src) {
21
+ if (!src ||
22
+ src.startsWith('data:') ||
23
+ src.startsWith('blob:') ||
24
+ src.startsWith('http://') ||
25
+ src.startsWith('https://')) {
26
+ return;
27
+ }
28
+ paths.add(src);
29
+ }
30
+ function scanLayers(layers) {
31
+ if (!layers)
32
+ return;
33
+ for (const layer of layers) {
34
+ if (layer.type === 'image')
35
+ addIfRelative(layer.content.src);
36
+ if (layer.type === 'video') {
37
+ addIfRelative(layer.content.src);
38
+ addIfRelative(layer.content.posterSrc);
39
+ }
40
+ if (layer.type === 'map')
41
+ addIfRelative(layer.content.staticSrc);
42
+ }
43
+ }
44
+ function scanBlock(block) {
45
+ scanLayers(block.layers);
46
+ if (block.children)
47
+ block.children.forEach(scanBlock);
48
+ }
49
+ // Scan all blocks
50
+ doc.blocks.forEach(scanBlock);
51
+ // Scan start block hero
52
+ if (doc.startBlock?.heroSrc)
53
+ addIfRelative(doc.startBlock.heroSrc);
54
+ // Scan persistent layers
55
+ if (doc.persistentLayers) {
56
+ for (const pl of doc.persistentLayers.bottomLayers ?? []) {
57
+ if ('src' in pl && typeof pl.src === 'string')
58
+ addIfRelative(pl.src);
59
+ }
60
+ for (const pl of doc.persistentLayers.topLayers ?? []) {
61
+ if ('src' in pl && typeof pl.src === 'string')
62
+ addIfRelative(pl.src);
63
+ }
64
+ }
65
+ // Scan template block fields that reference images
66
+ for (const block of doc.blocks) {
67
+ scanTemplateImageFields(block, paths);
68
+ }
69
+ return paths;
70
+ }
71
+ /**
72
+ * Recursively scan any object for known image-bearing field names.
73
+ */
74
+ function scanTemplateImageFields(obj, paths) {
75
+ if (!obj || typeof obj !== 'object')
76
+ return;
77
+ const imageFieldNames = [
78
+ 'imageSrc',
79
+ 'src',
80
+ 'heroSrc',
81
+ 'backgroundImage',
82
+ 'posterSrc',
83
+ 'staticSrc',
84
+ 'videoSrc',
85
+ 'thumbnailSrc',
86
+ ];
87
+ for (const key of imageFieldNames) {
88
+ const val = obj[key];
89
+ if (typeof val === 'string' && val && !val.startsWith('data:') && !val.startsWith('http')) {
90
+ paths.add(val);
91
+ }
92
+ // Handle nested objects like { src: '...' }
93
+ if (val && typeof val === 'object' && !Array.isArray(val)) {
94
+ scanTemplateImageFields(val, paths);
95
+ }
96
+ }
97
+ // Handle arrays (e.g., images: [{ src: '...' }])
98
+ if (Array.isArray(obj)) {
99
+ for (const item of obj) {
100
+ if (item && typeof item === 'object') {
101
+ scanTemplateImageFields(item, paths);
102
+ }
103
+ }
104
+ }
105
+ // Recurse into known array/object fields
106
+ for (const key of ['images', 'accentImage', 'backgroundVideo', 'children', 'blocks']) {
107
+ const val = obj[key];
108
+ if (Array.isArray(val)) {
109
+ for (const item of val) {
110
+ if (item && typeof item === 'object') {
111
+ scanTemplateImageFields(item, paths);
112
+ }
113
+ }
114
+ }
115
+ else if (val && typeof val === 'object') {
116
+ scanTemplateImageFields(val, paths);
117
+ }
118
+ }
119
+ }
120
+ // ── HTML Generation ────────────────────────────────────────────────
121
+ /**
122
+ * Escape a string for safe embedding in a `<script>` tag.
123
+ * Prevents `</script>` from closing the tag prematurely.
124
+ */
125
+ function escapeForScript(str) {
126
+ return str.replace(/<\/(script)/gi, '<\\/$1');
127
+ }
128
+ /**
129
+ * Generate a complete inline HTML document with all JS and images embedded.
130
+ *
131
+ * @param doc - The Doc to render
132
+ * @param options - Export options
133
+ * @returns Complete HTML string
134
+ */
135
+ export function generateInlineHtml(doc, options) {
136
+ const { playerScript, images, mode = 'slideshow', title = 'Squisq Document', autoPlay = false, } = options;
137
+ // Build base64 image map
138
+ const imageMap = {};
139
+ if (images) {
140
+ for (const [path, buffer] of images.entries()) {
141
+ const mimeType = inferMimeType(path);
142
+ imageMap[path] = arrayBufferToBase64DataUrl(buffer, mimeType);
143
+ }
144
+ }
145
+ const docJson = escapeForScript(JSON.stringify(doc));
146
+ const imageMapJson = escapeForScript(JSON.stringify(imageMap));
147
+ return `<!DOCTYPE html>
148
+ <html lang="en">
149
+ <head>
150
+ <meta charset="UTF-8">
151
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
152
+ <title>${escapeHtml(title)}</title>
153
+ <style>
154
+ *,*::before,*::after{box-sizing:border-box}
155
+ html,body{margin:0;padding:0;height:100%;background:#1a1a2e;color:#e0e0e0;font-family:system-ui,-apple-system,sans-serif}
156
+ #squisq-root{width:100%;height:100%;display:flex;align-items:center;justify-content:center}
157
+ ${mode === 'static' ? '#squisq-root{align-items:flex-start;overflow-y:auto;background:#fff;color:#1f2937}' : ''}
158
+ </style>
159
+ </head>
160
+ <body>
161
+ <div id="squisq-root"></div>
162
+ <script>${escapeForScript(playerScript)}</script>
163
+ <script>
164
+ (function(){
165
+ var doc = JSON.parse(${JSON.stringify(docJson)});
166
+ var images = JSON.parse(${JSON.stringify(imageMapJson)});
167
+ SquisqPlayer.mount(document.getElementById("squisq-root"), doc, {
168
+ mode: ${JSON.stringify(mode)},
169
+ images: images,
170
+ autoPlay: ${JSON.stringify(autoPlay)},
171
+ basePath: "."
172
+ });
173
+ })();
174
+ </script>
175
+ </body>
176
+ </html>`;
177
+ }
178
+ /**
179
+ * Generate an HTML document that references external JS and image files.
180
+ * Used for ZIP exports where files sit alongside the HTML.
181
+ *
182
+ * @param doc - The Doc to render (image/audio paths should already be rewritten to relative)
183
+ * @param options - Export options (playerScript is not embedded, referenced via src)
184
+ * @returns Complete HTML string
185
+ */
186
+ export function generateExternalHtml(doc, options) {
187
+ const { playerScriptPath, imagePathMap, audioPathMap, mode = 'slideshow', title = 'Squisq Document', autoPlay = false, } = options;
188
+ const docJson = escapeForScript(JSON.stringify(doc));
189
+ const imageMapJson = imagePathMap ? escapeForScript(JSON.stringify(imagePathMap)) : '{}';
190
+ const audioMapJson = audioPathMap ? escapeForScript(JSON.stringify(audioPathMap)) : 'null';
191
+ return `<!DOCTYPE html>
192
+ <html lang="en">
193
+ <head>
194
+ <meta charset="UTF-8">
195
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
196
+ <title>${escapeHtml(title)}</title>
197
+ <style>
198
+ *,*::before,*::after{box-sizing:border-box}
199
+ html,body{margin:0;padding:0;height:100%;background:#1a1a2e;color:#e0e0e0;font-family:system-ui,-apple-system,sans-serif}
200
+ #squisq-root{width:100%;height:100%;display:flex;align-items:center;justify-content:center}
201
+ ${mode === 'static' ? '#squisq-root{align-items:flex-start;overflow-y:auto;background:#fff;color:#1f2937}' : ''}
202
+ </style>
203
+ </head>
204
+ <body>
205
+ <div id="squisq-root"></div>
206
+ <script src="${escapeHtml(playerScriptPath)}"></script>
207
+ <script>
208
+ (function(){
209
+ var doc = JSON.parse(${JSON.stringify(docJson)});
210
+ var images = JSON.parse(${JSON.stringify(imageMapJson)});
211
+ var audio = ${audioMapJson};
212
+ SquisqPlayer.mount(document.getElementById("squisq-root"), doc, {
213
+ mode: ${JSON.stringify(mode)},
214
+ images: images,
215
+ audio: audio,
216
+ autoPlay: ${JSON.stringify(autoPlay)},
217
+ basePath: "."
218
+ });
219
+ })();
220
+ </script>
221
+ </body>
222
+ </html>`;
223
+ }
224
+ /**
225
+ * Escape HTML special characters to prevent injection.
226
+ */
227
+ function escapeHtml(str) {
228
+ return str
229
+ .replace(/&/g, '&amp;')
230
+ .replace(/</g, '&lt;')
231
+ .replace(/>/g, '&gt;')
232
+ .replace(/"/g, '&quot;')
233
+ .replace(/'/g, '&#39;');
234
+ }
235
+ //# sourceMappingURL=htmlTemplate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"htmlTemplate.js","sourceRoot":"","sources":["../../src/html/htmlTemplate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAgC5E,sEAAsE;AAEtE;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAQ;IACxC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,SAAS,aAAa,CAAC,GAAuB;QAC5C,IACE,CAAC,GAAG;YACJ,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;YACvB,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;YACvB,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;YACzB,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAC1B,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,SAAS,UAAU,CAAC,MAA2B;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBAAE,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACjC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;gBAAE,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,SAAS,SAAS,CAAC,KAAY;QAC7B,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,KAAK,CAAC,QAAQ;YAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,kBAAkB;IAClB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE9B,wBAAwB;IACxB,IAAI,GAAG,CAAC,UAAU,EAAE,OAAO;QAAE,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAEnE,yBAAyB;IACzB,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;YACzD,IAAI,KAAK,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,GAAG,KAAK,QAAQ;gBAAE,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACvE,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;YACtD,IAAI,KAAK,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,GAAG,KAAK,QAAQ;gBAAE,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,uBAAuB,CAAC,KAA2C,EAAE,KAAK,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,GAA4B,EAAE,KAAkB;IAC/E,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO;IAE5C,MAAM,eAAe,GAAG;QACtB,UAAU;QACV,KAAK;QACL,SAAS;QACT,iBAAiB;QACjB,WAAW;QACX,WAAW;QACX,UAAU;QACV,cAAc;KACf,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1F,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;QACD,4CAA4C;QAC5C,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1D,uBAAuB,CAAC,GAA8B,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;YACvB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,uBAAuB,CAAC,IAA+B,EAAE,KAAK,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;QACrF,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;gBACvB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACrC,uBAAuB,CAAC,IAA+B,EAAE,KAAK,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC1C,uBAAuB,CAAC,GAA8B,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED,sEAAsE;AAEtE;;;GAGG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAQ,EAAE,OAA0B;IACrE,MAAM,EACJ,YAAY,EACZ,MAAM,EACN,IAAI,GAAG,WAAW,EAClB,KAAK,GAAG,iBAAiB,EACzB,QAAQ,GAAG,KAAK,GACjB,GAAG,OAAO,CAAC;IAEZ,yBAAyB;IACzB,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACrC,QAAQ,CAAC,IAAI,CAAC,GAAG,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE/D,OAAO;;;;;SAKA,UAAU,CAAC,KAAK,CAAC;;;;;EAKxB,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,oFAAoF,CAAC,CAAC,CAAC,EAAE;;;;;UAKrG,eAAe,CAAC,YAAY,CAAC;;;yBAGd,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;4BACpB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;;YAE5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;gBAEhB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;;;;;;QAMhC,CAAC;AACT,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAQ,EACR,OAOC;IAED,MAAM,EACJ,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,IAAI,GAAG,WAAW,EAClB,KAAK,GAAG,iBAAiB,EACzB,QAAQ,GAAG,KAAK,GACjB,GAAG,OAAO,CAAC;IAEZ,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzF,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE3F,OAAO;;;;;SAKA,UAAU,CAAC,KAAK,CAAC;;;;;EAKxB,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,oFAAoF,CAAC,CAAC,CAAC,EAAE;;;;;eAKhG,UAAU,CAAC,gBAAgB,CAAC;;;yBAGlB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;4BACpB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;gBACxC,YAAY;;YAEhB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;;gBAGhB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;;;;;;QAMhC,CAAC;AACT,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Image Utilities for HTML Export
3
+ *
4
+ * Browser-compatible helpers for converting image data to base64 data URIs
5
+ * and inferring MIME types from filenames.
6
+ */
7
+ /**
8
+ * Infer a MIME type from a filename's extension.
9
+ * Returns 'application/octet-stream' for unknown types.
10
+ */
11
+ export declare function inferMimeType(filename: string): string;
12
+ /**
13
+ * Convert an ArrayBuffer to a base64-encoded data URI string.
14
+ *
15
+ * @param buffer - The binary image data
16
+ * @param mimeType - MIME type (e.g., 'image/jpeg'). If not provided, defaults to
17
+ * 'application/octet-stream'.
18
+ * @returns A `data:` URI string
19
+ */
20
+ export declare function arrayBufferToBase64DataUrl(buffer: ArrayBuffer, mimeType: string): string;
21
+ /**
22
+ * Extract the filename from a path or URL (strips directory and query).
23
+ *
24
+ * @example
25
+ * extractFilename('images/hero.jpg') // 'hero.jpg'
26
+ * extractFilename('https://example.com/photo.png?v=2') // 'photo.png'
27
+ */
28
+ export declare function extractFilename(path: string): string;
29
+ //# sourceMappingURL=imageUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageUtils.d.ts","sourceRoot":"","sources":["../../src/html/imageUtils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQxF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpD"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Image Utilities for HTML Export
3
+ *
4
+ * Browser-compatible helpers for converting image data to base64 data URIs
5
+ * and inferring MIME types from filenames.
6
+ */
7
+ /** Map of file extensions to MIME types */
8
+ const MIME_MAP = {
9
+ jpg: 'image/jpeg',
10
+ jpeg: 'image/jpeg',
11
+ png: 'image/png',
12
+ gif: 'image/gif',
13
+ webp: 'image/webp',
14
+ svg: 'image/svg+xml',
15
+ ico: 'image/x-icon',
16
+ bmp: 'image/bmp',
17
+ avif: 'image/avif',
18
+ mp3: 'audio/mpeg',
19
+ wav: 'audio/wav',
20
+ ogg: 'audio/ogg',
21
+ mp4: 'video/mp4',
22
+ webm: 'video/webm',
23
+ };
24
+ /**
25
+ * Infer a MIME type from a filename's extension.
26
+ * Returns 'application/octet-stream' for unknown types.
27
+ */
28
+ export function inferMimeType(filename) {
29
+ const ext = filename.split('.').pop()?.toLowerCase() ?? '';
30
+ return MIME_MAP[ext] ?? 'application/octet-stream';
31
+ }
32
+ /**
33
+ * Convert an ArrayBuffer to a base64-encoded data URI string.
34
+ *
35
+ * @param buffer - The binary image data
36
+ * @param mimeType - MIME type (e.g., 'image/jpeg'). If not provided, defaults to
37
+ * 'application/octet-stream'.
38
+ * @returns A `data:` URI string
39
+ */
40
+ export function arrayBufferToBase64DataUrl(buffer, mimeType) {
41
+ const bytes = new Uint8Array(buffer);
42
+ let binary = '';
43
+ for (let i = 0; i < bytes.length; i++) {
44
+ binary += String.fromCharCode(bytes[i]);
45
+ }
46
+ const base64 = btoa(binary);
47
+ return `data:${mimeType};base64,${base64}`;
48
+ }
49
+ /**
50
+ * Extract the filename from a path or URL (strips directory and query).
51
+ *
52
+ * @example
53
+ * extractFilename('images/hero.jpg') // 'hero.jpg'
54
+ * extractFilename('https://example.com/photo.png?v=2') // 'photo.png'
55
+ */
56
+ export function extractFilename(path) {
57
+ // Strip query/hash
58
+ const clean = path.split('?')[0].split('#')[0];
59
+ // Get last segment
60
+ const parts = clean.split('/');
61
+ return parts[parts.length - 1] || path;
62
+ }
63
+ //# sourceMappingURL=imageUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageUtils.js","sourceRoot":"","sources":["../../src/html/imageUtils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,2CAA2C;AAC3C,MAAM,QAAQ,GAA2B;IACvC,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC3D,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;AACrD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAmB,EAAE,QAAgB;IAC9E,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,QAAQ,QAAQ,WAAW,MAAM,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,mBAAmB;IACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,mBAAmB;IACnB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AACzC,CAAC"}
@@ -1,74 +1,3 @@
1
- import { Doc } from '@bendyline/squisq/schemas';
2
-
3
- /**
4
- * HTML Template Generation for SquisqPlayer Exports
5
- *
6
- * Generates complete, self-contained HTML documents that load the SquisqPlayer
7
- * IIFE bundle and render a Doc as either an interactive slideshow or a static
8
- * scrollable document.
9
- *
10
- * Two variants:
11
- * 1. **Inline** — All JS, CSS, and images are embedded in the HTML (single file).
12
- * 2. **External** — JS is referenced via `<script src>`, images via relative paths.
13
- */
14
-
15
- interface HtmlExportOptions {
16
- /** The IIFE player bundle source code (from @bendyline/squisq-react/standalone-source) */
17
- playerScript: string;
18
- /**
19
- * Map of relative image paths (as they appear in the Doc) to binary image data.
20
- * For inline HTML export, these are converted to base64 data URIs.
21
- * For ZIP export, these are written as separate files.
22
- */
23
- images?: Map<string, ArrayBuffer>;
24
- /**
25
- * Map of audio segment identifiers to binary audio data.
26
- * Keys should match the audio segment `name` or `url` fields in the Doc.
27
- * Only used in ZIP exports — single HTML uses timer-based playback.
28
- */
29
- audio?: Map<string, ArrayBuffer>;
30
- /** Rendering mode: 'slideshow' (interactive, default) or 'static' (scrollable) */
31
- mode?: 'slideshow' | 'static';
32
- /** HTML page title (default: 'Squisq Document') */
33
- title?: string;
34
- /** Auto-play slideshow on load (default: false) */
35
- autoPlay?: boolean;
36
- }
37
- /**
38
- * Collect all relative image paths referenced in a Doc's layers and template blocks.
39
- * Returns a Set of unique relative paths that need to be resolved.
40
- */
41
- declare function collectImagePaths(doc: Doc): Set<string>;
42
-
43
- /**
44
- * Image Utilities for HTML Export
45
- *
46
- * Browser-compatible helpers for converting image data to base64 data URIs
47
- * and inferring MIME types from filenames.
48
- */
49
- /**
50
- * Infer a MIME type from a filename's extension.
51
- * Returns 'application/octet-stream' for unknown types.
52
- */
53
- declare function inferMimeType(filename: string): string;
54
- /**
55
- * Convert an ArrayBuffer to a base64-encoded data URI string.
56
- *
57
- * @param buffer - The binary image data
58
- * @param mimeType - MIME type (e.g., 'image/jpeg'). If not provided, defaults to
59
- * 'application/octet-stream'.
60
- * @returns A `data:` URI string
61
- */
62
- declare function arrayBufferToBase64DataUrl(buffer: ArrayBuffer, mimeType: string): string;
63
- /**
64
- * Extract the filename from a path or URL (strips directory and query).
65
- *
66
- * @example
67
- * extractFilename('images/hero.jpg') // 'hero.jpg'
68
- * extractFilename('https://example.com/photo.png?v=2') // 'photo.png'
69
- */
70
- declare function extractFilename(path: string): string;
71
-
72
1
  /**
73
2
  * HTML Export Module — @bendyline/squisq-formats/html
74
3
  *
@@ -99,8 +28,10 @@ declare function extractFilename(path: string): string;
99
28
  * const zipBlob = await docToHtmlZip(doc, { playerScript: PLAYER_BUNDLE, images, audio });
100
29
  * ```
101
30
  */
102
-
103
- interface HtmlZipExportOptions extends HtmlExportOptions {
31
+ import type { Doc } from '@bendyline/squisq/schemas';
32
+ import { type HtmlExportOptions } from './htmlTemplate.js';
33
+ export type { HtmlExportOptions };
34
+ export interface HtmlZipExportOptions extends HtmlExportOptions {
104
35
  /**
105
36
  * Map of audio segment identifiers to binary audio data.
106
37
  * Keys should match the audio segment `name` or `url` fields in the Doc.
@@ -129,7 +60,7 @@ interface HtmlZipExportOptions extends HtmlExportOptions {
129
60
  * const blob = new Blob([html], { type: 'text/html' });
130
61
  * ```
131
62
  */
132
- declare function docToHtml(doc: Doc, options: HtmlExportOptions): string;
63
+ export declare function docToHtml(doc: Doc, options: HtmlExportOptions): string;
133
64
  /**
134
65
  * Export a Doc as a ZIP archive containing HTML, JS, images, and optionally audio.
135
66
  *
@@ -161,6 +92,7 @@ declare function docToHtml(doc: Doc, options: HtmlExportOptions): string;
161
92
  * const url = URL.createObjectURL(blob);
162
93
  * ```
163
94
  */
164
- declare function docToHtmlZip(doc: Doc, options: HtmlZipExportOptions): Promise<Blob>;
165
-
166
- export { type HtmlExportOptions, type HtmlZipExportOptions, arrayBufferToBase64DataUrl, collectImagePaths, docToHtml, docToHtmlZip, extractFilename, inferMimeType };
95
+ export declare function docToHtmlZip(doc: Doc, options: HtmlZipExportOptions): Promise<Blob>;
96
+ export { collectImagePaths } from './htmlTemplate.js';
97
+ export { inferMimeType, arrayBufferToBase64DataUrl, extractFilename } from './imageUtils.js';
98
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/html/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAK3B,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D;;;;OAIG;IACH,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CAClC;AAID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAEtE;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDzF;AAID,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,17 +1,138 @@
1
- import {
2
- arrayBufferToBase64DataUrl,
3
- collectImagePaths,
4
- docToHtml,
5
- docToHtmlZip,
6
- extractFilename,
7
- inferMimeType
8
- } from "../chunk-ULLIPBEJ.js";
9
- export {
10
- arrayBufferToBase64DataUrl,
11
- collectImagePaths,
12
- docToHtml,
13
- docToHtmlZip,
14
- extractFilename,
15
- inferMimeType
16
- };
1
+ /**
2
+ * HTML Export Module — @bendyline/squisq-formats/html
3
+ *
4
+ * Exports squisq documents as self-contained HTML files or ZIP archives.
5
+ *
6
+ * Two export modes:
7
+ *
8
+ * 1. **Single HTML** (`docToHtml`) — Everything embedded in one file:
9
+ * - SquisqPlayer IIFE bundle inlined in `<script>`
10
+ * - Images base64-encoded as data URIs
11
+ * - Timer-based playback (no audio — too large for inline)
12
+ *
13
+ * 2. **ZIP Archive** (`docToHtmlZip`) — Multi-file package:
14
+ * - `index.html` referencing external `squisq-player.js`
15
+ * - `squisq-player.js` — the IIFE bundle
16
+ * - `images/` — extracted image files
17
+ * - `audio/` — optional audio segment files (enables full playback)
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * import { PLAYER_BUNDLE } from '@bendyline/squisq-react/standalone-source';
22
+ * import { docToHtml, docToHtmlZip } from '@bendyline/squisq-formats/html';
23
+ *
24
+ * // Single HTML file
25
+ * const html = docToHtml(doc, { playerScript: PLAYER_BUNDLE, images });
26
+ *
27
+ * // ZIP archive
28
+ * const zipBlob = await docToHtmlZip(doc, { playerScript: PLAYER_BUNDLE, images, audio });
29
+ * ```
30
+ */
31
+ import JSZip from 'jszip';
32
+ import { generateInlineHtml, generateExternalHtml, } from './htmlTemplate.js';
33
+ import { extractFilename } from './imageUtils.js';
34
+ // ── Single HTML Export ─────────────────────────────────────────────
35
+ /**
36
+ * Export a Doc as a single, self-contained HTML file.
37
+ *
38
+ * The player JS is embedded inline, images are base64-encoded as data URIs,
39
+ * and playback uses a timer (no audio) for compact file size.
40
+ *
41
+ * @param doc - The Doc to export
42
+ * @param options - Export options (must include `playerScript`)
43
+ * @returns Complete HTML document as a string
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * const html = docToHtml(myDoc, {
48
+ * playerScript: PLAYER_BUNDLE,
49
+ * images: imageMap,
50
+ * title: 'My Document',
51
+ * mode: 'slideshow',
52
+ * });
53
+ * const blob = new Blob([html], { type: 'text/html' });
54
+ * ```
55
+ */
56
+ export function docToHtml(doc, options) {
57
+ return generateInlineHtml(doc, options);
58
+ }
59
+ // ── ZIP Archive Export ─────────────────────────────────────────────
60
+ /**
61
+ * Export a Doc as a ZIP archive containing HTML, JS, images, and optionally audio.
62
+ *
63
+ * The archive structure:
64
+ * ```
65
+ * document.zip
66
+ * ├── index.html # HTML page referencing squisq-player.js
67
+ * ├── squisq-player.js # Standalone IIFE bundle
68
+ * ├── images/ # Extracted image files
69
+ * │ ├── hero.jpg
70
+ * │ └── ...
71
+ * └── audio/ # Optional audio segment files
72
+ * ├── intro.mp3
73
+ * └── ...
74
+ * ```
75
+ *
76
+ * @param doc - The Doc to export
77
+ * @param options - Export options (must include `playerScript`)
78
+ * @returns A Promise resolving to a ZIP Blob
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * const blob = await docToHtmlZip(myDoc, {
83
+ * playerScript: PLAYER_BUNDLE,
84
+ * images: imageMap,
85
+ * audio: audioMap,
86
+ * });
87
+ * // Trigger browser download
88
+ * const url = URL.createObjectURL(blob);
89
+ * ```
90
+ */
91
+ export async function docToHtmlZip(doc, options) {
92
+ const { playerScript, images, audio, mode = 'slideshow', title, autoPlay } = options;
93
+ const zip = new JSZip();
94
+ // 1. Add player JS as a separate file
95
+ zip.file('squisq-player.js', playerScript);
96
+ // 2. Add images to images/ folder and build path mapping
97
+ const imagePathMap = {};
98
+ if (images) {
99
+ for (const [originalPath, buffer] of images.entries()) {
100
+ const filename = extractFilename(originalPath);
101
+ const zipPath = `images/${filename}`;
102
+ zip.file(zipPath, buffer);
103
+ imagePathMap[originalPath] = zipPath;
104
+ }
105
+ }
106
+ // 3. Add audio to audio/ folder and build path mapping
107
+ const audioPathMap = {};
108
+ if (audio) {
109
+ for (const [segmentKey, buffer] of audio.entries()) {
110
+ const filename = extractFilename(segmentKey);
111
+ // Ensure .mp3 extension
112
+ const finalName = filename.includes('.') ? filename : `${filename}.mp3`;
113
+ const zipPath = `audio/${finalName}`;
114
+ zip.file(zipPath, buffer);
115
+ audioPathMap[segmentKey] = zipPath;
116
+ }
117
+ }
118
+ // 4. Generate HTML that references external files
119
+ const html = generateExternalHtml(doc, {
120
+ playerScriptPath: 'squisq-player.js',
121
+ imagePathMap: Object.keys(imagePathMap).length > 0 ? imagePathMap : undefined,
122
+ audioPathMap: Object.keys(audioPathMap).length > 0 ? audioPathMap : undefined,
123
+ mode,
124
+ title,
125
+ autoPlay,
126
+ });
127
+ zip.file('index.html', html);
128
+ // 5. Generate ZIP blob
129
+ return zip.generateAsync({
130
+ type: 'blob',
131
+ compression: 'DEFLATE',
132
+ compressionOptions: { level: 6 },
133
+ });
134
+ }
135
+ // ── Re-exports ─────────────────────────────────────────────────────
136
+ export { collectImagePaths } from './htmlTemplate.js';
137
+ export { inferMimeType, arrayBufferToBase64DataUrl, extractFilename } from './imageUtils.js';
17
138
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/html/index.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,36 @@
1
- export { DocxExportOptions, DocxImportOptions, docToDocx, docxToDoc, docxToMarkdownDoc, markdownDocToDocx } from './docx/index.js';
2
- export { PptxExportOptions, PptxImportOptions, docToPptx, markdownDocToPptx, pptxToDoc, pptxToMarkdownDoc } from './pptx/index.js';
3
- export { XlsxExportOptions, XlsxImportOptions, docToXlsx, markdownDocToXlsx, xlsxToDoc, xlsxToMarkdownDoc } from './xlsx/index.js';
4
- export { PdfExportOptions, PdfImportOptions, configurePdfWorker, docToPdf, markdownDocToPdf, pdfToDoc, pdfToMarkdownDoc } from './pdf/index.js';
5
- export { HtmlExportOptions, HtmlZipExportOptions, collectImagePaths, docToHtml, docToHtmlZip } from './html/index.js';
6
- import '@bendyline/squisq/schemas';
7
- import '@bendyline/squisq/markdown';
1
+ /**
2
+ * @bendyline/squisq-formats
3
+ *
4
+ * Format converters for squisq documents. Converts between squisq's
5
+ * MarkdownDocument / Doc and various file formats via Office Open XML.
6
+ *
7
+ * Supported formats:
8
+ * - **DOCX** — Microsoft Word (import + export) ✅
9
+ * - **PDF** — Portable Document Format (import + export) ✅
10
+ * - **PPTX** — Microsoft PowerPoint (planned)
11
+ * - **XLSX** — Microsoft Excel (planned)
12
+ *
13
+ * All converters run in the browser — no server or native binaries required.
14
+ * The shared `ooxml/` subpath export provides reusable OOXML infrastructure.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * // Import from root
19
+ * import { markdownDocToDocx, docxToMarkdownDoc } from '@bendyline/squisq-formats';
20
+ *
21
+ * // Or import from subpath
22
+ * import { markdownDocToDocx } from '@bendyline/squisq-formats/docx';
23
+ * import { createPackage } from '@bendyline/squisq-formats/ooxml';
24
+ * ```
25
+ */
26
+ export { markdownDocToDocx, docToDocx, docxToMarkdownDoc, docxToDoc } from './docx/index.js';
27
+ export type { DocxExportOptions, DocxImportOptions } from './docx/index.js';
28
+ export { markdownDocToPptx, docToPptx, pptxToMarkdownDoc, pptxToDoc } from './pptx/index.js';
29
+ export type { PptxExportOptions, PptxImportOptions } from './pptx/index.js';
30
+ export { markdownDocToXlsx, docToXlsx, xlsxToMarkdownDoc, xlsxToDoc } from './xlsx/index.js';
31
+ export type { XlsxExportOptions, XlsxImportOptions } from './xlsx/index.js';
32
+ export { markdownDocToPdf, docToPdf, pdfToMarkdownDoc, pdfToDoc, configurePdfWorker, } from './pdf/index.js';
33
+ export type { PdfExportOptions, PdfImportOptions } from './pdf/index.js';
34
+ export { docToHtml, docToHtmlZip, collectImagePaths } from './html/index.js';
35
+ export type { HtmlExportOptions, HtmlZipExportOptions } from './html/index.js';
36
+ //# sourceMappingURL=index.d.ts.map