需求
最近有一个需求
需要开发一个VScode插件找到一个文档里面如下格式的文字把它替换成正确的链接并且实现关键词自动补全
关键词和要替换的词存在一个json文件里面
Test
`Test`
[Test]()
[Test](TestUrl)
[`Test`](TestUrl)
[`Test`]({
{
site.var }})
=>[Test]({
{
site.parameters_reference }}TestUrl)
首先看效果
正则表达式
首先要把对应格式的文字给找出来,这里用了强大的正则表达式
我这里对中文,英文做了不同的处理
代码如下
if(language=="en"){
for (var curStr in jsonStr)
{
var word = jsonStr[curStr].ori;
var regStr = "((^|\\s)(("+word+"|`"+word+"`|\\["+word+"\\]|\\[`"+word+"`\\])\\(.*?\\))($|\\s|,|\\.))|((^|\\s)("+word+"|`"+word+"`|\\["+word+"\\]|\\[`"+word+"`\\])($|\\s|,|\\.))"
regArray[curStr]=new RegExp(regStr,"g");
}
}
else{
for (var curStr in jsonStr)
{
var word = jsonStr[curStr].ori;
var regStr = "((\\[`\\b"+word+"\\b`\\]|`\\b"+word+"\\b`|\\[\\b"+word+"\\b\\]|\\b"+word+"\\b)\\(.*?\\))|((\\[`\\b"+word+"\\b`\\]|`\\b"+word+"\\b`|\\[\\b"+word+"\\b\\]|\\b"+word+"\\b))";
regArray[curStr]=new RegExp(regStr,"g");
}
}
查找逻辑
有了正则表达式我们就可以根据它来进行查找对应格式的文字了
代码逻辑如下
var editor = vscode.window.activeTextEditor;
var document = editor.document;
//找到当前选中部分开始向下搜索关键词
var startLine = vscode.window.activeTextEditor.selection.end.line;
currentLine = startLine;
lastIndex = vscode.window.activeTextEditor.selection.end.character;
for(var i = 0;i<regArray.length;i++){
regArray[i].lastIndex = lastIndex;
}
//当前选中的字符串
var selectString = "";
var nextpage = false;
do{
//匹配当前行
var line = document.lineAt(currentLine);
var range = line.range;
var end = range.end;
var text = document.getText(range);
lastIndex = end.character + 1;
for (var cur in regArray){
var list = regArray[cur].exec(text);
if(list==null){
continue;
}
if(lastIndex > regArray[cur].lastIndex){
selectString = list[0];
lastIndex = regArray[cur].lastIndex;
currentRegIndex = cur;
}
}
//当前行有无匹配
var ifFind = false;
for(var i = 0;i<regArray.length;i++){
if(regArray[i].lastIndex!=0){
ifFind = true;
}
}
if(ifFind==true){
for(var i = 0;i<regArray.length;i++){
regArray[i].lastIndex = lastIndex;
}
break;
}
else if(ifFind == false && nextpage == false){
//去下一行匹配
currentLine++;
currentLine = currentLine<lineNumb?currentLine:0;
if(currentLine == 0){
nextpage = true;
}
}else{
if(currentLine == startLine){
vscode.window.showInformationMessage('No keyword in the current document');
return;
}
currentLine++;
currentLine = currentLine<lineNumb?currentLine:0;
}
}while(true)
源码链接
VS插件可以在VScode的Extension搜索LinkCompletion直接install
或者在应用市场上下载
https://marketplace.visualstudio.com/items?itemName=william222.link-completion
还有一些替换的逻辑和自动补全的逻辑我就不一一列举了
源码我放到了GitHub上且有完整的注释,可以直接下载
因为本身是给公司用的,所以把代码一般化我注释了不少无用的和重复的代码
https://github.com/1095560081/changeKeyword/
有问题欢迎提出