diff --git a/app/src/assets/scss/protyle/_wysiwyg.scss b/app/src/assets/scss/protyle/_wysiwyg.scss index 23ddc88236..e392561b25 100644 --- a/app/src/assets/scss/protyle/_wysiwyg.scss +++ b/app/src/assets/scss/protyle/_wysiwyg.scss @@ -200,6 +200,7 @@ border-bottom: 1px solid; color: var(--b3-protyle-inline-tag-color); transition: var(--b3-transition); + cursor: pointer; // 预览导出无此元素,只读和编辑状态都需要点击 https://github.com/siyuan-note/siyuan/issues/11854 } span[data-type~="a"] { @@ -601,7 +602,6 @@ // 导出 html 不需要编辑样式 .protyle-wysiwyg[data-readonly="false"] { span[data-type~="inline-math"], - span[data-type~="tag"], .protyle-action__language, .render-node { cursor: pointer; diff --git a/app/src/menus/protyle.ts b/app/src/menus/protyle.ts index cc23bba52d..eb6c853ad3 100644 --- a/app/src/menus/protyle.ts +++ b/app/src/menus/protyle.ts @@ -712,7 +712,7 @@ export const contentMenu = (protyle: IProtyle, nodeElement: Element) => { if (inlineTypes.includes("code") || inlineTypes.includes("kbd")) { window.siyuan.menus.menu.append(new MenuItem({ label: window.siyuan.languages.copy, - icon:"iconCopy", + icon: "iconCopy", click() { writeText(protyle.lute.BlockDOM2StdMd(inlineElement.outerHTML)); } @@ -2092,7 +2092,7 @@ export const tableMenu = (protyle: IProtyle, nodeElement: Element, cellElement: return {menus, removeMenus, insertMenus, otherMenus, other2Menus}; }; -export const setFold = (protyle: IProtyle, nodeElement: Element, isOpen?: boolean, isRemove?: boolean) => { +export const setFold = (protyle: IProtyle, nodeElement: Element, isOpen?: boolean, isRemove?: boolean, addLoading = true) => { window.sout.tracker("invoked"); if (nodeElement.getAttribute("data-type") === "NodeListItem" && nodeElement.childElementCount < 4) { // 没有子列表或多个块的列表项不进行折叠 @@ -2139,7 +2139,9 @@ export const setFold = (protyle: IProtyle, nodeElement: Element, isOpen?: boolea const id = nodeElement.getAttribute("data-node-id"); if (nodeElement.getAttribute("data-type") === "NodeHeading") { if (hasFold) { - nodeElement.insertAdjacentHTML("beforeend", '
'); + if (addLoading) { + nodeElement.insertAdjacentHTML("beforeend", '
'); + } transaction(protyle, [{ action: "unfoldHeading", id, diff --git a/app/src/protyle/wysiwyg/input.ts b/app/src/protyle/wysiwyg/input.ts index b9422b707a..3d0fa78449 100644 --- a/app/src/protyle/wysiwyg/input.ts +++ b/app/src/protyle/wysiwyg/input.ts @@ -14,6 +14,7 @@ import {hasClosestByAttribute, hasClosestByClassName} from "../util/hasClosest"; import {fetchPost, fetchSyncPost} from "../../util/fetch"; import {headingTurnIntoList, turnIntoTaskList} from "./turnIntoList"; import {updateAVName} from "../render/av/action"; +import {setFold} from "../../menus/protyle"; export const input = async (protyle: IProtyle, blockElement: HTMLElement, range: Range, needRender = true, event?: InputEvent) => { if (!blockElement.parentElement) { @@ -64,7 +65,8 @@ export const input = async (protyle: IProtyle, blockElement: HTMLElement, range: } } const id = blockElement.getAttribute("data-node-id"); - if (type !== "NodeCodeBlock" && (editElement.innerHTML.endsWith("\n") || editElement.innerHTML.endsWith("\n\n"))) { + if ((type !== "NodeCodeBlock" && type !== "NodeHeading") && // https://github.com/siyuan-note/siyuan/issues/11851 + (editElement.innerHTML.endsWith("\n") || editElement.innerHTML.endsWith("\n\n"))) { // 软换行 updateTransaction(protyle, id, blockElement.outerHTML, protyle.wysiwyg.lastHTMLs[id] || blockElement.outerHTML.replace("\n", "")); wbrElement.remove(); @@ -156,6 +158,12 @@ export const input = async (protyle: IProtyle, blockElement: HTMLElement, range: ) { log("SpinBlockDOM", blockElement.outerHTML, "argument", protyle.options.debugger); log("SpinBlockDOM", html, "result", protyle.options.debugger); + if (blockElement.getAttribute("data-type") === "NodeHeading" && blockElement.getAttribute("fold") === "1" && + tempElement.content.firstElementChild.getAttribute("data-subtype") !== blockElement.dataset.subtype) { + setFold(protyle, blockElement, undefined, undefined, false); + html = html.replace(' fold="1"', ""); + protyle.wysiwyg.lastHTMLs[id] = blockElement.outerHTML; + } let scrollLeft: number; if (blockElement.classList.contains("table")) { scrollLeft = blockElement.firstElementChild.scrollLeft; diff --git a/app/src/protyle/wysiwyg/transaction.ts b/app/src/protyle/wysiwyg/transaction.ts index 3df0301799..3cf2535e25 100644 --- a/app/src/protyle/wysiwyg/transaction.ts +++ b/app/src/protyle/wysiwyg/transaction.ts @@ -892,7 +892,7 @@ export const turnsIntoTransaction = (options: { selectsElement.forEach((item, index) => { if ((options.type === "Blocks2Ps" || options.type === "Blocks2Hs") && item.getAttribute("data-type") === "NodeHeading" && item.getAttribute("fold") === "1") { - setFold(options.protyle, item); + setFold(options.protyle, item, undefined, undefined, false); } item.classList.remove("protyle-wysiwyg--select"); item.removeAttribute("select-start"); @@ -1116,18 +1116,20 @@ export const transaction = (protyle: IProtyle, doOperations: IOperation[], undoO protyle.model.headElement.classList.remove("item--unupdate"); } protyle.updated = true; - if (needDebounce) { protyle.undo.replace(doOperations, protyle); } else { protyle.undo.add(doOperations, undoOperations, protyle); } } + window.clearTimeout(transactionsTimeout); // 加速折叠 https://github.com/siyuan-note/siyuan/issues/11828 if (doOperations.length === 1 && ( doOperations[0].action === "unfoldHeading" || (doOperations[0].action === "setAttrs" && doOperations[0].data.startsWith('{"fold":')) )) { + // 防止 needDebounce 为 true + protyle.transactionTime = time + Constants.TIMEOUT_INPUT * 2; fetchPost("/api/transactions", { session: protyle.id, app: Constants.SIYUAN_APPID, @@ -1168,7 +1170,6 @@ export const transaction = (protyle: IProtyle, doOperations: IOperation[], undoO }); } protyle.transactionTime = time; - window.clearTimeout(transactionsTimeout); transactionsTimeout = window.setTimeout(() => { promiseTransaction(); }, Constants.TIMEOUT_INPUT * 2); diff --git a/app/src/search/util.ts b/app/src/search/util.ts index 017e7a5b3a..0960d8fbc0 100644 --- a/app/src/search/util.ts +++ b/app/src/search/util.ts @@ -1444,7 +1444,7 @@ ${getAttr(item)} config.method === 0 ? `
- ${window.siyuan.languages.newFile} ${(element.querySelector("#searchInput") as HTMLInputElement).value} + ${window.siyuan.languages.newFile} ${escapeHtml((element.querySelector("#searchInput") as HTMLInputElement).value)} ${window.siyuan.languages.enterNew}