VB代码格式化

最近看了一个菜鸟的项目代码,实在无法看。都没有对齐。

找了一些工具,一般就是插件。还有两个不好用。也找到了一个网站的C#源码,但是也不好用。静下心,自己写了经过测试OK!

当然,没有经过大众的测试!采用C# Visual Studio 2017 Windows 10。

简单思路:

关键字分为前缀和后缀,前缀主要是下行需要缩进的关键字(加Tab键)。后缀主要是下行需要收缩的关键字(减Tab键);

PrefixString 有两个的特殊关键字,Else Elseif他们是本行缩进,下行不变。

根据本代码的情况,对于跳转代码标记,只是遇到next时判断前面是否有纯数字的内容,有就认为他是代码位置。假如跳转代码标记作为单行出现,没有这个问题。

看看最简单的代码格式化代码

源码如下:

//前缀
private static string[] PrefixString = new string[]
{
"Begin ",
"BeginProperty ",
"Sub ",
"If ",
"Else",
"ElseIf ",
"For ",
"With ",
"While ",
"Function ",
"Type ",
"Enum ",
"Select ",
"Do ",
"Loop "
};
//后缀
private static string[] SuffixString = new string[]
{
"End",
"EndProperty",
"Next",
"Wend"
};
private bool disposedPrefix(string line,ref bool bMoveBefore)
{
bool result = false;
int tempint0;
int tempint1;
bMoveBefore = false;
for (int i = 0; i < PrefixString.Length; i++)
{
tempint0 = line.IndexOf(PrefixString[i],StringComparison.OrdinalIgnoreCase);
if (tempint0 < 0) continue;
if (tempint0 > 0)
{
tempint1 = line.IndexOf('\'');
if(tempint1 != -1 && tempint1 < tempint0)
{
continue;
}
if (line[tempint0 - 1] != ' ')
{
continue;
}
}
switch (i)
{
case 3:
tempint1 = line.IndexOf("Then",tempint0,line.Length - tempint0,StringComparison.OrdinalIgnoreCase);
if (tempint1 == -1) continue;
tempint0 = line.IndexOf('\'',tempint1);
if(tempint0 == -1)
{
if(string.IsNullOrEmpty(line.Substring(tempint1 + 4).Trim()))
{
result = true;
}
}
else
{
if(string.IsNullOrEmpty(line.Substring(tempint1 + 4,tempint0 - tempint1 - 4).Trim()))
{
result = true;
}
}
break;
case 4:
case 5:
bMoveBefore = true;
break;
default:
result = true;
break;
}
break;
}
return result;
}
private bool disposedSuffix(string line)
{
bool result = false;
int tempint0;
int tempint1;
for(int i = 0; i < SuffixString.Length; i++)
{
tempint0 = line.IndexOf(SuffixString[i],StringComparison.OrdinalIgnoreCase);
if (tempint0 < 0) continue;
if (tempint0 > 0)
{
tempint1 = line.IndexOf('\'');
if (tempint1 != -1 && tempint1 < tempint0)
{
continue;
}
if (tempint0 + SuffixString[i].Length < line.Length)
{
if(line[tempint0 + SuffixString[i].Length] != ' ')
{
continue;
}
}
if (i == 2)
{
string ts = line.Substring(0,tempint0 - 1).Trim();
int ta;
if (!string.IsNullOrEmpty(ts))
{
if(!int.TryParse(ts,out ta))
{
continue;
}
}
}
}
result = true;
}
return result;
}
public string IndentVBCode(string source)
{
string[] lines = source.Split('\n');
StringBuilder sb = new StringBuilder();
string sTabs = "";
bool bMoveBefore = false;
foreach (string line in lines)
{
string tmpLine = line.Trim();
if(string.IsNullOrEmpty(tmpLine))
{
continue;
}
if (disposedPrefix(tmpLine,ref bMoveBefore))
{
sb.Append(sTabs);
sb.AppendLine(tmpLine);
sTabs += "\t";
continue;
}
else
{
if(bMoveBefore)
{
if(sTabs.Length > 0) sb.Append(sTabs.Substring(0,sTabs.Length - 1));
sb.AppendLine(tmpLine);
continue;
}
if (disposedSuffix(tmpLine))
{
if (sTabs.Length > 0)
{
sTabs = sTabs.Remove(0,1);
}
}
}
sb.Append(sTabs); sb.AppendLine(tmpLine); } return sb.ToString(); }

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...