Open cnspray opened 5 years ago
你说的这个是编辑器的问题,我用的是editor.md编辑器,我对这个也不是很精通。
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);
}
感谢提供代码,下个版本加进去。
老大,发现正则有点小问题,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);
}
},
请按照一下格式提交issue,谢谢!
你当前使用的是哪个版本的 MinDoc(
godoc_linux_amd64 version
)? 2.0你当前使用的是什么操作系统?
windows
你是如何操作的? 选中文本点击H1
你期望得到什么结果? 当该行已有H1时,取消H1,没有时,增加H1
当前遇到的是什么结果? 当输入# dddd,再选择dddd后,会变成# dddd# dddd ,就是会再复制一遍,H1-H6都有这个问题。gfm也有这个问题,建议予以优化和修复。即当前行已有"# "开头的,光标在当前行时,再次点击H1后,自动去掉"# "。 由于本人编程水平相当业余,不知是否修改正确(以h3为例),建议作者予以优化和修复。 修改editormd.js 增加getLine; '' /**
}