From d521a88d303a2617a8463bf22b799f95e2831c91 Mon Sep 17 00:00:00 2001 From: GeorgeDong32 Date: Thu, 23 Oct 2025 00:05:43 +0800 Subject: [PATCH] feat(export): add image export options to markdown settings --- packages/shared/IpcChannel.ts | 5 +++++ src/main/ipc.ts | 17 +++++++++++++++++ src/renderer/src/store/settings.ts | 21 +++++++++++++++++++++ src/renderer/src/utils/export.ts | 2 ++ 4 files changed, 45 insertions(+) diff --git a/packages/shared/IpcChannel.ts b/packages/shared/IpcChannel.ts index 2931015117..7e1f92f704 100644 --- a/packages/shared/IpcChannel.ts +++ b/packages/shared/IpcChannel.ts @@ -191,6 +191,11 @@ export enum IpcChannel { File_StartWatcher = 'file:startWatcher', File_StopWatcher = 'file:stopWatcher', File_ShowInFolder = 'file:showInFolder', + // Image export specific channels + File_ReadBinary = 'file:readBinary', + File_WriteBinary = 'file:writeBinary', + File_CopyFile = 'file:copyFile', + File_CreateDirectory = 'file:createDirectory', // file service FileService_Upload = 'file-service:upload', diff --git a/src/main/ipc.ts b/src/main/ipc.ts index f1a4de6a59..7c24452694 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -531,6 +531,23 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) { ipcMain.handle(IpcChannel.File_StopWatcher, fileManager.stopFileWatcher.bind(fileManager)) ipcMain.handle(IpcChannel.File_ShowInFolder, fileManager.showInFolder.bind(fileManager)) + // Image export specific handlers + ipcMain.handle(IpcChannel.File_ReadBinary, async (_, filePath: string) => { + return fs.promises.readFile(filePath) + }) + + ipcMain.handle(IpcChannel.File_WriteBinary, async (_, filePath: string, buffer: Buffer) => { + return fs.promises.writeFile(filePath, buffer) + }) + + ipcMain.handle(IpcChannel.File_CopyFile, async (_, sourcePath: string, destPath: string) => { + return fs.promises.copyFile(sourcePath, destPath) + }) + + ipcMain.handle(IpcChannel.File_CreateDirectory, async (_, dirPath: string) => { + return fs.promises.mkdir(dirPath, { recursive: true }) + }) + // file service ipcMain.handle(IpcChannel.FileService_Upload, async (_, provider: Provider, file: FileMetadata) => { const service = FileServiceManager.getInstance().getService(provider) diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index 273653aa0c..e80f4f6031 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -151,6 +151,10 @@ export interface SettingsState { notionExportReasoning: boolean excludeCitationsInExport: boolean standardizeCitationsInExport: boolean + // Image export settings + imageExportMode: 'base64' | 'folder' | 'none' + imageExportQuality: number + imageExportMaxSize: number yuqueToken: string | null yuqueUrl: string | null yuqueRepoId: string | null @@ -333,6 +337,10 @@ export const initialState: SettingsState = { notionExportReasoning: false, excludeCitationsInExport: false, standardizeCitationsInExport: false, + // Image export settings + imageExportMode: 'none', + imageExportQuality: 85, + imageExportMaxSize: 2048, yuqueToken: '', yuqueUrl: '', yuqueRepoId: '', @@ -716,6 +724,16 @@ const settingsSlice = createSlice({ setStandardizeCitationsInExport: (state, action: PayloadAction) => { state.standardizeCitationsInExport = action.payload }, + // Image export settings actions + setImageExportMode: (state, action: PayloadAction<'base64' | 'folder' | 'none'>) => { + state.imageExportMode = action.payload + }, + setImageExportQuality: (state, action: PayloadAction) => { + state.imageExportQuality = action.payload + }, + setImageExportMaxSize: (state, action: PayloadAction) => { + state.imageExportMaxSize = action.payload + }, setYuqueToken: (state, action: PayloadAction) => { state.yuqueToken = action.payload }, @@ -940,6 +958,9 @@ export const { setNotionExportReasoning, setExcludeCitationsInExport, setStandardizeCitationsInExport, + setImageExportMode, + setImageExportQuality, + setImageExportMaxSize, setYuqueToken, setYuqueRepoId, setYuqueUrl, diff --git a/src/renderer/src/utils/export.ts b/src/renderer/src/utils/export.ts index 728fb2d89b..5f7abd0265 100644 --- a/src/renderer/src/utils/export.ts +++ b/src/renderer/src/utils/export.ts @@ -17,6 +17,8 @@ import dayjs from 'dayjs' import DOMPurify from 'dompurify' import { appendBlocks } from 'notion-helper' +import { createExportFolderStructure, processImageBlocks } from './exportImages' + const logger = loggerService.withContext('Utils:export') // 全局的导出状态获取函数