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
...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
Ich wahr es schon leid immer jaPBe aufzurufen um die Forumspostings
lesbar zu machen
Spart mir viel Zeit
(werde unformatierten Code jedoch trotztem weitgehend übersehen)
Verfasst: 19.10.2006 17:49
von vonTurnundTaxis
Klasse!
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 ?