From 8523050ab2ed02ce75eedd30ef1f5efd22c22579 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 23 Jun 2025 19:00:20 +0300 Subject: [PATCH] fix(export/share): note children preview links not working --- apps/server/src/services/export/zip.ts | 9 +++------ apps/server/src/services/export/zip/abstract_provider.ts | 3 +++ apps/server/src/services/export/zip/html.ts | 6 +++++- apps/server/src/services/export/zip/markdown.ts | 1 + apps/server/src/services/export/zip/share_theme.ts | 1 + packages/share-theme/src/templates/page.ejs | 2 +- 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/apps/server/src/services/export/zip.ts b/apps/server/src/services/export/zip.ts index 9a11ca026..2f550898a 100644 --- a/apps/server/src/services/export/zip.ts +++ b/apps/server/src/services/export/zip.ts @@ -35,6 +35,7 @@ async function exportToZip(taskContext: TaskContext, branch: BBranch, format: "h }); const noteIdToMeta: Record = {}; + const rewriteFn = (zipExportOptions?.customRewriteLinks ? zipExportOptions?.customRewriteLinks(rewriteLinks, getNoteTargetUrl) : rewriteLinks); function buildProvider() { const providerData: ZipExportProviderData = { @@ -42,7 +43,8 @@ async function exportToZip(taskContext: TaskContext, branch: BBranch, format: "h metaFile, archive, rootMeta: rootMeta!, - branch + branch, + rewriteFn }; switch (format) { case "html": @@ -275,8 +277,6 @@ async function exportToZip(taskContext: TaskContext, branch: BBranch, format: "h return url; } - const rewriteFn = (zipExportOptions?.customRewriteLinks ? zipExportOptions?.customRewriteLinks(rewriteLinks, getNoteTargetUrl) : rewriteLinks); - function rewriteLinks(content: string, noteMeta: NoteMeta): string { content = content.replace(/src="[^"]*api\/images\/([a-zA-Z0-9_]+)\/[^"]*"/g, (match, targetNoteId) => { const url = getNoteTargetUrl(targetNoteId, noteMeta); @@ -325,9 +325,6 @@ async function exportToZip(taskContext: TaskContext, branch: BBranch, format: "h } content = provider.prepareContent(title, content, noteMeta, note, branch); - if (isText) { - content = rewriteFn(content as string, noteMeta); - } return content; } diff --git a/apps/server/src/services/export/zip/abstract_provider.ts b/apps/server/src/services/export/zip/abstract_provider.ts index d1bd7a9f9..0c7a53656 100644 --- a/apps/server/src/services/export/zip/abstract_provider.ts +++ b/apps/server/src/services/export/zip/abstract_provider.ts @@ -28,6 +28,7 @@ export interface ZipExportProviderData { rootMeta: NoteMeta; archive: Archiver; zipExportOptions?: AdvancedExportOptions; + rewriteFn: RewriteLinksFn; } export abstract class ZipExportProvider { @@ -37,6 +38,7 @@ export abstract class ZipExportProvider { rootMeta: NoteMeta; archive: Archiver; zipExportOptions?: AdvancedExportOptions; + rewriteFn: RewriteLinksFn; constructor(data: ZipExportProviderData) { this.branch = data.branch; @@ -45,6 +47,7 @@ export abstract class ZipExportProvider { this.rootMeta = data.rootMeta; this.archive = data.archive; this.zipExportOptions = data.zipExportOptions; + this.rewriteFn = data.rewriteFn; } abstract prepareMeta(): void; diff --git a/apps/server/src/services/export/zip/html.ts b/apps/server/src/services/export/zip/html.ts index 0eac07fb8..749d7adc8 100644 --- a/apps/server/src/services/export/zip/html.ts +++ b/apps/server/src/services/export/zip/html.ts @@ -62,7 +62,11 @@ export default class HtmlExportProvider extends ZipExportProvider { `; } - return content.length < 100_000 ? html.prettyPrint(content, { indent_size: 2 }) : content; + if (content.length < 100_000) { + content = html.prettyPrint(content, { indent_size: 2 }) + } + content = this.rewriteFn(content as string, noteMeta); + return content; } else { return content; } diff --git a/apps/server/src/services/export/zip/markdown.ts b/apps/server/src/services/export/zip/markdown.ts index 9143e5e1f..1ace2051a 100644 --- a/apps/server/src/services/export/zip/markdown.ts +++ b/apps/server/src/services/export/zip/markdown.ts @@ -15,6 +15,7 @@ export default class MarkdownExportProvider extends ZipExportProvider { ${markdownContent}`; } + markdownContent = this.rewriteFn(markdownContent, noteMeta); return markdownContent; } else { return content; diff --git a/apps/server/src/services/export/zip/share_theme.ts b/apps/server/src/services/export/zip/share_theme.ts index 04a4a633f..695d90e8d 100644 --- a/apps/server/src/services/export/zip/share_theme.ts +++ b/apps/server/src/services/export/zip/share_theme.ts @@ -51,6 +51,7 @@ export default class ShareThemeExportProvider extends ZipExportProvider { if (note) { content = renderNoteForExport(note, branch, basePath); + content = this.rewriteFn(content, noteMeta); } return content; diff --git a/packages/share-theme/src/templates/page.ejs b/packages/share-theme/src/templates/page.ejs index 243f788a1..6900a1be0 100644 --- a/packages/share-theme/src/templates/page.ejs +++ b/packages/share-theme/src/templates/page.ejs @@ -137,7 +137,7 @@ content = content.replaceAll(headingRe, (...match) => { const action = note.type === "book" ? "getChildNotes" : "getVisibleChildNotes"; for (const childNote of note[action]()) { const isExternalLink = childNote.hasLabel("shareExternal") || childNote.hasLabel("shareExternalLink"); - const linkHref = isExternalLink ? childNote.getLabelValue("shareExternal") ?? childNote.getLabelValue("shareExternalLink") : `./${childNote.shareId}`; + const linkHref = isExternalLink ? childNote.getLabelValue("shareExternal") ?? childNote.getLabelValue("shareExternalLink") : `./${childNote.shareId ?? "#root/" + childNote.noteId}`; const target = isExternalLink ? ` target="_blank" rel="noopener noreferrer"` : ""; %>