@bendyline/docblocks-react 2.0.0 → 2.1.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 (310) hide show
  1. package/README.md +18 -3
  2. package/dist/ExportDialog-VYATD5UC.js +9 -0
  3. package/dist/{ExportToolbarControls-D2YDWOXW.js → ExportToolbarControls-5HUE3LSX.js} +206 -42
  4. package/dist/{GitToolbarControl-LMIR4R7I.js → GitToolbarControl-FW3BZFXV.js} +62 -44
  5. package/dist/{GitUI-KGF5MSNV.js → GitUI-GMH3PAYL.js} +225 -141
  6. package/dist/{LazyEditorShell-EF2BWRXU.js → LazyEditorShell-RF54B5UD.js} +0 -1
  7. package/dist/ShareDialog-PAMOQQFB.js +212 -0
  8. package/dist/chunk-3CZ27FOA.js +359 -0
  9. package/dist/chunk-3QSZY74C.js +255 -0
  10. package/{src/Export/export-destination.ts → dist/chunk-BI7NVU6T.js} +16 -15
  11. package/dist/{chunk-VHDP4IPL.js → chunk-BPGEBGAN.js} +0 -1
  12. package/dist/{chunk-DD4VFJQI.js → chunk-EBWYGTN7.js} +2 -1
  13. package/dist/{chunk-ZI56BNB7.js → chunk-GHQ4X7KM.js} +27 -7
  14. package/dist/{chunk-5A4KEWKT.js → chunk-HFYPTTCH.js} +0 -1
  15. package/dist/chunk-LG6HAWCK.js +109 -0
  16. package/dist/chunk-TFMO7EVO.js +88 -0
  17. package/dist/{chunk-4XXSWN3T.js → chunk-YBEYTVU2.js} +0 -1
  18. package/dist/editor.d.ts +5 -4
  19. package/dist/editor.js +8 -70
  20. package/dist/export/index.d.ts +24 -8
  21. package/dist/export/index.js +10 -6
  22. package/dist/index.d.ts +355 -21
  23. package/dist/index.js +6419 -21
  24. package/dist/run-export-Z5BVFLIR.js +9 -0
  25. package/dist/settings/index.d.ts +9 -1
  26. package/dist/settings/index.js +6 -5
  27. package/package.json +18 -13
  28. package/src/styles/docblocks.css +985 -35
  29. package/dist/AppMenu/AppMenu.d.ts +0 -53
  30. package/dist/AppMenu/AppMenu.d.ts.map +0 -1
  31. package/dist/AppMenu/AppMenu.js +0 -67
  32. package/dist/AppMenu/AppMenu.js.map +0 -1
  33. package/dist/AppMenu/index.d.ts +0 -3
  34. package/dist/AppMenu/index.d.ts.map +0 -1
  35. package/dist/AppMenu/index.js +0 -2
  36. package/dist/AppMenu/index.js.map +0 -1
  37. package/dist/DocBlocksShell/DocBlocksShell.d.ts +0 -49
  38. package/dist/DocBlocksShell/DocBlocksShell.d.ts.map +0 -1
  39. package/dist/DocBlocksShell/DocBlocksShell.js +0 -2730
  40. package/dist/DocBlocksShell/DocBlocksShell.js.map +0 -1
  41. package/dist/DocBlocksShell/LazyEditorShell.d.ts +0 -3
  42. package/dist/DocBlocksShell/LazyEditorShell.d.ts.map +0 -1
  43. package/dist/DocBlocksShell/LazyEditorShell.js +0 -3
  44. package/dist/DocBlocksShell/LazyEditorShell.js.map +0 -1
  45. package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts +0 -13
  46. package/dist/DocBlocksShell/UpdateAvailableNotice.d.ts.map +0 -1
  47. package/dist/DocBlocksShell/UpdateAvailableNotice.js +0 -16
  48. package/dist/DocBlocksShell/UpdateAvailableNotice.js.map +0 -1
  49. package/dist/DocBlocksShell/document-title.d.ts +0 -3
  50. package/dist/DocBlocksShell/document-title.d.ts.map +0 -1
  51. package/dist/DocBlocksShell/document-title.js +0 -17
  52. package/dist/DocBlocksShell/document-title.js.map +0 -1
  53. package/dist/DocBlocksShell/index.d.ts +0 -3
  54. package/dist/DocBlocksShell/index.d.ts.map +0 -1
  55. package/dist/DocBlocksShell/index.js +0 -2
  56. package/dist/DocBlocksShell/index.js.map +0 -1
  57. package/dist/DocBlocksShell/workspace-authority-barrier.d.ts +0 -14
  58. package/dist/DocBlocksShell/workspace-authority-barrier.d.ts.map +0 -1
  59. package/dist/DocBlocksShell/workspace-authority-barrier.js +0 -23
  60. package/dist/DocBlocksShell/workspace-authority-barrier.js.map +0 -1
  61. package/dist/Export/DeferredExportToolbarControls.d.ts +0 -5
  62. package/dist/Export/DeferredExportToolbarControls.d.ts.map +0 -1
  63. package/dist/Export/DeferredExportToolbarControls.js +0 -10
  64. package/dist/Export/DeferredExportToolbarControls.js.map +0 -1
  65. package/dist/Export/ExportDialog.d.ts +0 -25
  66. package/dist/Export/ExportDialog.d.ts.map +0 -1
  67. package/dist/Export/ExportDialog.js +0 -160
  68. package/dist/Export/ExportDialog.js.map +0 -1
  69. package/dist/Export/ExportToolbarControls.d.ts +0 -37
  70. package/dist/Export/ExportToolbarControls.d.ts.map +0 -1
  71. package/dist/Export/ExportToolbarControls.js +0 -285
  72. package/dist/Export/ExportToolbarControls.js.map +0 -1
  73. package/dist/Export/export-destination.d.ts +0 -3
  74. package/dist/Export/export-destination.d.ts.map +0 -1
  75. package/dist/Export/export-destination.js +0 -32
  76. package/dist/Export/export-destination.js.map +0 -1
  77. package/dist/Export/export-options.d.ts +0 -53
  78. package/dist/Export/export-options.d.ts.map +0 -1
  79. package/dist/Export/export-options.js +0 -49
  80. package/dist/Export/export-options.js.map +0 -1
  81. package/dist/Export/index.d.ts +0 -10
  82. package/dist/Export/index.d.ts.map +0 -1
  83. package/dist/Export/index.js +0 -6
  84. package/dist/Export/index.js.map +0 -1
  85. package/dist/Export/public-api.d.ts +0 -12
  86. package/dist/Export/public-api.d.ts.map +0 -1
  87. package/dist/Export/public-api.js +0 -9
  88. package/dist/Export/public-api.js.map +0 -1
  89. package/dist/Export/run-export.d.ts +0 -10
  90. package/dist/Export/run-export.d.ts.map +0 -1
  91. package/dist/Export/run-export.js +0 -313
  92. package/dist/Export/run-export.js.map +0 -1
  93. package/dist/Export/transform-summaries.d.ts +0 -7
  94. package/dist/Export/transform-summaries.d.ts.map +0 -1
  95. package/dist/Export/transform-summaries.js +0 -6
  96. package/dist/Export/transform-summaries.js.map +0 -1
  97. package/dist/ExportDialog-MEUISWZX.js +0 -9
  98. package/dist/ExportDialog-MEUISWZX.js.map +0 -1
  99. package/dist/ExportToolbarControls-D2YDWOXW.js.map +0 -1
  100. package/dist/FileExplorer/FileExplorer.d.ts +0 -43
  101. package/dist/FileExplorer/FileExplorer.d.ts.map +0 -1
  102. package/dist/FileExplorer/FileExplorer.js +0 -315
  103. package/dist/FileExplorer/FileExplorer.js.map +0 -1
  104. package/dist/FileExplorer/FileTreeNode.d.ts +0 -39
  105. package/dist/FileExplorer/FileTreeNode.d.ts.map +0 -1
  106. package/dist/FileExplorer/FileTreeNode.js +0 -131
  107. package/dist/FileExplorer/FileTreeNode.js.map +0 -1
  108. package/dist/FileExplorer/index.d.ts +0 -6
  109. package/dist/FileExplorer/index.d.ts.map +0 -1
  110. package/dist/FileExplorer/index.js +0 -4
  111. package/dist/FileExplorer/index.js.map +0 -1
  112. package/dist/FileExplorer/useFileTree.d.ts +0 -37
  113. package/dist/FileExplorer/useFileTree.d.ts.map +0 -1
  114. package/dist/FileExplorer/useFileTree.js +0 -284
  115. package/dist/FileExplorer/useFileTree.js.map +0 -1
  116. package/dist/Git/GitAuthGuidanceDialog.d.ts +0 -18
  117. package/dist/Git/GitAuthGuidanceDialog.d.ts.map +0 -1
  118. package/dist/Git/GitAuthGuidanceDialog.js +0 -27
  119. package/dist/Git/GitAuthGuidanceDialog.js.map +0 -1
  120. package/dist/Git/GitBranchesDialog.d.ts +0 -13
  121. package/dist/Git/GitBranchesDialog.d.ts.map +0 -1
  122. package/dist/Git/GitBranchesDialog.js +0 -59
  123. package/dist/Git/GitBranchesDialog.js.map +0 -1
  124. package/dist/Git/GitCloneDialog.d.ts +0 -14
  125. package/dist/Git/GitCloneDialog.d.ts.map +0 -1
  126. package/dist/Git/GitCloneDialog.js +0 -79
  127. package/dist/Git/GitCloneDialog.js.map +0 -1
  128. package/dist/Git/GitCommitDialog.d.ts +0 -12
  129. package/dist/Git/GitCommitDialog.d.ts.map +0 -1
  130. package/dist/Git/GitCommitDialog.js +0 -38
  131. package/dist/Git/GitCommitDialog.js.map +0 -1
  132. package/dist/Git/GitConflictsDialog.d.ts +0 -12
  133. package/dist/Git/GitConflictsDialog.d.ts.map +0 -1
  134. package/dist/Git/GitConflictsDialog.js +0 -17
  135. package/dist/Git/GitConflictsDialog.js.map +0 -1
  136. package/dist/Git/GitContext.d.ts +0 -89
  137. package/dist/Git/GitContext.d.ts.map +0 -1
  138. package/dist/Git/GitContext.js +0 -15
  139. package/dist/Git/GitContext.js.map +0 -1
  140. package/dist/Git/GitDiffDialog.d.ts +0 -20
  141. package/dist/Git/GitDiffDialog.d.ts.map +0 -1
  142. package/dist/Git/GitDiffDialog.js +0 -100
  143. package/dist/Git/GitDiffDialog.js.map +0 -1
  144. package/dist/Git/GitDiffView.d.ts +0 -23
  145. package/dist/Git/GitDiffView.d.ts.map +0 -1
  146. package/dist/Git/GitDiffView.js +0 -77
  147. package/dist/Git/GitDiffView.js.map +0 -1
  148. package/dist/Git/GitHistoryDialog.d.ts +0 -15
  149. package/dist/Git/GitHistoryDialog.d.ts.map +0 -1
  150. package/dist/Git/GitHistoryDialog.js +0 -107
  151. package/dist/Git/GitHistoryDialog.js.map +0 -1
  152. package/dist/Git/GitStatusBar.d.ts +0 -8
  153. package/dist/Git/GitStatusBar.d.ts.map +0 -1
  154. package/dist/Git/GitStatusBar.js +0 -49
  155. package/dist/Git/GitStatusBar.js.map +0 -1
  156. package/dist/Git/GitToolbarControl.d.ts +0 -15
  157. package/dist/Git/GitToolbarControl.d.ts.map +0 -1
  158. package/dist/Git/GitToolbarControl.js +0 -51
  159. package/dist/Git/GitToolbarControl.js.map +0 -1
  160. package/dist/Git/GitUI.d.ts +0 -14
  161. package/dist/Git/GitUI.d.ts.map +0 -1
  162. package/dist/Git/GitUI.js +0 -21
  163. package/dist/Git/GitUI.js.map +0 -1
  164. package/dist/Git/commit-selection.d.ts +0 -22
  165. package/dist/Git/commit-selection.d.ts.map +0 -1
  166. package/dist/Git/commit-selection.js +0 -47
  167. package/dist/Git/commit-selection.js.map +0 -1
  168. package/dist/Git/git-clone-utils.d.ts +0 -8
  169. package/dist/Git/git-clone-utils.d.ts.map +0 -1
  170. package/dist/Git/git-clone-utils.js +0 -26
  171. package/dist/Git/git-clone-utils.js.map +0 -1
  172. package/dist/Git/git-status.d.ts +0 -24
  173. package/dist/Git/git-status.d.ts.map +0 -1
  174. package/dist/Git/git-status.js +0 -105
  175. package/dist/Git/git-status.js.map +0 -1
  176. package/dist/Git/useGit.d.ts +0 -15
  177. package/dist/Git/useGit.d.ts.map +0 -1
  178. package/dist/Git/useGit.js +0 -206
  179. package/dist/Git/useGit.js.map +0 -1
  180. package/dist/Git/useGitStatus.d.ts +0 -17
  181. package/dist/Git/useGitStatus.d.ts.map +0 -1
  182. package/dist/Git/useGitStatus.js +0 -63
  183. package/dist/Git/useGitStatus.js.map +0 -1
  184. package/dist/GitToolbarControl-LMIR4R7I.js.map +0 -1
  185. package/dist/GitUI-KGF5MSNV.js.map +0 -1
  186. package/dist/LazyEditorShell-EF2BWRXU.js.map +0 -1
  187. package/dist/Settings/Settings.d.ts +0 -23
  188. package/dist/Settings/Settings.d.ts.map +0 -1
  189. package/dist/Settings/Settings.js +0 -22
  190. package/dist/Settings/Settings.js.map +0 -1
  191. package/dist/Settings/public-api.d.ts +0 -3
  192. package/dist/Settings/public-api.d.ts.map +0 -1
  193. package/dist/Settings/public-api.js +0 -2
  194. package/dist/Settings/public-api.js.map +0 -1
  195. package/dist/WorkspacePicker/WorkspacePicker.d.ts +0 -22
  196. package/dist/WorkspacePicker/WorkspacePicker.d.ts.map +0 -1
  197. package/dist/WorkspacePicker/WorkspacePicker.js +0 -74
  198. package/dist/WorkspacePicker/WorkspacePicker.js.map +0 -1
  199. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts +0 -11
  200. package/dist/WorkspacePicker/WorkspaceSettingsButton.d.ts.map +0 -1
  201. package/dist/WorkspacePicker/WorkspaceSettingsButton.js +0 -27
  202. package/dist/WorkspacePicker/WorkspaceSettingsButton.js.map +0 -1
  203. package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts +0 -20
  204. package/dist/WorkspacePicker/WorkspaceSettingsDialog.d.ts.map +0 -1
  205. package/dist/WorkspacePicker/WorkspaceSettingsDialog.js +0 -36
  206. package/dist/WorkspacePicker/WorkspaceSettingsDialog.js.map +0 -1
  207. package/dist/WorkspacePicker/index.d.ts +0 -3
  208. package/dist/WorkspacePicker/index.d.ts.map +0 -1
  209. package/dist/WorkspacePicker/index.js +0 -2
  210. package/dist/WorkspacePicker/index.js.map +0 -1
  211. package/dist/chunk-3SAXDU2U.js +0 -157
  212. package/dist/chunk-3SAXDU2U.js.map +0 -1
  213. package/dist/chunk-4XXSWN3T.js.map +0 -1
  214. package/dist/chunk-5A4KEWKT.js.map +0 -1
  215. package/dist/chunk-AOVTHZU7.js +0 -321
  216. package/dist/chunk-AOVTHZU7.js.map +0 -1
  217. package/dist/chunk-DD4VFJQI.js.map +0 -1
  218. package/dist/chunk-GSNZSCIK.js +0 -55
  219. package/dist/chunk-GSNZSCIK.js.map +0 -1
  220. package/dist/chunk-VHDP4IPL.js.map +0 -1
  221. package/dist/chunk-ZI56BNB7.js.map +0 -1
  222. package/dist/components/Dialog.d.ts +0 -22
  223. package/dist/components/Dialog.d.ts.map +0 -1
  224. package/dist/components/Dialog.js +0 -33
  225. package/dist/components/Dialog.js.map +0 -1
  226. package/dist/editor.d.ts.map +0 -1
  227. package/dist/editor.js.map +0 -1
  228. package/dist/export/index.js.map +0 -1
  229. package/dist/hooks/index.d.ts +0 -3
  230. package/dist/hooks/index.d.ts.map +0 -1
  231. package/dist/hooks/index.js +0 -2
  232. package/dist/hooks/index.js.map +0 -1
  233. package/dist/hooks/useDocumentSession.d.ts +0 -16
  234. package/dist/hooks/useDocumentSession.d.ts.map +0 -1
  235. package/dist/hooks/useDocumentSession.js +0 -18
  236. package/dist/hooks/useDocumentSession.js.map +0 -1
  237. package/dist/icons.d.ts +0 -12
  238. package/dist/icons.d.ts.map +0 -1
  239. package/dist/icons.js +0 -28
  240. package/dist/icons.js.map +0 -1
  241. package/dist/index.d.ts.map +0 -1
  242. package/dist/index.js.map +0 -1
  243. package/dist/preferences/theme.d.ts +0 -18
  244. package/dist/preferences/theme.d.ts.map +0 -1
  245. package/dist/preferences/theme.js +0 -63
  246. package/dist/preferences/theme.js.map +0 -1
  247. package/dist/preferences/versioning.d.ts +0 -27
  248. package/dist/preferences/versioning.d.ts.map +0 -1
  249. package/dist/preferences/versioning.js +0 -62
  250. package/dist/preferences/versioning.js.map +0 -1
  251. package/dist/provider-lease.d.ts +0 -10
  252. package/dist/provider-lease.d.ts.map +0 -1
  253. package/dist/provider-lease.js +0 -42
  254. package/dist/provider-lease.js.map +0 -1
  255. package/dist/run-export-ICTZITXC.js +0 -10
  256. package/dist/run-export-ICTZITXC.js.map +0 -1
  257. package/dist/settings/index.js.map +0 -1
  258. package/src/AppMenu/AppMenu.tsx +0 -334
  259. package/src/AppMenu/index.ts +0 -2
  260. package/src/DocBlocksShell/DocBlocksShell.tsx +0 -3398
  261. package/src/DocBlocksShell/LazyEditorShell.ts +0 -2
  262. package/src/DocBlocksShell/UpdateAvailableNotice.tsx +0 -60
  263. package/src/DocBlocksShell/document-title.ts +0 -19
  264. package/src/DocBlocksShell/index.ts +0 -2
  265. package/src/DocBlocksShell/workspace-authority-barrier.ts +0 -26
  266. package/src/Export/DeferredExportToolbarControls.tsx +0 -23
  267. package/src/Export/ExportDialog.tsx +0 -437
  268. package/src/Export/ExportToolbarControls.tsx +0 -511
  269. package/src/Export/export-options.ts +0 -99
  270. package/src/Export/index.ts +0 -19
  271. package/src/Export/public-api.ts +0 -17
  272. package/src/Export/run-export.ts +0 -374
  273. package/src/Export/transform-summaries.ts +0 -14
  274. package/src/FileExplorer/FileExplorer.tsx +0 -528
  275. package/src/FileExplorer/FileTreeNode.tsx +0 -306
  276. package/src/FileExplorer/index.ts +0 -5
  277. package/src/FileExplorer/useFileTree.ts +0 -352
  278. package/src/Git/GitAuthGuidanceDialog.tsx +0 -84
  279. package/src/Git/GitBranchesDialog.tsx +0 -144
  280. package/src/Git/GitCloneDialog.tsx +0 -200
  281. package/src/Git/GitCommitDialog.tsx +0 -119
  282. package/src/Git/GitConflictsDialog.tsx +0 -62
  283. package/src/Git/GitContext.tsx +0 -88
  284. package/src/Git/GitDiffDialog.tsx +0 -147
  285. package/src/Git/GitDiffView.tsx +0 -105
  286. package/src/Git/GitHistoryDialog.tsx +0 -195
  287. package/src/Git/GitStatusBar.tsx +0 -157
  288. package/src/Git/GitToolbarControl.tsx +0 -123
  289. package/src/Git/GitUI.tsx +0 -68
  290. package/src/Git/commit-selection.ts +0 -63
  291. package/src/Git/git-clone-utils.ts +0 -23
  292. package/src/Git/git-status.ts +0 -113
  293. package/src/Git/useGit.ts +0 -279
  294. package/src/Git/useGitStatus.ts +0 -78
  295. package/src/Settings/Settings.tsx +0 -118
  296. package/src/Settings/public-api.ts +0 -8
  297. package/src/WorkspacePicker/WorkspacePicker.tsx +0 -191
  298. package/src/WorkspacePicker/WorkspaceSettingsButton.tsx +0 -88
  299. package/src/WorkspacePicker/WorkspaceSettingsDialog.tsx +0 -121
  300. package/src/WorkspacePicker/index.ts +0 -2
  301. package/src/components/Dialog.tsx +0 -81
  302. package/src/editor.ts +0 -72
  303. package/src/hooks/index.ts +0 -2
  304. package/src/hooks/useDocumentSession.ts +0 -37
  305. package/src/icons.tsx +0 -48
  306. package/src/index.ts +0 -61
  307. package/src/preferences/theme.ts +0 -67
  308. package/src/preferences/versioning.ts +0 -69
  309. package/src/provider-lease.ts +0 -52
  310. package/src/types/pwa-dom.d.ts +0 -31
@@ -1,374 +0,0 @@
1
- /**
2
- * Execute an export using @bendyline/squisq-formats.
3
- */
4
-
5
- import type {
6
- MarkdownDocument,
7
- MarkdownBlockNode,
8
- MarkdownInlineNode,
9
- } from '@bendyline/squisq/markdown';
10
- import { parseMarkdown } from '@bendyline/squisq/markdown';
11
- import type { Doc } from '@bendyline/squisq/schemas';
12
- import type { ContentContainer } from '@bendyline/squisq/storage';
13
- import type { ExportOptions, ExportFormat } from './export-options.js';
14
- import { FORMAT_EXTENSIONS } from './export-options.js';
15
-
16
- export type ExportBlobSaver = (blob: Blob, filename: string) => Promise<void> | void;
17
-
18
- const MIME_TYPES: Record<ExportFormat, string> = {
19
- docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
20
- pdf: 'application/pdf',
21
- pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
22
- md: 'text/markdown',
23
- html: 'text/html',
24
- };
25
-
26
- /** Trigger a browser download for a Blob. */
27
- function downloadBlob(blob: Blob, filename: string): void {
28
- const url = URL.createObjectURL(blob);
29
- const a = document.createElement('a');
30
- a.href = url;
31
- a.download = filename;
32
- a.click();
33
- URL.revokeObjectURL(url);
34
- }
35
-
36
- async function saveExportBlob(
37
- blob: Blob,
38
- filename: string,
39
- saveBlob?: ExportBlobSaver,
40
- ): Promise<void> {
41
- if (saveBlob) {
42
- await saveBlob(blob, filename);
43
- return;
44
- }
45
- downloadBlob(blob, filename);
46
- }
47
-
48
- /** Derive a filename from the selected file path and export format. */
49
- function buildFilename(selectedFile: string | null, format: ExportFormat): string {
50
- const base = selectedFile ? selectedFile.replace(/^\//, '').replace(/\.[^.]+$/, '') : 'document';
51
- return base + FORMAT_EXTENSIONS[format];
52
- }
53
-
54
- export function buildExportFilename(selectedFile: string | null, options: ExportOptions): string {
55
- const base = selectedFile ? selectedFile.replace(/^\//, '').replace(/\.[^.]+$/, '') : 'document';
56
- if (options.format === 'html') {
57
- if (options.includeLinkedDocs || options.htmlBundle === 'zip') return `${base}.zip`;
58
- if (options.entryAsIndex) return 'index.html';
59
- }
60
- return base + FORMAT_EXTENSIONS[options.format];
61
- }
62
-
63
- /** Run the export and trigger a download. */
64
- export async function runExport(
65
- markdown: string,
66
- selectedFile: string | null,
67
- options: ExportOptions,
68
- mediaContainer?: ContentContainer | null,
69
- saveBlob?: ExportBlobSaver,
70
- ): Promise<void> {
71
- const filename = buildFilename(selectedFile, options.format);
72
- const themeId = options.themeId !== 'standard' ? options.themeId : undefined;
73
-
74
- if (options.format === 'md') {
75
- await saveExportBlob(new Blob([markdown], { type: MIME_TYPES.md }), filename, saveBlob);
76
- return;
77
- }
78
-
79
- if (options.format === 'html') {
80
- await runHtmlExport(markdown, filename, options, mediaContainer, selectedFile, saveBlob);
81
- return;
82
- }
83
-
84
- const doc = parseMarkdown(markdown);
85
-
86
- if (options.format === 'docx') {
87
- const { markdownDocToDocx } = await import('@bendyline/squisq-formats/docx');
88
- const images = mediaContainer ? await resolveImages(doc, mediaContainer) : undefined;
89
- const buf = await markdownDocToDocx(doc, { themeId, images });
90
- await saveExportBlob(new Blob([buf], { type: MIME_TYPES.docx }), filename, saveBlob);
91
- return;
92
- }
93
-
94
- if (options.format === 'pdf') {
95
- const { markdownDocToPdf } = await import('@bendyline/squisq-formats/pdf');
96
- const buf = await markdownDocToPdf(doc, {
97
- themeId,
98
- pageSize: options.pageSize,
99
- });
100
- await saveExportBlob(new Blob([buf], { type: MIME_TYPES.pdf }), filename, saveBlob);
101
- return;
102
- }
103
-
104
- if (options.format === 'pptx') {
105
- const [{ markdownToDoc }, { applyTransform }, { docToPptx }] = await Promise.all([
106
- import('@bendyline/squisq/doc'),
107
- import('@bendyline/squisq/transform'),
108
- import('@bendyline/squisq-formats/pptx'),
109
- ]);
110
- // Use the full transform pipeline: markdown -> Doc -> transform -> PPTX
111
- const baseDoc = markdownToDoc(doc);
112
- const transformed = applyTransform(baseDoc, options.transformStyle);
113
- const enrichedDoc = transformed.doc;
114
- if (themeId) {
115
- enrichedDoc.themeId = themeId;
116
- }
117
- const buf = await docToPptx(enrichedDoc, { themeId });
118
- await saveExportBlob(new Blob([buf], { type: MIME_TYPES.pptx }), filename, saveBlob);
119
- return;
120
- }
121
- }
122
-
123
- /** Run the HTML export branch — handles all four htmlStyle × htmlBundle combinations. */
124
- async function runHtmlExport(
125
- markdown: string,
126
- htmlFilename: string,
127
- options: ExportOptions,
128
- mediaContainer?: ContentContainer | null,
129
- selectedFile?: string | null,
130
- saveBlob?: ExportBlobSaver,
131
- ): Promise<void> {
132
- const baseName = htmlFilename.replace(/\.html$/, '');
133
- const zipName = `${baseName}.zip`;
134
- // When `entryAsIndex` is on, a single-doc HTML download lands on
135
- // disk as `index.html` so it drops straight into a static host. The
136
- // recursive ZIP path doesn't care — squisq's bundle helpers handle
137
- // the inside-zip rename and the cross-doc link rewrite themselves.
138
- const singleHtmlFilename = options.entryAsIndex ? 'index.html' : htmlFilename;
139
- const themeId = options.themeId !== 'standard' ? options.themeId : undefined;
140
-
141
- // Recursive HTML bundle: when the user opted in, ask squisq to walk
142
- // this doc's relative .md links and emit a ZIP with every reachable
143
- // page rendered + cross-doc hrefs rewritten. Two pipelines:
144
- // • Plain → `markdownDocsToPlainHtmlBundle` (semantic HTML)
145
- // • Rendered → `markdownDocsToHtmlBundle` (SquisqPlayer-rendered,
146
- // shared `squisq-player.js`, Doc-tree link rewrites)
147
- // Both consume the workspace container to resolve sibling files —
148
- // `mediaContainer` is already scoped to the selected file's parent
149
- // dir, which is exactly the bundle's scope root. Falls back to the
150
- // single-doc path if either prerequisite is missing rather than
151
- // silently skipping the recursion.
152
- if (options.includeLinkedDocs && mediaContainer && selectedFile) {
153
- const entryPath = basenameForBundle(selectedFile);
154
- if (options.htmlStyle === 'rendered') {
155
- const [{ markdownDocsToHtmlBundle }, { PLAYER_BUNDLE }] = await Promise.all([
156
- import('@bendyline/squisq-formats/html'),
157
- import('@bendyline/squisq-react/standalone-source'),
158
- ]);
159
- const blob = await markdownDocsToHtmlBundle({
160
- entryPath,
161
- readDocument: (path) => readDocumentFromContainer(mediaContainer, path),
162
- readBinary: (path) => mediaContainer.readFile(path),
163
- playerScript: PLAYER_BUNDLE,
164
- title: baseName,
165
- themeId,
166
- mode: 'static',
167
- entryAsIndex: options.entryAsIndex,
168
- });
169
- await saveExportBlob(blob, zipName, saveBlob);
170
- return;
171
- }
172
- const { markdownDocsToPlainHtmlBundle } = await import('@bendyline/squisq-formats/html');
173
- const blob = await markdownDocsToPlainHtmlBundle({
174
- entryPath,
175
- readDocument: (path) => readDocumentFromContainer(mediaContainer, path),
176
- readBinary: (path) => mediaContainer.readFile(path),
177
- title: baseName,
178
- themeId,
179
- entryAsIndex: options.entryAsIndex,
180
- });
181
- await saveExportBlob(blob, zipName, saveBlob);
182
- return;
183
- }
184
-
185
- if (options.htmlStyle === 'rendered') {
186
- const [{ markdownToDoc }, { docToHtml, docToHtmlZip, collectImagePaths }, { PLAYER_BUNDLE }] =
187
- await Promise.all([
188
- import('@bendyline/squisq/doc'),
189
- import('@bendyline/squisq-formats/html'),
190
- import('@bendyline/squisq-react/standalone-source'),
191
- ]);
192
- const mdDoc = parseMarkdown(markdown);
193
- const baseDoc = markdownToDoc(mdDoc);
194
- if (themeId) baseDoc.themeId = themeId;
195
-
196
- const images = mediaContainer
197
- ? await resolveDocImages(baseDoc, mediaContainer, collectImagePaths)
198
- : undefined;
199
-
200
- if (options.htmlBundle === 'zip') {
201
- const blob = await docToHtmlZip(baseDoc, {
202
- playerScript: PLAYER_BUNDLE,
203
- images,
204
- mode: 'static',
205
- title: baseName,
206
- });
207
- await saveExportBlob(blob, zipName, saveBlob);
208
- return;
209
- }
210
-
211
- const html = docToHtml(baseDoc, {
212
- playerScript: PLAYER_BUNDLE,
213
- images,
214
- mode: 'static',
215
- title: baseName,
216
- });
217
- await saveExportBlob(new Blob([html], { type: MIME_TYPES.html }), singleHtmlFilename, saveBlob);
218
- return;
219
- }
220
-
221
- // Plain semantic HTML
222
- const mdDoc = parseMarkdown(markdown);
223
- const referencedImages = collectMarkdownImageUrls(mdDoc);
224
- const localImages = referencedImages.filter((u) => !isExternalUrl(u));
225
-
226
- if (options.htmlBundle === 'zip' && mediaContainer && localImages.length > 0) {
227
- const [{ markdownDocToPlainHtml }, { MemoryContentContainer }, { containerToZip }] =
228
- await Promise.all([
229
- import('@bendyline/squisq-formats/html'),
230
- import('@bendyline/squisq/storage'),
231
- import('@bendyline/squisq-formats/container'),
232
- ]);
233
- // Mirror the markdown's relative paths inside the zip so <img src="..."> still resolves.
234
- const html = markdownDocToPlainHtml(mdDoc, { title: baseName, themeId });
235
- const container = new MemoryContentContainer();
236
- await container.writeFile('index.html', new TextEncoder().encode(html));
237
- for (const url of localImages) {
238
- const data = await mediaContainer.readFile(url);
239
- if (!data) continue;
240
- const cleanPath = url.replace(/^\/+/, '');
241
- await container.writeFile(cleanPath, new Uint8Array(data));
242
- }
243
- const blob = await containerToZip(container);
244
- await saveExportBlob(blob, zipName, saveBlob);
245
- return;
246
- }
247
-
248
- const { markdownDocToPlainHtml } = await import('@bendyline/squisq-formats/html');
249
- // Single-file plain HTML — embed local images as base64 data URIs.
250
- const inlineMap = new Map<string, string>();
251
- if (mediaContainer) {
252
- for (const url of localImages) {
253
- const data = await mediaContainer.readFile(url);
254
- if (!data) continue;
255
- inlineMap.set(url, arrayBufferToDataUrl(data, url));
256
- }
257
- }
258
- const html = markdownDocToPlainHtml(mdDoc, {
259
- title: baseName,
260
- images: inlineMap.size > 0 ? inlineMap : undefined,
261
- themeId,
262
- });
263
- await saveExportBlob(new Blob([html], { type: MIME_TYPES.html }), singleHtmlFilename, saveBlob);
264
- }
265
-
266
- const IMAGE_MIME: Record<string, string> = {
267
- png: 'image/png',
268
- jpg: 'image/jpeg',
269
- jpeg: 'image/jpeg',
270
- gif: 'image/gif',
271
- webp: 'image/webp',
272
- bmp: 'image/bmp',
273
- svg: 'image/svg+xml',
274
- };
275
-
276
- function isExternalUrl(url: string): boolean {
277
- return (
278
- url.startsWith('http://') ||
279
- url.startsWith('https://') ||
280
- url.startsWith('data:') ||
281
- url.startsWith('blob:')
282
- );
283
- }
284
-
285
- function arrayBufferToDataUrl(data: ArrayBuffer, url: string): string {
286
- const ext = url.slice(url.lastIndexOf('.') + 1).toLowerCase();
287
- const mime = IMAGE_MIME[ext] ?? 'application/octet-stream';
288
- // btoa requires a binary string; chunk to avoid call-stack issues on large files.
289
- const bytes = new Uint8Array(data);
290
- let binary = '';
291
- const CHUNK = 0x8000;
292
- for (let i = 0; i < bytes.length; i += CHUNK) {
293
- binary += String.fromCharCode(...bytes.subarray(i, i + CHUNK));
294
- }
295
- return `data:${mime};base64,${btoa(binary)}`;
296
- }
297
-
298
- /** Walk the markdown AST and collect all image URLs. */
299
- function collectMarkdownImageUrls(doc: MarkdownDocument): string[] {
300
- const urls: string[] = [];
301
- function walkBlocks(nodes: MarkdownBlockNode[]): void {
302
- for (const node of nodes) {
303
- if ('children' in node && Array.isArray(node.children)) {
304
- for (const child of node.children as (MarkdownBlockNode | MarkdownInlineNode)[]) {
305
- if (child.type === 'image') {
306
- urls.push((child as { url: string }).url);
307
- } else if ('children' in child && Array.isArray(child.children)) {
308
- walkBlocks(child.children as MarkdownBlockNode[]);
309
- }
310
- }
311
- }
312
- }
313
- }
314
- walkBlocks(doc.children);
315
- return Array.from(new Set(urls));
316
- }
317
-
318
- /** Resolve image URLs (markdown → docx) to binary data from a ContentContainer. */
319
- async function resolveImages(
320
- doc: MarkdownDocument,
321
- container: ContentContainer,
322
- ): Promise<Map<string, { data: ArrayBuffer | Uint8Array; contentType: string }>> {
323
- const urls = collectMarkdownImageUrls(doc);
324
- const map = new Map<string, { data: ArrayBuffer | Uint8Array; contentType: string }>();
325
-
326
- for (const url of urls) {
327
- if (map.has(url)) continue;
328
- if (isExternalUrl(url)) continue;
329
- const data = await container.readFile(url);
330
- if (!data) continue;
331
- const ext = url.slice(url.lastIndexOf('.') + 1).toLowerCase();
332
- const contentType = IMAGE_MIME[ext] || 'image/png';
333
- map.set(url, { data, contentType });
334
- }
335
-
336
- return map;
337
- }
338
-
339
- /** Container-relative path for the bundle's entry document. `mediaContainer`
340
- * is already scoped to the selected file's parent directory, so the bundle
341
- * needs the basename ("docs/home.md" → "home.md"). */
342
- function basenameForBundle(selectedFile: string): string {
343
- const clean = selectedFile.replace(/^\/+/, '');
344
- const idx = clean.lastIndexOf('/');
345
- return idx === -1 ? clean : clean.slice(idx + 1);
346
- }
347
-
348
- /** Read a UTF-8 text document from a ContentContainer. Returns null when
349
- * the file is missing — preserves the bundle's "abort with error" contract
350
- * for unreachable .md links. */
351
- async function readDocumentFromContainer(
352
- container: ContentContainer,
353
- path: string,
354
- ): Promise<string | null> {
355
- const data = await container.readFile(path);
356
- if (!data) return null;
357
- return new TextDecoder('utf-8').decode(data);
358
- }
359
-
360
- /** Resolve image paths referenced by a squisq Doc to ArrayBuffers for HTML export. */
361
- async function resolveDocImages(
362
- doc: Doc,
363
- container: ContentContainer,
364
- collectImagePaths: (doc: Doc) => Iterable<string>,
365
- ): Promise<Map<string, ArrayBuffer>> {
366
- const paths = collectImagePaths(doc);
367
- const map = new Map<string, ArrayBuffer>();
368
- for (const path of paths) {
369
- const data = await container.readFile(path);
370
- if (!data) continue;
371
- map.set(path, data);
372
- }
373
- return map;
374
- }
@@ -1,14 +0,0 @@
1
- export interface ExportSummaryOption {
2
- id: string;
3
- name: string;
4
- description?: string;
5
- }
6
-
7
- let transformStyleSummariesPromise: Promise<ExportSummaryOption[]> | null = null;
8
-
9
- export function loadTransformStyleSummaries(): Promise<ExportSummaryOption[]> {
10
- transformStyleSummariesPromise ??= import('@bendyline/squisq/transform').then(
11
- ({ getTransformStyleSummaries }) => getTransformStyleSummaries(),
12
- );
13
- return transformStyleSummariesPromise;
14
- }