[5.20 win] RTF et HTML (éditeur)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[5.20 win] RTF et HTML (éditeur)

Message 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.
Dernière modification par blendman le jeu. 22/août/2013 11:02, modifié 3 fois.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: RTF et HTML (éditeur)

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: RTF et HTML (éditeur)

Message 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)
Dernière modification par blendman le jeu. 15/août/2013 10:21, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: RTF et HTML (éditeur)

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: RTF et HTML (éditeur)

Message 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..
Répondre