J'ai commencer a bricoller un petit programme de reconnaissance de sintax dans un editor gadget
c'est pas encore vraiment au point mais déjà sa donne une petite idée

Voicie le fichier texte a nommer "commandes.txt"
Code : Tout sélectionner
[01 Un éléphant 23456789 - _ [[[]][][[]][][ ]]] [ [ [ gris] = {"Une {{}}}{ [[[[[[Simple]]]]]] *{"azs"}* {a} [[[[[[Simple]]]]]] 0.123456789 chaine"}
[Le chien] = {1,50}
[Le chat] = {"Ma variable *{"Eléphant gris"}* = "[Eléphant gris]""}
[La vache] = {"[Eléphant gris], [Le chien]"}
Code : Tout sélectionner
Enumeration
#Window_0
#Editor_0
EndEnumeration
#CFM_UNDERLINETYPE = $800000
#CFU_UNDERLINEWAVE = $8
#BlueUnderline = $10
#CyanUnderline = $20
#GreenUnderline = $30
#MagentaUnderline = $40
#RedUnderline = $50
#YellowUnderline = $60
#AquaUnderline = $90
#SeaGreenUnderline = $A0
#MaroonUnderline = $C0
Procedure.s TrimStringPlus(Chaine$, CaractereTrim$, Option)
If option = 1 Or option = 3
For TrimPlus = 1 To Len(Chaine$)
ChaineCaractere$ = Mid(Chaine$, TrimPlus, 1)
For Index = 1 To CountString(CaractereTrim$, "|")
VerificationCaractere$ = StringField(CaractereTrim$, Index, "|")
If VerificationCaractere$ = ChaineCaractere$
Trouver = 1
Break
Else
Trouver = 0
EndIf
Next
If Trouver = 1
Else
ResultaTrimPlus$ = Mid(Chaine$, TrimPlus)
Break
EndIf
Next
EndIf
If ResultaTrimPlus$ > ""
Chaine$ = ResultaTrimPlus$
EndIf
If option = 2 Or option = 3
For TrimPlus = Len(Chaine$) To 1 Step - 1
ChaineCaractere$ = Mid(Chaine$, TrimPlus, 1)
For Index = CountString(CaractereTrim$, "|") To 1 Step - 1
VerificationCaractere$ = StringField(CaractereTrim$, Index, "|")
If VerificationCaractere$ = ChaineCaractere$
Trouver = 1
Break
Else
Trouver = 0
EndIf
Next
If Trouver = 1
Else
ResultaTrimPlus$ = Mid(Chaine$, 1, TrimPlus)
Break
EndIf
Next
EndIf
ProcedureReturn ResultaTrimPlus$
EndProcedure
Procedure Editor_Color(Color.l)
format.CHARFORMAT2
format\cbSize = SizeOf(CHARFORMAT2)
format\dwMask = #CFM_COLOR
format\crTextColor = Color
If IsWindow(Numero_Fenetre_1) And IsGadget(#Editor_0)
SendMessage_(GadgetID(#Editor_0), #EM_SETCHARFORMAT, #SCF_SELECTION, @format)
EndIf
EndProcedure
Procedure Editor_Format(Format)
format2.CHARFORMAT2
format2\cbSize = SizeOf(CHARFORMAT)
format2\dwMask = #CFM_ITALIC|#CFM_BOLD|#CFM_STRIKEOUT|#CFM_UNDERLINE
format2\dwEffects = Format
SendMessage_(GadgetID(#Editor_0), #EM_SETCHARFORMAT, #SCF_SELECTION, @format2)
EndProcedure
Procedure selection_libre(ligne_de_depart.l, caractere_de_depart.l, ligne_de_fin.l, caractere_de_fin.l)
If IsGadget(#Editor_0)
ligne_de_depart - 1
sel.CHARRANGE
sel\cpMin = SendMessage_(GadgetID(#Editor_0), #EM_LINEINDEX, ligne_de_depart, 0) + caractere_de_depart - 1
If ligne_de_fin = -1
ligne_de_fin = SendMessage_(GadgetID(#Editor_0), #EM_GETLINECOUNT, 0, 0) - 1
EndIf
sel\cpMax = SendMessage_(GadgetID(#Editor_0), #EM_LINEINDEX, ligne_de_fin, 0)
If caractere_de_fin = -1
sel\cpMax + SendMessage_(GadgetID(#Editor_0), #EM_LINELENGTH, sel\cpMax, 0)
Else
sel\cpMax + caractere_de_fin - 1
EndIf
SendMessage_(GadgetID(#Editor_0), #EM_HIDESELECTION, #SCF_SELECTION, @sel)
SendMessage_(GadgetID(#Editor_0), #EM_EXSETSEL, 0, @sel)
EndIf
EndProcedure
Procedure selectionner_caracteres(ligne, position_depart, position_fin)
selection_libre(ligne, position_depart, ligne - 1, position_fin)
EndProcedure
Procedure.l renvoiller_position_cursseur_Y_console()
If IsGadget(#Editor_0)
; returns Y-Pos of Cursor
REG = GadgetID(#Editor_0)
SendMessage_(REG,#EM_EXGETSEL,0,Range.CHARRANGE)
position_cursseur_Y_console = SendMessage_(REG,#EM_EXLINEFROMCHAR,0,Range\cpMin)+1
ProcedureReturn position_cursseur_Y_console
EndIf
EndProcedure
Procedure.l renvoiller_position_cursseur_X_console()
If IsGadget(#Editor_0)
; returns X-Pos of Cursor
REG = GadgetID(#Editor_0)
SendMessage_(REG,#EM_EXGETSEL,0,Range.CHARRANGE)
position_cursseur_X_console = (Range\cpMax-(SendMessage_(REG,#EM_LINEINDEX,SendMessage_(REG,#EM_EXLINEFROMCHAR,0,Range\cpMin),0))+1)
ProcedureReturn position_cursseur_X_console
EndIf
EndProcedure
Procedure SyntaxLight(Ligne = 0)
If ligne > 0
NombreLigne = Ligne
ElseIf ligne < 0 Or ligne = 0
NombreLigne = CountGadgetItems(#Editor_0)
EndIf
For Ligne = Ligne To NombreLigne
Ligne$ = GetGadgetItemText(#Editor_0, Ligne)
terminer = 0
Chaine = 0
Valeur = 0
Variable = 0
Erreur = 0
For PositionExtraction = 1 To Len(Ligne$)
selectionner_caracteres(Ligne + 1, PositionExtraction, PositionExtraction + 1)
Caractere$ = Mid(Ligne$, PositionExtraction, 1)
If terminer = 0
If Chaine = 0
If Valeur = 0
If Variable = 0
If Caractere$ = "[" And Erreur = 0
Editor_Color(RGB(0, 0, 255))
Editor_Format(#CFM_BOLD)
Variable = 1
Erreur = 0
ElseIf Caractere$ = "]"
Editor_Color(RGB(255, 0, 0))
Debug "Erreur de syntax, caractère invalide » " + Caractere$ + " « dans le nom de la variable a la position " + Str(PositionExtraction) + ", a la ligne " + Str( Ligne)
Erreur = 1
ElseIf Caractere$ = "{"
Editor_Color(RGB(0, 0, 255))
Editor_Format(#CFM_BOLD)
If Mid(Ligne$, PositionExtraction + 1, 1) = Chr(34)
Chaine = 1
Else
Valeur = 1
EndIf
ElseIf Caractere$ = "=" Or Caractere$ = "+" Or Caractere$ = "-" Or Caractere$ = "*" Or Caractere$ = "/" Or Caractere$ = "%"
Editor_Color(RGB(253, 123, 0))
Editor_Format(#CFM_BOLD)
ElseIf Caractere$ <> Chr(32)
Editor_Color(RGB(255, 0, 0))
Debug "Erreur de syntax, caractère invalide » " + Caractere$ + " « a la position " + Str(PositionExtraction - 1)
EndIf
ElseIf Variable = 1
If Caractere$ = Chr(32) Or Caractere$ = Chr(9) Or Caractere$ = "@" Or Caractere$ = "-" Or Caractere$ = "_" Or Caractere$ = "ô" Or Caractere$ = "ö" Or Caractere$ = "ù" Or Caractere$ = "û" Or Caractere$ = "ü" Or Caractere$ = "ÿ" Or Caractere$ = "ç" Or Caractere$ = "é" Or Caractere$ = "è" Or Caractere$ = "ê" Or Caractere$ = "ë" Or Caractere$ = "à" Or Caractere$ = "ä" Or Caractere$ = "â" Or Caractere$ = "î" Or Caractere$ = "ï" Or Caractere$ = "a" Or Caractere$ = "b" Or Caractere$ = "c" Or Caractere$ = "d" Or Caractere$ = "e" Or Caractere$ = "f" Or Caractere$ = "g" Or Caractere$ = "h" Or Caractere$ = "i" Or Caractere$ = "j" Or Caractere$ = "k" Or Caractere$ = "l" Or Caractere$ = "m" Or Caractere$ = "n" Or Caractere$ = "o" Or Caractere$ = "p" Or Caractere$ = "q" Or Caractere$ = "r" Or Caractere$ = "s" Or Caractere$ = "t" Or Caractere$ = "u" Or Caractere$ = "v" Or Caractere$ = "w" Or Caractere$ = "x" Or Caractere$ = "y" Or Caractere$ = "z" Or Caractere$ = "A" Or Caractere$ = "B" Or Caractere$ = "C" Or Caractere$ = "D" Or Caractere$ = "E" Or Caractere$ = "F" Or Caractere$ = "G" Or Caractere$ = "H" Or Caractere$ = "I" Or Caractere$ = "J" Or Caractere$ = "K" Or Caractere$ = "L" Or Caractere$ = "M" Or Caractere$ = "N" Or Caractere$ = "O" Or Caractere$ = "P" Or Caractere$ = "Q" Or Caractere$ = "R" Or Caractere$ = "S" Or Caractere$ = "T" Or Caractere$ = "U" Or Caractere$ = "V" Or Caractere$ = "W" Or Caractere$ = "X" Or Caractere$ = "Y" Or Caractere$ = "Z" Or Caractere$ = "0" Or Caractere$ = "1" Or Caractere$ = "2" Or Caractere$ = "3" Or Caractere$ = "4" Or Caractere$ = "5" Or Caractere$ = "6" Or Caractere$ = "7" Or Caractere$ = "8" Or Caractere$ = "9"
Editor_Color(RGB(136, 58, 119))
ElseIf Caractere$ = "]"
Variable = 0
Editor_Color(RGB(0, 0, 255))
Editor_Format(#CFM_BOLD)
Else
Editor_Color(RGB(255, 0, 0))
Debug "Erreur de syntax, caractère invalide » " + Caractere$ + " « dans le nom de la variable a la position " + Str(PositionExtraction) + ", a la ligne " + Str( Ligne)
EndIf
EndIf
ElseIf Valeur = 1
If Caractere$ = "0" Or Caractere$ = "1" Or Caractere$ = "2" Or Caractere$ = "3" Or Caractere$ = "4" Or Caractere$ = "5" Or Caractere$ = "6" Or Caractere$ = "7" Or Caractere$ = "8" Or Caractere$ = "9" Or Caractere$ = "." Or Caractere$ = ","
Editor_Color(RGB(255, 0, 0))
ElseIf Caractere$ = "}"
Editor_Color(RGB(0, 0, 255))
Editor_Format(#CFM_BOLD)
Valeur = 0
terminer = 1
Else
Editor_Color(RGB(255, 0, 0))
Debug "Erreur de syntax, caractère invalide » " + Caractere$ + " « dans la valeur de la variable a la position " + Str(PositionExtraction) + ", a la ligne " + Str( Ligne)
EndIf
EndIf
ElseIf chaine = 1
If CaractereErreur = 0
If IgniorerCaractere = 0
If Caractere$ <> "}"
If Caractere$ = "*"
If Mid(Ligne$, PositionExtraction + 1, 2) = "{" + Chr(34)
If FindString(Ligne$, Chr(34) + "}*", PositionExtraction + 1)
IgniorerCaractere = FindString(Ligne$, Chr(34) + "}*", PositionExtraction + 1) - PositionExtraction + 1
Else
CaractereErreur = 1
EndIf
ElseIf Mid(Ligne$, PositionExtraction + 1, 2) = "{" + Chr(34)
If FindString(Ligne$, Chr(34) + "}*", PositionExtraction + 1)
IgniorerCaractere = FindString(Ligne$, Chr(34) + "}*", PositionExtraction + 1) - PositionExtraction + 1
Else
CaractereErreur = 1
EndIf
EndIf
ElseIf Mid(Ligne$, PositionExtraction, 2) = "{" + Chr(34)
Editor_Color(RGB(255, 0, 0))
terminer = 1
Debug "Erreur de syntax, caractère invalide » " + Caractere$ + " « dans la valeur de la variable a la position " + Str(PositionExtraction) + ", a la ligne " + Str( Ligne)
Continue
EndIf
Editor_Color(RGB(0, 150, 0))
Else
If Mid(Ligne$, PositionExtraction - 1, 1) <> Chr(34)
If FindString(Ligne$, "}", PositionExtraction + 1)
Editor_Color(RGB(0, 150, 0))
Else
Debug "Erreur de syntax, caractère de fin de chaine manquant » " + Chr(34) + " « a la fin de la chaine de caractère a la position " + Str(PositionExtraction - 1)
Editor_Color(RGB(255, 0, 0))
EndIf
Else
Editor_Color(RGB(0, 0, 255))
Editor_Format(#CFM_BOLD)
chaine = 0
terminer = 1
EndIf
EndIf
ElseIf IgniorerCaractere > 0
Editor_Color(RGB(0, 150, 0))
IgniorerCaractere - 1
EndIf
ElseIf CaractereErreur > 0
Editor_Color(RGB(255, 0, 0))
CaractereErreur - 1
EndIf
EndIf
Else
Editor_Color(RGB(255, 0, 0))
Debug "Erreur de syntax, caractère invalide » " + Caractere$ + " « a la fin de la ligne " + Str(PositionExtraction - 1)
EndIf
Delay(0)
Next
Next
EndProcedure
Procedure Open_Window_0()
If OpenWindow(#Window_0, 472, 203, 765, 610, "Editeur", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
EditorGadget(#Editor_0, 5, 5, 755, 600) ; #PB_Editor_ReadOnly
SetGadgetFont(#Editor_0, LoadFont(99, "Cambria", 10))
If ReadFile(1, "Commandes.txt") ; Si le fichier peut être lu , on continue...
While Eof(1) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
AddGadgetItem(#Editor_0, -1, TrimStringPlus(ReadString(1), "|" + Chr(32) + "|" + Chr(9) + "|", 3)) ; Affiche ligne par ligne le contenu du fichier
Ligne + 1
Wend
CloseFile(1) ; Ferme le fichier précédemment ouvert
Else ; Sinon ont affiche un message d'avertissement
MessageRequester("Information","Impossible d'ouvrir le fichier !")
EndIf
EndIf
SyntaxLight()
Repeat ; Start of the event loop
Event = WaitWindowEvent() ; This line waits until an event is received from Windows
WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
GadgetID = EventGadget() ; Is it a gadget event?
EventType = EventType() ; The event type
If Event = #PB_Event_Gadget
If GadgetID = #Editor_0
CodeEditeur$ = GetGadgetText(#Editor_0)
If SauvegardeCodeEditeur$ <> CodeEditeur$
SauvegardeCodeEditeur$ = CodeEditeur$
SyntaxLight(renvoiller_position_cursseur_Y_console() - 1)
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndProcedure
Open_Window_0()
