[5.20 win] RTF et HTML (éditeur)
Publié : mer. 14/août/2013 20:31
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 :
É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.
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
;}
Si vous améliorez ça, n'hésitez pas à poster le code.