Seite 1 von 9

[IDE-Tool]Einruecker

Verfasst: 19.10.2006 09:46
von HeX0R
Moin,

ich hab mich schon länger über so manche völlig unstrukturierten Beiträge hier im Board geärgert und daher mal g'schwind ein Auto-Einrück-Tool für die PB-IDE gebastelt.
O.k. ganz uneigennützig war das Ganze natürlich auch nicht:
Da ich sehr viele ältere PB-Projekte betreue und es früher mit der PB-IDE nicht möglich war Real-Tabs zu verwenden, hab ich nun meistens ein Gemisch aus Tabs und Spaces in meinen Source-Codes.
Das nervt mich einfach nur...

Das Tool schaut in eure IDE-Einstellungen (also ob Tabs, oder nicht Tabs) und setzt die Whitespaces entsprechend.

Blabla... peng ... blubberlutsch...
Wer immernoch nicht versteht, was dieses Tool macht, es macht aus dem hier:

Code: Alles auswählen

Procedure Aha(Ameisenbaer,Affe,Hosenscheisser)
	Protected i,jaaa,keeeeee

 i=12
jaaa=222
	   keeeeee=3333

     ProcedureReturn jaaaa
   EndProcedure


Aha(0,0,0)
das hier:

Code: Alles auswählen

Procedure Aha(Ameisenbaer, Affe, Hosenscheisser)
	Protected i, jaaa, keeeeee

	i       = 12
	jaaa    = 222
	keeeeee = 3333

	ProcedureReturn jaaaa
EndProcedure


Aha(0, 0, 0)
//Edit:
Download entfernt, ->hier<- der Quelltext


Hier kann man die IDE-Einstellungen noch sehen.

Verfasst: 19.10.2006 10:44
von Karl
Ja, cool so ´n Quellcodeformatierer.

Ist der Quellcode öffentlich, falls man eigene Formatierungsvorlagen hat?

Gruß Karl

Verfasst: 19.10.2006 11:34
von HeX0R
Wenn erwünscht klar.
Dann werde ich noch ein oder zwei Kommentare einfügen.
(Bin extrem Kommentarfaul)

Verfasst: 19.10.2006 12:15
von NicTheQuick
Das ist nur für die IDE, oder? Weil bei jaPBe gibt es schon zwei Methoden, die
automatisch einrücken. Ihren Unterschied hab ich aber bis heute noch nicht
erkannt.

Verfasst: 19.10.2006 12:19
von Kaeru Gaman
für fremdcode ist das sehr praktisch :allright:

...für eigenen brauch ich sowas nicht... ;)
ich würd nen knoten im kopp kriegen, wenn ich unstrukturiert proggen wollte...

Verfasst: 19.10.2006 12:32
von Kiffi
NicTheQuick hat geschrieben:Das ist nur für die IDE, oder? Weil bei jaPBe gibt es schon zwei Methoden, die
automatisch einrücken. Ihren Unterschied hab ich aber bis heute noch nicht
erkannt.
Ausgangscode:

Code: Alles auswählen

Enumeration
#lala = 1
#lululululululu = 2
EndEnumeration
Methode 1 (Ctrl + Tab):

Code: Alles auswählen

Enumeration
  #lala = 1
  #lululululululu = 2
EndEnumeration
Methode 2 (Ctrl + Shift + Tab):

Code: Alles auswählen

Enumeration
  #lala           = 1
  #lululululululu = 2
EndEnumeration
Grüße ... Kiffi

Verfasst: 19.10.2006 12:35
von HeX0R
Jau, das ist nur für die PB-IDE, weil irgendjemand mal irgendwo sagte, JaPBe bringt das bereits mit.

Verfasst: 19.10.2006 16:42
von ts-soft
:allright:
Ich wahr es schon leid immer jaPBe aufzurufen um die Forumspostings
lesbar zu machen :mrgreen:

Spart mir viel Zeit :D
(werde unformatierten Code jedoch trotztem weitgehend übersehen)

Verfasst: 19.10.2006 17:49
von vonTurnundTaxis
Klasse! :allright:
Ich habe es mal für die PB4-Linux-IDE angepasst (es sind nur ein paar Zeilen, aber für die Faulen nochmal komplett):

Code: Alles auswählen

 ;/--------------- 
 ;| IDE-Tool 
 ;| Einrücker 
 ;| 
 ;| (c)HeX0R 2006 
 ;| Do whatever you 
 ;| like with this 
 ;| source 
 ;/--------------- 
 
 #TestIT = 0 
 
 Structure _TAGS_ 
    Name.s 
    Tabs.l 
 EndStructure 
 
 Procedure.s AddTabs(Tabs.l, Tab.s) 
    Protected i.l, Result.s 
 
    For i = 1 To Tabs 
       Result + Tab 
    Next i 
 
    ProcedureReturn Result 
 EndProcedure 
 
 Procedure.s MyTrim(Line.s) 
    ;Normal Trim() doesn't handle Tabs correctly, so i had to write my own 
     
    Protected *B.BYTE, Start.l = 1, Ende.l, Result.s 
 
    If Line = "" 
       ProcedureReturn "" 
    EndIf 
 
    *B = @Line 
    Repeat 
       If *B\b <> 32 And *B\b <> 9 And *B\b <> 0 
          Break 
       EndIf 
       Start + 1 
       *B + 1 
    ForEver 
    Ende = Len(Line) 
    *B = @Line + Ende - 1 
    Ende - Start 
    Repeat 
       If *B\b <> 32 And *B\b <> 9 And *B\b <> 0 
          Break 
       EndIf 
       Ende - 1 
       *B - 1 
    ForEver 
    Result = Mid(Line, Start, Ende + 1) 
 
    ProcedureReturn Result 
 EndProcedure 
 
 Procedure.s FindCommand(Line.s, Index.l) 
    ;Find next Command in this Line 
    ;When User wrote more then 
    ;just one Command in one Line via ':' 
    ;For Example 
    ;While WindowEvent() : Wend 
     
    Protected i.l, DQ.l, *B.CHARACTER, Result.s 
 
    If Line = "" 
       ProcedureReturn "" 
    EndIf 
 
    i  = 1 
    *B = @Line 
    While *B\c <> 0 
       If *B\c = 34 
          DQ ! 1 
       EndIf 
       If *B\c = ':' And DQ = 0 
          If i = Index 
             Break 
          Else 
             i + 1 
          EndIf 
       ElseIf i = Index 
          Result + Chr(*B\c) 
       EndIf 
       *B + 1 
    Wend 
 
    ProcedureReturn MyTrim(Result) 
 
 EndProcedure 
 
 Procedure.l CheckForEndTag(b$, Tag.s) 
    ;Checks, whether the Start and End-Tag is in one line 
    ;For Example 
    ;While WindowEvent() : Wend 
    Protected a$, Result.l = #True, i.l = 2 
 
    a$ = FindCommand(b$, i) 
    While a$ <> "" 
       Select StringField(LCase(a$), 1, " ") 
          Case "endif" 
             If Tag = "if" 
                Result = #False 
                Break 
             EndIf 
          Case "endselect" 
             If Tag = "select" 
                Result = #False 
                Break 
             EndIf 
          Case "until" 
             If Tag = "repeat" 
                Result = #False 
                Break 
             EndIf 
          Case "forever" 
             If Tag = "repeat" 
                Result = #False 
                Break 
             EndIf 
          Case "next" 
             If Tag = "for" Or Tag = "foreach" 
                Result = #False 
                Break 
             EndIf 
          Case "wend" 
             If Tag = "while" 
                Result = #False 
                Break 
             EndIf 
          Case "enddatasection" 
             If Tag = "datasection" 
                Result = #False 
                Break 
             EndIf 
          Case "endprocedure" 
             If Tag = "procedure" 
                Result = #False 
                Break 
             EndIf 
          Case "endstructure" 
             If Tag = "structure" 
                Result = #False 
                Break 
             EndIf 
          Case "endinterface" 
             If Tag = "interface" 
                Result = #False 
                Break 
             EndIf 
          Case "endenumeration" 
             If Tag = "enumeration" 
                Result = #False 
                Break 
             EndIf 
          Case "endwith" 
             If Tag = "with" 
                Result = #False 
                Break 
             EndIf 
          Case "endimport" 
             If Tag = "import" 
                Result = #False 
                Break 
             EndIf 
          Case "endmacro" 
             If Tag = "macro" 
                Result = #False 
                Break 
             EndIf 
       EndSelect 
       i + 1 
       a$ = FindCommand(b$, i) 
    Wend 
 
    ProcedureReturn Result 
 EndProcedure 
 
 Procedure Main() 
    Protected MyTab.s, a$, b$, Tabs.l, i.l, UTF_Start.l, Found.l, *index 
 
    NewList Lines.s() 
    NewList Tags._TAGS_() 
    NewList MTags._TAGS_() 
 
    OpenPreferences(GetEnvironmentVariable("HOME") + ".purebasic/purebasic.prefs")
    PreferenceGroup("Global") 
    If ReadPreferenceLong("RealTab", 0) 
       MyTab = #TAB$ 
    Else 
       MyTab = Space(ReadPreferenceLong("TabLength", 2)) 
    EndIf 
    ClosePreferences() 
 
    a$ = ProgramParameter() 
    If a$ = "" Or ReadFile(0, a$) = 0 
    MessageRequester("nixgefunden", a$)
       End 
    EndIf 
 
    Tabs = 3 
    Restore Tags 
    Repeat 
       Read b$ 
       If b$ = "" 
          Tabs - 1 
          If Tabs = 0 
             Break 
          EndIf 
       Else 
          AddElement(Tags()) 
          Tags()\Tabs = Tabs 
          Tags()\Name = b$ 
       EndIf 
    ForEver 
 
    UTF_Start = #False 
    i         = 0 
 
    While Eof(0) = 0 
       AddElement(Lines()) 
       b$ = MyTrim(ReadString(0)) 
       If i = 0 
          If Asc(Mid(b$, 1, 1)) = 239 And Asc(Mid(b$, 2, 1)) = 187 And Asc(Mid(b$, 3, 1)) = 191 
             ;UTF-Header 
             UTF_Start = #True 
             b$ = Right(b$, Len(b$) - 3) 
          EndIf 
       EndIf 
       Lines() = b$ 
       i + 1 
    Wend 
    CloseFile(0) 
    Tabs = 0 
    ForEach Lines() 
       b$ = LCase(StringField(StringField(Lines(), 1, " "), 1, ".")) 
       Found = #False 
       ForEach Tags() 
          If b$ = Tags()\Name 
             Found = #True 
             Select Tags()\Tabs 
                Case 3 
                   ;StartTag 
                   Lines() = AddTabs(Tabs, MyTab) + Lines() 
                   If CheckForEndTag(Lines(), b$) 
                      If b$ = "if" Or b$ = "select" 
                         ;They have middletags! 
                         LastElement(MTags()) 
                         AddElement(MTags()) 
                         MTags()\Name = b$ 
                         MTags()\Tabs = Tabs 
                      EndIf 
                      Tabs + 1 
                   EndIf 
                Case 2 
                   ;MiddleTags need special treetment 
                   If LastElement(MTags()) 
                      If MTags()\Name = "if" 
                         Tabs = MTags()\Tabs 
                      ElseIf MTags()\Name = "select" 
                         Tabs = MTags()\Tabs + 1 
                      EndIf 
                   EndIf 
                   Lines() = AddTabs(Tabs, MyTab) + Lines() 
                   Tabs + 1 
                Case 1 
                   ;EndTag 
                   Tabs - 1 
                   ;Check for MiddleTags 
                   If b$ = "endif" And LastElement(MTags()) And MTags()\Name = "if" 
                      DeleteElement(MTags()) 
                   ElseIf b$ = "endselect" And LastElement(MTags()) And MTags()\Name = "select" 
                      Tabs - 1 
                      DeleteElement(MTags()) 
                   EndIf 
                   Lines() = AddTabs(Tabs, MyTab) + Lines() 
             EndSelect 
             Break 
          EndIf 
       Next 
       If Found = #False 
          If Lines() 
             Lines() = AddTabs(Tabs, MyTab) + Lines() 
          EndIf 
       EndIf 
    Next 
 
    Found = #PB_MessageRequester_Yes 
    If Tabs <> 0 
       ;Something wrong with the code... 
       Found = MessageRequester("Error!", "Something wrong with your Code!" + #LF$ + "Would you like to parse it anyway ?", #PB_MessageRequester_YesNo) 
    EndIf 
    If Found = #PB_MessageRequester_Yes 
 
       CompilerIf #TestIt = 0 
 
       If CreateFile(0, a$) 
          ForEach Lines() 
             If UTF_Start 
                WriteByte(0, 239) 
                WriteByte(0, 187) 
                WriteByte(0, 191) 
                UTF_Start = #False 
             EndIf 
             WriteStringN(0, Lines()) 
          Next 
          CloseFile(0) 
       EndIf 
 
       CompilerElse 
 
       a$ = "[code]" + #CRLF$ 
       If LastElement(Lines()) 
          While Left(MyTrim(Lines()), 1) = ";" 
             *index = @Lines() 
             If PreviousElement(Lines()) = 0 
                Break 
             EndIf 
          Wend 
       EndIf 
       ForEach Lines() 
          If @Lines() = *index 
             Break 
          EndIf 
          a$ + Lines() + #CRLF$ 
       Next 
       a$ + "
"
SetClipboardText(a$)

CompilerEndIf

EndIf
EndProcedure

Main()
End

DataSection
Tags:
;StartTags
Data.s "if"
Data.s "while"
Data.s "repeat"
Data.s "procedure"
Data.s "proceduredll"
Data.s "enumeration"
Data.s "structure"
Data.s "interface"
Data.s "for"
Data.s "foreach"
Data.s "select"
Data.s "datasection"
Data.s "with"
Data.s "import"
Data.s "macro"
Data.s ""
;MiddleTags
Data.s "else"
Data.s "elseif"
Data.s "case"
Data.s "default"
Data.s ""
;EndTags
Data.s "endif"
Data.s "wend"
Data.s "until"
Data.s "forever"
Data.s "endprocedure"
Data.s "endstructure"
Data.s "endinterface"
Data.s "endenumeration"
Data.s "next"
Data.s "endselect"
Data.s "enddatasection"
Data.s "endwith"
Data.s "endimport"
Data.s "endmacro"
Data.s ""
EndDataSection
[/code]
Gibt es eine Möglichkeit, das Tool auch funktionieren zu lassen, wenn der Code noch nicht gespeichert ist?

Verfasst: 19.10.2006 18:05
von HeX0R
Da ich %TEMPFILE übergeben lasse, sollte es eigentlich auch mit ungespeichertem Code funktionieren.
Zumindest bei mir hier unter Win tut es das, unter Linux etwa nicht ?