From 303b6a048f3c9fe91e8d34067200a87535318d68 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sat, 27 Jun 2026 00:40:19 +0100 Subject: [PATCH] fix: cleanup title --- apps/server/src/integrations/export/export.service.ts | 3 ++- apps/server/src/integrations/export/utils.ts | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/server/src/integrations/export/export.service.ts b/apps/server/src/integrations/export/export.service.ts index b4bc73fac..733e4e9c9 100644 --- a/apps/server/src/integrations/export/export.service.ts +++ b/apps/server/src/integrations/export/export.service.ts @@ -16,6 +16,7 @@ import { computeLocalPath, getExportExtension, getPageTitle, + getSafePageTitle, PageExportTree, replaceInternalLinks, updateAttachmentUrlsToLocalPaths, @@ -314,7 +315,7 @@ export class ExportService { updateAttachmentUrlsToLocalPaths(updatedJsonContent); } - const pageTitle = getPageTitle(page.title); + const pageTitle = getSafePageTitle(page.title); const pageExportContent = await this.exportPage(format, { ...page, content: updatedJsonContent, diff --git a/apps/server/src/integrations/export/utils.ts b/apps/server/src/integrations/export/utils.ts index ba021be3c..ed27cfda2 100644 --- a/apps/server/src/integrations/export/utils.ts +++ b/apps/server/src/integrations/export/utils.ts @@ -6,6 +6,7 @@ import { validate as isValidUUID } from 'uuid'; import * as path from 'path'; import { Page } from '@docmost/db/types/entity.types'; import { isAttachmentNode } from '../../common/helpers/prosemirror/utils'; +import { sanitizeFileName } from '../../common/helpers'; export type PageExportTree = Record; @@ -27,6 +28,13 @@ export function getPageTitle(title: string) { return title ? title : 'untitled'; } +export function getSafePageTitle(title: string): string { + const sanitized = sanitizeFileName(getPageTitle(title), { + preserveSpaces: true, + }); + return sanitized || 'untitled'; +} + export function updateAttachmentUrlsToLocalPaths(prosemirrorJson: any) { const doc = jsonToNode(prosemirrorJson); if (!doc) return null; @@ -167,7 +175,7 @@ export function computeLocalPath( const children = tree[parentPageId] || []; for (const page of children) { - const title = encodeURIComponent(getPageTitle(page.title)); + const title = encodeURIComponent(getSafePageTitle(page.title)); const localPath = `${currentPath}${title}`; slugIdToPath[page.slugId] = `${localPath}${getExportExtension(format)}`;