processCode.ts 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import {abcRender} from "../markdown/abcRender";
  2. import {chartRender} from "../markdown/chartRender";
  3. import {codeRender} from "../markdown/codeRender";
  4. import {graphvizRender} from "../markdown/graphvizRender";
  5. import {highlightRender} from "../markdown/highlightRender";
  6. import {mathRender} from "../markdown/mathRender";
  7. import {mermaidRender} from "../markdown/mermaidRender";
  8. import {mindmapRender} from "../markdown/mindmapRender";
  9. export const processPasteCode = (html: string, text: string, type = "sv") => {
  10. const tempElement = document.createElement("div");
  11. tempElement.innerHTML = html;
  12. let isCode = false;
  13. if (tempElement.childElementCount === 1 &&
  14. (tempElement.lastElementChild as HTMLElement).style.fontFamily.indexOf("monospace") > -1) {
  15. // VS Code
  16. isCode = true;
  17. }
  18. const pres = tempElement.querySelectorAll("pre");
  19. if (tempElement.childElementCount === 1 && pres.length === 1
  20. && pres[0].className !== "vditor-wysiwyg"
  21. && pres[0].className !== "vditor-sv") {
  22. // IDE
  23. isCode = true;
  24. }
  25. if (html.indexOf('\n<p class="p1">') === 0) {
  26. // Xcode
  27. isCode = true;
  28. }
  29. if (tempElement.childElementCount === 1 && tempElement.firstElementChild.tagName === "TABLE" &&
  30. tempElement.querySelector(".line-number") && tempElement.querySelector(".line-content")) {
  31. // 网页源码
  32. isCode = true;
  33. }
  34. if (isCode) {
  35. const code = text || html;
  36. if (/\n/.test(code) || pres.length === 1) {
  37. if (type === "wysiwyg") {
  38. return `<div class="vditor-wysiwyg__block" data-block="0" data-type="code-block"><pre><code>${
  39. code.replace(/&/g, "&amp;").replace(/</g, "&lt;")}<wbr></code></pre></div>`;
  40. }
  41. return "```\n" + code.replace(/&/g, "&amp;").replace(/</g, "&lt;") + "\n```";
  42. } else {
  43. if (type === "wysiwyg") {
  44. return `<code>${code.replace(/&/g, "&amp;").replace(/</g, "&lt;")}</code><wbr>`;
  45. }
  46. return `\`${code}\``;
  47. }
  48. }
  49. return false;
  50. };
  51. export const processCodeRender = (previewPanel: HTMLElement, vditor: IVditor) => {
  52. if (!previewPanel) {
  53. return;
  54. }
  55. const codeElement = previewPanel.querySelector("code");
  56. if (!codeElement) {
  57. if (previewPanel.parentElement.getAttribute("data-type") === "html-block") {
  58. previewPanel.style.backgroundColor = "var(--preview-background-color)";
  59. previewPanel.style.padding = "0.2em 0.4em";
  60. previewPanel.setAttribute("data-render", "1");
  61. }
  62. return;
  63. }
  64. const language = codeElement.className.replace("language-", "");
  65. if (language === "abc") {
  66. abcRender(previewPanel, vditor.options.cdn);
  67. } else if (language === "mermaid") {
  68. mermaidRender(previewPanel, `.vditor-${vditor.currentMode}__preview .language-mermaid`, vditor.options.cdn);
  69. } else if (language === "echarts") {
  70. chartRender(previewPanel, vditor.options.cdn);
  71. } else if (language === "mindmap") {
  72. mindmapRender(previewPanel, vditor.options.cdn);
  73. } else if (language === "graphviz") {
  74. graphvizRender(previewPanel, vditor.options.cdn);
  75. } else if (language === "math") {
  76. let tag = "div";
  77. if (previewPanel.tagName === "SPAN") {
  78. tag = "span";
  79. }
  80. previewPanel.innerHTML = `<code class="language-math"><${tag} class="vditor-math">${previewPanel.innerHTML}</${tag}></code>`;
  81. mathRender(previewPanel.parentElement, {cdn: vditor.options.cdn, math: vditor.options.preview.math});
  82. } else {
  83. highlightRender(Object.assign({}, vditor.options.preview.hljs), previewPanel, vditor.options.cdn);
  84. codeRender(previewPanel, vditor.options.lang);
  85. }
  86. previewPanel.setAttribute("data-render", "1");
  87. };