VBS代码格式化工具的源码 代码格式化 源代码

VBS代码格式化工具的源码:
━━━━━━━━━━━━━━━━━━━━━━━━━
OptionExplicit

IfWScript.Arguments.Count=0Then
MsgBox"请将要格式化的代码文件拖动到这个文件上",vbInformation,"使用方法"
WScript.Quit
EndIf

'作者:Demon
'时间:2011/12/24
'链接:http://demon.tw/my-work/vbs-beautifier.html
'描述:VBScript代码格式化工具
'注意:
'1.错误的VBScript代码不能被正确地格式化
'2.代码中不能含有%[comment]%%[quoted]%等模板标签,有待改进
'3.由2可知,该工具不能格式化自身

DimBeautifier,iSetBeautifier=NewVbsBeautifier
ForEachiInWScript.Arguments
Beautifier.BeautifyFileiNextMsgBox"代码格式化完成",vbInformation,"提示"
ClassVbsBeautifier
'VbsBeautifier类
Privatequoted,comments,code,indents
PrivateReservedWord,BuiltInFunction,BuiltInConstants,VersionInfo
'公共方法
'格式化字符串
PublicFunctionBeautify(ByValinput)
code=input
code=Replace(code,vbCrLf,vbLf)

CallGetQuoted()
CallGetComments()
CallGetErrorHandling()

CallColonToNewLine()
CallFixSpaces()
CallReplaceReservedWord()
CallInsertIndent()
CallFixIndent()

CallPutErrorHandling()
CallPutComments()
CallPutQuoted()

code=Replace(code,vbLf,vbCrLf)
code=VersionInfo&code
Beautify=code
EndFunction


'公共方法
'格式化文件
PublicFunctionBeautifyFile(ByValpath)
Dimfso
Setfso=CreateObject("scripting.filesystemobject")
BeautifyFile=Beautify(fso.OpenTextFile(path).ReadAll)
'备份文件以免出错
fso.GetFile(path).Copypath&".bak",True
fso.OpenTextFile(path,2,True).Write(BeautifyFile)
EndFunction

PrivateSubClass_Initialize()
'保留字
ReservedWord="AndAsBooleanByRefByteByValCallCaseClassConstCurrencyDebugDimDoDoubleEachElseElseIfEmptyEndEndIfEnumEqvEventExitExplicitFalseForFunctionGetGotoIfImpImplementsInIntegerIsLetLikeLongLoopLSetMeModNewNextNotNothingNullOnOptionOptionalOrParamArrayPreservePrivatePropertyPublicRaiseEventReDimRemResumeRSetSelectSetSharedSingleStaticStopSubThenToTrueTypeTypeOfUntilVariantWEndWhileWithXor"
'内置函数
BuiltInFunction="AbsArrayAscAtnCBoolCByteCCurCDateCDblCIntCLngCSngCStrChrCosCreateObjectDateDateAddDateDiffDatePartDateSerialDateValueDayEscapeEvalExpFilterFixFormatCurrencyFormatDateTimeFormatNumberFormatPercentGetLocaleGetObjectGetRefHexHourInStrInStrRevInputBoxIntIsArrayIsDateIsEmptyIsNullIsNumericIsObjectJoinLBoundLCaseLTrimLeftLenLoadPictureLogMidMinuteMonthMonthNameMsgBoxNowOctRandomizeRGBRTrimReplaceRightRndRoundScriptEngineScriptEngineBuildVersionScriptEngineMajorVersionScriptEngineMinorVersionSecondSetLocaleSgnSinSpaceSplitSqrStrCompStrReverseStringTanTimeTimeSerialTimeValueTimerTrimTypeNameUBoundUCaseVarTypeWeekdayWeekdayNameYear"

'内置常量
BuiltInConstants="vbBlackvbRedvbGreenvbYellowvbBluevbMagentavbCyanvbWhitevbBinaryComparevbTextComparevbSundayvbMondayvbTuesdayvbWednesdayvbThursdayvbFridayvbSaturdayvbUseSystemDayOfWeekvbFirstJan1vbFirstFourDaysvbFirstFullWeekvbGeneralDatevbLongDatevbShortDatevbLongTimevbShortTimevbObjectErrorvbOKOnlyvbOKCancelvbAbortRetryIgnorevbYesNoCancelvbYesNovbRetryCancelvbCriticalvbQuestionvbExclamationvbInformationvbDefaultButton1vbDefaultButton2vbDefaultButton3vbDefaultButton4vbApplicationModalvbSystemModalvbOKvbCancelvbAbortvbRetryvbIgnorevbYesvbNovbCrvbCrLfvbFormFeedvbLfvbNewLinevbNullCharvbNullStringvbTabvbVerticalTabvbUseDefaultvbTruevbFalsevbEmptyvbNullvbIntegervbLongvbSinglevbDoublevbCurrencyvbDatevbStringvbObjectvbErrorvbBooleanvbVariantvbDataObjectvbDecimalvbBytevbArrayWScript"

'版本信息
VersionInfo=Chr(39)&Chr(86)&Chr(98)&Chr(115)&Chr(66)&Chr(101)&Chr(97)&Chr(117)&Chr(116)&Chr(105)&Chr(102)&Chr(105)&Chr(101)&Chr(114)&Chr(32)&Chr(49)&Chr(46)&Chr(48)&Chr(32)&Chr(98)&Chr(121)&Chr(32)&Chr(68)&Chr(101)&Chr(109)&Chr(111)&Chr(110)&Chr(13)&Chr(10)&Chr(39)&Chr(104)&Chr(116)&Chr(116)&Chr(112)&Chr(58)&Chr(47)&Chr(47)&Chr(100)&Chr(101)&Chr(109)&Chr(111)&Chr(110)&Chr(46)&Chr(116)&Chr(119)&Chr(13)&Chr(10)

'缩进大小
Setindents=CreateObject("scripting.dictionary")
indents("if")=1
indents("sub")=1
indents("function")=1
indents("property")=1
indents("for")=1
indents("while")=1
indents("do")=1
indents("for")=1
indents("select")=1
indents("with")=1
indents("class")=1
indents("end")=- 1
indents("next")=- 1
indents("loop")=- 1
indents("wend")=- 1
EndSub

PrivateSubClass_Terminate()
'什么也不做
EndSub

'将字符串替换成%[quoted]%
PrivateSubGetQuoted()
Dimre
Setre=NewRegExp
re.Global=True
re.Pattern=""".*?"""
Setquoted=re.Execute(code)
code=re.Replace(code,"%[quoted]%")
EndSub

'将%[quoted]%替换回字符串
PrivateSubPutQuoted()
Dimi
ForEachiInquoted
code=Replace(code,"%[quoted]%",i,1,1)
Next
EndSub
'将注释替换成%[comment]%

PrivateSubGetComments()
Dimre
Setre=NewRegExp
re.Global=True
re.Pattern="'.*"
Setcomments=re.Execute(code)
code=re.Replace(code,"%[comment]%")
EndSub

'将%[comment]%替换回注释
PrivateSubPutComments()
Dimi
ForEachiIncomments
code=Replace(code,"%[comment]%",i,1,1)
NextEndSub

'将冒号替换成换行
PrivateSubColonToNewLine
code=Replace(code,":",vbLf)
EndSub

'将错误处理语句替换成模板标签
PrivateSubGetErrorHandling()
Dimre
Setre=NewRegExp
re.Global=True
re.IgnoreCase=True
re.Pattern="ons+errors+resumes+next"
code=re.Replace(code,"%[resumenext]%")
re.Pattern="ons+errors+gotos+0"
code=re.Replace(code,"%[gotozero]%")
EndSub

'将模板标签替换回错误处理语句
PrivateSubPutErrorHandling()
code=Replace(code,"%[resumenext]%","OnErrorResumeNext")
code=Replace(code,"%[gotozero]%","OnErrorGoTo0")
EndSub

'格式化空格
PrivateSubFixSpaces()
Dimre
Setre=NewRegExp
re.Global=True
re.IgnoreCase=True
re.MultiLine=True
'去掉每行前后的空格
re.Pattern="^[t]*(.*?)[t]*$"
code=re.Replace(code,"$1")
'在操作符前后添加空格
re.Pattern="[t]*(=|<|>|-|+|&|*|/|^|\)[t]*"
code=re.Replace(code,"$1")
'去掉<>中间的空格
re.Pattern="[t]*<s*>[t]*"
code=re.Replace(code,"<>")
'去掉<=中间的空格
re.Pattern="[t]*<s*=[t]*"
code=re.Replace(code,"<=")
'去掉>=中间的空格
re.Pattern="[t]*>s*=[t]*"
code=re.Replace(code,">=")
'在行尾的_前面加上空格
re.Pattern="[t]*_[t]*$"
code=re.Replace(code,"_")
'去掉DoWhile中间多余的空格
re.Pattern="[t]*Dos*While[t]*"
code=re.Replace(code,"DoWhile")
'去掉DoUntil中间多余的空格
re.Pattern="[t]*Dos*Until[t]*"
code=re.Replace(code,"DoUntil")
'去掉EndSub中间多余的空格
re.Pattern="[t]*Ends*Sub[t]*"
code=re.Replace(code,"EndSub")
'去掉EndFunction中间多余的空格
re.Pattern="[t]*Ends*Function[t]*"
code=re.Replace(code,"EndFunction")
'去掉EndIf中间多余的空格
re.Pattern="[t]*Ends*If[t]*"
code=re.Replace(code,"EndIf")
'去掉EndWith中间多余的空格
re.Pattern="[t]*Ends*With[t]*"
code=re.Replace(code,"EndWith")
'去掉EndSelect中间多余的空格
re.Pattern="[t]*Ends*Select[t]*"
code=re.Replace(code,"EndSelect")
'去掉SelectCase中间多余的空格
re.Pattern="[t]*Selects*Case[t]*"
code=re.Replace(code,"SelectCase")
EndSub

VBS代码格式化工具的源码 代码格式化 源代码
'将保留字内置函数内置常量替换成首字母大写
PrivateSubReplaceReservedWord()
Dimre,words,word
Setre=NewRegExp
re.Global=True
re.IgnoreCase=True
re.MultiLine=True
words=Split(ReservedWord,"")
ForEachwordInwords
re.Pattern="(b)"&word&"(b)"
code=re.Replace(code,"$1"&word&"$2")
Next
words=Split(BuiltInFunction,"")
ForEachwordInwords
re.Pattern="(b)"&word&"(b)"
code=re.Replace(code,"$1"&word&"$2")
Next

words=Split(BuiltInConstants,"")
ForEachwordInwords
re.Pattern="(b)"&word&"(b)"
code=re.Replace(code,"$1"&word&"$2")
Next
EndSub

'插入缩进
PrivateSubInsertIndent()
Dimlines,line,i,n,t,delta
lines=Split(code,vbLf)
n=UBound(lines)
Fori=0Ton
line=lines(i)
SingleLineIfThenline
t=delta
delta=delta+CountDelta(line)

Ift<=deltaThen
lines(i)=String(t,vbTab)&lines(i)
Else
lines(i)=String(delta,vbTab)&lines(i)
EndIf
Next
code=Join(lines,vbLf)
EndSub


'调整错误的缩进
PrivateSubFixIndent()
Dimlines,i,n,re
Setre=NewRegExp
re.IgnoreCase=True
lines=Split(code,vbLf)
n=UBound(lines)
Fori=0Ton
re.Pattern="^t*else"
Ifre.Test(lines(i))Then
lines(i)=Replace(lines(i),vbTab,"",1,1)
EndIf
Next
code=Join(lines,vbLf)
EndSub


'计算缩进大小
PrivateFunctionCountDelta(ByRefline)
Dimi,re,delta
Setre=NewRegExp
re.Global=True
re.IgnoreCase=True
ForEachiInindents.Keys

re.Pattern="^s*b"&i&"b"

Ifre.Test(line)Then

'方便调试
'WScript.Echoline
line=re.Replace(line,"")
delta=delta+indents(i)

EndIf
Next
CountDelta=delta
EndFunction


'处理单行的IfThen
PrivateSubSingleLineIfThen(ByRefline)
Dimre
Setre=NewRegExp
re.IgnoreCase=True
re.Pattern="if.*?then.+"
line=re.Replace(line,"")
'去掉PrivatePublic前缀
re.Pattern="(private|public).+?(sub|function|property)"
line=re.Replace(line,"$2")
EndSub
EndClass


'Demon,于2011年平安夜

  

爱华网本文地址 » http://www.413yy.cn/a/25101012/108621.html

更多阅读

股票公式全解析:16 股票软件源码引入

股票公式全解析:[16]股票软件源码引入——简介我们上一篇文章主要说明了大智慧的源码引入的基本方法,大家在使用这个源码的时候一定要注意具体的设置,按照我的要求一步一步实现,源码的编写我会专门有一个介绍,现在我继续说明其他股票软件

如何获得dota2的激活码? 如何获得百度云激活码

如何获得dota2的激活码?——简介dota 2已经登录国服,但是完美代理激活码一号难得,本文通过作者对相关信息整理,分享了几个获得方式 。如何获得dota2的激活码?——工具/原料dota2激活码获取方式有很多种,可以通过购买、也有少量免费激活码

易语言进度条源码 精易论坛

易语言进度条源码——简介今天,我给大家带来如何弄进度条!易语言进度条源码——工具/原料电脑易语言易语言进度条源码——方法/步骤易语言进度条源码 1、打开易语言!拉

关于真实女友的去码补丁 使用 真实女友去码后图片

关于真实女友的去码补丁 使用——简介真实女友的补丁关于真实女友的去码补丁 使用——工具/原料去码补丁真实女友关于真实女友的去码补丁 使用——方法/步骤关于真实女友的去码补丁 使用 1、首先找到游戏目录下的 data 文件夹关

声明:《VBS代码格式化工具的源码 代码格式化 源代码》为网友属于我分享!如侵犯到您的合法权益请联系我们删除