最近看了一个菜鸟的项目代码,实在无法看。都没有对齐。
找了一些工具,一般就是插件。还有两个不好用。也找到了一个网站的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 "
};
{
"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"
};
{
"End",
"EndProperty",
"Next",
"Wend"
};
private bool DisposedPrefix(string line,ref bool bMoveBefore)
{
bool result = false;
int tempint0;
int tempint1;
{
bool result = false;
int tempint0;
int tempint1;
bMoveBefore = false;
for (int i = 0; i < PrefixString.Length; i++)
{
tempint0 = line.IndexOf(PrefixString[i],StringComparison.OrdinalIgnoreCase);
{
tempint0 = line.IndexOf(PrefixString[i],StringComparison.OrdinalIgnoreCase);
if (tempint0 < 0) continue;
if (tempint0 > 0)
{
tempint1 = line.IndexOf('\'');
{
tempint1 = line.IndexOf('\'');
if(tempint1 != -1 && tempint1 < tempint0)
{
continue;
}
{
continue;
}
if (line[tempint0 - 1] != ' ')
{
continue;
}
}
{
continue;
}
}
switch (i)
{
case 3:
tempint1 = line.IndexOf("Then",tempint0,line.Length - tempint0,StringComparison.OrdinalIgnoreCase);
if (tempint1 == -1) continue;
{
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;
{
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;
result = true;
break;
}
break;
}
break;
}
return result;
}
}
private bool DisposedSuffix(string line)
{
bool result = false;
int tempint0;
int tempint1;
{
bool result = false;
int tempint0;
int tempint1;
for(int i = 0; i < SuffixString.Length; i++)
{
tempint0 = line.IndexOf(SuffixString[i],StringComparison.OrdinalIgnoreCase);
{
tempint0 = line.IndexOf(SuffixString[i],StringComparison.OrdinalIgnoreCase);
if (tempint0 < 0) continue;
if (tempint0 > 0)
{
tempint1 = line.IndexOf('\'');
{
tempint1 = line.IndexOf('\'');
if (tempint1 != -1 && tempint1 < tempint0)
{
continue;
}
{
continue;
}
if (tempint0 + SuffixString[i].Length < line.Length)
{
if(line[tempint0 + SuffixString[i].Length] != ' ')
{
continue;
}
}
{
if(line[tempint0 + SuffixString[i].Length] != ' ')
{
continue;
}
}
if (i == 2)
{
string ts = line.Substring(0,tempint0 - 1).Trim();
int ta;
{
string ts = line.Substring(0,tempint0 - 1).Trim();
int ta;
if (!string.IsNullOrEmpty(ts))
{
if(!int.TryParse(ts,out ta))
{
continue;
}
}
}
}
{
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;
{
string[] lines = source.Split('\n');
StringBuilder sb = new StringBuilder();
string sTabs = "";
bool bMoveBefore = false;
foreach (string line in lines)
{
string tmpLine = line.Trim();
{
string tmpLine = line.Trim();
if(string.IsNullOrEmpty(tmpLine))
{
continue;
}
{
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;
}
{
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);
}
}
}
{
if (sTabs.Length > 0)
{
sTabs = sTabs.Remove(0,1);
}
}
}
sb.Append(sTabs); sb.AppendLine(tmpLine); } return sb.ToString(); }