Sfoglia il codice sorgente

:recycle: 让我哭一下吧,感觉都要写好了,由于复杂度,只能重写一版

Liyuan Li 5 anni fa
parent
commit
cd092fbdcc

+ 3 - 5
src/index.ts

@@ -6,13 +6,13 @@ import {i18n} from "./ts/i18n";
 import {IR} from "./ts/ir";
 import {input as irInput} from "./ts/ir/input";
 import {processAfterRender} from "./ts/ir/process";
+import {processAfterRender as processSVAfterRender} from "./ts/sv/process";
 import {getHTML} from "./ts/markdown/getHTML";
 import {getMarkdown} from "./ts/markdown/getMarkdown";
 import {setLute} from "./ts/markdown/setLute";
 import {Outline} from "./ts/outline";
 import {Preview} from "./ts/preview/index";
 import {Resize} from "./ts/resize/index";
-import {formatRender} from "./ts/sv/formatRender";
 import {getSelectText} from "./ts/sv/getSelectText";
 import {html2md} from "./ts/sv/html2md";
 import {Editor} from "./ts/sv/index";
@@ -322,10 +322,8 @@ class Vditor extends VditorMethod {
             this.clearStack();
         }
         if (this.vditor.currentMode === "sv") {
-            formatRender(this.vditor, markdown, {
-                end: markdown.length,
-                start: markdown.length,
-            }, {
+            this.vditor.sv.element.innerHTML = this.vditor.lute.SpinVditorSVDOM(markdown);
+            processSVAfterRender(this.vditor, {
                 enableAddUndoStack: !clearStack,
                 enableHint: false,
                 enableInput: false,

+ 1 - 1
src/ts/markdown/getMarkdown.ts

@@ -1,6 +1,6 @@
 export const getMarkdown = (vditor: IVditor) => {
     if (vditor.currentMode === "sv") {
-        return vditor.lute.VditorSVDOM2Md(vditor.sv.element.innerHTML);
+        return vditor.sv.element.textContent;
     } else if (vditor.currentMode === "wysiwyg") {
         return vditor.lute.VditorDOM2Md(vditor.wysiwyg.element.innerHTML);
     } else if (vditor.currentMode === "ir") {

+ 5 - 7
src/ts/sv/inputEvent.ts

@@ -39,9 +39,7 @@ export const inputEvent = (vditor: IVditor, event?: InputEvent) => {
         blockElement = vditor.sv.element;
     }
     // 添加光标位置
-    if (!blockElement.querySelector("wbr")) {
-        range.insertNode(document.createElement("wbr"));
-    }
+    range.insertNode(document.createTextNode(Lute.Caret));
     // 清除浏览器自带的样式
     blockElement.querySelectorAll("[style]").forEach((item) => {
         item.removeAttribute("style");
@@ -49,7 +47,7 @@ export const inputEvent = (vditor: IVditor, event?: InputEvent) => {
     blockElement.querySelectorAll("font").forEach((item) => {
         item.outerHTML = item.innerHTML;
     });
-    let html = blockElement.outerHTML;
+    let html = blockElement.textContent;
     if (event?.inputType === "insertParagraph" && blockElement.previousElementSibling
         && blockElement.previousElementSibling.textContent.trim() !== "") {
         // 在粗体中换行
@@ -59,14 +57,14 @@ export const inputEvent = (vditor: IVditor, event?: InputEvent) => {
     // TODO: 链接引用,脚注?
     const isSVElement = blockElement.isEqualNode(vditor.sv.element);
     if (isSVElement) {
-        html = blockElement.innerHTML;
+        html = blockElement.textContent;
     } else {
         if (blockElement.previousElementSibling) {
-            html = blockElement.previousElementSibling.outerHTML + html;
+            html = blockElement.previousElementSibling.textContent + html;
             blockElement.previousElementSibling.remove();
         }
         if (blockElement.nextElementSibling) {
-            html = html + blockElement.nextElementSibling.outerHTML;
+            html = html + blockElement.nextElementSibling.textContent;
             blockElement.nextElementSibling.remove();
         }
     }

+ 3 - 0
src/ts/sv/processKeydown.ts

@@ -72,6 +72,7 @@ export const processKeydown = (vditor: IVditor, event: KeyboardEvent) => {
         range.insertNode(document.createElement("wbr"));
         const wbrElement = document.querySelector("wbr");
         let markerElement;
+        // blockquote, heading, list marker 删除或空格
         if (wbrElement.parentElement?.className.indexOf("vditor-sv__marker") > -1) {
             markerElement = wbrElement.parentElement;
         } else if (wbrElement.previousSibling && wbrElement.previousSibling.nodeType !== 3 &&
@@ -85,6 +86,7 @@ export const processKeydown = (vditor: IVditor, event: KeyboardEvent) => {
                 range.selectNode(markerElement.firstChild);
                 range.collapse(false);
                 event.preventDefault();
+                wbrElement.remove();
                 return true;
             }
             if (event.key === " ") {
@@ -92,6 +94,7 @@ export const processKeydown = (vditor: IVditor, event: KeyboardEvent) => {
                 range.selectNode(markerElement.firstChild);
                 range.collapse(false);
                 event.preventDefault();
+                wbrElement.remove();
                 return true;
             }
         }

+ 2 - 2
src/ts/undo/index.ts

@@ -92,7 +92,7 @@ class Undo {
             return;
         }
         getSelection().getRangeAt(0).insertNode(document.createElement("wbr"));
-        this.undoStack[0][0].diffs[0][1] = vditor.lute.SpinVditorSVDOM(vditor.sv.element.innerHTML);
+        this.undoStack[0][0].diffs[0][1] = vditor.lute.SpinVditorSVDOM(vditor.sv.element.textContent);
         this.lastText = this.undoStack[0][0].diffs[0][1];
         if (vditor.sv.element.querySelector("wbr")) {
             vditor.sv.element.querySelector("wbr").remove();
@@ -108,7 +108,7 @@ class Undo {
                 range.insertNode(document.createElement("wbr"));
             }
         }
-        const text = vditor.lute.SpinVditorSVDOM(vditor.sv.element.innerHTML);
+        const text = vditor.lute.SpinVditorSVDOM(vditor.sv.element.textContent);
         if (vditor.sv.element.querySelector("wbr")) {
             vditor.sv.element.querySelector("wbr").remove();
         }

+ 2 - 4
types/index.d.ts

@@ -104,6 +104,7 @@ interface ILute {
     WalkSkipChildren: number;
     WalkContinue: number;
     Version: string;
+    Caret: string;
 
     New(): ILute;
 
@@ -196,10 +197,7 @@ interface ILute {
     HTML2VditorIRDOM(html: string): string;
 
     // sv 输入渲染
-    SpinVditorSVDOM(html: string): string;
-
-    // sv 获取 md
-    VditorSVDOM2Md(html: string): string;
+    SpinVditorSVDOM(text: string): string;
 }
 
 declare const webkitAudioContext: {