mindoc-org / mindoc

Golang实现的基于beego框架的接口在线文档管理系统
https://mindoc.com.cn/docs/mindochelp
Apache License 2.0
7.29k stars 1.9k forks source link

建议对h1-h6,gfm 进行优化和修复的建议 #470

Open cnspray opened 5 years ago

cnspray commented 5 years ago

请按照一下格式提交issue,谢谢!

  1. 你当前使用的是哪个版本的 MinDoc(godoc_linux_amd64 version)? 2.0

  2. 你当前使用的是什么操作系统?

windows

  1. 你是如何操作的? 选中文本点击H1

  2. 你期望得到什么结果? 当该行已有H1时,取消H1,没有时,增加H1

  3. 当前遇到的是什么结果? 当输入# dddd,再选择dddd后,会变成# dddd# dddd ,就是会再复制一遍,H1-H6都有这个问题。gfm也有这个问题,建议予以优化和修复。即当前行已有"# "开头的,光标在当前行时,再次点击H1后,自动去掉"# "。 由于本人编程水平相当业余,不知是否修改正确(以h3为例),建议作者予以优化和修复。 修改editormd.js 增加getLine; '' /**

    • 获取第N行内容 */ getLine:function(n) { return this.cm.getLine(n); } 修改h3: h3 : function() { var cm = this.cm; var cursor = cm.getCursor(); var selection = cm.getLine(cursor.line); var patt1=new RegExp("^#{3}[ ]"); if (patt1.test(selection)===true){ selection=selection.replace(/^#{3}[ ]/,""); cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 }); cm.replaceSelection(selection+"\n"); cm.setCursor(cursor.line, cursor.ch -4); } else { cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 }); cm.replaceSelection("### "+selection+"\n"); cm.setCursor(cursor.line, cursor.ch +4); }

    }

lifei6671 commented 5 years ago

你说的这个是编辑器的问题,我用的是editor.md编辑器,我对这个也不是很精通。

cnspray commented 5 years ago

mark一下,我倒是测试通过了,算是给大家提供一个按自己习惯修改编辑器的途径,由于代码很烂,勿喷。 一、对H1-H6标记进行优化,当已打上H1-H6标记的,再次点击该标记按钮,取消标记,点击其他标题按钮,替换当前标题标记。 二、对有序列表和无序列表进行了优化,当选中的段中,存在没有列表标记的做段落,自动补打标记,已全部打上列表标记的,再次点击时取消。 三、对GFM任务列表进行优化,直接将鼠标所在行打上任务列表标记。 一和二需要修改editormd.js (一)增加getLine;

/**

获取第N行内容
*/
getLine:function(n) {
return this.cm.getLine(n);
}

(二)修改H1-H6和有序、无序部分。

        h1 : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getLine(cursor.line);
            var patt1=new RegExp("^#{1}[ ]");//如果存在H1
            var patt2=new RegExp("^#{1,6}[ ]");//如果存在H2-H6
            //如果存在H1,取消H1的设置
            if (patt1.test(selection)===true){
                selection=selection.replace(/^#{1}[ ]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection(selection+"\n");
                cm.setCursor(cursor.line, cursor.ch -2);
            }
            //如果存在H1-H6,取消H2-H6,并替换为H1
            else if(patt2.test(selection)===true){
                selection=selection.replace(/^#{1,6}[ ]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("# "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +2);

            }else
            //设置为H1
            {
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("# "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +2);
            }
        },

        h2 : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getLine(cursor.line);
            var patt1=new RegExp("^#{2}[ ]");//如果存在H1
            var patt2=new RegExp("^#{1,6}[ ]");//如果存在H1-H6
            //如果存在H2,取消H2的设置
            if (patt1.test(selection)===true){
                selection=selection.replace(/^#{2}[ ]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection(selection+"\n");
                cm.setCursor(cursor.line, cursor.ch -3);
            }
            //如果存在H1-H6,取消H1-H6,并替换为H2
            else if(patt2.test(selection)===true){
                selection=selection.replace(/^#{1,6}[ ]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("## "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +3);

            }else
            //设置为H1
            {
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("## "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +3);
            }
        },

        h3 : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getLine(cursor.line);
            var patt1=new RegExp("^#{3}[ ]");//如果存在H3
            var patt2=new RegExp("^#{1,6}[ ]");//如果存在H1-H6
            //如果存在H3,取消H3的设置
            if (patt1.test(selection)===true){
                selection=selection.replace(/^#{3}[ ]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection(selection+"\n");
                cm.setCursor(cursor.line, cursor.ch -4);
            }
            //如果存在H1-H6,取消H1-H6,并替换为H3
            else if(patt2.test(selection)===true){
                selection=selection.replace(/^#{1,6}[ ]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +4);

            }else
            //设置为H3
            {
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +4);
            }
        },

        h4 : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getLine(cursor.line);
            var patt1=new RegExp("^#{4}[ ]");//如果存在H4
            var patt2=new RegExp("^#{1,6}[ ]");//如果存在H1-H6
            //如果存在H4,取消H4的设置
            if (patt1.test(selection)===true){
                selection=selection.replace(/^#{4}[ ]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection(selection+"\n");
                cm.setCursor(cursor.line, cursor.ch -5);
            }
            //如果存在H1-H6,取消H1-H6,并替换为H4
            else if(patt2.test(selection)===true){
                selection=selection.replace(/^#{1,6}[ ]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("#### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +5);

            }else
            //设置为H4
            {
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("#### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +5);
            }
        },

        h5 : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getLine(cursor.line);
            var patt1=new RegExp("^#{5}[ ]");//如果存在H5
            var patt2=new RegExp("^#{1,6}[ ]");//如果存在H1-H6
            //如果存在H5,取消H5的设置
            if (patt1.test(selection)===true){
                selection=selection.replace(/^#{5}[ ]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection(selection+"\n");
                cm.setCursor(cursor.line, cursor.ch -6);
            }
            //如果存在H1-H6,取消H1-H6,并替换为H5
            else if(patt2.test(selection)===true){
                selection=selection.replace(/^#{1,6}[ ]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("##### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +6);

            }else
            //设置为H5
            {
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("##### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +6);
            }
        },

        h6 : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getLine(cursor.line);
            var patt1=new RegExp("^#{6}[ ]");//如果存在H6
            var patt2=new RegExp("^#{1,6}[ ]");//如果存在H1-H6
            //如果存在H6,取消H6的设置
            if (patt1.test(selection)===true){
                selection=selection.replace(/^#{6}[ ]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection(selection+"\n");
                cm.setCursor(cursor.line, cursor.ch -7);
            }
            //如果存在H1-H6,取消H1-H6,并替换为H6
            else if(patt2.test(selection)===true){
                selection=selection.replace(/^#{1,6}[ ]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("###### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +7);

            }else
            //设置为H6
            {
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("###### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +7);
            }
        },

        "list-ul" : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getSelection();
            var patt1=new RegExp("^-{1}[ ]");
            var cnt =0;
            //如果未选择,将该行设置为无序列表
            if (selection === "")
            {
                cm.setCursor(cursor.line, 0);
                cm.replaceSelection("- " + selection);
                cm.setCursor(cursor.line, cursor.ch + 2);
            }
            else
            {
                var selectionText = selection.split("\n");
                //判断取中内容是否已作无序列表标记
                for (var i = 0, len = selectionText.length; i < len; i++)
                {
                    if (patt1.test(selectionText[i])===true ){cnt++;}
                }
                //如果全作了无序列表标记,取消标记
                if(cnt===selectionText.length){
                    for (var i = 0, len = selectionText.length; i < len; i++){
                    selectionText[i] = (selectionText[i] === "") ? "" : selectionText[i].replace(/^-{1}[ ]/,"");
                    }
                }else
                //对未打上无序列表标记,打上标记
                {
                    for (var i = 0, len = selectionText.length; i < len; i++){
                    selectionText[i] = (selectionText[i] === "") ? "" : "- "+selectionText[i].replace(/^-{1}[ ]/,"");
                    }

                }
                cm.replaceSelection(selectionText.join("\n"));
            }
        },

        "list-ol" : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getSelection();
            var patt1=new RegExp("^[0-9]+[\.][ ]");
            var cnt =0;
            //如果未选择,将该行设置为有序列表
            if (selection === "")
            {
                cm.setCursor(cursor.line, 0);
                cm.replaceSelection("1. " + selection);
                cm.setCursor(cursor.line, cursor.ch + 3);
            }
            else
            {
                var selectionText = selection.split("\n");
                //判断取中内容是否已作有序列表标记
                for (var i = 0, len = selectionText.length; i < len; i++)
                {
                    if (patt1.test(selectionText[i])===true ){cnt++;}
                }
                //如果全作了有序列表标记,取消标记
                if(cnt===selectionText.length){
                    for (var i = 0, len = selectionText.length; i < len; i++){
                    selectionText[i] = (selectionText[i] === "") ? "" : selectionText[i].replace(/^[0-9]+[\.][ ]/,"");
                    }
                }else
                //对未打上有序列表标记,打上标记
                {
                    for (var i = 0, len = selectionText.length; i < len; i++){
                    selectionText[i] = (selectionText[i] === "") ? "" : (i+1)+". "+selectionText[i].replace(/^[0-9]+[\.][ ]/,"");
                    }

                }
                cm.replaceSelection(selectionText.join("\n"));
            }
        }

三、修改markdown.js

else if (name === "tasks") {
           // 插入 GFM 任务列表
           var cm = window.editor.cm;
           var selection = cm.getSelection();
           var cursor    = cm.getCursor();
           if (selection === "") {
               cm.setCursor(cursor.line, 0);
               cm.replaceSelection("- [x] " + selection);
               cm.setCursor(cursor.line, cursor.ch + 6);
           } 
lifei6671 commented 5 years ago

感谢提供代码,下个版本加进去。

cnspray commented 5 years ago

老大,发现正则有点小问题,editor.md可以在#前面加3个空格,#号后加若干空格的,当时没有考虑到这块,重新写了一下正则表达式。

        h1 : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getLine(cursor.line);
            var patt1=new RegExp("^ {0,3}#{1}[ *]");//如果存在H1
            var patt2=new RegExp("^ {0,3}#{1,6}[ *]");//如果存在H1-H6
            //如果存在H1,取消H1的设置
            if (patt1.test(selection)===true){
                selection=selection.replace(/^ {0,3}#{1}[ *]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection(selection+"\n");
                cm.setCursor(cursor.line, cursor.ch -2);
            }
            //如果存在H1-H6,取消H1-H6,并替换为H1
            else if(patt2.test(selection)===true){
                selection=selection.replace(/^ {0,3}#{1,6}[ *]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("# "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +2);

            }else
            //设置为H1
            {
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("# "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +2);
            }
        },

        h2 : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getLine(cursor.line);
            var patt1=new RegExp("^ {0,3}#{2}[ *]");//如果存在H1
            var patt2=new RegExp("^ {0,3}#{1,6}[ *]");//如果存在H1-H6
            //如果存在H2,取消H2的设置
            if (patt1.test(selection)===true){
                selection=selection.replace(/^ {0,3}#{2}[ *]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection(selection+"\n");
                cm.setCursor(cursor.line, cursor.ch -3);
            }
            //如果存在H1-H6,取消H1-H6,并替换为H2
            else if(patt2.test(selection)===true){
                selection=selection.replace(/^ {0,3}#{1,6}[ *]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("## "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +3);

            }else
            //设置为H2
            {
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("## "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +3);
            }
        },

        h3 : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getLine(cursor.line);
            var patt1=new RegExp("^ {0,3}#{3}[ *]");//如果存在H3
            var patt2=new RegExp("^ {0,3}#{1,6}[ *]");//如果存在H1-H6
            //如果存在H3,取消H3的设置
            if (patt1.test(selection)===true){
                selection=selection.replace(/^ {0,3}#{3}[ *]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection(selection+"\n");
                cm.setCursor(cursor.line, cursor.ch -4);
            }
            //如果存在H1-H6,取消H1-H6,并替换为H3
            else if(patt2.test(selection)===true){
                selection=selection.replace(/^ {0,3}#{1,6}[ *]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +4);

            }else
            //设置为H3
            {
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +4);
            }
        },

        h4 : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getLine(cursor.line);
            var patt1=new RegExp("^ {0,3}#{4}[ *]");//如果存在H4
            var patt2=new RegExp("^ {0,3}#{1,6}[ *]*");//如果存在H1-H6
            //如果存在H4,取消H4的设置
            if (patt1.test(selection)===true){
                selection=selection.replace(/^ {0,3}#{4}[ *]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection(selection+"\n");
                cm.setCursor(cursor.line, cursor.ch -5);
            }
            //如果存在H1-H6,取消H1-H6,并替换为H4
            else if(patt2.test(selection)===true){
                selection=selection.replace(/^ {0,3}#{1,6}[ *]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("#### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +5);

            }else
            //设置为H4
            {
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("#### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +5);
            }
        },

        h5 : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getLine(cursor.line);
            var patt1=new RegExp("^ {0,3}#{5}[ *]");//如果存在H5
            var patt2=new RegExp("^ {0,3}#{1,6}[ *]");//如果存在H1-H6
            //如果存在H5,取消H5的设置
            if (patt1.test(selection)===true){
                selection=selection.replace(/^ {0,3}#{5}[ *]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection(selection+"\n");
                cm.setCursor(cursor.line, cursor.ch -6);
            }
            //如果存在H1-H6,取消H1-H6,并替换为H5
            else if(patt2.test(selection)===true){
                selection=selection.replace(/^ {0,3}#{1,6}[ *]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("##### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +6);

            }else
            //设置为H5
            {
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("##### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +6);
            }
        },

        h6 : function() {
            var cm        = this.cm;
            var cursor    = cm.getCursor();
            var selection = cm.getLine(cursor.line);
            var patt1=new RegExp("^ {0,3}#{6}[ *]");//如果存在H6
            var patt2=new RegExp("^ {0,3}#{1,6}[ *]");//如果存在H1-H6
            //如果存在H6,取消H6的设置
            if (patt1.test(selection)===true){
                selection=selection.replace(/^ {0,3}#{6}[ *]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection(selection+"\n");
                cm.setCursor(cursor.line, cursor.ch -7);
            }
            //如果存在H1-H6,取消H1-H6,并替换为H6
            else if(patt2.test(selection)===true){
                selection=selection.replace(/^ {0,3}#{1,6}[ *]/,"");
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("###### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +7);

            }else
            //设置为H6
            {
                cm.setSelection({line:cursor.line, ch:0}, {line:cursor.line+1, ch:0 });
                cm.replaceSelection("###### "+selection+"\n");
                cm.setCursor(cursor.line, cursor.ch +7);
            }
        },