diff --git a/app/src/menus/protyle.ts b/app/src/menus/protyle.ts index 557ce80ba..0db4b0fec 100644 --- a/app/src/menus/protyle.ts +++ b/app/src/menus/protyle.ts @@ -23,13 +23,10 @@ import {readText, writeText} from "../protyle/util/compatibility"; import {preventScroll} from "../protyle/scroll/preventScroll"; import {onGet} from "../protyle/util/onGet"; import {getAllModels} from "../layout/getAll"; -import {pasteText} from "../protyle/util/paste"; +import {pasteAsPlainText, pasteText} from "../protyle/util/paste"; /// #if !MOBILE import {openFileById, updateBacklinkGraph} from "../editor/util"; /// #endif -/// #if !BROWSER -import {getCurrentWindow} from "@electron/remote"; -/// #endif import {isMobile} from "../util/functions"; import {removeFoldHeading} from "../protyle/util/heading"; import {lineNumberRender} from "../protyle/markdown/highlightRender"; @@ -364,7 +361,7 @@ export const contentMenu = (protyle: IProtyle, nodeElement: Element) => { accelerator: "⇧⌘V", click() { focusByRange(getEditorRange(nodeElement)); - getCurrentWindow().webContents.pasteAndMatchStyle(); + pasteAsPlainText(protyle); } }).element); /// #endif diff --git a/app/src/protyle/util/paste.ts b/app/src/protyle/util/paste.ts index d853def84..ca3e45e41 100644 --- a/app/src/protyle/util/paste.ts +++ b/app/src/protyle/util/paste.ts @@ -4,6 +4,7 @@ import {processPasteCode, processRender} from "./processCode"; import {writeText} from "./compatibility"; /// #if !BROWSER import {clipboard} from "electron"; +import {getCurrentWindow} from "@electron/remote"; /// #endif import {hasClosestBlock} from "./hasClosest"; import {focusByWbr, getEditorRange} from "./selection"; @@ -29,6 +30,31 @@ const filterClipboardHint = (protyle: IProtyle, textPlain: string) => { } }; +export const pasteAsPlainText = async (protyle: IProtyle) => { + /// #if !BROWSER && !MOBILE + let localFiles: string[] = []; + if ("darwin" === window.siyuan.config.system.os) { + const xmlString = clipboard.read("NSFilenamesPboardType"); + const domParser = new DOMParser(); + const xmlDom = domParser.parseFromString(xmlString, "application/xml"); + Array.from(xmlDom.getElementsByTagName("string")).forEach(item => { + localFiles.push(item.childNodes[0].nodeValue); + }); + } else { + const xmlString = await fetchSyncPost("/api/clipboard/readFilePaths", {}); + if (xmlString.data.length > 0) { + localFiles = xmlString.data; + } + } + if (localFiles.length > 0) { + uploadLocalFiles(localFiles, protyle, false); + writeText(""); + } else { + getCurrentWindow().webContents.pasteAndMatchStyle(); + } + /// #endif +}; + export const pasteText = (protyle: IProtyle, textPlain: string, nodeElement: Element) => { const range = getEditorRange(protyle.wysiwyg.element); if (nodeElement.getAttribute("data-type") === "NodeCodeBlock") { diff --git a/app/src/protyle/wysiwyg/keydown.ts b/app/src/protyle/wysiwyg/keydown.ts index 8bf7e78f7..7efd01275 100644 --- a/app/src/protyle/wysiwyg/keydown.ts +++ b/app/src/protyle/wysiwyg/keydown.ts @@ -42,9 +42,6 @@ import {isLocalPath} from "../../util/pathName"; /// #if !MOBILE import {openBy, openFileById} from "../../editor/util"; /// #endif -/// #if !BROWSER -import {getCurrentWindow} from "@electron/remote"; -/// #endif import {commonHotkey, downSelect, getStartEndElement, upSelect} from "./commonHotkey"; import {linkMenu, refMenu, setFold, zoomOut} from "../../menus/protyle"; import {removeEmbed} from "./removeEmbed"; @@ -60,6 +57,7 @@ import {highlightRender} from "../markdown/highlightRender"; import {countBlockWord} from "../../layout/status"; import {openMobileFileById} from "../../mobile/editor"; import {moveToDown, moveToUp} from "./move"; +import {pasteAsPlainText} from "../util/paste"; export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => { editorElement.addEventListener("keydown", (event: KeyboardEvent & { target: HTMLElement }) => { @@ -1583,7 +1581,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => { event.returnValue = false; event.preventDefault(); event.stopPropagation(); - getCurrentWindow().webContents.pasteAndMatchStyle(); + pasteAsPlainText(protyle); return; }