■ Qu'est ce que SyntaxHilighting.dll ?
SyntaxHilighting.dll est une DLL utilisée par l'IDE (l'éditeur de code) officiel de PureBasic pour analyser votre code Pure Basic et le coloriser.
Cette DLL peut être utiliser pour coder vos propres applications. Exemple : Une impression de code.
■ Ou se trouve la dll ?
SyntaxHilighting.dll se trouve dans le dossier SDK\Syntax Highlighting du dossier d'installation de Pure Basic.
■ Quels sont les fonctions disponibles
Une seule fonction : SyntaxHighlight(*Buffer, Length, @Callback(), EnableAsm)
*Buffer et Length Spécifie le texte à analyser
Callback() Cette procédure est appelée autant de fois qu'il y a de mots dans le code analysé.
EnableAsm Si cette valeur est à #True l'analyseur tiendra compte de l'assembleur.
■ Comment ça fonctionne ?
Un exemple est fourni avec cette dll dans le dossier d'installation de Pure Basic.
Avec cette base nous allons faire un outil qui permet de poster du code en couleur (BBCodes) sur le forum.
Fred va hurler car forcement ce code bourré de BBCodes sera plus lourd dans sa base de données.
Vous trouverez le code complet à la fin de ce post.
Avant de poster un code sur le forum je suppose que vous avez fait un copier/coller de ce code ou cette portion de code.
Le plan de travail
- Ouvrir la dll
- Récupérer le code stocké dans le presse-papier.
- Allouer un espace mémoire nécessaire au traitement de la colorisation.
- Lancer la colorisation en appelant la procédure callback associée.
- Copier le résultat de la colorisation dans le presse papier.
- Ne pas oublier de fermer la Dll.
Première partie du code.
Analysons maintenant la procédure callback CallbackHighlight(*Position, length, color);La dll SyntaxHilighting.dll se trouve dans le dossier d'installation de Pure Basic
If OpenLibrary(#Dll, #PB_Compiler_Home+"SDK/Syntax Highlighting/SyntaxHilighting.dll")
;Récupérer le code stocké dans le presse-papier.
SelectedText.s = GetClipboardText()
Length = Len(SelectedText)
*Buffer = AllocateMemory(Length + 1)
PokeS(*Buffer, SelectedText, Length, #PB_UTF8)
If *Buffer
ClearClipboard()
;Début d'initialisation de la balise quote
QuoteHighlight = Chr(91) + "quote" + Chr(93)
;Appel de la fonction SyntaxHighlight
;Cette fonction est inclus dans SyntaxHilighting.dll
;Elle fait appel autant de fois à la procédure CallbackHighlight() qu'il y a de mots dans le code analysé.
CallFunction(#Dll, "SyntaxHighlight", *Buffer, Length, @CallbackHighlight(), #True)
;Fin d'initialisation de la balise quote
QuoteHighlight + Chr(91) + "/quote" + Chr(93)
;Remplace tout les espaces par un espace insécable et copie dans le presse papier
SetClipboardText(ReplaceString(QuoteHighlight, " ", Chr(160)))
MessageRequester("PB - Forum Quote Code", "Code formaté BBCode")
EndIf
CloseLibrary(#Dl
Cette procédure est appelée autant de fois que l'analyseur trouve un mot.
Le paramètre color ne renvoie pas une couleur mais un code de 0 à 13 définissant le type de syntax trouvé.
Par exemple 0 : Text, 1: Mots clefs, 2: Commentaire, etc..
Cette syntaxe sera défini de cette manière.
Pour chaque syntaxe on associera une couleur à ce mot (ou caractère). Cette couleur pourra être par exemple du code html ou bien du BBCode.Enumeration Syntax
#SYNTAX_Text
#SYNTAX_Keyword
#SYNTAX_Comment
#SYNTAX_Constant
#SYNTAX_String
#SYNTAX_Function
#SYNTAX_Asm
#SYNTAX_Operator
#SYNTAX_Structure
#SYNTAX_Number
#SYNTAX_Pointer
#SYNTAX_Separator
#SYNTAX_Label
#SYNTAX_Module
EndEnumeration
Cette deuxième et dernière partie du code vous montre comment coloriser du code Pure Basic avec du BBCode.
Il est temps maintenant de vous fournir le code complet et commenté.Global QuoteHighlight.s
Procedure CallbackHighlight(*Position, length, color)
Protected Buffer.s = PeekS(*Position, length, #PB_UTF8)
If Len(Buffer)>0
Debug Str(color) + " Mot "+ Buffer
Select color
Case #SYNTAX_Text
QuoteHighlight + Buffer
Case #SYNTAX_Keyword
QuoteHighlight + Chr(91) + "b" + Chr(93) + Chr(91) + "color=#000000" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93) + Chr(91) + "/b" + Chr(93)
Case #SYNTAX_Comment
QuoteHighlight + Chr(91) + "color=#008000" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93)
Case #SYNTAX_Constant
QuoteHighlight + Chr(91) + "color=#924B72" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93)
Case #SYNTAX_String
QuoteHighlight + Chr(91) + "color=#800080" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93)
Case #SYNTAX_Function
QuoteHighlight + Chr(91) + "color=#006666" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93)
Case #SYNTAX_Asm
QuoteHighlight + Chr(91) + "color=#800000" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93)
Case #SYNTAX_Structure
QuoteHighlight + Chr(91) + "b" + Chr(93) + Chr(91) + "color=#59017E" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93) + Chr(91) + "/b" + Chr(93)
Case #SYNTAX_Number
QuoteHighlight + Chr(91) + "i" + Chr(93) + Chr(91) + "color=#FF0000" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93) + Chr(91) + "/i" + Chr(93)
Case #SYNTAX_Pointer
QuoteHighlight + Chr(91) + "color=#003264" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93)
Case #SYNTAX_Label
QuoteHighlight + Chr(91) + "b" + Chr(93) + Chr(91) + "color=#5A5AAD" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93) + Chr(91) + "/b" + Chr(93)
Case #SYNTAX_Module
QuoteHighlight + Chr(91) + "b" + Chr(93) + Chr(91) + "color=#FF0000" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93) + Chr(91) + "/b" + Chr(93)
Default
QuoteHighlight + Buffer
EndSelect
EndIf
EndProcedure
■ Pour finir : Je pense qu'avec cette base on doit pouvoir coder un outil pour imprimer du code en couleur, un fichier pdf contenant ce code, une page html contenant ce code, etc ....Enumeration Syntax
#SYNTAX_Text
#SYNTAX_Keyword
#SYNTAX_Comment
#SYNTAX_Constant
#SYNTAX_String
#SYNTAX_Function
#SYNTAX_Asm
#SYNTAX_Operator
#SYNTAX_Structure
#SYNTAX_Number
#SYNTAX_Pointer
#SYNTAX_Separator
#SYNTAX_Label
#SYNTAX_Module
EndEnumeration
Enumeration File
#Dll
EndEnumeration
Global QuoteHighlight.s
Procedure CallbackHighlight(*Position, length, color)
Protected Buffer.s = PeekS(*Position, length, #PB_UTF8)
If Len(Buffer)>0
Select color
Case #SYNTAX_Text
QuoteHighlight + Buffer
Case #SYNTAX_Keyword
QuoteHighlight + Chr(91) + "b" + Chr(93) + Chr(91) + "color=#000000" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93) + Chr(91) + "/b" + Chr(93)
Case #SYNTAX_Comment
QuoteHighlight + Chr(91) + "color=#008000" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93)
Case #SYNTAX_Constant
QuoteHighlight + Chr(91) + "color=#924B72" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93)
Case #SYNTAX_String
QuoteHighlight + Chr(91) + "color=#800080" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93)
Case #SYNTAX_Function
QuoteHighlight + Chr(91) + "color=#006666" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93)
Case #SYNTAX_Asm
QuoteHighlight + Chr(91) + "color=#800000" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93)
Case #SYNTAX_Structure
QuoteHighlight + Chr(91) + "b" + Chr(93) + Chr(91) + "color=#59017E" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93) + Chr(91) + "/b" + Chr(93)
Case #SYNTAX_Number
QuoteHighlight + Chr(91) + "i" + Chr(93) + Chr(91) + "color=#FF0000" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93) + Chr(91) + "/i" + Chr(93)
Case #SYNTAX_Pointer
QuoteHighlight + Chr(91) + "color=#003264" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93)
Case #SYNTAX_Label
QuoteHighlight + Chr(91) + "b" + Chr(93) + Chr(91) + "color=#5A5AAD" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93) + Chr(91) + "/b" + Chr(93)
Case #SYNTAX_Module
QuoteHighlight + Chr(91) + "b" + Chr(93) + Chr(91) + "color=#FF0000" + Chr(93)
QuoteHighlight + Buffer
QuoteHighlight + Chr(91) + "/color" + Chr(93) + Chr(91) + "/b" + Chr(93)
Default
QuoteHighlight + Buffer
EndSelect
EndIf
EndProcedure
;La dll SyntaxHilighting.dll se trouve dans le dossier d'installation de Pure Basic
If OpenLibrary(#Dll, #PB_Compiler_Home+"SDK/Syntax Highlighting/SyntaxHilighting.dll")
;Récupérer le code stocké dans le presse-papier.
SelectedText.s = GetClipboardText()
Length = Len(SelectedText)
*Buffer = AllocateMemory(Length + 1)
PokeS(*Buffer, SelectedText, Length, #PB_UTF8)
Length = Len(PeekS(*Buffer))
If *Buffer
ClearClipboard()
;Début d'initialisation de la balise quote
QuoteHighlight = Chr(91) + "quote" + Chr(93)
;Appel de la fonction SyntaxHighlight
;Cette fonction est inclus dans SyntaxHilighting.dll
;Elle fait appel autant de fois à la procédure CallbackHighlight() qu'il y a de mots dans le code analysé.
CallFunction(#Dll, "SyntaxHighlight", *Buffer, Length, @CallbackHighlight(), #True)
;Fin d'initialisation de la balise quote
QuoteHighlight + Chr(91) + "/quote" + Chr(93)
;Remplace tout les espaces par un espace insécable et copie dans le presse papier
SetClipboardText(ReplaceString(QuoteHighlight, " ", Chr(160)))
MessageRequester("PB - Forum Quote Code", "Code formaté BBCode")
EndIf
CloseLibrary(#Dll)
EndIf
A lire ensuite SyntaxHilighting.dll & Scintilla