PB-IDE aut. Einrücken die X.te
Verfasst: 09.07.2007 18:52
Oooch. Dies ist ein Beispiel, um zu zeigen, dass man erst im Forum suchen sollte, bevor man losproggt. Eigentlich wollte ich diesen Beitrag gleich mal im Mülleimer eröffnen, das können aber nur Moderatoren... (lustig eigentlich)
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).
Die zugehörige Textdatei IndenterList.txt (könnt sie ja selber noch erweitern):
Vorläufig hab ich genug! Keine Energie an dem weiter zu arbeiten. Es macht was ich will. Grundsätzlich. Eigentlich hätte ich noch ein Funktion _IMDepro() spendieren können...
Have Fun
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
