vditor
Version:
♏ 易于使用的 Markdown 编辑器,为适配不同的应用场景而生
61 lines (56 loc) • 3.4 kB
text/typescript
import {code160to32} from "../util/code160to32";
import {Constants} from "../constants";
export const codeRender = (element: HTMLElement, option?: IHljs) => {
Array.from<HTMLElement>(element.querySelectorAll("pre > code")).filter((e, index) => {
if (e.parentElement.classList.contains("vditor-wysiwyg__pre") ||
e.parentElement.classList.contains("vditor-ir__marker--pre")) {
return false;
}
if (e.classList.contains("language-mermaid") || e.classList.contains("language-flowchart") ||
e.classList.contains("language-echarts") || e.classList.contains("language-mindmap") ||
e.classList.contains("language-plantuml") || e.classList.contains("language-markmap") ||
e.classList.contains("language-abc") || e.classList.contains("language-graphviz") ||
e.classList.contains("language-math") || e.classList.contains("language-smiles")) {
return false;
}
if (e.style.maxHeight.indexOf("px") > -1) {
return false;
}
// 避免预览区在渲染后由于代码块过多产生性能问题 https://github.com/b3log/vditor/issues/67
if (element.classList.contains("vditor-preview") && index > 5) {
return false;
}
return true;
}).forEach((e) => {
let codeText = e.innerText;
if (e.classList.contains("highlight-chroma")) {
const codeElement = e.cloneNode(true) as HTMLElement;
codeElement.querySelectorAll(".highlight-ln").forEach((item: HTMLElement) => {
item.remove();
});
codeText = codeElement.innerText;
} else if (codeText.endsWith("\n")) {
codeText = codeText.substr(0, codeText.length - 1)
}
let iconHTML = '<svg><use xlink:href="#vditor-icon-copy"></use></svg>';
if (!document.getElementById("vditorIconScript")) {
iconHTML = '<svg viewBox="0 0 32 32"><path d="M22.545-0h-17.455c-1.6 0-2.909 1.309-2.909 2.909v20.364h2.909v-20.364h17.455v-2.909zM26.909 5.818h-16c-1.6 0-2.909 1.309-2.909 2.909v20.364c0 1.6 1.309 2.909 2.909 2.909h16c1.6 0 2.909-1.309 2.909-2.909v-20.364c0-1.6-1.309-2.909-2.909-2.909zM26.909 29.091h-16v-20.364h16v20.364z"></path></svg>';
}
const divElement = document.createElement("div");
divElement.className = "vditor-copy";
divElement.innerHTML = `<span aria-label="${window.VditorI18n?.copy || "复制"}"
onmouseover="this.setAttribute('aria-label', '${window.VditorI18n?.copy || "复制"}')"
class="vditor-tooltipped vditor-tooltipped__w"
onclick="event.stopPropagation();this.previousElementSibling.select();document.execCommand('copy');this.setAttribute('aria-label', '${window.VditorI18n?.copied || "已复制"}');this.previousElementSibling.blur()">${iconHTML}</span>`;
const textarea = document.createElement("textarea");
textarea.value = code160to32(codeText);
divElement.insertAdjacentElement("afterbegin", textarea);
if (option && option.renderMenu) {
option.renderMenu(e, divElement);
}
e.before(divElement);
e.style.maxHeight = (window.outerHeight - 40) + "px";
// https://github.com/Vanessa219/vditor/issues/1356
e.insertAdjacentHTML("afterend", `<span style="position: absolute">${Constants.ZWSP}</span>`)
});
};