Browse Source

:recycle: SV 模式写不下去了,第三版改写开始。

Liyuan Li 5 years ago
parent
commit
7207a27c37
5 changed files with 34 additions and 19 deletions
  1. 2 2
      src/index.ts
  2. 2 13
      src/ts/sv/inputEvent.ts
  3. 25 0
      src/ts/sv/process.ts
  4. 2 2
      src/ts/toolbar/EditMode.ts
  5. 3 2
      src/ts/undo/index.ts

+ 2 - 2
src/index.ts

@@ -99,8 +99,8 @@ class Vditor extends VditorMethod {
             this.vditor.upload = new Upload();
         }
 
-        // const lutePath = `http://192.168.0.107:9090/lute.min.js?${new Date().getTime()}`;
-        const lutePath = "src/js/lute/lute.min.js";
+        const lutePath = `http://192.168.0.107:9090/lute.min.js?${new Date().getTime()}`;
+        // const lutePath = "src/js/lute/lute.min.js";
         // const lutePath = `${mergedOptions.cdn}/dist/js/lute/lute.min.js`;
         addScript(lutePath, "vditorLuteScript").then(() => {
             this.vditor.lute = setLute({

+ 2 - 13
src/ts/sv/inputEvent.ts

@@ -1,8 +1,7 @@
 import {scrollCenter} from "../util/editorCommonEvent";
 import {hasClosestByAttribute, hasTopClosestByAttribute} from "../util/hasClosest";
-import {log} from "../util/log";
 import {getSelectPosition, setRangeByWbr} from "../util/selection";
-import {processAfterRender} from "./process";
+import {processAfterRender, processSpinVditorSVDOM} from "./process";
 
 export const inputEvent = (vditor: IVditor, event?: InputEvent) => {
     const range = getSelection().getRangeAt(0).cloneRange();
@@ -120,14 +119,6 @@ export const inputEvent = (vditor: IVditor, event?: InputEvent) => {
     if (isSVElement) {
         html = blockElement.textContent;
     } else {
-        if (blockElement.previousElementSibling) {
-            html = blockElement.previousElementSibling.textContent + html;
-            blockElement.previousElementSibling.remove();
-        }
-        if (blockElement.nextElementSibling) {
-            html = html + blockElement.nextElementSibling.textContent;
-            blockElement.nextElementSibling.remove();
-        }
         // 添加链接引用
         const allLinkRefDefsElement = vditor.sv.element.querySelector("[data-type='link-ref-defs-block']");
         if (allLinkRefDefsElement && !blockElement.isEqualNode(allLinkRefDefsElement)) {
@@ -141,9 +132,7 @@ export const inputEvent = (vditor: IVditor, event?: InputEvent) => {
             allFootnoteElement.remove();
         }
     }
-    log("SpinVditorSVDOM", html, "argument", vditor.options.debugger);
-    html = vditor.lute.SpinVditorSVDOM(html);
-    log("SpinVditorSVDOM", html, "result", vditor.options.debugger);
+    html = processSpinVditorSVDOM(html, vditor);
     if (isSVElement) {
         blockElement.innerHTML = html;
     } else {

+ 25 - 0
src/ts/sv/process.ts

@@ -4,6 +4,31 @@ import {hasClosestBlock, hasClosestByAttribute} from "../util/hasClosest";
 import {getEditorRange, setRangeByWbr} from "../util/selection";
 import {highlightToolbarSV} from "./highlightToolbarSV";
 import {inputEvent} from "./inputEvent";
+import {log} from "../util/log";
+
+export const processSpinVditorSVDOM = (html: string, vditor: IVditor) => {
+    log("SpinVditorSVDOM", html, "argument", vditor.options.debugger);
+    html = "<div data-block='0'>" +
+        vditor.lute.SpinVditorSVDOM(html).replace(/<span data-type="newline"><br \/><span style="display: none">\n<\/span><\/span><span data-type="newline"><br \/><span style="display: none">\n<\/span><\/span></g, '<span data-type="newline"><br /><span style="display: none">\n</span></span><span data-type="newline"><br /><span style="display: none">\n</span></span></div><div data-block="0"><') +
+        "</div>";
+    log("SpinVditorSVDOM", html, "result", vditor.options.debugger);
+    return html;
+}
+
+export const getBlockquoteMarkers = (pElement: HTMLElement) => {
+    let markerText = ''
+    const previousElement = pElement.previousElementSibling
+    if (previousElement) {
+        if (previousElement.getAttribute("data-type") === "li-marker") {
+            // >   * 2 中的 [   * ]
+            markerText = previousElement.previousElementSibling.textContent + previousElement.textContent + markerText
+        } else if (previousElement.getAttribute("data-type") === "blockquote-marker") {
+            // >   * > 3 中的 [> ]
+            markerText = previousElement.textContent + markerText;
+        }
+        // previousElement = '';
+    }
+};
 
 export const processAfterRender = (vditor: IVditor, options = {
     enableAddUndoStack: true,

+ 2 - 2
src/ts/toolbar/EditMode.ts

@@ -2,7 +2,7 @@ import {Constants} from "../constants";
 import {i18n} from "../i18n";
 import {processAfterRender} from "../ir/process";
 import {getMarkdown} from "../markdown/getMarkdown";
-import {processAfterRender as processSVAfterRender} from "../sv/process";
+import {processAfterRender as processSVAfterRender, processSpinVditorSVDOM} from "../sv/process";
 import {setPadding, setTypewriterPosition} from "../ui/initUI";
 import {getEventName, updateHotkeyTip} from "../util/compatibility";
 import {highlightToolbar} from "../util/highlightToolbar";
@@ -90,7 +90,7 @@ export const setEditMode = (vditor: IVditor, type: string, event: Event | string
             vditor.sv.element.style.display = "block";
         }
         vditor.currentMode = "sv";
-        vditor.sv.element.innerHTML = vditor.lute.SpinVditorSVDOM(markdownText);
+        vditor.sv.element.innerHTML =  processSpinVditorSVDOM(markdownText, vditor);;
         processSVAfterRender(vditor, {
             enableAddUndoStack: true,
             enableHint: false,

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

@@ -6,6 +6,7 @@ import {execAfterRender} from "../util/fixBrowserBehavior";
 import {highlightToolbar} from "../util/highlightToolbar";
 import {processCodeRender} from "../util/processCode";
 import {setRangeByWbr, setSelectionFocus} from "../util/selection";
+import {processSpinVditorSVDOM} from "../sv/process";
 
 interface IUndo {
     hasUndo: boolean;
@@ -109,7 +110,7 @@ class Undo {
                 vditor.lute.SpinVditorIRDOM(vditor[vditor.currentMode].element.innerHTML);
         } else {
             this[vditor.currentMode].undoStack[0][0].diffs[0][1] =
-                vditor.lute.SpinVditorSVDOM(vditor[vditor.currentMode].element.textContent);
+                processSpinVditorSVDOM(vditor[vditor.currentMode].element.textContent, vditor);
         }
         this[vditor.currentMode].lastText = this[vditor.currentMode].undoStack[0][0].diffs[0][1];
         const wbrElement =
@@ -143,7 +144,7 @@ class Undo {
         } else if (vditor.currentMode === "ir") {
             text = vditor.lute.SpinVditorIRDOM(vditor[vditor.currentMode].element.innerHTML);
         } else {
-            text = vditor.lute.SpinVditorSVDOM(vditor[vditor.currentMode].element.textContent);
+            text = processSpinVditorSVDOM(vditor[vditor.currentMode].element.textContent, vditor);
         }
         const wbrElement =
             vditor[vditor.currentMode].element.querySelector(vditor.currentMode === "sv" ? ".wbr" : "wbr");