Vanessa 2024-04-19 10:52:59 +08:00
parent a945cf9c18
commit 6684c77120
3 changed files with 46 additions and 11 deletions

View file

@ -178,3 +178,31 @@ export const genEmptyElement = (zwsp = true, wbr = true, id?: string) => {
element.innerHTML = `<div contenteditable="true" spellcheck="${window.siyuan.config.editor.spellcheck}">${zwsp ? Constants.ZWSP : ""}${wbr ? "<wbr>" : ""}</div><div class="protyle-attr" contenteditable="false">${Constants.ZWSP}</div>`;
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
}

View file

@ -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 = `<svg class="svg"><use xlink:href="#icon${isIFrame ? "Language" : "Both"}"></use></svg> ${isIFrame ? "IFrame" : window.siyuan.languages.widget}`;
getContenteditableElement(embedElement).innerHTML = `<svg class="svg"><use xlink:href="${ buttonElement.querySelector("use").getAttribute("xlink:href")}"></use></svg> ${getLangByType(type)}`;
ghostElement.append(embedElement);
} else {
ghostElement.append(item.cloneNode(true));

View file

@ -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