[bb] BB Code Formatter by Alaric [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:42

Previous topic - Next topic

BlitzBot

Title : BB Code Formatter
Author : Alaric
Posted : 1+ years ago

Description : Lately I've been realizing what a neccessity the abillity to read and get information from others source code can be.  However, one of my biggest pet peeves is people that do not format their code like I do.  Eventually I got tired of reformatting it into a readable format so I wrote this little program to do it for me :).  It still has a couple of bugs around comments and the header declaration (global, dim, etc.) and setup (Graphics, apptitle, seedrnd, etc.) commands, but I plan on working those out soon.  The code for the program is self-formatted and makes a good preview.  I hope that it helps make someone's life a little less boring!

Note:  The space at the end of the code (50 blank lines) is not a glitch.  If you don't like it take it out, but I like to be able to scroll all the way past my code.


Code :
Code (blitzbasic) Select
;Average Commands
Global pluscoms$=Lower$(";if;select;repeat;for;while;function;type;")
Global mincoms$=Lower$(";until;forever;next;wend;endif;end;")
Global backcoms$=Lower$(";then;case;default;elseif;else;")
Global comends$=Chr$(34)+Chr$(9)+" ~!@#$%^&*()_+|`-={}:<>?[];',./"

;Header commands
Const headercoms$=";graphics;apptitle;automidhandle;seedrnd;setbuffer;"
Const constcoms$=";const;"
Const globalcoms$=";global;"
Const localcoms$=";local;"
Const arraycoms$=";dim;"

;Globalize some assorted variables
Global hitfuncs=0
Global needspace=0
Global LastComSet=0 ;Used to see which header command set (declaration or such) was used
Global crlf$=Chr$(10)+Chr$(13)

;Select the files
Global fileloc$=RequestFile$("Select a File to reformat")
If Not FileType(fileloc$) Then Notify("Could not open file!"):End
Global filein=ReadFile(fileloc)
Global fileout=WriteFile(parseoutext$(fileloc)+"_clean"+parseext$(fileloc))

;Begin the Main Loop
While Not Eof(filein)
linefeed$=ReadLine(filein)
linefeed=Trim$(Replace$(linefeed,Chr$(9),""))
If Trim$(linefeed) <> "" Then
If Left$(linefeed,1)=";" Then WriteLine(fileout,"")
newtab%=needstab%(linefeed)
cleanheader(linefeed)

;Check to see if the program has come to the function section near the end
If hitfuncs = 1 Then
For I=1 To 5
WriteLine(fileout,"")
Print ""
Next

hitfuncs=2
End If


;See if a blank space is necessary
If needspace Then
WriteLine(fileout,"")
Print ""
needspace=0
End If


;Add the Tabs
If newtab > 1 Then tab=tab-1 ;See if the tab needs to be taken down
If tab< 0 Then tab=0
I=0
While I < tab
linefeed=Chr$(9)+linefeed
I=I+1
Wend

If newtab Mod(2) Then tab=tab+1 ;See if the tab should be reversed or added to

;Makes sure that there isn't a break for an Ending (forever, next, end function, etc.) command just Before another such command
If newtab=2
LastWasEnd=True
Else
If lastwasend Then
Print ""
WriteLine(fileout,"")
lastwasend=False
End If
End If

Print linefeed$
WriteLine(fileout,linefeed) ;write the edited line
End If
Wend


;I like to have plenty of space at the bottom of my code
For I = 1 To 50
WriteLine(fileout,"")
Next

Print "Finished"
CloseFile(filein)
CloseFile(fileout)
Delay(10000)





Function ParseOutExt$(loc$);parses the name and location of a file w/o extension
Repeat
If Not Instr(loc,".",placement+1) Then Exit
placement=Instr(loc,".",placement+1)
Forever

Return Left$(loc,placement-1)
End Function


;parses the extension of a file location
Function ParseExt$(loc$)
Repeat
If Not Instr(loc,".",placement+1) Then Exit
placement=Instr(loc,".",placement+1)
Forever

Return Right$(loc,Len(loc)-placement+1)
End Function

Function needstab%(LineIn$)
If linein <> ""

;Prepare the input
linein=Lower$(Trim$(linein))
If linein="end" Then Return 0 ;Ensure there isn't a random "End" statement that messes with tabbing
nostrings$=stripstrings$(linein)
nocomments$=stripcomments$(linein)

;parse out the first command of a line
com$=";"+firstcom$(linein)+";"

;check to see if the functions section of the program has begun
If com$=";function;" And hitfuncs=0 Then hitfuncs=1

;ensure that an "if" statement w/o an "end if" doesn't screw up the tabbing
If Instr(nostrings,"then",0)
If Right$(nostrings,4) <> "then" Or Instr(nostrings,":") Then Return 0
End If


;find out how to classify the command
If Instr(pluscoms,com$,0) ;add a tab
Return 1
ElseIf Instr(mincoms$,com$,0) ;delete a tab
Return 2
ElseIf Instr(backcoms,com$,0) ;temporarily delete a tab
Return 3
End If
End If


;command does not require a tab change
Return 0
End Function


;parses out the first word on a line
Function firstcom$(linein$)
linein=Trim$(Replace$(linein,Chr$(9),""))
I=1
While (Not Instr(comends,Mid$(linein,I,1),0)) And (I <= Len(linein$))
I=I+1
Wend

Return Lower$(Trim$(Left$(linein,I-1)))
End Function


;strips away comments
Function StripComments$(linein$)
I=Instr(linein,";")
Return Left$(Trim$(linein),I-1)
End Function


;strips away strings
Function stripstrings$(linein$)
While Instr(linein,Chr$(34))
placement=Instr(linein,Chr$(34))
If placement
endquote=Instr(linein,Chr$(34),placement+1)
linein=Left$(linein,placement-1)+Right$(linein,Len(linein)-endquote)
End If
Wend

Return linein
End Function


;used for identifying declaration functions (global, const, local, etc.)
Function cleanheader(linein$)
Local com$=";"+firstcom$(linein)+";"
Select 1
Case Instr(Globalcoms,com$,0)
If lastcomset=0 Then lastcomset=1
If lastcomset <> 1 Then WriteLine(fileout,"")
lastcomset=1
Case Instr(constcoms,com$,0)
If lastcomset=0 Then lastcomset=2
If lastcomset <> 2 Then WriteLine(fileout,"")
lastcomset=2
Case Instr(arraycoms,com$,0)
If lastcomset=0 Then lastcomset=3
If lastcomset <> 3 Then WriteLine(fileout,"")
lastcomset=3
Case Instr(localcoms,com$,0)
If lastcomset=0 Then lastcomset=4
If lastcomset <> 4 Then WriteLine(fileout,"")
lastcomset=4
Case Instr(headercoms,com$,0)
If lastcomset=0 Then lastcomset=5
If lastcomset <> 5 Then WriteLine(fileout,"")
lastcomset=5
Default
lastcomset=0
End Select
End Function


Comments :


Rook Zimbabwe(Posted 1+ years ago)

 so is this for B3d or BMax or ???


Damien Sturdy(Posted 1+ years ago)

 <div class="quote"> ;Average Commands </div>looks like BlitzBasic, to me.


Alaric(Posted 1+ years ago)

 actually its b+ but might work in b3d as well


Ryudin(Posted 1+ years ago)

 Thanks for posting! I feel the same way as you (including the empty lines at the bottom).