diff --git a/themes/common.js b/themes/common.js index 6d45961b..044dba29 100644 --- a/themes/common.js +++ b/themes/common.js @@ -239,14 +239,20 @@ function do_something_but_not_too_frequently(min_interval, func) { const now = Date.now(); if (!lastInvocationTime || (now - lastInvocationTime) >= min_interval) { lastInvocationTime = now; - func.apply(this, args); + // 现在就执行 + setTimeout(() => { + func.apply(this, lastArgs); + }, 0); } else if (!timeoutID) { + // 等一会执行 timeoutID = setTimeout(() => { timeoutID = null; lastInvocationTime = Date.now(); func.apply(this, lastArgs); }, min_interval - (now - lastInvocationTime)); - } + } else { + // 压根不执行 + } } } @@ -258,7 +264,7 @@ function chatbotContentChanged(attempt = 1, force = false) { }, i === 0 ? 0 : 200); } - const run_mermaid_render = do_something_but_not_too_frequently(500, function () { + const run_mermaid_render = do_something_but_not_too_frequently(1000, function () { const blocks = document.querySelectorAll(`pre.mermaid, diagram-div`); if (blocks.length == 0) { return; } uml("mermaid"); diff --git a/themes/mermaid_loader.js b/themes/mermaid_loader.js index d719f98f..183cbc33 100644 --- a/themes/mermaid_loader.js +++ b/themes/mermaid_loader.js @@ -54,7 +54,7 @@ const uml = async className => { function createOrUpdateHyperlink(parentElement, linkText, linkHref) { // Search for an existing anchor element within the parentElement let existingAnchor = parentElement.querySelector("a"); - + // Check if an anchor element already exists if (existingAnchor) { // Update the hyperlink reference if it's different from the current one @@ -63,7 +63,7 @@ const uml = async className => { } // Update the target attribute to ensure it opens in a new tab existingAnchor.target = '_blank'; - + // If the text must be dynamic, uncomment and use the following line: // existingAnchor.textContent = linkText; } else { @@ -76,6 +76,15 @@ const uml = async className => { } } + function removeLastLine(str) { + // 将字符串按换行符分割成数组 + var lines = str.split('\n'); + lines.pop(); + // 将数组重新连接成字符串,并按换行符连接 + var result = lines.join('\n'); + return result; + } + // 给出配置 Provide a default config in case one is not specified const defaultConfig = { startOnLoad: false, @@ -93,55 +102,84 @@ const uml = async className => { messageFontSize: "16px" } } - // console.log('启动渲染'); - // 加载配置 Load up the config - mermaid.mermaidAPI.globalReset() // 全局复位 - const config = (typeof mermaidConfig === "undefined") ? defaultConfig : mermaidConfig - mermaid.initialize(config) + const Module = await import('./file=themes/mermaid_editor.js'); - // 查找需要渲染的元素 Find all of our Mermaid sources and render them. - const blocks = document.querySelectorAll(`pre.${className}, diagram-div`); - for (let i = 0; i < blocks.length; i++) { - var block = blocks[i] - ///////////////////////////////////////////////////////////////// - var code = getFromCode(block); - let code2Element = document.createElement("code2"); // 创建一个新的code2元素 - let existingCode2Element = block.querySelector("code2"); // 如果block下已存在code2元素,则获取它 - let codeContent = block.querySelector("code").textContent; // 获取code元素中的文本内容 - if(existingCode2Element){ // 如果block下已存在code2元素 - existingCode2Element.style.display = "none"; - if(existingCode2Element.textContent !== codeContent){ - existingCode2Element.textContent = codeContent; // 如果现有的code2元素中的内容与code元素中的内容不同,更新code2元素中的内容 - } - else{ - continue; - } - } else { // 如果不存在code2元素,则将code元素中的内容添加到新创建的code2元素中 - code2Element.style.display = "none"; - code2Element.textContent = codeContent; - block.appendChild(code2Element); // 将新创建的code2元素添加到block中 + function do_render(block, code, codeContent) { + var rendered_content = mermaid.render(`_diagram_${i}`, code); + ////////////////////////////// 记录有哪些代码已经被渲染了 /////////////////////////////////// + let codeFinishRenderElement = block.querySelector("code_finish_render"); // 如果block下已存在code_already_rendered元素,则获取它 + if (codeFinishRenderElement) { // 如果block下已存在code_already_rendered元素 + codeFinishRenderElement.style.display = "none"; + } else { + // 如果不存在code_finish_render元素,则将code元素中的内容添加到新创建的code_finish_render元素中 + let codeFinishRenderElementNew = document.createElement("code_finish_render"); // 创建一个新的code_already_rendered元素 + codeFinishRenderElementNew.style.display = "none"; + codeFinishRenderElementNew.textContent = ""; + block.appendChild(codeFinishRenderElementNew); // 将新创建的code_already_rendered元素添加到block中 + codeFinishRenderElement = codeFinishRenderElementNew; } - ///////////////////////////////////////////////////////////////// - //尝试获取已存在的