From e455984576a174d624f4a9d17ea78a9790af8cba Mon Sep 17 00:00:00 2001 From: Aman Harwara Date: Mon, 22 Apr 2024 22:53:09 +0530 Subject: [PATCH] chore: fix exporting super notes as md when multiple embedded files have same name [skip e2e] --- .../SuperEditor/Tools/HeadlessSuperConverter.tsx | 14 +++++++++++++- .../web/src/javascripts/Utils/NoteExportUtils.ts | 10 +++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/web/src/javascripts/Components/SuperEditor/Tools/HeadlessSuperConverter.tsx b/packages/web/src/javascripts/Components/SuperEditor/Tools/HeadlessSuperConverter.tsx index 767e5a314..7bee3ba0f 100644 --- a/packages/web/src/javascripts/Components/SuperEditor/Tools/HeadlessSuperConverter.tsx +++ b/packages/web/src/javascripts/Components/SuperEditor/Tools/HeadlessSuperConverter.tsx @@ -18,6 +18,7 @@ import { $createFileExportNode } from '../Lexical/Nodes/FileExportNode' import { $createInlineFileNode } from '../Plugins/InlineFilePlugin/InlineFileNode' import { $convertFromMarkdownString } from '../Lexical/Utils/MarkdownImport' import { $convertToMarkdownString } from '../Lexical/Utils/MarkdownExport' +import { parseFileName } from '@standardnotes/filepicker' export class HeadlessSuperConverter implements SuperConverterServiceInterface { private importEditor: LexicalEditor @@ -90,6 +91,7 @@ export class HeadlessSuperConverter implements SuperConverterServiceInterface { return } const fileNodes = $nodesOfType(FileNode) + const filenameCounts: Record = {} Promise.all( fileNodes.map(async (fileNode) => { const fileItem = getFileItem(fileNode.getId()) @@ -112,7 +114,17 @@ export class HeadlessSuperConverter implements SuperConverterServiceInterface { } else { this.exportEditor.update( () => { - const fileExportNode = $createFileExportNode(fileItem.name, fileItem.mimeType) + filenameCounts[fileItem.name] = + filenameCounts[fileItem.name] == undefined ? 0 : filenameCounts[fileItem.name] + 1 + + let name = fileItem.name + + if (filenameCounts[name] > 0) { + const { name: _name, ext } = parseFileName(name) + name = `${_name} - ${fileItem.uuid}.${ext}` + } + + const fileExportNode = $createFileExportNode(name, fileItem.mimeType) fileNode.replace(fileExportNode) }, { discrete: true }, diff --git a/packages/web/src/javascripts/Utils/NoteExportUtils.ts b/packages/web/src/javascripts/Utils/NoteExportUtils.ts index 5218f7cf4..b23457083 100644 --- a/packages/web/src/javascripts/Utils/NoteExportUtils.ts +++ b/packages/web/src/javascripts/Utils/NoteExportUtils.ts @@ -156,6 +156,7 @@ const noteRequiresFolder = ( const addEmbeddedFilesToFolder = async (application: WebApplication, note: SNNote, folder: ZipDirectoryEntry) => { try { + const filenameCounts: Record = {} const embeddedFileIDs = headlessSuperConverter.getEmbeddedFileIDsFromSuperString(note.text) for (const embeddedFileID of embeddedFileIDs) { const fileItem = application.items.findItem(embeddedFileID) @@ -166,7 +167,14 @@ const addEmbeddedFilesToFolder = async (application: WebApplication, note: SNNot if (!embeddedFileBlob) { continue } - folder.addBlob(parseAndCreateZippableFileName(fileItem.title), embeddedFileBlob) + filenameCounts[fileItem.title] = + filenameCounts[fileItem.title] == undefined ? 0 : filenameCounts[fileItem.title] + 1 + let name = fileItem.title + if (filenameCounts[fileItem.title] > 0) { + const { name: _name, ext } = parseFileName(fileItem.title) + name = `${_name} - ${fileItem.uuid}.${ext}` + } + folder.addBlob(parseAndCreateZippableFileName(name), embeddedFileBlob) } } catch (error) { console.error(error)