soumaeda 2 лет назад
Родитель
Сommit
c6e456d60a

+ 7 - 7
packages/editor/src/components/CodeMirrorEditor/Toolbar/TextFormatTools.tsx

@@ -49,8 +49,8 @@ export const TextFormatTools = (props: TextFormatToolsType): JSX.Element => {
     codeMirrorEditor?.insertMarkdownElements(prefix, suffix);
   };
 
-  const onClickInsertPrefix = (prefix: string) => {
-    codeMirrorEditor?.insertPrefix(prefix);
+  const onClickInsertPrefix = (prefix: string, isContinuous: boolean) => {
+    codeMirrorEditor?.insertPrefix(prefix, isContinuous);
   };
 
   return (
@@ -68,22 +68,22 @@ export const TextFormatTools = (props: TextFormatToolsType): JSX.Element => {
           <button type="button" className="btn btn-toolbar-button" onClick={() => onClickInsertMarkdownElements('~', '~')}>
             <span className="material-symbols-outlined fs-5">format_strikethrough</span>
           </button>
-          <button type="button" className="btn btn-toolbar-button">
+          <button type="button" className="btn btn-toolbar-button" onClick={() => onClickInsertPrefix('#', true)}>
             <span className="material-symbols-outlined fs-5">block</span>
           </button>
           <button type="button" className="btn btn-toolbar-button" onClick={() => onClickInsertMarkdownElements('`', '`')}>
             <span className="material-symbols-outlined fs-5">code</span>
           </button>
-          <button type="button" className="btn btn-toolbar-button" onClick={() => onClickInsertPrefix('-')}>
+          <button type="button" className="btn btn-toolbar-button" onClick={() => onClickInsertPrefix('-', false)}>
             <span className="material-symbols-outlined fs-5">format_list_bulleted</span>
           </button>
-          <button type="button" className="btn btn-toolbar-button" onClick={() => onClickInsertPrefix('1.')}>
+          <button type="button" className="btn btn-toolbar-button" onClick={() => onClickInsertPrefix('1.', false)}>
             <span className="material-symbols-outlined fs-5">format_list_numbered</span>
           </button>
-          <button type="button" className="btn btn-toolbar-button" onClick={() => onClickInsertPrefix('>')}>
+          <button type="button" className="btn btn-toolbar-button" onClick={() => onClickInsertPrefix('>', false)}>
             <span className="material-symbols-outlined fs-5">block</span>
           </button>
-          <button type="button" className="btn btn-toolbar-button" onClick={() => onClickInsertPrefix('- [ ]')}>
+          <button type="button" className="btn btn-toolbar-button" onClick={() => onClickInsertPrefix('- [ ]', false)}>
             <span className="material-symbols-outlined fs-5">checklist</span>
           </button>
         </div>

+ 8 - 6
packages/editor/src/services/codemirror-editor/use-codemirror-editor/utils/insert-prefix.ts

@@ -2,11 +2,11 @@ import { useCallback } from 'react';
 
 import { EditorView } from '@codemirror/view';
 
-export type InsertPrefix = (prefix: string) => void;
+export type InsertPrefix = (prefix: string, flag: boolean) => void;
 
 export const useInsertPrefix = (view?: EditorView): InsertPrefix => {
 
-  return useCallback((prefix) => {
+  return useCallback((prefix, isContinuous) => {
     if (view == null) {
       return;
     }
@@ -17,16 +17,18 @@ export const useInsertPrefix = (view?: EditorView): InsertPrefix => {
 
     const cursorPos = view?.state.selection.main.head;
     const space = ' ';
-    const insertText = prefix + space + selection;
+    const line = view.state.doc.lineAt(cursorPos);
+    const insertText = isContinuous && line.text.startsWith(prefix) ? prefix : prefix + space;
+    const insertPos = isContinuous && line.text.startsWith(prefix) ? cursorPos - 1 : cursorPos;
 
     if (insertText && cursorPos) {
       view.dispatch({
         changes: {
-          from: view.state.selection.main.from,
-          to: view.state.selection.main.to,
+          from: insertPos,
+          to: insertPos,
           insert: insertText,
         },
-        selection: { anchor: cursorPos + insertText.length },
+        selection: { anchor: cursorPos + insertText.length + selection.length },
       });
     }
     view.focus();