一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - VBS - 美化你的代碼 vb(VBS)代碼格式化的實現代碼

美化你的代碼 vb(VBS)代碼格式化的實現代碼

2020-11-09 00:14itianda's blog VBS

雖然VB.NET出現很久了,但還有好多人仍然在使用VB6。我在實現一些小功能的時候也喜歡用VB6,畢竟誰都不想每天的美好心情被VS那烏龜般的啟動速度影響

不過VB.NET確實有許多VB6沒有的新功能,代碼的自動排版就是一項,這也正是我們今天要實現的功能——VB代碼格式化。
先看下實現的效果:

格式化前:

復制代碼 代碼如下:

For i = 0 To WebBrowser1.Document.All.length - 1
If WebBrowser1.Document.All(i).tagName = "HTML" Then
strContent = strContent & WebBrowser1.Document.All(i).innerHTML
Exit For
End If
Next


格式化后:

復制代碼 代碼如下:

For i = 0 To WebBrowser1.Document.All.length - 1
If WebBrowser1.Document.All(i).tagName = "HTML" Then
strContent = strContent & WebBrowser1.Document.All(i).innerHTML
Exit For
End If
Next


C++水平一直很爛,所以選擇了C++作為練手語言寫了這個簡陋的VB代碼格式化工具。代碼不長,才200多行,標準C++實現。另外,為了徹底打消某些人繼續使用VC6的念頭,使用了auto關鍵字嘿嘿。好吧,廢話少說,直接上代碼:

復制代碼 代碼如下:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<fstream>
using namespace std;

//判斷是否為空格
bool isSpace(const char chr)
{
return chr == ' ';
}

//去除左側空白
void leftTrim(string &str)
{
string::iterator p=find_if(str.begin(),str.end(),not1(ptr_fun(isSpace)));
str.erase(str.begin(),p);
}

//去除右側空白
void rightTrim(string& str)
{
string::reverse_iterator p=find_if(str.rbegin(),str.rend(),not1(ptr_fun(isSpace)));
str.erase(p.base(),str.end());
}

//去除兩側空白
string trim(const string& str)
{
string strRet(str);
leftTrim(strRet);
rightTrim(strRet);
return strRet;
}

//轉換成小寫
string toLower(const string& str)
{
string strRet(str);
transform(strRet.begin(),strRet.end(),strRet.begin(),(int (*)(int))tolower);
return strRet;
}

//判斷是否以給定關鍵字開頭
bool startWith(const vector<string>& vecCodeKeywords,const string& strCodeLine)
{
string line(toLower(strCodeLine));
for(auto keyword=vecCodeKeywords.begin(); keyword!=vecCodeKeywords.end(); keyword++)
if(line.find(*keyword + " ")==0 || line== *keyword)
return true;
return false;
}

//IF...Then...特殊檢查
bool checkForIfThen(const string& strCodeLine)
{
vector<string> vecIf;
vecIf.push_back("if");
if(!startWith(vecIf,strCodeLine))
return false;
if(toLower(strCodeLine).find("then")==string::npos)
return false;
string line(trim(toLower(strCodeLine)));
if(line.length()<7)
return false;
return !(line.substr(line.length()-4,4) == "then");
}

//格式化給定行并標記相關信息
int formatAndMarkLine(string& strCodeLine)
{
//起始關鍵字 "if","for","[Private | Friend | Public] [Static] [Sub | Function | Property | Type]","with","do","select"
vector<string> vecStartKeywords;
vecStartKeywords.push_back("if");
vecStartKeywords.push_back("for");
vecStartKeywords.push_back("with");
vecStartKeywords.push_back("do");
vecStartKeywords.push_back("select");
string _pfp[] = {"private","friend","public"}; //可空
string _s[] = {"static"}; //可空
string _sfpt[] = {"sub","function","property","type"};
//_pfp _s 都為空
for(auto i=0; i<4; i++)
vecStartKeywords.push_back(_sfpt[i]);
//_pfp 為空
for(auto i=0; i<4; i++)
vecStartKeywords.push_back(_s[0] + " " + _sfpt[i]);
//_s 為空
for(auto i=0; i<4; i++)
for(auto j=0; j<3; j++)
vecStartKeywords.push_back(_pfp[j] + " " + _sfpt[i]);
//_pfp _s 都不為空
for(auto i=0; i<4; i++)
for(auto j=0; j<3; j++)
vecStartKeywords.push_back(_pfp[j] + " " + _s[0] + " " + _sfpt[i]);

//終止關鍵字 "end if","next","End [Sub | Function | Property | Type]","end with","loop","end select"
vector<string> vecEndKeywords;
vecEndKeywords.push_back("end if");
vecEndKeywords.push_back("next");
vecEndKeywords.push_back("end with");
vecEndKeywords.push_back("loop");
vecEndKeywords.push_back("end select");
for(auto i=0; i<4; i++)
vecEndKeywords.push_back("end " + _sfpt[i]);

//中間關鍵字 "else","elseif","case"
vector<string> vecMiddleKeywords;
vecMiddleKeywords.push_back("else");
vecMiddleKeywords.push_back("elseif");
vecMiddleKeywords.push_back("case");

auto mark = 0;
char c;
auto n=0;
string line;
auto quote = false; //雙引號狀態
/*
規則:
雙引號內單引號不考慮,否則后面內容成為注釋
*/
auto space = true; //空白符狀態 false 表示未遇到任何空白符
while((c=strCodeLine[n++]))
{
switch(c)
{
case ' ':
case '\t':
if(quote)
{
line += c;
}
else
{
if(!space)
{
line += c;
space = true;
}
}
break;
case '"':
space = false;
quote = !quote;
line += c;
break;
case '\'':
space = false;
if(quote)
line += c;
else
{
line += " '"; //MsgBox("itianda") '單引號前有一個空格
while((c=strCodeLine[n++])) //直接附加單引號后面內容
line += c;
continue;
}
break;
case '_': //續行符
space = false;
line += c;
if(!quote && n==(int)strCodeLine.length() && n-2>=0 && strCodeLine[n-2]==' ')
mark |= 0x80; //10000000
break;
default:
space = false;
line += c;
}
}
strCodeLine = line;
if(startWith(vecStartKeywords,line) && !checkForIfThen(line))
mark += 1;
if(startWith(vecEndKeywords,line))
mark += 2;
if(startWith(vecMiddleKeywords,line))
mark += 3;
return mark;
}

//將代碼按行分割
void splitToLines(const string& strCode, vector<string>& vecCodeLines)
{
vecCodeLines.clear();
char c;
auto n=0;
string line;
while((c=strCode[n++]))
{
if(c!='\n')
line += c;
else
{
vecCodeLines.push_back(line);
line.clear();
}
}
if(line.length()) //最后一行為空則舍去
vecCodeLines.push_back(line);
}

//格式化給定代碼
void formatCode(string& strCode,const string& strIndentString)
{
vector<string> vecLines; //所有代碼行
splitToLines(strCode,vecLines); //獲取所有代碼行
if(vecLines.size()==0)
{
return;
}
auto indentLevel = 0; //縮進級別
auto incompleteLine = false; //是否是未結束行
for(auto line=vecLines.begin(); line!=vecLines.end(); line++)
{
auto indent = indentLevel;
auto mask = formatAndMarkLine(*line);
switch(mask & ~0x80)
{
case 0:
break;
case 1:
indentLevel++;
break;
case 2:
indent--;
indentLevel--;
break;
case 3:
indent--;
break;
}
if(incompleteLine)
indent++;
incompleteLine = mask & 0x80;
if(indent<0)
indent = 0;
if(indentLevel<0)
indentLevel = 0;
string strIndent;
for(auto i=0; i<indent; i++)
strIndent += strIndentString;
*line = strIndent + *line;
}
strCode.clear();
for(auto line=vecLines.begin(); line!=vecLines.end(); line++)
strCode+= trim(*line).length() ? "\n" + *line : "";
}

int main()
{
string indentString = " ";
string code;
ifstream inputFile("in.txt");
string line;
while(getline(inputFile,line))
{
code += line + "\n";
}
formatCode(code,indentString);
ofstream outputFile("out.txt");
outputFile<<"Your beautiful code:"<<endl<<
"-------------------------------------------------------------------"
<<endl<<code<<endl<<endl<<
"-------------------------------------------------------------------"
<<endl<<
" Formatted by itianda's PUVBFormatter"
<<endl<<
" http://www.programup.com/blog"
<<endl;
return 0;
}


看過代碼應該知道這是多么基本的實現了吧,好多細節都沒有去仔細處理,比如沒有考慮冒號連接多行的情況,所以如果你希望使用此工具,請不要把多行語句寫到一行哦!

更新:
增加select case…end select關鍵字,感謝jjww2999網友的反饋。
本文來自: itianda's blog

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲成av人影院 | 美女扒开腿让男人桶爽动态图片 | se01在线看片| 丝袜兔女郎被啪在线观看91 | 国产一级毛片国语版 | 69pao强力打造免费高速 | 亚洲AV精品无码喷水直播间 | 日本玖玖视频 | 欧美国产日本高清不卡 | 高清国产精品久久久久 | 欧美s级人做人爱c视频 | 高考录取率1977-2021 | 日韩毛片基地一区二区三区 | 2020韩国r级理论片在线观看 | 色天天综合网色鬼综合 | 久久99re热在线观看视频 | 欧美另类videos另类粗暴 | 欧美高清免费一级在线 | 91理论片午午伦夜理片久久 | 青青久在线视频免费观看 | 无套啪啪 | 青青久久久国产线免观 | 欧美gayxxxx| 紧身短裙女教师波多野 | 都市后宫小说 | 狠狠色综合久久久久尤物 | 60岁妇女毛片免费观看 | 亚洲欧美日本在线观看 | 精品一区二区三区五区六区七区 | 丝袜足控免费网站xx动漫漫画 | 亚洲美女爱爱 | 日韩毛片基地一区二区三区 | 国产真实偷乱视频在线观看 | 午夜一级视频 | 免费日本在线 | 免费观看美景之屋 | 奇米影视欧美 | 免费高清在线观看 | 日韩经典在线 | 国产在线步兵一区二区三区 | 亚洲精品国产成人99久久 |