EditorGadget mit Multiformatierungen und HTML-Export

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
Bamsagla
Beiträge: 33
Registriert: 03.12.2004 14:49
Wohnort: Laufen

EditorGadget mit Multiformatierungen und HTML-Export

Beitrag von Bamsagla »

Hallo Leute,
hab mich mal gestern und heute ein ganzes Stück lang gespielt, bis ich endlich so weit war, wie ich sein wollte. Ich habe versucht, ein EditorGadget mehrfach zu formatieren (z.B. markierten Text fett und kursiv) und diese Formatierung dann in HTML-Code zu exportieren.
Jetzt bin ich aber kein Profi, somit schaut der Programmcode ein wenig hakelig aus. Darum die Bitte, falls jemand Optimierungen, Verbesserungen oder Anregungen hat, meldet euch.
Ansonsten kann dieser Code von jedem frei verwendet werden. Hab in der Hinsicht nicht viel Material auf dem Board und im CodeArchiv gefunden, drum möcht ich euch das zur Verfügung stellen.

Code: Alles auswählen

; EditorGadget mit Multiformatierungen und HTML-Exporter
; Bamsagla - Harry Wessner - 17.02.2006 - PureBasic 4.00 Beta 3

; Globale Formatierungsvariablen werden erstellt
Global Editorfettdr, Editoritalic, Editorunderl, Editorstrike

; EditorGadget Format Zeichen für Zeichen auslesen
Procedure Formatlesen(Gadget,Position)
  SendMessage_(GadgetID(Gadget),#EM_SETSEL,Position,Position+1)
  preval.CHARFORMAT
  preval\cbSize=SizeOf(CHARFORMAT)
  SendMessage_(GadgetID(Gadget),#EM_GETCHARFORMAT,#SCF_SELECTION,@preval)
  Pretyp=preval\dwEffects
  If Pretyp & #CFM_STRIKEOUT: Editorstrike=1: Else: Editorstrike=0: EndIf
  If Pretyp & #CFM_UNDERLINE: Editorunderl=1: Else: Editorunderl=0: EndIf
  If Pretyp & #CFM_ITALIC: Editoritalic=1: Else: Editoritalic=0: EndIf
  If Pretyp & #CFM_BOLD: Editorfettdr=1: Else: Editorfettdr=0: EndIf
EndProcedure

; EditorGadget formatieren mit Berücksichtigung bestehender Formate
Procedure Formatsetzen(Gadget,Neuformat)
  Speicher1.l=0: Speicher2.l=0
  SendMessage_(GadgetID(Gadget),#EM_GETSEL,@Speicher1,@Speicher2)
  For Formatieren=Speicher1 To Speicher2-1
    Formatlesen(Gadget,Formatieren): Gesamtformat=0
    If Neuformat=#CFM_BOLD And Editorfettdr=0: Gesamtformat=Gesamtformat|#CFM_BOLD: EndIf
    If Neuformat<>#CFM_BOLD And Editorfettdr=1: Gesamtformat=Gesamtformat|#CFM_BOLD: EndIf
    If Neuformat=#CFM_ITALIC And Editoritalic=0: Gesamtformat=Gesamtformat|#CFM_ITALIC: EndIf
    If Neuformat<>#CFM_ITALIC And Editoritalic=1: Gesamtformat=Gesamtformat|#CFM_ITALIC: EndIf
    If Neuformat=#CFM_UNDERLINE And Editorunderl=0: Gesamtformat=Gesamtformat|#CFM_UNDERLINE: EndIf
    If Neuformat<>#CFM_UNDERLINE And Editorunderl=1: Gesamtformat=Gesamtformat|#CFM_UNDERLINE: EndIf
    If Neuformat=#CFM_STRIKEOUT And Editorstrike=0: Gesamtformat=Gesamtformat|#CFM_STRIKEOUT: EndIf
    If Neuformat<>#CFM_STRIKEOUT And Editorstrike=1: Gesamtformat=Gesamtformat|#CFM_STRIKEOUT: EndIf
    format.CHARFORMAT
    format\cbSize=SizeOf(CHARFORMAT)
    format\dwMask=#CFM_ITALIC|#CFM_BOLD|#CFM_STRIKEOUT|#CFM_UNDERLINE
    format\dwEffects=Gesamtformat
    SendMessage_(GadgetID(Gadget),#EM_SETCHARFORMAT,#SCF_SELECTION,@format)
  Next
  SendMessage_(GadgetID(Gadget),#EM_SETSEL,Speicher1,Speicher2)
EndProcedure 

; Hauptteil mit Anwendungsfenster und Abfragen
If OpenWindow(100,0,0,400,300,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"Editor-Test")
  If CreateGadgetList(WindowID(100))
    ButtonGadget(100,10,10,40,25,"Fett")
    ButtonGadget(110,50,10,50,25,"Kursiv")
    ButtonGadget(120,100,10,80,25,"Unterstrichen")
    ButtonGadget(130,180,10,100,25,"Durchgestrichen")
    ButtonGadget(140,280,10,110,25,"HTML Exportieren")
    EditorGadget(200,10,45,WindowWidth(100)-20,WindowHeight(100)-55)
  EndIf
  ; Rechtsklick-Menü für EditorGadget wird erstellt
  If CreatePopupMenu(100)
    MenuItem(110,"Ausschneiden"+Chr(9)+"Strg+X")
    MenuItem(120,"Kopieren"+Chr(9)+"Strg+C")
    MenuItem(130,"Einfügen"+Chr(9)+"Strg+V")
    MenuItem(140,"Alles markieren"+Chr(9)+"Strg+A")
    MenuBar()
    MenuItem(150,"Rückgängig"+Chr(9)+"Strg+Z")
    OpenSubMenu("Formatieren")
      MenuItem(160,"Fett"+Chr(9)+"Strg+Shift+F")
      MenuItem(170,"Kursiv"+Chr(9)+"Strg+Shift+K")
      MenuItem(180,"Unterstrichen"+Chr(9)+"Strg+Shift+U")
      MenuItem(190,"Durchgestrichen"+Chr(9)+"Strg+Shift+D")
    CloseSubMenu()
  EndIf
  SetGadgetFont(200,LoadFont(100,"Tahoma",10))
  ; URLs werden automatisch als Links dargestellt
  SendMessage_(GadgetID(200),#EM_AUTOURLDETECT,#True,0)
  ; Shortcuts für Editor-Fenster werden hinzugefügt
  AddKeyboardShortcut(100,#PB_Shortcut_Control|#PB_Shortcut_Shift|#PB_Shortcut_F,160)
  AddKeyboardShortcut(100,#PB_Shortcut_Control|#PB_Shortcut_Shift|#PB_Shortcut_K,170)
  AddKeyboardShortcut(100,#PB_Shortcut_Control|#PB_Shortcut_Shift|#PB_Shortcut_U,180)
  AddKeyboardShortcut(100,#PB_Shortcut_Control|#PB_Shortcut_Shift|#PB_Shortcut_D,190)
  Repeat
    Select WindowEvent()
      Case #WM_RBUTTONDOWN
        If GetActiveGadget()=200: DisplayPopupMenu(100,WindowID(100)): EndIf
      Case #PB_Event_CloseWindow
        Ende=1
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 100: Formatsetzen(200,#CFM_BOLD)
          Case 110: Formatsetzen(200,#CFM_ITALIC)
          Case 120: Formatsetzen(200,#CFM_UNDERLINE)
          Case 130: Formatsetzen(200,#CFM_STRIKEOUT)
          Case 140
            ; Hier werden die Formate des EditorGadgets in eine HTML-Datei exportiert
            HtmlExporter$=SaveFileRequester("HTML Exportieren","","Alle HTML-Dateien (*.htm,*.html)|*.htm;*.html",0)
            If HtmlExporter$<>""
              If Right(HtmlExporter$,3)="htm": Gegeben=1: EndIf
              If Right(HtmlExporter$,4)="html": Gegeben=1: EndIf
              If Gegeben=0: HtmlExporter$=HtmlExporter$+".htm": EndIf
              If CreateFile(100,HtmlExporter$)
                WriteStringN(100,"<HTML><HEAD><TITLE>Export aus einem EditorGadget</TITLE></HEAD><BODY>")
                SendMessage_(GadgetID(200),#EM_SETSEL,0,-1)
                Speicher1.l=0: Speicher2.l=0
                SendMessage_(GadgetID(200),#EM_GETSEL,@Speicher1,@Speicher2)
                HtmlFettdr=0: HtmlKursiv=0: HtmlUnters=0: HtmlStrike=0
                Zeilenschaltung$=Chr(10)
                Erweitertezeile$=Chr(13)+Chr(10)
                Textfeld$=ReplaceString(GetGadgetText(200),Erweitertezeile$,Zeilenschaltung$)
                For Formatieren=Speicher1 To Speicher2
                  Formatlesen(200,Formatieren)
                  Aktuellzeichen$=Mid(Textfeld$,Formatieren+1,1)
                  If Editorfettdr=0 And HtmlFettdr=1: WriteString(100,"</B>"): HtmlFettdr=0: EndIf
                  If Editoritalic=0 And HtmlKursiv=1: WriteString(100,"</I>"): HtmlKursiv=0: EndIf
                  If Editorunderl=0 And HtmlUnters=1: WriteString(100,"</U>"): HtmlUnters=0: EndIf
                  If Editorstrike=0 And HtmlStrike=1: WriteString(100,"</S>"): HtmlStrike=0: EndIf
                  If Aktuellzeichen$=Zeilenschaltung$: WriteStringN(100,"<BR>"): Formatieren=Formatieren+1: EndIf
                  If Editorfettdr=1 And HtmlFettdr=0: WriteString(100,"<B>"): HtmlFettdr=1: EndIf
                  If Editoritalic=1 And HtmlKursiv=0: WriteString(100,"<I>"): HtmlKursiv=1: EndIf
                  If Editorunderl=1 And HtmlUnters=0: WriteString(100,"<U>"): HtmlUnters=1: EndIf
                  If Editorstrike=1 And HtmlStrike=0: WriteString(100,"<S>"): HtmlStrike=1: EndIf
                  If Not Aktuellzeichen$=Zeilenschaltung$: WriteString(100,Aktuellzeichen$): EndIf
                  Letzteszeichen$=Aktuellzeichen$
                Next
                If HtmlFettdr=1: WriteString(100,"</B>"): EndIf
                If HtmlKursiv=1: WriteString(100,"</I>"): EndIf
                If HtmlUnters=1: WriteString(100,"</U>"): EndIf
                If HtmlStrike=1: WriteString(100,"</S>"): EndIf
                WriteStringN(100,"</BODY></HTML>")
                CloseFile(100)
              Else
                MessageRequester("Fehler!","Die Erstellung der HTML-Datei ist leider fehlgeschlagen."+Chr(10)+"Der Vorgang war nicht erfolgreich!",#MB_ICONERROR)
              EndIf
            EndIf
        EndSelect
      Case #PB_Event_Menu
        Select EventMenu()
          ; Befehle des Rechtsklick-Menüs vom EditorGadget
          Case 110: SendMessage_(GadgetID(200),#WM_CUT,0,0)
          Case 120: SendMessage_(GadgetID(200),#WM_COPY,0,0)
          Case 130: SendMessage_(GadgetID(200),#WM_PASTE,0,0)
          Case 140: SendMessage_(GadgetID(200),#EM_SETSEL,0,-1)
          Case 150: SendMessage_(GadgetID(200),#EM_UNDO,0,0)
          Case 160: If GetActiveGadget()=200: Formatsetzen(200,#CFM_BOLD): EndIf
          Case 170: If GetActiveGadget()=200: Formatsetzen(200,#CFM_ITALIC): EndIf
          Case 180: If GetActiveGadget()=200: Formatsetzen(200,#CFM_UNDERLINE): EndIf
          Case 190: If GetActiveGadget()=200: Formatsetzen(200,#CFM_STRIKEOUT): EndIf
        EndSelect
      Case 0: Delay(1)
    EndSelect
  Until Ende=1
EndIf
End
Hoffe, jemand kanns brauchen. Vielleicht gibts ja auch die eine oder andere Anregung.
Servus, Bamsagla
Service Packs sind dazu da, die Fehler zu verbessern, die vorher nicht richtig funktioniert haben!
Bild