Here you go:-
Framework MaxGUI.MaxGUI
Import BRL.EventQueue
Import BRL.Retro
Import MaxGui.Drivers
SuperStrict
Local window:TGadget = CreateWindow("SPad",30,20,400,300,Desktop(),WINDOW_TITLEBAR | WINDOW_MENU | WINDOW_STATUS)
Local textarea:TGadget = CreateTextArea(0,0,ClientWidth(window),ClientHeight(window),window)
SetTextAreaColor(textarea,1,81,107,True)
SetTextAreaColor(textarea,255,255,255,False)
'Menu
Local filemenu:TGadget
Const MENU_OPEN:Int=101
filemenu=CreateMenu("&File",0,WindowMenu(window))
CreateMenu"&Open",MENU_OPEN,filemenu,KEY_O,MODIFIER_COMMAND
UpdateWindowMenu window
While True
PollEvent()
Select EventID()
Case EVENT_GADGETACTION
Select(EventSource())
Case textarea
FormatLine(textarea)
End Select
Case EVENT_WINDOWCLOSE
End
Case EVENT_MENUACTION
Select EventData()
Case MENU_OPEN
Local result:String = RequestFile("Open file...","All files:*",False)
If result <> ""
SetTextAreaText(textArea,LoadText$(result))
FormatDocument(textArea)
End If
End Select
End Select
Wend
Function FormatLine(textArea:TGadget)
Local cursorpos:Int
Local currentline:Int, lineString:String
Local lineCharStart:Int, lineCharEnd:Int
cursorpos=TextAreaCursor(textArea)
currentLine = TextAreaLine(textArea,cursorPos)
lineCharStart = TextAreaChar(textArea,currentLine)
lineString = ""
For Local loop:Int = lineCharStart To TextAreaLen(textArea)
Local char:String = TextAreaText$(textArea,loop,1)
If (TextAreaLine(textArea,loop) <> currentLine) Or (loop = TextAreaLen(textArea))
lineCharEnd = loop-1
Exit
End If
lineString = lineString + char
Next
Local lex:TLexer = New TLexer
If lineString <> ""
lex.mLexLine(lineString)
End If
Local r:Int,g:Int,b:Int,flag:Int
Local inTag:Byte = False
For Local loop:Int = 0 To lex.iTokenAmount
r = 255 ; g = 255 ; b = 255 ; flag = 0
Local tempToken:String = lex.sTokenBank[loop]
If tempToken = "<"
r = 0 ; g = 255 ; b = 255
inTag = True
End If
If tempToken = ">"
r = 0 ; g = 255 ; b = 255
inTag = False
End If
If tempToken = "/" Or tempToken = "!"
If lex.sTokenBank[loop-1] = "<"
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
End If
End If
For Local keyWordLoop:Int = 0 To lex.sKeywords.length-1
If intag = True
If lex.sKeywords[KeyWordLoop] = tempToken
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
Exit
End If
End If
If tempToken = "h"
If lex.sTokenBank[loop-1] = "<" Or lex.sTokenBank[loop-1] = "/"
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
End If
End If
Next
If Left$(tempToken,1) = "~q"
r = 50 ; g = 255 ; b = 50
End If
For Local numbersLoop:Int = 0 To lex.sNumbers.length-1
If lex.sNumbers[numbersLoop] = Left$(tempToken,1)
r = 192 ; g = 192 ; b = 192
If lex.sTokenBank[loop-1] = "h"
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
End If
Exit
End If
Next
SetTextAreaText(textArea,tempToken,lineCharStart,Len(tempToken))
FormatTextAreaText(textArea,r,g,b,flag,lineCharStart,Len(tempToken))
lineCharStart = lineCharStart+Len(tempToken)
Next
End Function
Function FormatDocument(textArea:TGadget)
Local lineCount:Int = TextAreaLine(textArea,TextAreaLen(textArea))
Local currentline:Int, lineString:String
Local lineCharStart:Int, lineCharEnd:Int
For Local loopx:Int = 0 To lineCount
lineCharStart = TextAreaChar(textArea,loopx)
lineString = ""
For Local loop:Int = lineCharStart To TextAreaLen(textArea)
Local char:String = TextAreaText$(textArea,loop,1)
If (TextAreaLine(textArea,loop) <> loopx) Or (loopx = TextAreaLen(textArea))
lineCharEnd = loop-1
Exit
End If
lineString = lineString + char
Next
Local lex:TLexer = New TLexer
lex.mLexLine(lineString)
Local r:Int,g:Int,b:Int,flag:Int
Local inTag:Byte = False
For Local loop:Int = 0 To lex.iTokenAmount
r = 255 ; g = 255 ; b = 255 ; flag = 0
Local tempToken:String = lex.sTokenBank[loop]
If tempToken = "<"
r = 0 ; g = 255 ; b = 255
inTag = True
End If
If tempToken = ">"
r = 0 ; g = 255 ; b = 255
inTag = False
End If
If tempToken = "/" Or tempToken = "!"
If lex.sTokenBank[loop-1] = "<"
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
End If
End If
For Local keyWordLoop:Int = 0 To lex.sKeywords.length-1
If intag = True
If lex.sKeywords[KeyWordLoop] = tempToken
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
Exit
End If
If tempToken = "h"
If lex.sTokenBank[loop-1] = "<" Or lex.sTokenBank[loop-1] = "/"
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
End If
End If
End If
Next
If Left$(tempToken,1) = "~q"
r = 50 ; g = 255 ; b = 50
End If
For Local numbersLoop:Int = 0 To lex.sNumbers.length-1
If lex.sNumbers[numbersLoop] = Left$(tempToken,1)
r = 192 ; g = 192 ; b = 192
If lex.sTokenBank[loop-1] = "h"
r = 255 ; g = 255 ; b = 50
flag = TEXTFORMAT_BOLD
End If
Exit
End If
Next
SetTextAreaText(textArea,tempToken,lineCharStart,Len(tempToken))
FormatTextAreaText(textArea,r,g,b,flag,lineCharStart,Len(tempToken))
lineCharStart = lineCharStart+Len(tempToken)
Next
Next
End Function
Type TLexer
Field sSymbols:String[] = [" ","+","-","*","^","/","%","=",">","<",":","{","}","[","]","(",")",";","&"]
Field sAlpha:String[] = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","Z","B","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","_"]
Field sNumbers:String[] = ["0","1","2","3","4","5","6","7","8","9","."]
Field sKeywords:String[] = ["body","doctype","head","html","meta","address","blockquote","br","div","em","h1","h2","h3","h4","h5","h6","p","pre","strong","sub","sup","b","big","hr","i","small","tt","dd","dl","dt","li","ol","ul","a","caption","table","td","th","tr","frame","frameset","iframe","noframes","img","map","object","style","button","form","input","label","legend","option","select","textarea","script","noscript"]
Field sTok:String = ""
Field bInStruct:Byte, sCurrentStructIdentifier:String
Field iTOKENS_PER_LINE:Int = 512
Field sTokenBank:String[iTOKENS_PER_LINE]
Field iTokenAmount:Int
'Field lstTokenList:TList = New TList
Field lstSymbolTable:TList = New TList
Field TYPE_UNKNOWN:Int = 0, TYPE_STRING:Int = 1, TYPE_IDENTIFIER:Int = 2, TYPE_COMMAND:Int = 3, TYPE_INTEGER:Int = 4, TYPE_FLOAT:Int = 5
Field TYPE_SYMBOL:Int = 6, TYPE_VARIABLE:Int = 7, TYPE_CONSTANT:Int = 8, TYPE_FUNCTION:Int = 9,TYPE_ARRAY:Int = 10, TYPE_STRUCT:Int = 11
Field DATA_UNKNOWN:Int = 0, DATA_INTEGER:Int = 1, DATA_FLOAT:Int = 2, DATA_STRING:Int = 3
Method TokenAmount:Int()
Return(iTokenAmount)
End Method
Method mLexLine:Int(sLinein:String)
Local sTempToken:String
Local iLoopLine:Int, iLoopOther:Int, sChar:String
Local bInString:Byte = False
iTokenAmount = 0
' lstTokenList.Clear()
For iLoopOther = 0 To iTOKENS_PER_LINE-1
sTokenBank[iLoopOther] = ""
Next
sLinein = sLinein + " "
For iLoopLine = 1 To Len(sLinein)
sChar = Mid$(sLinein,iLoopLine,1)
If sChar = "/"
If Mid$(sLinein,iLoopLine+1,1) = "/" Then Exit
End If
'check for strings
If sChar = "~q"
sTempToken = sChar
For iLoopLine = iLoopLine+1 To Len(sLinein)
sChar = Mid$(sLinein,iLoopLine,1)
If sChar = "~q" Then Exit
sTempToken = sTempToken + sChar
Next
sTempToken = sTempToken + sChar
iLoopLine = iLoopLine
iTokenAmount = iTokenAmount + 1
sTokenBank[iTokenAmount] = sTempToken
sTempToken = ""
End If
Local bDoExit:Byte
'Check for letters such as commands or identifiers
For iLoopOther = 0 To sAlpha.length-1
If sChar = sAlpha[iLoopOther]
sTempToken = sChar
For iLoopLine = iLoopLine+1 To Len(sLinein)
sChar = Mid$(sLinein,iLoopLine,1)
For iLoopOther = 0 To sAlpha.length-1
If sChar <> sAlpha[iLoopOther]
bDoExit = True
End If
If sChar = sAlpha[iLoopOther]
sTempToken = sTempToken + sChar
bDoExit = False
Exit
End If
Next
If bDoExit = True
iLoopLine = iLoopLine - 1
iTokenAmount = iTokenAmount + 1
sTokenBank[iTokenAmount] = Lower$(sTempToken)
sTempToken = ""
sChar = ""
Exit
End If
Next
End If
If bDoExit = True Then Exit
Next
'Check for numbers, including floats:-
bDoExit = False
For iLoopOther = 0 To sNumbers.length-1
If sChar = sNumbers[iLoopOther]
sTempToken = sChar
For iLoopLine = iLoopLine+1 To Len(sLinein)
sChar = Mid$(sLinein,iLoopLine,1)
For iLoopOther = 0 To sNumbers.length-1
If sChar <> sNumbers[iLoopOther]
bDoExit = True
End If
If sChar = sNumbers[iLoopOther]
sTempToken = sTempToken + sChar
bDoExit = False
Exit
End If
Next
If bDoExit = True
iLoopLine = iLoopLine - 1
iTokenAmount = iTokenAmount + 1
sTokenBank[iTokenAmount] = sTempToken
sTempToken = ""
sChar = ""
Exit
End If
Next
End If
If bDoExit = True Then Exit
Next
For iLoopOther = 0 To sSymbols.length-1
If sChar = sSymbols[iLoopOther]
sTempToken = sChar
iTokenAmount = iTokenAmount + 1
sTokenBank[iTokenAmount] = sTempToken
sTempToken = ""
sChar = ""
Exit
End If
Next
If sChar = " "
iTokenAmount = iTokenAmount + 1
sTokenBank[iTokenAmount] = sTempToken
sTempToken = ""
sChar = ""
End If
If sChar = "~t"
iTokenAmount = iTokenAmount + 1
sTokenBank[iTokenAmount] = sTempToken
sTempToken = ""
sChar = ""
End If
Next
iTokenAmount = iTokenAmount - 1
Return(iTokenAmount)
End Method
End Type
It formats the text when it encounters html tags, so load a short html page and you'll see it formats the lot, as well as when your typing! :)
Dabz