From a477b70c6d1d572e7552e0b5792b561250bf2020 Mon Sep 17 00:00:00 2001 From: Vanessa Date: Wed, 22 Nov 2023 11:30:06 +0800 Subject: [PATCH] :art: fix https://github.com/siyuan-note/siyuan/issues/9648 --- app/src/protyle/render/blockRender.ts | 137 +++++++++++++++++--------- app/src/util/fetch.ts | 1 + 2 files changed, 92 insertions(+), 46 deletions(-) diff --git a/app/src/protyle/render/blockRender.ts b/app/src/protyle/render/blockRender.ts index d6770f5f3..9eb17def3 100644 --- a/app/src/protyle/render/blockRender.ts +++ b/app/src/protyle/render/blockRender.ts @@ -41,53 +41,98 @@ export const blockRender = (protyle: IProtyle, element: Element, top?: number) = if (sbElement) { breadcrumb = false; } - fetchPost("/api/search/searchEmbedBlock", { - embedBlockID: item.getAttribute("data-node-id"), - stmt: content, - headingMode: item.getAttribute("custom-heading-mode") === "1" ? 1 : 0, - excludeIDs: [item.getAttribute("data-node-id"), protyle.block.rootID], - breadcrumb - }, (response) => { - const rotateElement = item.querySelector(".fn__rotate"); - if (rotateElement) { - rotateElement.classList.remove("fn__rotate"); - } - let html = ""; - response.data.blocks.forEach((blocksItem: { block: IBlock, blockPaths: IBreadcrumb[] }) => { - let breadcrumbHTML = ""; - if (blocksItem.blockPaths.length !== 0) { - breadcrumbHTML = genBreadcrumb(blocksItem.blockPaths, true); + if (content.startsWith("//!js")) { + try { + const includeIDs = new Function(content)(); + if (includeIDs instanceof Promise) { + includeIDs.then((promiseIds) => { + if (Array.isArray(promiseIds)) { + fetchPost("/api/search/getEmbedBlock", { + embedBlockID: item.getAttribute("data-node-id"), + includeIDs: promiseIds, + headingMode: item.getAttribute("custom-heading-mode") === "1" ? 1 : 0, + breadcrumb + }, (response) => { + renderEmbed(response.data.blocks || [], protyle, item, top); + }); + } else { + renderEmbed([], protyle, item, top); + } + }).catch(() => { + renderEmbed([], protyle, item, top); + }) + } else if (Array.isArray(includeIDs)) { + fetchPost("/api/search/getEmbedBlock", { + embedBlockID: item.getAttribute("data-node-id"), + includeIDs, + headingMode: item.getAttribute("custom-heading-mode") === "1" ? 1 : 0, + breadcrumb + }, (response) => { + renderEmbed(response.data.blocks || [], protyle, item, top); + }); + } else { + renderEmbed([], protyle, item, top); } - html += `
${breadcrumbHTML}${blocksItem.block.content}
`; + console.log(includeIDs); + } catch (e) { + renderEmbed([], protyle, item, top); + } + } else { + fetchPost("/api/search/searchEmbedBlock", { + embedBlockID: item.getAttribute("data-node-id"), + stmt: content, + headingMode: item.getAttribute("custom-heading-mode") === "1" ? 1 : 0, + excludeIDs: [item.getAttribute("data-node-id"), protyle.block.rootID], + breadcrumb + }, (response) => { + renderEmbed(response.data.blocks, protyle, item, top) }); - if (response.data.blocks.length > 0) { - item.lastElementChild.insertAdjacentHTML("beforebegin", html + - // 辅助上下移动时进行选中 - `
${Constants.ZWSP}
`); - } else { - item.lastElementChild.insertAdjacentHTML("beforebegin", `
${window.siyuan.languages.refExpired}
-
${Constants.ZWSP}
`); - } - - processRender(item); - highlightRender(item); - avRender(item, protyle); - if (top) { - // 前进后退定位 https://ld246.com/article/1667652729995 - protyle.contentElement.scrollTop = top; - } - let maxDeep = 0; - let deepEmbedElement: false | HTMLElement = item; - while (maxDeep < 4 && deepEmbedElement) { - deepEmbedElement = hasClosestByAttribute(deepEmbedElement.parentElement, "data-type", "NodeBlockQueryEmbed"); - maxDeep++; - } - if (maxDeep < 4) { - item.querySelectorAll('[data-type="NodeBlockQueryEmbed"]').forEach(embedElement => { - blockRender(protyle, embedElement); - }); - } - item.style.height = ""; - }); + } }); }; + +const renderEmbed = (blocks: { + block: IBlock, + blockPaths: IBreadcrumb[] +}[], protyle: IProtyle, item: HTMLElement, top?: number) => { + const rotateElement = item.querySelector(".fn__rotate"); + if (rotateElement) { + rotateElement.classList.remove("fn__rotate"); + } + let html = ""; + blocks.forEach((blocksItem) => { + let breadcrumbHTML = ""; + if (blocksItem.blockPaths.length !== 0) { + breadcrumbHTML = genBreadcrumb(blocksItem.blockPaths, true); + } + html += `
${breadcrumbHTML}${blocksItem.block.content}
`; + }); + if (blocks.length > 0) { + item.lastElementChild.insertAdjacentHTML("beforebegin", html + + // 辅助上下移动时进行选中 + `
${Constants.ZWSP}
`); + } else { + item.lastElementChild.insertAdjacentHTML("beforebegin", `
${window.siyuan.languages.refExpired}
+
${Constants.ZWSP}
`); + } + + processRender(item); + highlightRender(item); + avRender(item, protyle); + if (top) { + // 前进后退定位 https://ld246.com/article/1667652729995 + protyle.contentElement.scrollTop = top; + } + let maxDeep = 0; + let deepEmbedElement: false | HTMLElement = item; + while (maxDeep < 4 && deepEmbedElement) { + deepEmbedElement = hasClosestByAttribute(deepEmbedElement.parentElement, "data-type", "NodeBlockQueryEmbed"); + maxDeep++; + } + if (maxDeep < 4) { + item.querySelectorAll('[data-type="NodeBlockQueryEmbed"]').forEach(embedElement => { + blockRender(protyle, embedElement); + }); + } + item.style.height = ""; +} diff --git a/app/src/util/fetch.ts b/app/src/util/fetch.ts index 7da643622..95b12408a 100644 --- a/app/src/util/fetch.ts +++ b/app/src/util/fetch.ts @@ -101,3 +101,4 @@ export const fetchGet = (url: string, cb: (response: IWebSocketData | IEmoji[]) }); }; +window.fetchSyncPost = fetchSyncPost