diff --git a/app/src/config/search.ts b/app/src/config/search.ts index 05d370146..4d976b5d1 100644 --- a/app/src/config/search.ts +++ b/app/src/config/search.ts @@ -15,7 +15,7 @@ export const initConfigSearch = (element: HTMLElement) => { "editor", "md2", "md3", "md12", "md16", "md27", "md28", "md29", "md30", "md31", "md32", "md33", "md34", "md39", "md40", "fontSizeTip", "fontSize", "font", "font1", "generateHistory", "generateHistoryInterval", "historyRetentionDays", "historyRetentionDaysTip", "clearHistory", "katexMacros", "katexMacrosTip", - "editReadonly", "editReadonlyTip" + "editReadonly", "editReadonlyTip", "embedBlockBreadcrumb", "embedBlockBreadcrumbTip" ]), // 文档树 diff --git a/app/src/protyle/gutter/index.ts b/app/src/protyle/gutter/index.ts index 5e7e5bc1e..b2a8d4652 100644 --- a/app/src/protyle/gutter/index.ts +++ b/app/src/protyle/gutter/index.ts @@ -1165,6 +1165,7 @@ export class Gutter { }).element); } else if (type === "NodeBlockQueryEmbed" && !window.siyuan.config.readonly && !window.siyuan.config.editor.readOnly) { window.siyuan.menus.menu.append(new MenuItem({type: "separator"}).element); + const breadcrumb = nodeElement.getAttribute("breadcrumb"); window.siyuan.menus.menu.append(new MenuItem({ id: "assetSubMenu", type: "submenu", @@ -1183,6 +1184,25 @@ export class Gutter { click() { protyle.toolbar.showRender(protyle, nodeElement); } + }, { + label: `
${window.siyuan.languages.embedBlockBreadcrumb} +
`, + bind(element) { + element.addEventListener("click", (event: MouseEvent & { target: HTMLElement }) => { + const inputElement = element.querySelector("input"); + if (event.target.tagName !== "INPUT") { + inputElement.checked = !inputElement.checked; + } + nodeElement.setAttribute("breadcrumb", inputElement.checked.toString()); + fetchPost("/api/attr/setBlockAttrs", { + id, + attrs: {breadcrumb: inputElement.checked.toString()} + }); + nodeElement.removeAttribute("data-render") + blockRender(protyle, nodeElement); + window.siyuan.menus.menu.remove(); + }); + } }] }).element); } else if (type === "NodeHeading" && !window.siyuan.config.readonly && !window.siyuan.config.editor.readOnly) { diff --git a/app/src/protyle/markdown/blockRender.ts b/app/src/protyle/markdown/blockRender.ts index 1c24533a0..23fdce070 100644 --- a/app/src/protyle/markdown/blockRender.ts +++ b/app/src/protyle/markdown/blockRender.ts @@ -26,10 +26,17 @@ export const blockRender = (protyle: IProtyle, element: Element) => { ${item.lastElementChild.outerHTML}`; const content = Lute.UnEscapeHTMLStr(item.getAttribute("data-content")); + let breadcrumb: boolean | string = item.getAttribute("breadcrumb"); + if (breadcrumb) { + breadcrumb = breadcrumb === "true" + } else { + breadcrumb = window.siyuan.config.editor.embedBlockBreadcrumb + } fetchPost("/api/search/searchEmbedBlock", { stmt: content, headingMode: item.getAttribute("custom-heading-mode") === "1" ? 1 : 0, - excludeIDs: [item.getAttribute("data-node-id"), protyle.block.rootID] + excludeIDs: [item.getAttribute("data-node-id"), protyle.block.rootID], + breadcrumb }, (response) => { const rotateElement = item.querySelector(".fn__rotate"); if (rotateElement) { @@ -37,7 +44,11 @@ export const blockRender = (protyle: IProtyle, element: Element) => { } let html = ""; response.data.blocks.forEach((blocksItem: { block: IBlock, blockPaths: IBreadcrumb[] }) => { - html += `
${genBreadcrumb(blocksItem.blockPaths, true)}${blocksItem.block.content}
`; + let breadcrumbHTML = ""; + if (blocksItem.blockPaths.length !== 0) { + breadcrumbHTML = genBreadcrumb(blocksItem.blockPaths, true); + } + html += `
${breadcrumbHTML}${blocksItem.block.content}
`; }); item.setAttribute("data-render", "true"); if (response.data.blocks.length > 0) {