diff --git a/app/src/block/util.ts b/app/src/block/util.ts index 8908f2740..c543c5001 100644 --- a/app/src/block/util.ts +++ b/app/src/block/util.ts @@ -178,3 +178,31 @@ export const genEmptyElement = (zwsp = true, wbr = true, id?: string) => { element.innerHTML = `
${zwsp ? Constants.ZWSP : ""}${wbr ? "" : ""}
${Constants.ZWSP}
`; return element; }; + +export const getLangByType = (type: string) => { + let lang = type; + switch (type) { + case "NodeIFrame": + lang = "IFrame"; + break; + case "NodeAttributeView": + lang = window.siyuan.languages.database; + break; + case "NodeThematicBreak": + lang = window.siyuan.languages.line; + break; + case "NodeWidget": + lang = window.siyuan.languages.widget; + break; + case "NodeVideo": + lang = window.siyuan.languages.video; + break; + case "NodeAudio": + lang = window.siyuan.languages.audio; + break; + case "NodeBlockQueryEmbed": + lang = window.siyuan.languages.blockEmbed; + break; + } + return lang +} diff --git a/app/src/protyle/gutter/index.ts b/app/src/protyle/gutter/index.ts index 1d4f72a66..b0f735e7f 100644 --- a/app/src/protyle/gutter/index.ts +++ b/app/src/protyle/gutter/index.ts @@ -28,7 +28,7 @@ import {removeEmbed} from "../wysiwyg/removeEmbed"; import {getContenteditableElement, getTopAloneElement, isNotEditBlock} from "../wysiwyg/getBlock"; import * as dayjs from "dayjs"; import {fetchPost, fetchSyncPost} from "../../util/fetch"; -import {cancelSB, genEmptyElement, insertEmptyBlock, jumpToParentNext} from "../../block/util"; +import {cancelSB, genEmptyElement, getLangByType, insertEmptyBlock, jumpToParentNext} from "../../block/util"; import {countBlockWord} from "../../layout/status"; import {Constants} from "../../constants"; import {mathRender} from "../render/mathRender"; @@ -98,11 +98,10 @@ export class Gutter { ghostElement.className = protyle.wysiwyg.element.className; selectElements.forEach(item => { const type = item.getAttribute("data-type"); - if (["NodeIFrame", "NodeWidget"].includes(type)) { + if (item.querySelector("iframe")) { const embedElement = genEmptyElement(); embedElement.classList.add("protyle-wysiwyg--select"); - const isIFrame = type === "NodeIFrame"; - getContenteditableElement(embedElement).innerHTML = ` ${isIFrame ? "IFrame" : window.siyuan.languages.widget}`; + getContenteditableElement(embedElement).innerHTML = ` ${getLangByType(type)}`; ghostElement.append(embedElement); } else { ghostElement.append(item.cloneNode(true)); diff --git a/app/src/protyle/wysiwyg/index.ts b/app/src/protyle/wysiwyg/index.ts index 49c511a6f..9b37b486a 100644 --- a/app/src/protyle/wysiwyg/index.ts +++ b/app/src/protyle/wysiwyg/index.ts @@ -737,12 +737,11 @@ export class WYSIWYG { let moveCellElement: HTMLElement; let startFirstElement: Element; let endLastElement: Element; + this.element.querySelectorAll("iframe").forEach(item => { + item.style.pointerEvents = "none" + }) documentSelf.onmousemove = (moveEvent: MouseEvent) => { const moveTarget = moveEvent.target as HTMLElement; - if (moveTarget.tagName === "IFRAME") { - moveTarget.style.pointerEvents = "none"; - return; - } // table cell select if (!protyle.disabled && tableBlockElement && tableBlockElement.contains(moveTarget) && !hasClosestByClassName(tableBlockElement, "protyle-wysiwyg__embed")) { if ((moveTarget.tagName === "TH" || moveTarget.tagName === "TD") && !moveTarget.isSameNode(target) && (!moveCellElement || !moveCellElement.isSameNode(moveTarget))) { @@ -906,6 +905,15 @@ export class WYSIWYG { } let selectElements: Element[] = []; let currentElement: Element | boolean = firstBlockElement; + + if (currentElement) { + // 从下网上选遇到嵌入块时,选中整个嵌入块 + const embedElement = hasClosestByAttribute(currentElement, "data-type", "NodeBlockQueryEmbed") + if (embedElement) { + currentElement = embedElement + } + } + let hasJump = false; const selectBottom = endLastElement ? endLastElement.getBoundingClientRect().bottom : (newTop + newHeight); while (currentElement) { @@ -975,6 +983,9 @@ export class WYSIWYG { documentSelf.onselect = null; startFirstElement = undefined; endLastElement = undefined; + this.element.querySelectorAll("iframe").forEach(item => { + item.style.pointerEvents = ""; + }) protyle.selectElement.classList.add("fn__none"); protyle.selectElement.removeAttribute("style"); if (!protyle.disabled && tableBlockElement) { @@ -1198,9 +1209,6 @@ export class WYSIWYG { const selectElement = protyle.wysiwyg.element.querySelectorAll(".protyle-wysiwyg--select"); selectElement.forEach(item => { ids.push(item.getAttribute("data-node-id")); - if (item.classList.contains("iframe")) { - item.querySelector("iframe").style.pointerEvents = ""; - } }); countBlockWord(ids); // 划选后不能存在跨块的 range https://github.com/siyuan-note/siyuan/issues/4473