Nun ja - nehmt mich nicht allzu ernst - ist wohl etwas ironisch gemeint.
Will das trotzdem mal hier bringen, als Anregung sozusagen... Vorallem scheinen die anderen via Datei zu arbeiten - ich mach das via Zwischenablage. Die Anwendung sollte klar sein: Kleine Codestücke restrukturieren ("Automatisch Einrücken" in der PB-IDE). Das ist besonders praktisch, wenn man gern fremden Code übernimmt (mist - jetzt oute ich mich auch noch).
Code: Alles auswählen
;Soll den Text in der Zwischenablage schön formatieren
;PB 4
;Andrea Marschner, Switzerland, 2007
;Indent geschieht immer auf der Folgezeile (einrücken)
;Unindent geschieht auf der aktuellen Zeile (ausrücken)
;Es müssen Wörter sein! D.h. Sie müssen am Anfang oder Ende der Zeile stehn oder vorne und hinten ein Leerzeichen haben!
;Wenn sehr viele Strukturen in eine Zeile verpackt sind und trotzdem zum Schluss offen, wird es nicht funktionieren - Z.B.: If 1 : x+1 : Endif : If ... das zweite If wird ignoriert werden - diese Zeile wäre auf jeden Fall Tab-neutral...
;Auch auskommentierte Stellen werden verarbeitet!
;- VARS ---------------------------------------------------
#PrgName = "Indenter"
#PrgVersion = 0.10
Global GText.s ;Eingabetext
Global NewList Indent.s()
Global NewList Unindent.s()
;- PROCS ---------------------------------------------------
Procedure _M(text.s)
MessageRequester(#PrgName+" Meldung",text)
EndProcedure
Procedure _LoadWordLists()
d$="IndenterList.txt"
If ReadFile(0,d$)=0
_M("Konnte Datei nicht öffnen: "+d$)
ProcedureReturn
EndIf
Mode=0
Repeat
r$=ReadString(0)
If r$ ;keine leeren Strings
If FindString(LCase(r$),"[indent]",1) ;nicht so schnell - aber fehlersicherer
Mode=1
ElseIf FindString(LCase(r$),"[unindent]",1)
Mode=-1
Else
If Mode=1
AddElement(Indent())
Indent()=LCase(Trim(r$))
ElseIf Mode=-1
AddElement(Unindent())
Unindent()=LCase(Trim(r$))
EndIf
EndIf
EndIf
Until Eof(0)
CloseFile(0)
EndProcedure
Procedure.s _Tabs(Anzahl.l) ;liefert Anzahl Tabulatoren
For i=1 To Anzahl
s$+#TAB$
Next
ProcedureReturn s$
EndProcedure
Procedure.l _FindWort(StringToFind.s, String.s)
;Angrenzende zeichen untersuchen, um herauszufinden, obs ein Wort ist
p = FindString(String.s, StringToFind.s,1)
If p=0 : ProcedureReturn 0 : EndIf
If p=1 ;steht am Anfang
B1=1
Else
If Mid(String,p-1,1)=" "
B1=1
EndIf
EndIf
If p+Len(StringToFind)>Len(String) ;steht am Ende
B2=1
Else
If Mid(String,p+Len(StringToFind),1)=" "
B2=1
EndIf
EndIf
If B1 And B2
ProcedureReturn p
EndIf
EndProcedure
Procedure _IndentText()
GText=ReplaceString(GText,#CRLF$,#LF$)
GText=ReplaceString(GText,#TAB$,"")
Tab=0 : NewText.s = ""
For i=1 To CountString(GText,#LF$)+1
IN=0 : UN=0
t$=Trim(StringField(GText,i,#LF$))
ForEach Indent()
If _FindWort(Indent(),LCase(t$))
IN=1
Break
EndIf
Next
ForEach Unindent()
If _FindWort(Unindent(),LCase(t$))
UN=1
Break
EndIf
Next
If UN
Tab-1
EndIf
Debug Tab
NewText + _Tabs(Tab) + t$ + #LF$
If IN
Tab+1
EndIf
Next
GText = ReplaceString(NewText,#LF$,#CRLF$)
EndProcedure
;- MAIN ---------------------------------------------------
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
; etwas Windows spezifischer Programmcode...
;öffnet die Textdatei mit den Wörtern
If GetAsyncKeyState_(#VK_SHIFT)
RunProgram("IndenterList.txt")
End
EndIf
CompilerEndIf
GText=GetClipboardText()
If GText="" ;macht ja keinen Sinn
End
EndIf
_LoadWordLists()
_IndentText()
SetClipboardText(GText)
End
Code: Alles auswählen
[indent]
Case
Else
ElseIf
Enumeration
Default
For
ForEach
ForEver
If
Procedure
Repeat
Select
Structure
While
[unindent]
Case
Else
ElseIf
EndEnumeration
Endif
EndProcedure
EndSelect
EndStructure
Default
Next
Until
Wend
Have Fun
