donc j'ai fait ma lib de coloration syntaxique
Code : Tout sélectionner
ProcedureDLL ls_InitKeyword(file.s); initialise et charge la liste de mot clé de la forme: "nombre de mot cle" "motclé" "couleurmotcle" "motclé" "couleurmotcle"
If OpenFile(0, file)
nombre = Val(ReadString())
If nombre = 0 : ProcedureReturn 0 : EndIf
Dim color_fonction_liste.s(nombre, 2)
color_fonction_liste(0, 0) = Str(nombre)
For index = 1 To nombre
color_fonction_liste(index, 1) = ReadString(); keyword
color_fonction_liste(index, 2) = ReadString(); couleur
Next
CloseFile(0)
ProcedureReturn 1
EndIf
ProcedureReturn 0
EndProcedure
ProcedureDLL.s ls_ReturnString(text.s, pos.l); retourne le caractere a la position specifie du text
ProcedureReturn Right(Left(text, pos), 1)
EndProcedure
ProcedureDLL ls_FindDiffString(string.s, stringstofind.s, startposition); retourne la position du premier caractere trouver de stringstofind.s dans string
position = 1000000000
For pos = 1 To Len(stringstofind.s)
cara = FindString(string, ls_ReturnString(stringstofind, pos), startposition)
If cara < position And cara <> 0
position = cara
EndIf
Next
If position = 1000000000
position = 0
EndIf
ProcedureReturn position
EndProcedure
ProcedureDLL ls_ColorationSyntaxique(gadget.l, progbarID.l, com.s, ColorCom, chaine.s, ColorChaine, operator.s, coloroperator, colorchiffre); effectue une coloration syntaxique "InitKeyword(file.s)" doit etre appeler avant
HideGadget(gadget, 1)
ProgressBarGadget(progbarID, GadgetX(gadget) + 10, GadgetHeight(gadget) / 2 - 5, GadgetWidth(gadget) - 20, 10, 0, 100, #PB_ProgressBar_Smooth)
For index = 0 To CountGadgetItems(gadget)
ligne.s = GetGadgetItemText(gadget, index, 0)
Editor_ColorText(gadget, index, 1, index, Len(ligne) + 1, RGB(0, 0, 0))
;{ coloration des commentaires
pos = 0
poscom = 0
While pos < Len(ligne) And pos <> -1
poscommentaire = FindString(ligne, com, pos + 1)
pos = poscommentaire
If pos = 0 : pos = -1 : EndIf
If poscommentaire
chainecaractere = 0
For indexbis = 1 To poscommentaire
If ls_ReturnString(ligne, indexbis) = chaine : chainecaractere = chainecaractere + 1 : EndIf
Next
resultn.f = chainecaractere / 2
If Fract(resultn.f) = 0
Editor_ColorText(gadget, index, poscommentaire, index, Len(ligne) + 1, ColorCom)
If poscom = 0 : poscom = poscommentaire : EndIf
EndIf
EndIf
Wend
If poscom = 0 : poscom = Len(ligne) + 1 : EndIf
;}
;{ coloration des chaines
resultbis = CountString(ligne, chaine)
Dim chaine_emplacement(1, 2)
If resultbis
Dim chaine_emplacement(resultbis, 2)
EndIf
For indexbis = 1 To Len(ligne) + 1
poschainepre = FindString(ligne, chaine, indexbis)
If poschainepre
chainepasse = chainepasse + 1
indexbis = poschainepre + 1
poschaineder = FindString(ligne, chaine, indexbis)
If poschaineder = 0
poschaineder = Len(ligne) + 1
Else
indexbis = poschaineder + 1
EndIf
If poschainepre < poscom
Editor_ColorText(gadget, index, poschainepre, index, poschaineder + 1, ColorChaine)
chaine_emplacement(0, 0) = chaine_emplacement(0, 0) + 1
chaine_emplacement(chaine_emplacement(0, 0), 1) = poschainepre
chaine_emplacement(chaine_emplacement(0, 0), 2) = poschaineder
EndIf
EndIf
Next
;}
;{ coloration des mots clé
For indexbis = 1 To Val(color_fonction_liste(0, 0))
pos = 0
While pos < Len(ligne) + 1 And pos > -1
pos = FindString(LCase(ligne), LCase(color_fonction_liste(indexbis, 1)), pos)
autorise = 1
If chaine_emplacement(0, 0)
For indexprime = 1 To chaine_emplacement(0, 0)
If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
autorise = 0
EndIf
Next
EndIf
If pos
cara1.s =ls_ReturnString(ligne, pos - 1)
cara2.s =ls_ReturnString(ligne, pos + Len(color_fonction_liste(indexbis, 1)))
If pos + Len(color_fonction_liste(indexbis, 1)) = Len(ligne) + 1 : cara2.s = "" : EndIf
oui1 = 0
oui2 = 0
For indexprime = 0 To Len(operator + chaine + com)
If cara1 =ls_ReturnString(operator + chaine + com, indexprime) : oui1 = 1 : EndIf
If cara2 =ls_ReturnString(operator + chaine + com, indexprime) : oui2 = 1 : EndIf
Next
If autorise = 1 And oui1 = 1 And oui2 = 1 And pos < poscom
Editor_ColorText(gadget, index, pos, index, pos + Len(color_fonction_liste(indexbis, 1)), Val(color_fonction_liste(indexbis, 2)))
EndIf
pos = pos + 1
Else : pos = - 1
EndIf
Wend
Next
;}
;{ coloration des chiffres
pos = 0
While pos < Len(ligne) + 1 And pos > -1
pos = ls_FindDiffString(ligne, "0123456789", pos)
If pos
len = 1
autorise = 1
If chaine_emplacement(0, 0)
For indexprime = 1 To chaine_emplacement(0, 0)
If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
autorise = 0
EndIf
Next
EndIf
Repeat
If pos + len = ls_FindDiffString(ligne, "0123456789", pos + len)
len = len + 1
EndIf
Until pos + len <> ls_FindDiffString(ligne, "0123456789", pos + len)
cara1.s =ls_ReturnString(ligne, pos - 1)
cara2.s =ls_ReturnString(ligne, pos + len)
If pos + len = Len(ligne) + 1 : cara2.s = "" : EndIf
oui1 = 0
oui2 = 0
For indexprime = 0 To Len(operator + chaine + com)
If cara1 = ls_ReturnString(operator + chaine + com, indexprime) : oui1 = 1 : EndIf
If cara2 = ls_ReturnString(operator + chaine + com, indexprime) : oui2 = 1 : EndIf
Next
If autorise = 1 And oui1 = 1 And oui2 = 1 And pos < poscom
Editor_ColorText(gadget, index, pos, index, pos + len, colorchiffre)
EndIf
pos = pos + len
Else : pos = -1
EndIf
Wend
;}
;{ coloration des operateurs
pos = 0
While pos < Len(ligne) + 1 And pos > -1
pos = ls_FindDiffString(ligne, operator, pos)
autorise = 1
If chaine_emplacement(0, 0)
For indexprime = 1 To chaine_emplacement(0, 0)
If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
autorise = 0
EndIf
Next
EndIf
If pos
If autorise = 1 And pos < poscom
Editor_ColorText(gadget, index, pos, index, pos + 1, coloroperator)
EndIf
pos = pos + 1
Else : pos = - 1
EndIf
Wend
;}
If CountGadgetItems(gadget)
SetGadgetState(progbarID, (index * 100) / CountGadgetItems(gadget))
EndIf
Next
FreeGadget(progbarID)
HideGadget(gadget, 0)
EndProcedure
ProcedureDLL ls_ColorationSyntaxiqueLigne(gadget.l, index, com.s, ColorCom, chaine.s, ColorChaine, operator.s, coloroperator, colorchiffre);ingnore le parametre "progbarID.l" effectue une coloration syntaxique a l'index donné "InitKeyword(file.s)" doit etre appeler avant
index = index - 1
ligne.s = GetGadgetItemText(gadget, index, 0)
Editor_ColorText(gadget, index, 1, index, Len(ligne) + 1, RGB(0, 0, 0))
;{ coloration des commentaires
pos = 0
poscom = 0
While pos < Len(ligne) And pos <> -1
poscommentaire = FindString(ligne, com, pos + 1)
pos = poscommentaire
If pos = 0 : pos = -1 : EndIf
If poscommentaire
chainecaractere = 0
For indexbis = 1 To poscommentaire
If ls_ReturnString(ligne, indexbis) = chaine : chainecaractere = chainecaractere + 1 : EndIf
Next
resultn.f = chainecaractere / 2
If Fract(resultn.f) = 0
Editor_ColorText(gadget, index, poscommentaire, index, Len(ligne) + 1, ColorCom)
If poscom = 0 : poscom = poscommentaire : EndIf
EndIf
EndIf
Wend
If poscom = 0 : poscom = Len(ligne) + 1 : EndIf
;}
;{ coloration des chaines
resultbis = CountString(ligne, chaine)
Dim chaine_emplacement(1, 2)
If resultbis
Dim chaine_emplacement(resultbis, 2)
EndIf
For indexbis = 1 To Len(ligne) + 1
poschainepre = FindString(ligne, chaine, indexbis)
If poschainepre
chainepasse = chainepasse + 1
indexbis = poschainepre + 1
poschaineder = FindString(ligne, chaine, indexbis)
If poschaineder = 0
poschaineder = Len(ligne) + 1
Else
indexbis = poschaineder + 1
EndIf
If poschainepre < poscom
Editor_ColorText(gadget, index, poschainepre, index, poschaineder + 1, ColorChaine)
chaine_emplacement(0, 0) = chaine_emplacement(0, 0) + 1
chaine_emplacement(chaine_emplacement(0, 0), 1) = poschainepre
chaine_emplacement(chaine_emplacement(0, 0), 2) = poschaineder
EndIf
EndIf
Next
;}
;{ coloration des mots clé
For indexbis = 1 To Val(color_fonction_liste(0, 0))
pos = 0
While pos < Len(ligne) + 1 And pos > -1
pos = FindString(LCase(ligne), LCase(color_fonction_liste(indexbis, 1)), pos)
autorise = 1
If chaine_emplacement(0, 0)
For indexprime = 1 To chaine_emplacement(0, 0)
If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
autorise = 0
EndIf
Next
EndIf
If pos
cara1.s =ls_ReturnString(ligne, pos - 1)
cara2.s =ls_ReturnString(ligne, pos + Len(color_fonction_liste(indexbis, 1)))
If pos + Len(color_fonction_liste(indexbis, 1)) = Len(ligne) + 1 : cara2.s = "" : EndIf
oui1 = 0
oui2 = 0
For indexprime = 0 To Len(operator + chaine + com)
If cara1 =ls_ReturnString(operator + chaine + com, indexprime) : oui1 = 1 : EndIf
If cara2 =ls_ReturnString(operator + chaine + com, indexprime) : oui2 = 1 : EndIf
Next
If autorise = 1 And oui1 = 1 And oui2 = 1 And pos < poscom
Editor_ColorText(gadget, index, pos, index, pos + Len(color_fonction_liste(indexbis, 1)), Val(color_fonction_liste(indexbis, 2)))
EndIf
pos = pos + 1
Else : pos = - 1
EndIf
Wend
Next
;}
;{ coloration des chiffres
pos = 0
While pos < Len(ligne) + 1 And pos > -1
pos = ls_FindDiffString(ligne, "0123456789", pos)
If pos
len = 1
autorise = 1
If chaine_emplacement(0, 0)
For indexprime = 1 To chaine_emplacement(0, 0)
If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
autorise = 0
EndIf
Next
EndIf
Repeat
If pos + len = ls_FindDiffString(ligne, "0123456789", pos + len)
len = len + 1
EndIf
Until pos + len <> ls_FindDiffString(ligne, "0123456789", pos + len)
cara1.s =ls_ReturnString(ligne, pos - 1)
cara2.s =ls_ReturnString(ligne, pos + len)
If pos + len = Len(ligne) + 1 : cara2.s = "" : EndIf
oui1 = 0
oui2 = 0
For indexprime = 0 To Len(operator + chaine + com)
If cara1 = ls_ReturnString(operator + chaine + com, indexprime) : oui1 = 1 : EndIf
If cara2 = ls_ReturnString(operator + chaine + com, indexprime) : oui2 = 1 : EndIf
Next
If autorise = 1 And oui1 = 1 And oui2 = 1 And pos < poscom
Editor_ColorText(gadget, index, pos, index, pos + len, colorchiffre)
EndIf
pos = pos + len
Else : pos = -1
EndIf
Wend
;}
;{ coloration des operateurs
pos = 0
While pos < Len(ligne) + 1 And pos > -1
pos = ls_FindDiffString(ligne, operator, pos)
autorise = 1
If chaine_emplacement(0, 0)
For indexprime = 1 To chaine_emplacement(0, 0)
If pos > chaine_emplacement(indexprime, 1) And pos < chaine_emplacement(indexprime, 2)
autorise = 0
EndIf
Next
EndIf
If pos
If autorise = 1 And pos < poscom
Editor_ColorText(gadget, index, pos, index, pos + 1, coloroperator)
EndIf
pos = pos + 1
Else : pos = - 1
EndIf
Wend
;}
EndProcedure
c possible d'eviter ca ?