diff --git a/apps/desktop/src/renderer/export-window.tsx b/apps/desktop/src/renderer/export-window.tsx index 1b3b8f7c..0e7a49ed 100644 --- a/apps/desktop/src/renderer/export-window.tsx +++ b/apps/desktop/src/renderer/export-window.tsx @@ -14,6 +14,7 @@ import { resolveCustomThemeMode } from '@renderer/lib/custom-themes' import { withExportTitle } from '@shared/export-title' +import { rewriteWikilinkImageEmbeds } from '@shared/embed-size' import '@renderer/styles/index.css' const PREFS_KEY = 'zen:prefs:v2' @@ -446,7 +447,9 @@ function ExportNoteWindow({ notePath }: { notePath: string }): JSX.Element { `}
setExportState('ready')} /> diff --git a/apps/web/src/export-window.tsx b/apps/web/src/export-window.tsx index 02857450..37c053a9 100644 --- a/apps/web/src/export-window.tsx +++ b/apps/web/src/export-window.tsx @@ -3,6 +3,7 @@ import ReactDOM from 'react-dom/client' import type { AssetMeta, NoteContent, NoteMeta, VaultInfo } from '@shared/ipc' import { LazyPreview as Preview } from '@renderer/components/LazyPreview' import { useStore } from '@renderer/store' +import { rewriteWikilinkImageEmbeds } from '@shared/embed-size' import '@renderer/styles/index.css' const PREFS_KEY = 'zen:prefs:v2' @@ -244,7 +245,11 @@ function ExportNoteWindow({ notePath }: { notePath: string }): JSX.Element { } `}
- void triggerPrint()} /> + void triggerPrint()} + />
) diff --git a/packages/app-core/src/lib/local-assets-vault-root.test.ts b/packages/app-core/src/lib/local-assets-vault-root.test.ts index 906280ba..78d111f3 100644 --- a/packages/app-core/src/lib/local-assets-vault-root.test.ts +++ b/packages/app-core/src/lib/local-assets-vault-root.test.ts @@ -90,6 +90,20 @@ describe('#459 — vault-root wikilink embeds resolve from the root', () => { const img = root.querySelector('img')! expect(img.dataset.localAssetUrl).toBe('zen-asset://v/assets/image.png') }) + + it('leaves a missing image unresolved without throwing', async () => { + const { useStore, enhanceLocalAssetNodes } = await load() + useStore.setState({ assetFiles: [{ path: 'assets/other.png' }] as never }) + const root = document.createElement('div') + root.innerHTML = '

Missing image

' + + expect(() => + enhanceLocalAssetNodes(root, { vaultRoot: '/v', notePath: DAILY_NOTE }) + ).not.toThrow() + const img = root.querySelector('img')! + expect(img.dataset.localAssetUrl).toBe('zen-asset://v/missing image.png') + expect(img.getAttribute('alt')).toBe('Missing image') + }) }) // #462: imported Obsidian vaults use per-folder `attachments/` directories and diff --git a/packages/shared-domain/src/embed-size.test.ts b/packages/shared-domain/src/embed-size.test.ts index ac45884c..80782e39 100644 --- a/packages/shared-domain/src/embed-size.test.ts +++ b/packages/shared-domain/src/embed-size.test.ts @@ -37,6 +37,14 @@ describe('rewriteWikilinkImageEmbeds', () => { expect(rewriteWikilinkImageEmbeds('![[chart.png|Quarter|600x400]]')).toBe('![Quarter|600x400](chart.png)') expect(rewriteWikilinkImageEmbeds('![[assets/my chart.png]]')).toBe('![]()') }) + it('supports nested paths, spaces, alt text, and dimension labels used by PDF export', () => { + expect(rewriteWikilinkImageEmbeds('![[subfolder/team photo.png|Team photo]]')).toBe( + '![Team photo]()' + ) + expect(rewriteWikilinkImageEmbeds('![[subfolder/team photo.png|300]]')).toBe( + '![|300]()' + ) + }) it('leaves note embeds and fenced code alone', () => { const doc = '![[Some note]]\n\n```md\n![[chart.png]]\n```\n\n![[chart.png]]' expect(rewriteWikilinkImageEmbeds(doc)).toBe('![[Some note]]\n\n```md\n![[chart.png]]\n```\n\n![](chart.png)')