Page 1 sur 1

[5.20 win] RTF et HTML (éditeur)

Publié : mer. 14/août/2013 20:31
par blendman
salut

Voici un petit code qui permet de convertir un code RTF en HTML (ou code y ressemblant, comme le bbcode, etc..).
En combinant ça avec des boutons, il y a moyen d'avoir un éditeur HTML temps réel.

le code :

Code : Tout sélectionner

textRTF$ = "{\rtf1\ansi\ansicpg1252\deff0\deflang1036{\fonttbl{\f0\fnil\fcharset0 Times New Roman;}}"+
           "\viewkind4\uc1\pard\b\f0\fs24 texte gras\b0\par"+
           "\par"+
           "\i italique\i0\par"+
           "\par"+
           "texte normal\par"+
           "\par"+
           "\pard\qc texte centr\'e9\par"+
           "\pard\par"+
           "texte re normal\par"+
           "}"


#EDITOR_GADGET = 0
#EDITOR_GADGET_html = 1
;{ procédure
Procedure EditCallBack_E(dwCookie.l, *pbBuff, cb.l, *pcb)
  Shared chaine$
  chaine$=chaine$+PeekS(*pbBuff,cb)
  PokeL(*pcb,Len(chaine$))
EndProcedure
Procedure SetTextInMemory()
Shared chaine$
chaine$=""
longueur= Len(GetGadgetText(#EDITOR_GADGET))
Edit.EDITSTREAM
Edit\dwCookie=0 
Edit\pfnCallback=@EditCallBack_E()
SendMessage_(GadgetID(#EDITOR_GADGET),#EM_STREAMOUT,#SF_RTF,Edit)
EndProcedure

Procedure Editor_StreamCallback(dwCookie, *pbBuff, cb, *pcb.LONG)
  Shared File.l
  If dwCookie = 1 ; Save   
    WriteData(File,*pbBuff, cb)
    *pcb\l = cb
    
  Else ; Load
    length = Lof(File) - Loc(File)
    If length > cb
      ReadData(File,*pbBuff, cb)
      *pcb\l = cb
    Else
      ReadData(File,*pbBuff, length)
      *pcb\l = length
    EndIf
    
  EndIf
  
  ProcedureReturn 0
EndProcedure

Procedure Editor_Save(Gadget.l, File$)
  Shared File.l, FileToSave.s
  File = CreateFile(#PB_Any, File$)
  If File 
    stream.EDITSTREAM
    stream\dwCookie    = 1
    stream\pfnCallback = @Editor_StreamCallback()
    SendMessage_(GadgetID(Gadget), #EM_STREAMOUT, #SF_RTF, @stream)
    CloseFile(File)
  Else
    Debug "erreur save"
  EndIf
EndProcedure

Procedure ConvertRTFToHtml()
  Shared chaine$, pard
  SetTextInMemory()
  
  chaine2$ = ""
  If lt$ =""
    lt$ ="<"
  EndIf
  If gt$ =""
    gt$ = ">"
  EndIf 

  Editor_Save(#EDITOR_GADGET, "temp.txt"); on sauve d'abord le texte contenu dans le gadget pour le rouvrir juste après 
  ; on pourrait utiliser le texte dans la mémoire, mais je n'ai pas trouvé de méthode aussi simple que celle-ci.

  
  If ReadFile(0, "temp.txt"); puis on l'ouvre, ça permet de pouvoir lire ligne par ligne
    While Eof(0) = 0
      
      a$=ReadString (0)
      
      For i = 0 To Len(a$)
        t$ = Mid(a$,i,1); on vérifie les "\"
        
        If t$ = "\" ; si on en trouve
          t2$ = Mid(a$,i+1,1); on vérifie la lettre suivante, pour comprendre ce que c'est (par, pard, u, i, b, etc..)
          
          Select t2$
              
            Case "p"; si la lettre commence par "p"
              
              t3$ = Mid(a$,i+1,4) ; on vérifie la suite, ça peut être par ou pard (pour les paragraphes
              
              If t3$ = "pard"                
                pard = i+1
                pard_ok = 1
              EndIf
              
              If t3$="par"; i = Len(a$); logiquement c'est la fin de la ligne.
                
                If pard_ok = 1
                  
                  pard_ok = 0
                  t4$ = Mid(a$,pard+5,2)
                 
                  
                  Select t4$; on vérifie si c'est qc (centré), qr (right) ou qj (justify)
                      
                    Case "qr"; right
                      a$ = ReplaceString(a$,"\pard\qr", "")
                      a$ = ReplaceString(a$,"\par", "<br>"+Chr(10))
                      
                    Case "qc" ; centré                  
                      a$ = ReplaceString(a$,"\pard\qc", "<center>")
                      a$ = ReplaceString(a$,"\par", "</center><br>"+Chr(10))
                      
                    Case "qj"; justifié
                      a$ = ReplaceString(a$,"\pard\qj", "")
                      a$ = ReplaceString(a$,"\par", "<br>"+Chr(10))
                      
                    Default ; gauche                 
                      a$ = ReplaceString(a$,"\pard", "")
                      a$ = ReplaceString(a$,"\par", "<br>"+Chr(10))
                      
                  EndSelect
                  
                Else                  
                  a$ = ReplaceString(a$,"\par", "<br>"+Chr(10))
                EndIf
                
              EndIf
              
          EndSelect
          
        EndIf
        
      Next i
      chaine2$ +a$      
    Wend
    CloseFile(0)
  EndIf
  
  chaine2$ = RemoveString(chaine2$,"{\rtf1\ansi\ansicpg1252\deff0\deflang1036{\fonttbl{\f0\fnil\fcharset0 Times New Roman;}}")
  chaine2$ = RemoveString(chaine2$,"\viewkind4\uc1")
  chaine2$ = RemoveString(chaine2$,"\f0\fs24 ")
  chaine2$ = RemoveString(chaine2$,"\pard\cf0")
  
  chaine2$ = ReplaceString(chaine2$,"\fs",""); font size
  
  chaine2$ = ReplaceString(chaine2$,"\ul ",lt$+"u"+gt$)
  chaine2$ = ReplaceString(chaine2$,"\ulnone",lt$+"/u"+gt$)
  chaine2$ = ReplaceString(chaine2$,"\ul0",lt$+"/u"+gt$)
  
  chaine2$ = ReplaceString(chaine2$,"\'e9","é")
  chaine2$ = ReplaceString(chaine2$,"\'e8","è")
  chaine2$ = ReplaceString(chaine2$,"\'e7","ç")
  chaine2$ = ReplaceString(chaine2$,"\'ea","ê")
  chaine2$ = ReplaceString(chaine2$,"\'ee","î")
  chaine2$ = ReplaceString(chaine2$,"\'e0","à")
  chaine2$ = ReplaceString(chaine2$,"\'e2","â")
  chaine2$ = ReplaceString(chaine2$,"\'f9","ù")
  chaine2$ = ReplaceString(chaine2$,"\'fb","û")
    
  chaine2$ = ReplaceString(chaine2$,"\i ",lt$+"i"+gt$)
  chaine2$ = ReplaceString(chaine2$,"\i0",lt$+"/i"+gt$)
  
  chaine2$ = ReplaceString(chaine2$,"\strike ",lt$+"s"+gt$)
  chaine2$ = ReplaceString(chaine2$,"\strike0",lt$+"/s"+gt$)
  
  chaine2$ = ReplaceString(chaine2$,"\b ",lt$+"b"+gt$)
  chaine2$ = ReplaceString(chaine2$,"\b0",lt$+"/b"+gt$)
  chaine2$ = ReplaceString(chaine2$,"\b",lt$+"b"+gt$)
  
  chaine2$ = RemoveString(chaine2$,"}")
  
  SetGadgetText(#EDITOR_GADGET_html,chaine2$)

EndProcedure
;}
;{ open window
If OpenWindow(0,0,0,600,400,"RTF to html",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  EditorGadget(#EDITOR_GADGET,10,10,280,380)
  EditorGadget(#EDITOR_GADGET_html,300,10,280,380)
  SetGadgetText(#EDITOR_GADGET,textRTF$)
  ConvertRTFToHtml()
  
  
  Repeat
    Event = WaitWindowEvent()
    
    Select event
        
      Case #PB_Event_CloseWindow
        quit = 1
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
          Case #EDITOR_GADGET
            If EventType() = #PB_EventType_Change
              ConvertRTFToHtml()
            EndIf
            
        EndSelect               
    EndSelect  
  Until quit = 1
EndIf
;}
Évidemment, c'est améliorable et il manque quelques balises (h1 à h6, hr, etc...). Mais c'est déjà une bonne base.

Si vous améliorez ça, n'hésitez pas à poster le code.

Re: RTF et HTML (éditeur)

Publié : mer. 14/août/2013 21:44
par falsam
Merci blendman. Effectivement couplé à un bon éditeur de fichier rtf, on pourrait faire un excellent générateur html. :)

Pour information un éditeur rtf sur ce lien.
http://www.realsource.de/downloads/doc_ ... edit-class
Download en bas de la page.

Sujet de discussion sur le forum anglais
http://www.purebasic.fr/english/viewtop ... 12&t=46948

Re: RTF et HTML (éditeur)

Publié : jeu. 15/août/2013 10:00
par blendman
merci pour le lien Falsam ;)

Il me semble que je l'avais déjà vu.
Concernant un éditeur de texte plus complet, j'ai déjà commencé un éditeur de texte vers janvier 2013. Il n'est pas terminé et comporte quelques petits bugs, mais fonctionne plutôt bien.
Lorsque je l'aurai terminé, je le posterai sans doute, mais il me reste encore un peu de boulot sur les listes à puce, le format de la page, l'auto-completion, quelques options d'autocorrection, etc..

http://www.dracaena-studio.com/download ... tor1.2.jpg

Mais je vais pouvoir y ajouter cette fonction-ci (édition html simplifiée et KDP)

Re: RTF et HTML (éditeur)

Publié : jeu. 15/août/2013 10:09
par falsam
blendman a écrit :merci pour le lien Falsam ;) Il me semble que je l'avais déjà vu.
Je confirme que tu l'as vu :)
blendman a écrit :j'ai déjà commencé un éditeur de texte vers janvier 2013.
D’après le screenshoot, StoryCreator a l'air très prometteur.

Re: RTF et HTML (éditeur)

Publié : jeu. 15/août/2013 10:42
par blendman
falsam a écrit :
blendman a écrit :merci pour le lien Falsam ;) Il me semble que je l'avais déjà vu.
Je confirme que tu l'as vu :)
oui, je confirme aussi :)
j'ai d'ailleurs piqué quelques bouts de code sur cet exemple ^^, mais j'ai du corrigé car certains ne marchaient plus (font effect par exemple), et j'ai ajouté d'autres bricoles (notamment les propriétés de la page, tabulation, etc..)

falsam a écrit :
blendman a écrit :j'ai déjà commencé un éditeur de texte vers janvier 2013.
D’après le screenshoot, StoryCreator a l'air très prometteur.
Disons qu'il est basique, mais qu'il possède des fonctions que je n'ai pas trouvé sur d'autres éditeurs de texte, pourtant très complet (libreoffice, openoffice), comme les statistiques (jour, mois, année), les répétitions, le challenge, etc..