coloration syntaxique
Publié : mer. 12/avr./2006 18:45
Bon je sais qu'il en existe plein mais je n'arrive pas a les faire fonctionner
donc j'ai fait ma lib de coloration syntaxique
ca marche mais quand on utilise la coloration pour une seule ligne et que le texte de la ligne est plus grand que l éditor gadget on voit le deplacement du texte pour colorer toute la ligne
c possible d'eviter ca ?
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 ?