微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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(); }

原文地址:https://www.jb51.cc/vb/256180.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐