From be4611bf3193740ce3b8c8bf5fd9f3ac9733c8ce Mon Sep 17 00:00:00 2001 From: Vanessa Date: Mon, 19 Sep 2022 11:33:11 +0800 Subject: [PATCH] :art: fix https://github.com/siyuan-note/insider/issues/1057 --- app/src/menus/protyle.ts | 9 +++----- app/src/protyle/toolbar/index.ts | 2 +- app/src/protyle/util/insertHTML.ts | 4 ++-- app/src/protyle/util/paste.ts | 29 +++++++++++++++++++++++ app/src/protyle/wysiwyg/keydown.ts | 37 ++++-------------------------- app/src/types/protyle.d.ts | 4 ++++ 6 files changed, 43 insertions(+), 42 deletions(-) diff --git a/app/src/menus/protyle.ts b/app/src/menus/protyle.ts index 8c8d59935..b45d635d4 100644 --- a/app/src/menus/protyle.ts +++ b/app/src/menus/protyle.ts @@ -23,7 +23,7 @@ import {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 @@ -338,16 +338,13 @@ export const contentMenu = (protyle: IProtyle, nodeElement: Element) => { } } }).element); - /// #if !BROWSER + /// #if !BROWSER && !MOBILE window.siyuan.menus.menu.append(new MenuItem({ label: window.siyuan.languages.pasteAsPlainText, accelerator: window.siyuan.config.keymap.editor.general.pasteAsPlainText.custom, click() { focusByRange(getEditorRange(nodeElement)); - writeText(clipboard.readText()); - setTimeout(() => { - getCurrentWindow().webContents.pasteAndMatchStyle(); - }, 100); + pasteAsPlainText(protyle) } }).element); /// #endif diff --git a/app/src/protyle/toolbar/index.ts b/app/src/protyle/toolbar/index.ts index 31c01c95a..0e37d51be 100644 --- a/app/src/protyle/toolbar/index.ts +++ b/app/src/protyle/toolbar/index.ts @@ -871,7 +871,7 @@ export class Toolbar { } else { renderElement.setAttribute("data-inline-memo-content", Lute.EscapeHTMLStr(target.value)); } - }else if (type === "NodeBlockQueryEmbed") { + } else if (type === "NodeBlockQueryEmbed") { blockRender(protyle, renderElement); } if (this.range) { diff --git a/app/src/protyle/util/insertHTML.ts b/app/src/protyle/util/insertHTML.ts index f9f2e7afd..bad8e70e4 100644 --- a/app/src/protyle/util/insertHTML.ts +++ b/app/src/protyle/util/insertHTML.ts @@ -7,7 +7,7 @@ import {focusBlock, getEditorRange, focusByWbr} from "./selection"; import {mathRender} from "../markdown/mathRender"; import {Constants} from "../../constants"; -export const insertHTML = (html: string, protyle: IProtyle, isBlock = false) => { +export const insertHTML = (html: string, protyle: IProtyle, isBlock = false, splitSpan = true) => { if (html === "") { return; } @@ -89,7 +89,7 @@ export const insertHTML = (html: string, protyle: IProtyle, isBlock = false) => } // 粘贴带样式的行内元素到另一个行内元素中需进行切割 const spanElement = range.startContainer.nodeType === 3 ? range.startContainer.parentElement: range.startContainer as HTMLElement; - if (spanElement.tagName === "SPAN" && spanElement.isSameNode( range.endContainer.nodeType === 3 ? range.endContainer.parentElement: range.endContainer)) { + if (splitSpan && spanElement.tagName === "SPAN" && spanElement.isSameNode( range.endContainer.nodeType === 3 ? range.endContainer.parentElement: range.endContainer)) { const afterElement = document.createElement("span"); const attributes = spanElement.attributes; for (let i = 0; i < attributes.length; i++) { diff --git a/app/src/protyle/util/paste.ts b/app/src/protyle/util/paste.ts index 2b37b43d8..97ed5220d 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 * as path from "path"; /// #endif import {hasClosestBlock} from "./hasClosest"; import {focusByWbr, getEditorRange} from "./selection"; @@ -30,6 +31,34 @@ 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) { + let fileText = ""; + localFiles.forEach((item) => { + fileText += `[${path.basename(item).replace(/\]/g, "\\]").replace(/\[/g, "\\[")}](file://${item.replace(/\\/g, "\\\\").replace(/\)/g, "\\)").replace(/\(/g, "\\(")})\n`; + }); + insertHTML(protyle.lute.SpinBlockDOM(fileText), protyle); + } else { + insertHTML(protyle.lute.BlockDOM2Content(protyle.lute.InlineMd2BlockDOM(clipboard.readText())), protyle, false, false); + } + /// #endif +} + export const pasteText = (protyle: IProtyle, textPlain: string, nodeElement: Element) => { const range = getEditorRange(protyle.wysiwyg.element); const id = nodeElement.getAttribute("data-node-id"); diff --git a/app/src/protyle/wysiwyg/keydown.ts b/app/src/protyle/wysiwyg/keydown.ts index 105cdcb69..440d92fb4 100644 --- a/app/src/protyle/wysiwyg/keydown.ts +++ b/app/src/protyle/wysiwyg/keydown.ts @@ -41,11 +41,6 @@ import {listIndent, listOutdent, updateListOrder} from "./list"; import {newFileBySelect, newFileContentBySelect, rename, replaceFileName} from "../../editor/rename"; import {insertEmptyBlock, jumpToParentNext} from "../../block/util"; import {isLocalPath} from "../../util/pathName"; -/// #if !BROWSER -import {clipboard} from "electron"; -import {getCurrentWindow} from "@electron/remote"; -import * as path from "path"; -/// #endif /// #if !MOBILE import {openBy, openFileById} from "../../editor/util"; import {commonHotkey} from "./commonHotkey"; @@ -56,7 +51,7 @@ import {openAttr} from "../../menus/commonMenuItem"; import {Constants} from "../../constants"; import {preventScroll} from "../scroll/preventScroll"; import {bindMenuKeydown} from "../../menus/Menu"; -import {fetchPost, fetchSyncPost} from "../../util/fetch"; +import {fetchPost} from "../../util/fetch"; import {onGet} from "../util/onGet"; import {scrollCenter} from "../../util/highlightById"; import {BlockPanel} from "../../block/Panel"; @@ -65,9 +60,10 @@ import {highlightRender} from "../markdown/highlightRender"; import {countBlockWord} from "../../layout/status"; import {insertHTML} from "../util/insertHTML"; import {openMobileFileById} from "../../mobile/editor"; +import {pasteAsPlainText} from "../util/paste"; export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => { - editorElement.addEventListener("keydown", async (event: KeyboardEvent & { target: HTMLElement }) => { + editorElement.addEventListener("keydown", (event: KeyboardEvent & { target: HTMLElement }) => { if (event.target.localName === "protyle-html") { event.stopPropagation(); return; @@ -1667,32 +1663,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => { event.returnValue = false; event.preventDefault(); event.stopPropagation(); - 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) { - let fileText = ""; - localFiles.forEach((item) => { - fileText += `[${path.basename(item).replace(/\]/g, "\\]").replace(/\[/g, "\\[")}](file://${item.replace(/\\/g, "\\\\").replace(/\)/g, "\\)").replace(/\(/g, "\\(")})\n`; - }); - insertHTML(protyle.lute.SpinBlockDOM(fileText), protyle); - } else { - writeText(clipboard.readText()); - setTimeout(() => { - getCurrentWindow().webContents.pasteAndMatchStyle(); - }, 100); - } + pasteAsPlainText(protyle); return; } diff --git a/app/src/types/protyle.d.ts b/app/src/types/protyle.d.ts index de38be472..fe38541ed 100644 --- a/app/src/types/protyle.d.ts +++ b/app/src/types/protyle.d.ts @@ -137,6 +137,10 @@ declare class Lute { private constructor(); + public BlockDOM2Content(text: string): string; + + public InlineMd2BlockDOM(text: string): string; + public SetTextMark(enable: boolean): void; public SetHeadingID(enable: boolean): void;