Set objDict = server.CreateObject("Scripting.Dictionary") objDict.CompareMode = 1
CreateKeywords
Set objFSO = server.CreateObject("Scripting.FileSystemObject") End Sub
Private Sub Class_Terminate() Set objDict = Nothing Set objFSO = Nothing End Sub
Public Property Let CodeColor(inColor) m_CodeColor = "<font color=" & inColor & "><Strong>" End Property Private Property Get CodeColor() CodeColor = m_CodeColor End Property
Public Property Let CommentColor(inColor) m_CommentColor = "<font color=" & inColor & ">" End Property Private Property Get CommentColor() CommentColor = m_CommentColor End Property
Public Property Let StringColor(inColor) m_StringColor = "<font color=" & inColor & ">" End Property Private Property Get StringColor() StringColor = m_StringColor End Property
Public Property Let TabSpaces(inSpaces) m_TabSpaces = inSpaces End Property Private Property Get TabSpaces() TabSpaces = m_TabSpaces End Property
Public Property Let TableBGColor(inColor) m_TableBGColor = inColor End Property
Private Property Get TableBGColor() TableBGColor = m_TableBGColor End Property
Public Property Get ProcessingTime() ProcessingTime = Second(m_EndTime - m_StartTime) End Property
Public Property Get LineCount() LineCount = m_LineCount End Property
Public Property Get PathToFile() PathToFile = m_strPathToFile End Property Public Property Let PathToFile(inPath) m_strPathToFile = inPath End Property
Private Property Let KeyMin(inMin) m_intKeyMin = inMin End Property Private Property Get KeyMin() KeyMin = m_intKeyMin End Property Private Property Let KeyMax(inMax) m_intKeyMax = inMax End Property Private Property Get KeyMax() KeyMax = m_intKeyMax End Property
" Check for the top script line that set"s the default script language " for the page. If left( tempString, 3 ) = Chr(60) & "%@" And right(tempString, 2) = "%" & Chr(62) Then Response.Write "<table><tr bgcolor=yellow><td>" Response.Write server.HTMLEncode(m_strReadLine) Response.Write "</td></tr></table>" blnInScriptBlock = False " Check for an opening script tag ElseIf Left( tempString, 2) = Chr(60) & "%" Then " Check for a closing script tag on the same line If right( RTrim(tempString), 2 ) = "%" & Chr(62) Then Response.Write "<table><tr><td bgcolor=yellow><%</td>" Response.Write "<td>" Response.Write CharacterParse(mid(m_strReadLine, 3, Len(m_strReadLine) - 4)) Response.Write "</td>" Response.Write "<td bgcolor=yellow>%gt;</td></tr></table>" blnInScriptBlock = False Else Response.Write "<table><tr bgcolor=yellow><td><%</td></tr></table>" " We"ve got an opening script tag so set the flag to true so " that we know to start parsing the lines for keywords/comments blnInScriptBlock = True End If Else If blnInScriptBlock Then If blnEmptyLine Then Response.Write vbCrLf Else If right(tempString, 2) = "%" & Chr(62) Then Response.Write "<table><tr bgcolor=yellow><td>%></td></tr></table>" blnInScriptBlock = False Else Response.Write CharacterParse(m_strReadLine) & vbCrLf End If End If Else If blnOutputHTML Then If blnEmptyLine Then Response.Write vbCrLf Else Response.Write server.HTMLEncode(m_strReadLine) & vbCrLf End If End If End If End If Loop
" Grab the time at the completion of processing m_EndTime = Time()
" Close the outside table Response.Write "</PRE></td></tr></table>"
" Close the file and destroy the file object objFile.close Set objFile = Nothing End Sub
" This function parses a line character by character Private Function CharacterParse(inLine) Dim charBuffer, tempChar, i, outputString Dim insideString, workString, holdChar
insideString = False outputString = ""
For i = 1 to Len(inLine) tempChar = mid(inLine, i, 1) Select Case tempChar Case " " If Not insideString Then charBuffer = charBuffer & " " If charBuffer <>" " Then If left(charBuffer, 1) = " " Then outputString = outputString & " "
" Check for a "rem" style comment marker If LCase(Trim(charBuffer)) = "rem" Then outputString = outputString & CommentColor outputString = outputString & "REM" workString = mid( inLine, i, Len(inLine)) workString = replace(workString, "<", "&lt;") workString = replace(workString, ">", "&gt;") outputString = outputString & workString & "</font>" charBuffer = "" Exit For End If
outputString = outputString & FindReplace(Trim(charBuffer)) If right(charBuffer, 1) = " " Then outputString = outputString & " " charBuffer = "" End If Else outputString = outputString & " " End If Case "(" If left(charBuffer, 1) = " " Then outputString = outputString & " " End If outputString = outputString & FindReplace(Trim(charBuffer)) & "(" charBuffer = "" Case Chr(60) outputString = outputString & "<" Case Chr(62) outputString = outputString & ">" Case Chr(34) " catch quote chars and flip a boolean variable to denote that " whether or not we"re "inside" a quoted string insideString = Not insideString If insideString Then outputString = outputString & StringColor outputString = outputString & "&quot;" Else outputString = outputString & """" outputString = outputString & "</font>" End If Case """ " Catch comments and output the rest of the line " as a comment IF we"re not inside a string. If Not insideString Then outputString = outputString & CommentColor workString = mid( inLine, i, Len(inLine)) workString = replace(workString, "<", "&lt;") workString = replace(workString, ">", "&gt;") outputString = outputString & workString outputString = outputString & "</font>" Exit For Else outputString = outputString & """ End If Case Else " We"ve dealt with special case characters so now " we"ll begin adding characters to our outputString " or charBuffer depending on the state of the insideString " boolean variable If insideString Then outputString = outputString & tempChar Else charBuffer = charBuffer & tempChar End If End Select Next
" Deal with the last part of the string in the character buffer If Left(charBuffer, 1) = " " Then outputString = outputString & " " End If " Check for closing parentheses at the end of a string If right(charBuffer, 1) = ")" Then charBuffer = Left(charBuffer, Len(charBuffer) - 1) CharacterParse = outputString & FindReplace(Trim(charBuffer)) & ")" Exit Function End If
CharacterParse = outputString & FindReplace(Trim(charBuffer)) End Function
" return true or false if a passed in number is between KeyMin and KeyMax Private Function InRange(inLen) If inLen >= KeyMin And inLen <= KeyMax Then InRange = True Exit Function End If InRange = False End Function
" Evaluate the passed in string and see if it"s a keyword in the " dictionary. If it is we will add html formatting to the string " and return it to the caller. Otherwise just return the same " string as was passed in. Private Function FindReplace(inToken) " Check the length to make sure it"s within the range of KeyMin and KeyMax If InRange(Len(inToken)) Then If objDict.Exists(inToken) Then FindReplace = CodeColor & objDict.Item(inToken) & "</Strong></Font>" Exit Function End If End If " Keyword is either too short or too long or doesn"t exist in the " dictionary so we"ll just return what was passed in to the function FindReplace = inToken End Function
End Class %>
<!--#include file="token.asp"--> <% " ************************************************************************* " This is all test/example code showing the calling syntax of the " cBuffer class ... the interface to the cBuffer object is quite simple. " " Use it for reference ... delete it ... whatever. " *************************************************************************
REM This is a rem type comment just for testing purposes!
" This variable will hold an instance of the cBuffer class Dim objBuffer
" Set up the error handling On Error Resume Next
" create the instance of the cBuffer class Set objBuffer = New cBuffer
" Set the PathToFile property of the cBuffer class " " Just for kicks we"ll use the asp file that we created " in the last installment of this article series for testing purposes objBuffer.PathToFile = "../081899/random.asp" "这是文件名啦。
" Here"s an example of how to add a new keyword to the keyword array " You could add a list of your own function names, variables or whatever...cool! " NOTE: You can add different HTML formatting if you like, the <strong> " attribute will applied to all keywords ... this is likely to change " in the near future. " "objBuffer.AddKeyword "response.write", "<font color=Red>Response.Write</font>"
" Here are examples of changing the table background color, code color, " comment color, string color and tab space properties " "objBuffer.TableBGColor = "LightGrey" " or "objBuffer.TableBGColor = "#ffffdd" " simple right? "objBuffer.CodeColor = "Red" "objBuffer.CommentColor = "Orange" "objBuffer.StringColor = "Purple" "objBuffer.TabSpaces = " "
" Call the ParseFile method of the cBuffer class, pass it true if you want the " HTML contained in the page output or false if you don"t objBuffer.ParseFile False "注意:显示代码的response.write已经在class中。这里调用方法就可以了。
" Check for errors that may have been raised and write them out If Err.number <> 0 Then Response.Write Err.number & ":" & Err.description & ":" & Err.source & "<br>" End If
" Output the processing time and number of lines processed by the script Response.Write "<strong>Processing Time:</strong> " & objBuffer.ProcessingTime & " seconds<br>" Response.Write "<strong>Lines Processed:</strong> " & objBuffer.LineCount & "<br>"
" Destroy the instance of our cBuffer class Set objBuffer = Nothing %>