[IDE-Tool]Einruecker

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

Ne, das geht nicht.
Ich werde mich mal beschweren :wink:
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Hab nen kleinen Fehler gefunden, bei UTF-8 Dateien wird die erste Zeile ausgelassen. Habs mal korrigiert. Ist nur ein Befehl:

Code: Alles auswählen

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_()

  CompilerIf #TestIT
  a$ = "D:\Purebasic\PureBasic4\"
  CompilerElse
  a$ = GetPathPart(GetEnvironmentVariable("PB_TOOL_IDE"))
  CompilerEndIf

  OpenPreferences(a$ + "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
    End
  EndIf
  ReadStringFormat(0) ; BOM überspringen
  Tabs = 3
  Restore Tags
Also nur ReadStringFormat(0) einfügen, wie oben

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Da ich diesen Code ständig nutze, hab ichs nochmal etwas fehlerbereinigt.
Jetzt läufts unter Linux, sowie unter Windows, Datazeilen wurden
vervollständig. UTF-8 und ASCII werden jetzt auch richtig behandelt, war
noch fehlerhaft.

Code: Alles auswählen

;/---------------
;| IDE-Tool
;| Einrücker
;|
;| (c)HeX0R 2006
;| Do whatever you
;| like with this
;| source
;/---------------

#TestIT = 0

Global UTF_Flag.l

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, Found.l, *index

  NewList Lines.s()
  NewList Tags._TAGS_()
  NewList MTags._TAGS_()

  CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  OpenPreferences(GetEnvironmentVariable("HOME") + ".purebasic/purebasic.prefs")
  CompilerElse
  OpenPreferences(GetPathPart(GetEnvironmentVariable("PB_TOOL_IDE")) + "purebasic.prefs")
  CompilerEndIf
  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
  If ReadStringFormat(0) = #PB_UTF8
    UTF_Flag = #PB_UTF8
  Else
    UTF_Flag = #PB_Ascii
  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

  While Eof(0) = 0
    AddElement(Lines())
    b$ = MyTrim(ReadString(0, UTF_Flag))
    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$)
      WriteStringFormat(0, UTF_Flag)
      ForEach Lines()
        WriteStringN(0, Lines(), UTF_Flag)
      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 "procedurec"
Data.s "proceduredll"
Data.s "procedurecdll"
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 "importc"
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]

Ich hoffe, ich hab keine neuen Fehler eingebaut :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Beitrag von HeX0R »

Sehr gut :allright:

Habe nur noch für die faulen Säcke, die so auf Einzeiler stehn die ganzen C-Commands-Abfragen hinzugefügt, die Globale Variable lokalisiert und die komische Test-Konstante entfernt.
Zuletzt geändert von HeX0R am 07.06.2009 23:14, insgesamt 2-mal geändert.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Beitrag von HeX0R »

Obigen Code leicht modifiziert.
Z.B. findet er jetzt die IDE-Einstellungen auch, wenn man sie in den Anwendungsdaten sitzen hat.
Ausserdem StructureUnion und EndStructureUnion hinzugefügt.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

HeX0R hat geschrieben:Obigen Code leicht modifiziert.
Z.B. findet er jetzt die IDE-Einstellungen auch, wenn man sie in den Anwendungsdaten sitzen hat.
Ausserdem StructureUnion und EndStructureUnion hinzugefügt.
Danke :allright:
Bin schon paarmal mit der Beta drüber gestolpert und habe keine Lust/Zeit
gehabt es zu ändern :oops:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Sorry, bin anscheinend zu blöde das Ding ans Laufen zu bekommen. :oops:

Ich hab also den letzten Source von Hexor aus dem Forum in die IDE kopiert, daraus eine EXE gemacht und diese als Wekzeug eingebunden.

Als Argument übergebe ich: "%Tempfile"

Wenn ich es nun unter "Werkzeuge" ausrufe scheint nichts zu passieren.
Was muss ich denn sonst noch einstellen oder machen bzw. wie muss ich dass dann anwenden um einen formatierten Source zu bekommen?

ThX, PL. *schäm* :(
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Beitrag von HeX0R »

Im Rar-Archiv des ersten Beitrags ist ne Hilfe mit drinne.
Nur das Tool selbst ist nicht ganz up-to-date.

[Edit]
Ich hab das interessante Bild mal rausgegruschtelt :
Bild

P.S.:
Das Tool auszurufen dürfte herzlich wenig bringen :lol:
Zuletzt geändert von HeX0R am 18.10.2017 21:43, insgesamt 1-mal geändert.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

HeX0R hat geschrieben:Das Tool auszurufen dürfte herzlich wenig bringen :lol:
Au Mann bin ich Banane ... meine Nachbarn wundern sich schon wieso ich hier die ganze Zeit am Fenster stehe und komische Namen über die Straße brülle. :freak:
HeX0R hat geschrieben: Ich hab das interessante Bild mal rausgegruschtelt :
Das Problem ist, dass bei mir die Felder bei "Reload Source after tool has quit" nicht aktiv sind - ich kann sie also nicht anwählen:

Bild

Benutzte IDE: 4.10-Beta2

[Edit:]
*Aaarrrggghhhhh* .... erst mach ich mich vor meiner gesamten Nachbarschafft lächerlich und dann bin ich noch zu blöde einfach "abzuschreiben" !!! Ist heute wohl nicht mein Tag. :freak:
"%TEMPFILE" - MUSS - groß geschrieben werden, sonst bleiben die Gadgets deaktiviert.

Nun läufts aber, also: Vielen Dank ... schickes und nützliches Tool. :allright:
Zuletzt geändert von PureLust am 01.08.2007 16:41, insgesamt 2-mal geändert.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Beitrag von gekkonier »

Nettes Tool!

Danke! :allright:
Antworten