November 25, 2020, 04:58:57 AM

Author Topic: [bb] MaxGUI text area formatting by Dabhand [ 1+ years ago ]  (Read 612 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : MaxGUI text area formatting
Author : Dabhand
Posted : 1+ years ago

Description : Example on how to format a MaxGUI text area, basically, it sweeps each line, splits the line into tokens then formats each token.

Currently, its set out to catch html tags, but you can change that and expand it with a little play.

Dabz


Code :
Code: BlitzBasic
  1. Framework MaxGUI.MaxGUI
  2. Import BRL.EventQueue
  3. Import BRL.Retro
  4. Import MaxGui.Drivers
  5.  
  6. SuperStrict
  7.  
  8. Local window:TGadget = CreateWindow("SPad",30,20,400,300,Desktop(),WINDOW_TITLEBAR | WINDOW_MENU | WINDOW_STATUS)
  9. Local textarea:TGadget = CreateTextArea(0,0,ClientWidth(window),ClientHeight(window),window)
  10. SetTextAreaColor(textarea,1,81,107,True)
  11. SetTextAreaColor(textarea,255,255,255,False)
  12.  
  13.  
  14. 'Menu
  15. Local filemenu:TGadget
  16.  
  17. Const MENU_OPEN:Int=101
  18.  
  19. filemenu=CreateMenu("&File",0,WindowMenu(window))
  20.  
  21. CreateMenu"&Open",MENU_OPEN,filemenu,KEY_O,MODIFIER_COMMAND
  22. UpdateWindowMenu window
  23.  
  24. While True
  25.         PollEvent()
  26.        
  27.         Select EventID()
  28.                 Case EVENT_GADGETACTION
  29.                         Select(EventSource())
  30.                                 Case textarea
  31.                                         FormatLine(textarea)
  32.                         End Select
  33.                
  34.                 Case EVENT_WINDOWCLOSE
  35.                         End
  36.  
  37.                 Case EVENT_MENUACTION
  38.                         Select EventData()                                     
  39.                                 Case MENU_OPEN
  40.                                         Local result:String = RequestFile("Open file...","All files:*",False)
  41.                                         If result <> ""
  42.                                                 SetTextAreaText(textArea,LoadText$(result))
  43.                                                 FormatDocument(textArea)
  44.                                         End If
  45.                         End Select
  46.         End Select
  47.  
  48. Wend
  49.                
  50. Function FormatLine(textArea:TGadget)
  51.         Local cursorpos:Int
  52.         Local currentline:Int, lineString:String
  53.         Local lineCharStart:Int, lineCharEnd:Int
  54.        
  55.         cursorpos=TextAreaCursor(textArea)
  56.         currentLine = TextAreaLine(textArea,cursorPos)
  57.         lineCharStart = TextAreaChar(textArea,currentLine)
  58.         lineString = ""
  59.                
  60.         For Local loop:Int = lineCharStart To TextAreaLen(textArea)
  61.                 Local char:String = TextAreaText$(textArea,loop,1)
  62.                 If (TextAreaLine(textArea,loop) <> currentLine) Or (loop = TextAreaLen(textArea))
  63.                         lineCharEnd = loop-1
  64.                         Exit
  65.                 End If
  66.                 lineString = lineString + char
  67.         Next
  68.                
  69.         Local lex:TLexer = New TLexer
  70.         If lineString <> ""
  71.                 lex.mLexLine(lineString)
  72.         End If
  73.                
  74.         Local r:Int,g:Int,b:Int,flag:Int
  75.         Local inTag:Byte = False
  76.        
  77.         For Local loop:Int = 0 To lex.iTokenAmount
  78.                 r = 255 ; g = 255 ; b = 255 ; flag = 0
  79.                 Local tempToken:String = lex.sTokenBank[loop]
  80.                        
  81.                 If tempToken = "<"
  82.                         r = 0 ; g = 255 ; b = 255
  83.                         inTag = True
  84.                 End If
  85.                        
  86.                 If tempToken = ">"
  87.                         r = 0 ; g = 255 ; b = 255
  88.                         inTag = False
  89.                 End If
  90.                        
  91.                 If tempToken = "/" Or tempToken = "!"
  92.                         If lex.sTokenBank[loop-1] = "<"
  93.                                 r = 255 ; g = 255 ; b = 50
  94.                                 flag = TEXTFORMAT_BOLD
  95.                         End If
  96.                 End If
  97.                        
  98.                 For Local keyWordLoop:Int = 0 To lex.sKeywords.length-1
  99.                         If intag = True
  100.                                 If lex.sKeywords[KeyWordLoop] = tempToken
  101.                                         r = 255 ; g = 255 ; b = 50
  102.                                         flag = TEXTFORMAT_BOLD
  103.                                         Exit
  104.                                 End If
  105.                         End If
  106.                                                
  107.                         If tempToken = "h"
  108.                                 If lex.sTokenBank[loop-1] = "<" Or lex.sTokenBank[loop-1] = "/"
  109.                                         r = 255 ; g = 255 ; b = 50
  110.                                         flag = TEXTFORMAT_BOLD
  111.                                 End If
  112.                         End If  
  113.                 Next
  114.                        
  115.                 If Left$(tempToken,1) = "~q"
  116.                         r = 50 ; g = 255 ; b = 50
  117.                 End If
  118.                        
  119.                 For Local numbersLoop:Int = 0 To lex.sNumbers.length-1
  120.                         If lex.sNumbers[numbersLoop] = Left$(tempToken,1)
  121.                                 r = 192 ; g = 192 ; b = 192
  122.                                 If lex.sTokenBank[loop-1] = "h"
  123.                                         r = 255 ; g = 255 ; b = 50
  124.                                         flag = TEXTFORMAT_BOLD
  125.                                 End If
  126.                                 Exit
  127.                         End If
  128.                 Next
  129.                        
  130.                 SetTextAreaText(textArea,tempToken,lineCharStart,Len(tempToken))
  131.                 FormatTextAreaText(textArea,r,g,b,flag,lineCharStart,Len(tempToken))
  132.                 lineCharStart = lineCharStart+Len(tempToken)
  133.         Next
  134. End Function
  135.  
  136. Function FormatDocument(textArea:TGadget)
  137.         Local lineCount:Int = TextAreaLine(textArea,TextAreaLen(textArea))
  138.         Local currentline:Int, lineString:String
  139.         Local lineCharStart:Int, lineCharEnd:Int
  140.                                                
  141.                                                
  142.         For Local loopx:Int = 0 To lineCount   
  143.                 lineCharStart = TextAreaChar(textArea,loopx)
  144.                 lineString = ""
  145.                
  146.                 For Local loop:Int = lineCharStart To TextAreaLen(textArea)
  147.                         Local char:String = TextAreaText$(textArea,loop,1)
  148.                                                
  149.                         If (TextAreaLine(textArea,loop) <> loopx) Or (loopx = TextAreaLen(textArea))
  150.                                 lineCharEnd = loop-1
  151.                                 Exit
  152.                         End If
  153.                         lineString = lineString + char
  154.                 Next
  155.                
  156.                 Local lex:TLexer = New TLexer
  157.                                        
  158.                 lex.mLexLine(lineString)
  159.                                        
  160.                 Local r:Int,g:Int,b:Int,flag:Int
  161.                 Local inTag:Byte = False
  162.                
  163.                 For Local loop:Int = 0 To lex.iTokenAmount
  164.                         r = 255 ; g = 255 ; b = 255 ; flag = 0
  165.                         Local tempToken:String = lex.sTokenBank[loop]
  166.                        
  167.                         If tempToken = "<"
  168.                                 r = 0 ; g = 255 ; b = 255
  169.                                 inTag = True
  170.                         End If
  171.                        
  172.                         If tempToken = ">"
  173.                                 r = 0 ; g = 255 ; b = 255
  174.                                 inTag = False
  175.                         End If
  176.                        
  177.                         If tempToken = "/" Or tempToken = "!"
  178.                                 If lex.sTokenBank[loop-1] = "<"
  179.                                         r = 255 ; g = 255 ; b = 50
  180.                                         flag = TEXTFORMAT_BOLD
  181.                                 End If
  182.                         End If
  183.                        
  184.                         For Local keyWordLoop:Int = 0 To lex.sKeywords.length-1
  185.                                 If intag = True
  186.                                         If lex.sKeywords[KeyWordLoop] = tempToken
  187.                                                 r = 255 ; g = 255 ; b = 50
  188.                                                 flag = TEXTFORMAT_BOLD
  189.                                                 Exit
  190.                                         End If
  191.                                                        
  192.                                         If tempToken = "h"
  193.                                                 If lex.sTokenBank[loop-1] = "<" Or lex.sTokenBank[loop-1] = "/"
  194.                                                         r = 255 ; g = 255 ; b = 50
  195.                                                         flag = TEXTFORMAT_BOLD
  196.                                                 End If  
  197.                                         End If
  198.                                 End If  
  199.                         Next
  200.                        
  201.                 If Left$(tempToken,1) = "~q"
  202.                         r = 50 ; g = 255 ; b = 50
  203.                 End If
  204.                        
  205.                 For Local numbersLoop:Int = 0 To lex.sNumbers.length-1
  206.                         If lex.sNumbers[numbersLoop] = Left$(tempToken,1)
  207.                                 r = 192 ; g = 192 ; b = 192
  208.                                
  209.                                 If lex.sTokenBank[loop-1] = "h"
  210.                                         r = 255 ; g = 255 ; b = 50
  211.                                         flag = TEXTFORMAT_BOLD
  212.                                 End If
  213.                                
  214.                                 Exit
  215.                         End If
  216.                 Next
  217.                        
  218.                 SetTextAreaText(textArea,tempToken,lineCharStart,Len(tempToken))
  219.                 FormatTextAreaText(textArea,r,g,b,flag,lineCharStart,Len(tempToken))
  220.                
  221.                 lineCharStart = lineCharStart+Len(tempToken)
  222.         Next
  223. Next
  224. End Function
  225.  
  226.  
  227.  
  228.  
  229. Type TLexer
  230.         Field sSymbols:String[] = [" ","+","-","*","^","/","%","=",">","<",":","{","}","[","]","(",")",";","&"]
  231.          
  232.         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","_"]
  233.        
  234.         Field sNumbers:String[] = ["0","1","2","3","4","5","6","7","8","9","."]
  235.        
  236.         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"]
  237.         Field sTok:String = ""
  238.         Field bInStruct:Byte, sCurrentStructIdentifier:String
  239.  
  240.         Field iTOKENS_PER_LINE:Int = 512
  241.         Field sTokenBank:String[iTOKENS_PER_LINE]
  242.         Field iTokenAmount:Int
  243.         'Field lstTokenList:TList = New TList
  244.         Field lstSymbolTable:TList = New TList
  245.        
  246.         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
  247.         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
  248.        
  249.         Field DATA_UNKNOWN:Int = 0, DATA_INTEGER:Int = 1, DATA_FLOAT:Int = 2, DATA_STRING:Int = 3
  250.        
  251.         Method TokenAmount:Int()
  252.                 Return(iTokenAmount)
  253.         End Method
  254.        
  255.         Method mLexLine:Int(sLinein:String)
  256.                 Local sTempToken:String
  257.                 Local iLoopLine:Int, iLoopOther:Int, sChar:String
  258.                 Local bInString:Byte = False
  259.                
  260.                 iTokenAmount = 0
  261. '               lstTokenList.Clear()
  262.                
  263.                 For iLoopOther = 0 To iTOKENS_PER_LINE-1
  264.                         sTokenBank[iLoopOther] = ""
  265.                 Next
  266.                
  267.                 sLinein = sLinein + " "
  268.                         For iLoopLine = 1 To Len(sLinein)              
  269.                                 sChar = Mid$(sLinein,iLoopLine,1)
  270.                                                                
  271.                                
  272.                                 If sChar = "/"
  273.                                         If Mid$(sLinein,iLoopLine+1,1) = "/" Then Exit
  274.                                 End If
  275.                                
  276.                                 'check for strings
  277.                                 If sChar = "~q"
  278.                                         sTempToken = sChar
  279.                                         For iLoopLine = iLoopLine+1 To Len(sLinein)
  280.                                                 sChar = Mid$(sLinein,iLoopLine,1)
  281.                                                 If sChar = "~q" Then Exit
  282.                                                 sTempToken = sTempToken + sChar
  283.                                         Next
  284.                                         sTempToken = sTempToken + sChar
  285.                                         iLoopLine = iLoopLine
  286.                                         iTokenAmount = iTokenAmount + 1
  287.                                         sTokenBank[iTokenAmount] = sTempToken
  288.                                         sTempToken = ""  
  289.                                 End If
  290.                                
  291.                                 Local bDoExit:Byte
  292.                                 'Check for letters such as commands or identifiers
  293.                                 For iLoopOther = 0 To sAlpha.length-1
  294.                                        
  295.                                         If sChar = sAlpha[iLoopOther]
  296.                                                 sTempToken = sChar
  297.                                                 For iLoopLine = iLoopLine+1 To Len(sLinein)
  298.                                                          
  299.                                                         sChar = Mid$(sLinein,iLoopLine,1)
  300.                                                         For iLoopOther = 0 To sAlpha.length-1
  301.                                                                 If sChar <> sAlpha[iLoopOther]
  302.                                                                         bDoExit = True  
  303.                                                                 End If
  304.                                                                
  305.                                                                 If sChar = sAlpha[iLoopOther]
  306.                                                                         sTempToken = sTempToken + sChar
  307.                                                                         bDoExit = False
  308.                                                                         Exit
  309.                                                                 End If
  310.                                                         Next
  311.                                                         If bDoExit = True
  312.                                                                 iLoopLine = iLoopLine - 1
  313.                                                                 iTokenAmount = iTokenAmount + 1
  314.                                                                 sTokenBank[iTokenAmount] = Lower$(sTempToken)
  315.                                                                 sTempToken = ""
  316.                                                                 sChar = ""
  317.                                                                 Exit
  318.                                                         End If
  319.                                                 Next
  320.                                         End If
  321.                                         If bDoExit = True Then Exit
  322.                                 Next
  323.                                
  324.                                 'Check for numbers, including floats:-
  325.                                 bDoExit = False
  326.                                 For iLoopOther = 0 To sNumbers.length-1
  327.                                        
  328.                                         If sChar = sNumbers[iLoopOther]
  329.                                                 sTempToken = sChar
  330.                                                 For iLoopLine = iLoopLine+1 To Len(sLinein)
  331.                                                          
  332.                                                         sChar = Mid$(sLinein,iLoopLine,1)
  333.                                                         For iLoopOther = 0 To sNumbers.length-1
  334.                                                                 If sChar <> sNumbers[iLoopOther]
  335.                                                                         bDoExit = True  
  336.                                                                 End If
  337.                                                                
  338.                                                                 If sChar = sNumbers[iLoopOther]
  339.                                                                         sTempToken = sTempToken + sChar
  340.                                                                         bDoExit = False
  341.                                                                         Exit
  342.                                                                 End If
  343.                                                         Next
  344.                                                         If bDoExit = True
  345.                                                                 iLoopLine = iLoopLine - 1
  346.                                                                 iTokenAmount = iTokenAmount + 1
  347.                                                                 sTokenBank[iTokenAmount] = sTempToken
  348.                                                                 sTempToken = ""
  349.                                                                 sChar = ""
  350.                                                                 Exit
  351.                                                         End If
  352.                                                 Next
  353.                                         End If
  354.                                         If bDoExit = True Then Exit
  355.                                 Next
  356.                                
  357.                                 For iLoopOther = 0 To sSymbols.length-1
  358.                                         If sChar = sSymbols[iLoopOther]
  359.                                                 sTempToken = sChar
  360.                                                 iTokenAmount = iTokenAmount + 1
  361.                                                 sTokenBank[iTokenAmount] = sTempToken
  362.                                                 sTempToken = ""
  363.                                                 sChar = ""
  364.                                                 Exit
  365.                                         End If
  366.                                 Next
  367.                                
  368.                                 If sChar = " "
  369.                                         iTokenAmount = iTokenAmount + 1
  370.                                         sTokenBank[iTokenAmount] = sTempToken
  371.                                         sTempToken = ""
  372.                                         sChar = ""
  373.                                 End If
  374.                                
  375.                                 If sChar = "~t"
  376.                                         iTokenAmount = iTokenAmount + 1
  377.                                         sTokenBank[iTokenAmount] = sTempToken
  378.                                         sTempToken = ""
  379.                                         sChar = ""
  380.                                 End If
  381.                         Next
  382.                         iTokenAmount = iTokenAmount - 1
  383.                 Return(iTokenAmount)
  384.         End Method
  385. End Type


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal