/** * 平台抽象层 - Electron 实现 * 仅在存在 require 且可加载 electron 时使用;封装 IPC、dialog、fs、remote。 */ (function () { 'use strict'; if (typeof require === 'undefined') { return; } var ipcRenderer, dialog, path, fs, remote, clipboard; try { ipcRenderer = require('electron').ipcRenderer; dialog = require('@electron/remote').dialog; path = require('path'); fs = require('fs'); remote = require('@electron/remote'); clipboard = require('electron').clipboard; } catch (e) { console.warn('[platform] Electron modules not available', e); return; } var exePath = remote.app.getPath('userData'); var historyFilePath = path.join(exePath, 'data.json'); var bridge = { readHistory: function () { return ipcRenderer.invoke('history:read'); }, writeHistory: function (data) { return ipcRenderer.invoke('history:write', data); }, readJsonFile: function (filePath) { if (!filePath) return Promise.resolve(null); return ipcRenderer.invoke('file:read-json', filePath); }, showOpenDialog: function (options) { return dialog.showOpenDialog(options).then(function (result) { return { canceled: result.canceled, filePaths: result.filePaths }; }); }, showSaveDialog: function (options) { return dialog.showSaveDialog(options); }, writeFile: function (filePath, content) { return new Promise(function (resolve, reject) { var buf = Buffer.isBuffer(content) ? content : (typeof content === 'string' ? Buffer.from(content, 'utf8') : Buffer.from(content)); fs.writeFile(filePath, buf, 'utf8', function (err) { if (err) reject(err); else resolve(); }); }); }, writeFileSync: function (filePath, content) { fs.writeFileSync(filePath, content, 'utf8'); }, readFile: function (filePath) { return new Promise(function (resolve, reject) { fs.readFile(filePath, function (err, data) { if (err) reject(err); else resolve(data); }); }); }, readFileSync: function (filePath) { return fs.readFileSync(filePath); }, existsSync: function (p) { return fs.existsSync(p); }, getAppVersion: function () { return ipcRenderer.invoke('app:get-version'); }, getLocale: function () { return remote.app.getLocale(); }, getUserDataPath: function () { return exePath; }, getSystemFonts: function () { return new Promise(function (resolve, reject) { ipcRenderer.once('font-list', function (ev, fonts) { resolve(fonts || []); }); ipcRenderer.send('get-sys-fonts'); setTimeout(function () { resolve([]); }, 10000); }); }, openDesignPage: function (file, type) { ipcRenderer.send('open-design-page', file || 'empty', type || '1'); }, openFirstPage: function () { ipcRenderer.send('open-first-page'); }, onClose: function (callback) { ipcRenderer.on('close', callback); }, runClose: function () { ipcRenderer.send('run-close'); }, openHelp: function () { ipcRenderer.send('open-help-file'); }, printPdf: function (urlOrBlob) { ipcRenderer.send('print-pdf', urlOrBlob); }, getScaleRate: function () { return typeof window !== 'undefined' && window.devicePixelRatio ? window.devicePixelRatio : 1; }, clipboard: { readText: function () { return Promise.resolve(clipboard.readText()); }, writeText: function (text) { clipboard.writeText(text); return Promise.resolve(); } } }; window.platformBridge = bridge; // 兼容现有命名 window.sysAPI = { readHistory: bridge.readHistory, writeHistory: bridge.writeHistory, readJsonFile: bridge.readJsonFile, getAppVersion: bridge.getAppVersion }; window.dialog = { showOpenDialog: bridge.showOpenDialog, showSaveDialog: bridge.showSaveDialog }; window.path = path; window.fs = fs; window.remote = remote; window.ipcRenderer = ipcRenderer; window.clipboard = clipboard; window.exePath = exePath; window.fullPath = historyFilePath; })();