Page 1 sur 2

SyntaxHilighting.dll

Publié : ven. 22/août/2014 23:04
par falsam
Le sujet a déjà été traité sur le forum Français et Anglais mais j'avais envie de le remettre au gout du jour.

■ 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.

:arrow: Vous trouverez le code complet à la fin de ce post.

:idea: 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.

:arrow: Première partie du code.
;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
Analysons maintenant la procédure callback CallbackHighlight(*Position, length, color)

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..

:arrow: Cette syntaxe sera défini de cette manière.
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
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.

:arrow: Cette deuxième et dernière partie du code vous montre comment coloriser du code Pure Basic avec du BBCode.
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
:arrow: Il est temps maintenant de vous fournir le code complet et commenté.
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


■ 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 ....

A lire ensuite SyntaxHilighting.dll & Scintilla

Re: SyntaxHilighting.dll

Publié : ven. 22/août/2014 23:16
par falsam
Pour transformer le code précédent en outil à intégrer dans l'éditeur officiel de Pure Basic, ajouter ce qui suit juste avant la ligne :

If OpenLibrary(#Dll, #PB_Compiler_Home+"SDK/Syntax Highlighting/SyntaxHilighting.dll")
;Si l'utilitaire est lancé en temps qu'outil : Mémorisation de la sélection
HandleIDESci=Val(GetEnvironmentVariable("PB_TOOL_Scintilla"))
  
If HandleIDESci
  SendMessage_(HandleIDESci, #WM_COPY,0,0)   
EndIf

Re: SyntaxHilighting.dll

Publié : sam. 23/août/2014 12:18
par graph100
Merci Falsam !

Re: SyntaxHilighting.dll

Publié : sam. 23/août/2014 13:17
par Micoute
Superbe travail falsam et merci de partager !

Re: SyntaxHilighting.dll

Publié : sam. 23/août/2014 16:04
par falsam
J'ai un souci avec ce code. Si je sélectionne du code sans laisser d'espace aprés le dernier mot, le résultat final est tronqué.

Cette portion de code

Code : Tout sélectionner

;Si l'utilitaire est lancé en temps qu'outil : Mémorisation de la sélection
HandleIDESci=Val(GetEnvironmentVariable("PB_TOOL_Scintilla"))
  
If HandleIDESci
  SendMessage_(HandleIDESci, #WM_COPY,0,0)   
EndIf
donnera après colorisation
;Si l'utilitaire est lancé en temps qu'outil : Mémorisation de la sélection
HandleIDESci=Val(GetEnvironmentVariable("PB_TOOL_Scintilla"))
  
If HandleIDESci
  SendMessage_(HandleIDESci, #WM_COPY,0,0)   
En
Je n'arrive pas à comprendre pourquoi. D'avance merci de votre aide.

Re: SyntaxHilighting.dll

Publié : sam. 23/août/2014 18:39
par Micoute
Ah, si Dobro pouvait revenir, il connaît la syntaxe surbrillante, puisqu'il l'a inclue dans EPB.

Sinon, désolé de n'avoir pas d'autre solution à proposer et effectivement, c'est plus que tronqué !

Re: SyntaxHilighting.dll

Publié : sam. 23/août/2014 18:52
par majikeyric
:lol:

Re: SyntaxHilighting.dll

Publié : sam. 23/août/2014 18:58
par falsam
Micoute a écrit :désolé de n'avoir pas d'autre solution à proposer et effectivement, c'est plus que tronqué !
Faut pas exagérer! Il ne manque que les 3 derniers caractéres.

PS: On voit que Micoute est un fan de la première heure. Et quand on est fan on manque de discernement :)

Re: SyntaxHilighting.dll

Publié : sam. 23/août/2014 19:14
par majikeyric
assurément :lol:

Re: SyntaxHilighting.dll

Publié : sam. 23/août/2014 19:25
par falsam
Erreur localisée

-Je calcule la longueur du code mémorisé dans le presse papier.
-J'initialise une zone mémoire avec cette longueur.
-J'écris le contenu du presse papier dans dans cette zone mémoire mais en UTF8.
- :idea: j'ai oublié de recalculer la longueur de cette zone mémoire qui est devenu plus grande à cause du codage UTF8

Le code final est corrigé.

Re: SyntaxHilighting.dll

Publié : sam. 23/août/2014 23:28
par Kwai chang caine
Merci FALSAM de ce POST 8)
Et surtout merci encore une fois pour toutes les aides, les nombreux TUTOS, et tout ce que tu offres quotidiennement à ce forum, 8) 8) et tout ceci dans la bonne humeur, la générosité, l'humilité et la simplicité. 8) 8) 8) (J'trouve pas un smiley qui te correspond, alors j'en met plusieurs :mrgreen:)
majikeyric a écrit :
Micoute a écrit :Ah, si Dobro pouvait revenir, il connaît la syntaxe surbrillante, puisqu'il l'a inclue dans EPB.
Pourrait revenir ?!! C'est justement à cause de son attitude pitoyable qui a consisté à effacer ses propres posts sur le forum avant de partir que falsam a crée ce topic.
Il peut rester ou il est !
Et bah dis donc !!! ça c'est du franc parlé :wink: 8)

Re: SyntaxHilighting.dll

Publié : dim. 24/août/2014 10:06
par MLD
@ KCC, falsam

+1 :lol: :lol:

@ Micoute
Oui un peu plus de dicernement s'il te plait. Tu connais mal l'animal. :roll: :wink:

Re: SyntaxHilighting.dll

Publié : dim. 24/août/2014 10:25
par graph100
majikeyric a écrit :Pourrait revenir ?!! C'est justement à cause de son attitude pitoyable qui a consisté à effacer ses propres posts sur le forum avant de partir que falsam a crée ce topic.
Il peut rester ou il est !
Effectivement. C'est une attitude malsaine.

Re: SyntaxHilighting.dll

Publié : dim. 24/août/2014 14:05
par Micoute
falsam a écrit :
Micoute a écrit :désolé de n'avoir pas d'autre solution à proposer et effectivement, c'est plus que tronqué !
Faut pas exagérer! Il ne manque que les 3 derniers caractéres.

PS: On voit que Micoute est un fan de la première heure. Et quand on est fan on manque de discernement :)
Je voulais juste te taquiner un peu, sache que je suis pas un méchant !

Re: SyntaxHilighting.dll

Publié : dim. 24/août/2014 14:13
par Micoute
falsam a écrit :
Micoute a écrit :désolé de n'avoir pas d'autre solution à proposer et effectivement, c'est plus que tronqué !
Faut pas exagérer! Il ne manque que les 3 derniers caractéres.

PS: On voit que Micoute est un fan de la première heure. Et quand on est fan on manque de discernement :)
Non, ce n'est pas ce que tu crois, si j'ai une grande admiration pour Dobro, mais ça aurait pu être toi ou un autre, c'est que quand je suis arrivé sur ce forum, j'étais complètement ignare en programmation PureBasic et c'est lui qui m'a tout appris, donc je lui doit, selon moi, un minimum de respect, mais ça s'arrête là.

Je le répète encore, j'aime tous les programmeurs de PureBasic et en particulier, ceux qui m'aident quand je suis embrouillé et sans solution.