123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- const fs = require('fs')
- const path = require('path')
- const os = require('os')
- const { ipcRenderer, contextBridge, shell, clipboard, webFrame } = require('electron')
- const IS_MAC = process.platform === 'darwin'
- const IS_WIN32 = process.platform === 'win32'
- const ALLOWED_EXTERNAL_PROTOCOLS = ['https:', 'http:', 'mailto:', 'zotero:', 'file:']
- function getFilePathFromClipboard () {
- if (IS_WIN32) {
- const rawFilePath = clipboard.read('FileNameW')
- return rawFilePath.replace(new RegExp(String.fromCharCode(0), 'g'), '')
- } else if (IS_MAC) {
- return clipboard.read('public.file-url').replace('file://', '')
- } else {
- return clipboard.readText()
- }
- }
- /**
- * Read the contents of the clipboard for a custom format.
- * @param {string} format The custom format to read.
- * @returns Buffer containing the contents of the clipboard for the specified format, or null if not available.
- */
- function getClipboardData (format) {
- if (clipboard.has(format, "clipboard")) {
- return clipboard.readBuffer(format)
- }
- else {
- return null;
- }
- }
- contextBridge.exposeInMainWorld('apis', {
- doAction: async (arg) => {
- return await ipcRenderer.invoke('main', arg)
- },
- invoke: async (channel, args) => {
- return await ipcRenderer.invoke(channel, ...args)
- },
- addListener: ipcRenderer.on.bind(ipcRenderer),
- removeListener: ipcRenderer.removeListener.bind(ipcRenderer),
- removeAllListeners: ipcRenderer.removeAllListeners.bind(ipcRenderer),
- on: (channel, callback) => {
- const newCallback = (_, data) => callback(data)
- ipcRenderer.on(channel, newCallback)
- },
- off: (channel, callback) => {
- if (!callback) {
- ipcRenderer.removeAllListeners(channel)
- } else {
- ipcRenderer.removeListener(channel, callback)
- }
- },
- once: (channel, callback) => {
- ipcRenderer.on(channel, callback)
- },
- checkForUpdates: async (...args) => {
- await ipcRenderer.invoke('check-for-updates', ...args)
- },
- setUpdatesCallback (cb) {
- if (typeof cb !== 'function') return
- const channel = 'updates-callback'
- ipcRenderer.removeAllListeners(channel)
- ipcRenderer.on(channel, cb)
- },
- installUpdatesAndQuitApp () {
- ipcRenderer.invoke('install-updates', true)
- },
- async openExternal (url, options) {
- const protocol = new URL(url).protocol
- if (!ALLOWED_EXTERNAL_PROTOCOLS.includes(protocol)) {
- throw new Error('illegal protocol')
- }
- await shell.openExternal(url, options)
- },
- async openPath (relativePath) {
- const absolutePath = path.resolve(
- relativePath.startsWith('~') ? path.join(os.homedir(), relativePath.slice(1)) : relativePath
- );
- await shell.openPath(absolutePath)
- },
- /**
- * save all publish assets to disk
- *
- * @param {string} html html file with embedded state
- */
- exportPublishAssets (html, customCSSPath, exportCSSPath, repoPath, assetFilenames, outputDir) {
- ipcRenderer.invoke(
- 'export-publish-assets',
- html,
- customCSSPath,
- exportCSSPath,
- repoPath,
- assetFilenames,
- outputDir
- )
- },
- toggleMaxOrMinActiveWindow (isToggleMin = false) {
- ipcRenderer.invoke('toggle-max-or-min-active-win', isToggleMin)
- },
- /**
- * internal
- * @param type
- * @param args
- * @private
- */
- async _callApplication (type, ...args) {
- return await ipcRenderer.invoke('call-application', type, ...args)
- },
- /**
- * internal
- * @param type
- * @param args
- * @private
- */
- async _callMainWin (type, ...args) {
- return await ipcRenderer.invoke('call-main-win', type, ...args)
- },
- getFilePathFromClipboard,
- getClipboardData,
- setZoomFactor (factor) {
- webFrame.setZoomFactor(factor)
- },
- setZoomLevel (level) {
- webFrame.setZoomLevel(level)
- },
- isAbsolutePath: path.isAbsolute.bind(path)
- })
|