Skip to content

Commit 09aeb52

Browse files
author
Abhiraj
committed
fix(export): resolve wikilink images during PDF exports
1 parent a29bd21 commit 09aeb52

4 files changed

Lines changed: 32 additions & 2 deletions

File tree

apps/desktop/src/renderer/export-window.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
resolveCustomThemeMode
1515
} from '@renderer/lib/custom-themes'
1616
import { withExportTitle } from '@shared/export-title'
17+
import { rewriteWikilinkImageEmbeds } from '@shared/embed-size'
1718
import '@renderer/styles/index.css'
1819

1920
const PREFS_KEY = 'zen:prefs:v2'
@@ -446,7 +447,9 @@ function ExportNoteWindow({ notePath }: { notePath: string }): JSX.Element {
446447
`}</style>
447448
<main className="export-note-shell">
448449
<Preview
449-
markdown={withExportTitle(note.body, note.title).markdown}
450+
markdown={rewriteWikilinkImageEmbeds(
451+
withExportTitle(note.body, note.title).markdown
452+
)}
450453
notePath={note.path}
451454
onRendered={() => setExportState('ready')}
452455
/>

apps/web/src/export-window.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import ReactDOM from 'react-dom/client'
33
import type { AssetMeta, NoteContent, NoteMeta, VaultInfo } from '@shared/ipc'
44
import { LazyPreview as Preview } from '@renderer/components/LazyPreview'
55
import { useStore } from '@renderer/store'
6+
import { rewriteWikilinkImageEmbeds } from '@shared/embed-size'
67
import '@renderer/styles/index.css'
78

89
const PREFS_KEY = 'zen:prefs:v2'
@@ -244,7 +245,11 @@ function ExportNoteWindow({ notePath }: { notePath: string }): JSX.Element {
244245
}
245246
`}</style>
246247
<main className="export-note-shell">
247-
<Preview markdown={note.body} notePath={note.path} onRendered={() => void triggerPrint()} />
248+
<Preview
249+
markdown={rewriteWikilinkImageEmbeds(note.body)}
250+
notePath={note.path}
251+
onRendered={() => void triggerPrint()}
252+
/>
248253
</main>
249254
</>
250255
)

packages/app-core/src/lib/local-assets-vault-root.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,20 @@ describe('#459 — vault-root wikilink embeds resolve from the root', () => {
9090
const img = root.querySelector<HTMLImageElement>('img')!
9191
expect(img.dataset.localAssetUrl).toBe('zen-asset://v/assets/image.png')
9292
})
93+
94+
it('leaves a missing image unresolved without throwing', async () => {
95+
const { useStore, enhanceLocalAssetNodes } = await load()
96+
useStore.setState({ assetFiles: [{ path: 'assets/other.png' }] as never })
97+
const root = document.createElement('div')
98+
root.innerHTML = '<p><img src="missing image.png" alt="Missing image"></p>'
99+
100+
expect(() =>
101+
enhanceLocalAssetNodes(root, { vaultRoot: '/v', notePath: DAILY_NOTE })
102+
).not.toThrow()
103+
const img = root.querySelector<HTMLImageElement>('img')!
104+
expect(img.dataset.localAssetUrl).toBe('zen-asset://v/missing image.png')
105+
expect(img.getAttribute('alt')).toBe('Missing image')
106+
})
93107
})
94108

95109
// #462: imported Obsidian vaults use per-folder `attachments/` directories and

packages/shared-domain/src/embed-size.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ describe('rewriteWikilinkImageEmbeds', () => {
3737
expect(rewriteWikilinkImageEmbeds('![[chart.png|Quarter|600x400]]')).toBe('![Quarter|600x400](chart.png)')
3838
expect(rewriteWikilinkImageEmbeds('![[assets/my chart.png]]')).toBe('![](<assets/my chart.png>)')
3939
})
40+
it('supports nested paths, spaces, alt text, and dimension labels used by PDF export', () => {
41+
expect(rewriteWikilinkImageEmbeds('![[subfolder/team photo.png|Team photo]]')).toBe(
42+
'![Team photo](<subfolder/team photo.png>)'
43+
)
44+
expect(rewriteWikilinkImageEmbeds('![[subfolder/team photo.png|300]]')).toBe(
45+
'![|300](<subfolder/team photo.png>)'
46+
)
47+
})
4048
it('leaves note embeds and fenced code alone', () => {
4149
const doc = '![[Some note]]\n\n```md\n![[chart.png]]\n```\n\n![[chart.png]]'
4250
expect(rewriteWikilinkImageEmbeds(doc)).toBe('![[Some note]]\n\n```md\n![[chart.png]]\n```\n\n![](chart.png)')

0 commit comments

Comments
 (0)