PB-IDE aut. Einrücken die X.te

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
AndyMars
Beiträge: 141
Registriert: 08.09.2004 11:59
Computerausstattung: Win11 Prof 64bit, i5-13500 @ 4.8 GHz, 32GB RAM, Nvidia RTX 4070 TI
Wohnort: Zürich, Schweiz
Kontaktdaten:

PB-IDE aut. Einrücken die X.te

Beitrag von AndyMars »

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).

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
Die zugehörige Textdatei IndenterList.txt (könnt sie ja selber noch erweitern):

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
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 ;)
Grüsse von AndyMars
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

trotzdem kann das ruhig in CT&T... ich verschiebs mal... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AndyMars
Beiträge: 141
Registriert: 08.09.2004 11:59
Computerausstattung: Win11 Prof 64bit, i5-13500 @ 4.8 GHz, 32GB RAM, Nvidia RTX 4070 TI
Wohnort: Zürich, Schweiz
Kontaktdaten:

Beitrag von AndyMars »

Mann Kaeru - bist du schnell! ... :freak: (<-ich)
Grüsse von AndyMars
Antworten