Vanessa 2025-12-01 19:30:33 +08:00
parent 12ebc120a0
commit 4d2d0a8d4c
2 changed files with 65 additions and 11 deletions

View file

@ -626,6 +626,14 @@ export class Gutter {
selectsElement, selectsElement,
type: "Blocks2Blockquote" type: "Blocks2Blockquote"
})); }));
turnIntoSubmenu.push(this.turnsIntoOne({
menuId: "callout",
icon: "iconCallout",
label: window.siyuan.languages.callout,
protyle,
selectsElement,
type: "Blocks2Callout"
}));
} }
turnIntoSubmenu.push(this.turnsInto({ turnIntoSubmenu.push(this.turnsInto({
menuId: "paragraph", menuId: "paragraph",
@ -1007,6 +1015,14 @@ export class Gutter {
selectsElement: [nodeElement], selectsElement: [nodeElement],
type: "Blocks2Blockquote" type: "Blocks2Blockquote"
})); }));
turnIntoSubmenu.push(this.turnsIntoOne({
menuId: "callout",
icon: "iconCallout",
label: window.siyuan.languages.callout,
protyle,
selectsElement: [nodeElement],
type: "Blocks2Callout"
}));
turnIntoSubmenu.push(this.turnsInto({ turnIntoSubmenu.push(this.turnsInto({
menuId: "heading1", menuId: "heading1",
icon: "iconH1", icon: "iconH1",
@ -1086,6 +1102,14 @@ export class Gutter {
selectsElement: [nodeElement], selectsElement: [nodeElement],
type: "Blocks2Blockquote" type: "Blocks2Blockquote"
})); }));
turnIntoSubmenu.push(this.turnsIntoOne({
menuId: "callout",
icon: "iconCallout",
label: window.siyuan.languages.callout,
protyle,
selectsElement: [nodeElement],
type: "Blocks2Callout"
}));
if (subType !== "h1") { if (subType !== "h1") {
turnIntoSubmenu.push(this.turnsInto({ turnIntoSubmenu.push(this.turnsInto({
menuId: "heading1", menuId: "heading1",
@ -1178,6 +1202,14 @@ export class Gutter {
selectsElement: [nodeElement], selectsElement: [nodeElement],
type: "Blocks2Blockquote" type: "Blocks2Blockquote"
})); }));
turnIntoSubmenu.push(this.turnsIntoOne({
menuId: "callout",
icon: "iconCallout",
label: window.siyuan.languages.callout,
protyle,
selectsElement: [nodeElement],
type: "Blocks2Callout"
}));
if (nodeElement.getAttribute("data-subtype") === "o") { if (nodeElement.getAttribute("data-subtype") === "o") {
turnIntoSubmenu.push(this.turnsOneInto({ turnIntoSubmenu.push(this.turnsOneInto({
menuId: "list", menuId: "list",

View file

@ -162,11 +162,14 @@ const promiseTransaction = () => {
} else if (updateElements.length > 0) { } else if (updateElements.length > 0) {
Array.from(protyle.wysiwyg.element.querySelectorAll(`[data-node-id="${operation.parentID}"]`)).forEach(item => { Array.from(protyle.wysiwyg.element.querySelectorAll(`[data-node-id="${operation.parentID}"]`)).forEach(item => {
if (!isInEmbedBlock(item) && !getFirstBlock(item).contains(range.startContainer)) { if (!isInEmbedBlock(item) && !getFirstBlock(item).contains(range.startContainer)) {
const cloneElement = processClonePHElement(updateElements[0].cloneNode(true) as Element);
// 列表特殊处理 // 列表特殊处理
if (item.firstElementChild?.classList.contains("protyle-action")) { if (item.firstElementChild?.classList.contains("protyle-action")) {
item.firstElementChild.after(processClonePHElement(updateElements[0].cloneNode(true) as Element)); item.firstElementChild.after(cloneElement);
} else if (item.classList.contains("callout")) {
item.querySelector(".callout-content").prepend(cloneElement);
} else { } else {
item.prepend(processClonePHElement(updateElements[0].cloneNode(true) as Element)); item.prepend(cloneElement);
} }
hasFind = true; hasFind = true;
} }
@ -208,10 +211,14 @@ const promiseTransaction = () => {
if (!isInEmbedBlock(item) && !item.contains(range.startContainer)) { if (!isInEmbedBlock(item) && !item.contains(range.startContainer)) {
// 列表特殊处理 // 列表特殊处理
if (item.firstElementChild && item.firstElementChild.classList.contains("protyle-action") && if (item.firstElementChild && item.firstElementChild.classList.contains("protyle-action") &&
item.firstElementChild.nextElementSibling.getAttribute("data-node-id") !== operation.id) { item.firstElementChild.nextElementSibling?.getAttribute("data-node-id") !== operation.id) {
item.firstElementChild.insertAdjacentHTML("afterend", operation.data); item.firstElementChild.insertAdjacentHTML("afterend", operation.data);
cursorElements.push(item.firstElementChild.nextElementSibling); cursorElements.push(item.firstElementChild.nextElementSibling);
} else if (item.firstElementChild && item.firstElementChild.getAttribute("data-node-id") !== operation.id) { } else if (item.classList.contains("callout") &&
item.querySelector('[data-node-id]')?.getAttribute("data-node-id") !== operation.id) {
item.querySelector(".callout-content").insertAdjacentHTML("afterbegin", operation.data);
cursorElements.push(item.querySelector('[data-node-id]'));
} else if (item.firstElementChild.getAttribute("data-node-id") !== operation.id) {
item.insertAdjacentHTML("afterbegin", operation.data); item.insertAdjacentHTML("afterbegin", operation.data);
cursorElements.push(item.firstElementChild); cursorElements.push(item.firstElementChild);
} }
@ -719,11 +726,14 @@ export const onTransaction = (protyle: IProtyle, operation: IOperation, isUndo:
} else { } else {
parentElement.forEach(item => { parentElement.forEach(item => {
if (!isInEmbedBlock(item)) { if (!isInEmbedBlock(item)) {
const cloneElement = processClonePHElement(updateElements[0].cloneNode(true) as Element);
// 列表特殊处理 // 列表特殊处理
if (item.firstElementChild?.classList.contains("protyle-action")) { if (item.firstElementChild?.classList.contains("protyle-action")) {
item.firstElementChild.after(processClonePHElement(updateElements[0].cloneNode(true) as Element)); item.firstElementChild.after(cloneElement);
} else if (item.classList.contains("callout")) {
item.querySelector(".callout-content").prepend(cloneElement);
} else { } else {
item.prepend(processClonePHElement(updateElements[0].cloneNode(true) as Element)); item.prepend(cloneElement);
} }
hasFind = true; hasFind = true;
} }
@ -825,6 +835,9 @@ export const onTransaction = (protyle: IProtyle, operation: IOperation, isUndo:
if (item.firstElementChild?.classList.contains("protyle-action")) { if (item.firstElementChild?.classList.contains("protyle-action")) {
item.firstElementChild.insertAdjacentHTML("afterend", operation.data); item.firstElementChild.insertAdjacentHTML("afterend", operation.data);
cursorElements.push(item.firstElementChild.nextElementSibling); cursorElements.push(item.firstElementChild.nextElementSibling);
} else if (item.classList.contains("callout")) {
item.querySelector(".callout-content").insertAdjacentHTML("afterbegin", operation.data);
cursorElements.push(item.querySelector('[data-node-id]'));
} else { } else {
item.insertAdjacentHTML("afterbegin", operation.data); item.insertAdjacentHTML("afterbegin", operation.data);
cursorElements.push(item.firstElementChild); cursorElements.push(item.firstElementChild);
@ -923,14 +936,15 @@ export const turnsIntoOneTransaction = (options: {
parentElement.classList.add("bq"); parentElement.classList.add("bq");
parentElement.setAttribute("data-node-id", id); parentElement.setAttribute("data-node-id", id);
parentElement.setAttribute("data-type", "NodeBlockquote"); parentElement.setAttribute("data-type", "NodeBlockquote");
parentElement.innerHTML = '<div class="protyle-attr" contenteditable="false"></div>'; parentElement.innerHTML = `<div class="protyle-attr" contenteditable="false">${Constants.ZWSP}</div>`;
} else if (options.type === "Blocks2Callout") { } else if (options.type === "Blocks2Callout") {
// TODO
parentElement = document.createElement("div"); parentElement = document.createElement("div");
parentElement.classList.add("bq"); parentElement.classList.add("callout");
parentElement.setAttribute("data-node-id", id); parentElement.setAttribute("data-node-id", id);
parentElement.setAttribute("data-type", "NodeBlockquote"); parentElement.setAttribute("data-type", "NodeCallout");
parentElement.innerHTML = '<div class="protyle-attr" contenteditable="false"></div>'; parentElement.setAttribute("contenteditable", "false");
parentElement.setAttribute("data-subtype", "NOTE");
parentElement.innerHTML = `<div class="callout-info"><span class="callout-icon">✏️</span><span class="callout-title">Note</span></div><div class="callout-content"></div><div class="protyle-attr" contenteditable="false">${Constants.ZWSP}</div>`;
} else if (options.type.endsWith("Ls")) { } else if (options.type.endsWith("Ls")) {
parentElement = document.createElement("div"); parentElement = document.createElement("div");
parentElement.classList.add("list"); parentElement.classList.add("list");
@ -989,6 +1003,14 @@ export const turnsIntoOneTransaction = (options: {
parentID: parentElement.children[index].getAttribute("data-node-id") parentID: parentElement.children[index].getAttribute("data-node-id")
}); });
parentElement.children[index].firstElementChild.after(item); parentElement.children[index].firstElementChild.after(item);
} else if (options.type === "Blocks2Callout") {
doOperations.push({
action: "move",
id: itemId,
previousID: itemPreviousId,
parentID: id
});
parentElement.querySelector(".callout-content").insertAdjacentElement("beforeend", item);
} else { } else {
doOperations.push({ doOperations.push({
action: "move", action: "move",