第一篇: 介绍编写插件的准备和如何发布.git
第二篇: 介绍插件简单功能的具体编写过程.github
第三篇: 介绍插件开发遇到的问题和解决的方案markdown
开发完之后就美滋滋地开始用了,在格式化以前本身写的一个md,取名为 1.md
时,忽然发现每格式化一次后,都会在空行后多出一个空行post
本身将文件删减到只有两行,依然发现还会多出空行,而后新建一个md文件,,取名为 2.md
,将内容复制拷贝过去之后,发如今 2.md
中能够正确地格式化。这就奇怪了,明明内容是同样的啊,查看两个文件描述,发现相差一个字节。优化
再想到1.md
是从以前的window
平台拷贝过来,而2.md
是在osx
平台新建的,因而去查了下资料,原来是两个平台的换行符是有差别的。ui
简单地说, window
平台下的换行符为 \r\n
,而 osx
平台的换行符为\n
。所以,用一段正则统一两个平台的换行符便可。spa
const LINE_BREAK_EXP = /\r\n/g;
复制代码
在这里,稍微提一下。插件
\r
为回车,做用是光标返回当前行首。code
\n
为换行, 做用为光标移动到下一行。regexp
这两个符号是从打字机开始出现,后来继承到电脑上。
而Unix
平台认为 \n
就阔以了,还省个字节,window
认为 \r\n
才是正统, osx
之前用 \r
,万幸如今和 Unix
同样了。
在格式化js代码后,会将代码段(用```包裹的代码)中已经格式化过地代码,再次格式化,出现问题。
例如:
function(){var a = 100; settimeout(function(){console.log('hello')}),100}
复制代码
格式化之后
function(){
var a = 100;
settimeout(function(){
console.log('hello')
},100)
}
复制代码
再次点击格式化,
function(){
var a = 100;
settimeout(
function(){
console.log('hello')
}
,100)
}
复制代码
这个问题就比较容易发现缘由, 是由于被格式化后的代码段中出现了多行以4个空格或者tab开头的行,他们也符合代码块(就是以空格或者tab开头)的匹配规则,所以被重复格式化。
我没有找到更好的正则匹配方式,所以个人思路是,将已经格式化过的代码段从内容中移除,再执行格式化代码块,最后再补全内容。
在这里补充一个格式化的办法
function removeReplace(text: string, reg: RegExp, func: Function): string {
const _tempRegArr = text.match(reg)
if (_tempRegArr && _tempRegArr.length > 0) {
const _tempArr = [];
_tempRegArr.forEach((e, i) => {
const _reg = new RegExp(escapeStringRegexp(e), 'g');
_tempArr.push(e);
text = text.replace(_reg, `$mdFormatter$${i}$mdFormatter$`);
})
text = func(text);
const _mdformatterArr = text.match(/\$mdFormatter\$\d+\$mdFormatter\$/g)
_mdformatterArr.forEach((e, i) => {
const _reg = new RegExp(escapeStringRegexp(e), 'g');
text = text.replace(_reg, _tempArr[i]);
})
} else {
text = func(text);
}
return text
}
复制代码
依然仍是有些不足滴,粗略说一些
1. 用户每次点击 command+shift+f
的时候,都会执行格式化,从效率角度,应当有个变量标记内容是否更改,若是没有更改就直接返回。(已在0.2.1版本实现)
目前开发了一些功能,算是能够用了,我的格式化了40篇md没有什么问题. 开发两小时,修了两天bug
在vscode插件里查找
git地址在这里~
代码在这里,star随意,欢迎issues~, 也欢迎你们在vscode中使用,我会持续更新~