mirror of
https://github.com/siyuan-note/siyuan.git
synced 2026-01-28 19:26:09 +01:00
117 lines
5.3 KiB
TypeScript
117 lines
5.3 KiB
TypeScript
import {getIconByType} from "../../editor/getIcon";
|
|
import {removeLoading} from "../ui/initUI";
|
|
import {fetchPost} from "../../util/fetch";
|
|
import {Constants} from "../../constants";
|
|
import {processRender} from "../util/processCode";
|
|
import {highlightRender} from "../render/highlightRender";
|
|
import {blockRender} from "../render/blockRender";
|
|
import {disabledForeverProtyle, disabledProtyle} from "../util/onGet";
|
|
import {avRender} from "../render/av/render";
|
|
|
|
export const renderBacklink = (protyle: IProtyle, backlinkData: {
|
|
blockPaths: IBreadcrumb[],
|
|
dom: string,
|
|
expand: boolean
|
|
}[]) => {
|
|
protyle.block.showAll = true;
|
|
let html = "";
|
|
backlinkData.forEach(item => {
|
|
html += genBreadcrumb(item.blockPaths) + setBacklinkFold(item.dom, item.expand);
|
|
});
|
|
protyle.wysiwyg.element.innerHTML = html;
|
|
processRender(protyle.wysiwyg.element);
|
|
highlightRender(protyle.wysiwyg.element);
|
|
avRender(protyle.wysiwyg.element, protyle);
|
|
blockRender(protyle, protyle.wysiwyg.element);
|
|
removeLoading(protyle);
|
|
if (window.siyuan.config.readonly || window.siyuan.config.editor.readOnly) {
|
|
disabledProtyle(protyle);
|
|
}
|
|
};
|
|
|
|
// 传递型折叠处理
|
|
export const foldPassiveType = (expand: boolean, element: HTMLElement | DocumentFragment) => {
|
|
if (element.firstElementChild.classList.contains("li")) {
|
|
if (expand) {
|
|
element.querySelectorAll(".li .li").forEach(item => {
|
|
if (item.childElementCount > 3) {
|
|
item.setAttribute("fold", "1");
|
|
}
|
|
});
|
|
} else {
|
|
element.firstElementChild.setAttribute("fold", "1");
|
|
}
|
|
} else if (element.firstElementChild.getAttribute("data-type") === "NodeHeading") {
|
|
Array.from(element.children).forEach((item, index) => {
|
|
if ((expand && index > 2) || (!expand && index > 1)) {
|
|
if ((expand && index === 3) || (!expand && index === 2)) {
|
|
item.insertAdjacentHTML("beforebegin", '<div style="max-width: 100%;justify-content: center;" contenteditable="false" class="protyle-breadcrumb__item"><svg><use xlink:href="#iconMore"></use></svg></div>');
|
|
}
|
|
item.classList.add("fn__none");
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
const setBacklinkFold = (html: string, expand: boolean) => {
|
|
const tempDom = document.createElement("template");
|
|
tempDom.innerHTML = html;
|
|
foldPassiveType(expand, tempDom.content);
|
|
return tempDom.innerHTML;
|
|
};
|
|
|
|
export const loadBreadcrumb = (protyle: IProtyle, element: HTMLElement) => {
|
|
fetchPost("/api/filetree/getDoc", {
|
|
id: element.getAttribute("data-id"),
|
|
size: Constants.SIZE_GET_MAX,
|
|
}, getResponse => {
|
|
element.parentElement.querySelector(".protyle-breadcrumb__item--active").classList.remove("protyle-breadcrumb__item--active");
|
|
element.classList.add("protyle-breadcrumb__item--active");
|
|
let nextElement = element.parentElement.nextElementSibling;
|
|
while (nextElement && !nextElement.classList.contains("protyle-breadcrumb__bar")) {
|
|
const tempElement = nextElement;
|
|
nextElement = nextElement.nextElementSibling;
|
|
tempElement.remove();
|
|
}
|
|
element.parentElement.insertAdjacentHTML("afterend", setBacklinkFold(getResponse.data.content, true));
|
|
processRender(element.parentElement.parentElement);
|
|
avRender(element.parentElement.parentElement, protyle);
|
|
blockRender(protyle, element.parentElement.parentElement);
|
|
if (getResponse.data.isSyncing) {
|
|
disabledForeverProtyle(protyle);
|
|
} else if (window.siyuan.config.readonly || window.siyuan.config.editor.readOnly) {
|
|
disabledProtyle(protyle);
|
|
} else if (element.parentElement.parentElement.classList.contains("protyle-wysiwyg__embed")) {
|
|
// 嵌入块
|
|
element.parentElement.parentElement.querySelectorAll('[contenteditable="true"][spellcheck]').forEach(item => {
|
|
item.setAttribute("contenteditable", "false");
|
|
});
|
|
}
|
|
});
|
|
};
|
|
|
|
export const getBacklinkHeadingMore = (moreElement: HTMLElement) => {
|
|
let nextElement = moreElement.nextElementSibling;
|
|
while (nextElement && !nextElement.classList.contains("protyle-breadcrumb__bar")) {
|
|
nextElement.classList.remove("fn__none");
|
|
nextElement = nextElement.nextElementSibling;
|
|
}
|
|
moreElement.remove();
|
|
};
|
|
|
|
export const genBreadcrumb = (blockPaths: IBreadcrumb[], renderFirst = false) => {
|
|
let html = "";
|
|
blockPaths.forEach((item, index) => {
|
|
if (index === 0 && !renderFirst) {
|
|
return;
|
|
}
|
|
html += `<span class="protyle-breadcrumb__item${index === blockPaths.length - 1 ? " protyle-breadcrumb__item--active" : ""}" data-id="${item.id}">
|
|
<svg class="popover__block" data-id="${item.id}"><use xlink:href="#${getIconByType(item.type, item.subType)}"></use></svg>
|
|
<span class="protyle-breadcrumb__text" title="${item.name}">${item.name}</span>
|
|
</span>`;
|
|
if (index !== blockPaths.length - 1) {
|
|
html += '<svg class="protyle-breadcrumb__arrow"><use xlink:href="#iconRight"></use></svg>';
|
|
}
|
|
});
|
|
return `<div contenteditable="false" style="margin-bottom: 8px" class="protyle-breadcrumb__bar protyle-breadcrumb__bar--nowrap">${html}</div>`;
|
|
};
|