SyntaxHilighting.dll

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

SyntaxHilighting.dll

Message 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
Dernière modification par falsam le sam. 23/août/2014 23:26, modifié 3 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: SyntaxHilighting.dll

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: SyntaxHilighting.dll

Message par graph100 »

Merci Falsam !
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: SyntaxHilighting.dll

Message par Micoute »

Superbe travail falsam et merci de partager !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: SyntaxHilighting.dll

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: SyntaxHilighting.dll

Message 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é !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: SyntaxHilighting.dll

Message par majikeyric »

:lol:
Dernière modification par majikeyric le dim. 24/août/2014 23:46, modifié 2 fois.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: SyntaxHilighting.dll

Message 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 :)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: SyntaxHilighting.dll

Message par majikeyric »

assurément :lol:
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: SyntaxHilighting.dll

Message 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é.
Dernière modification par falsam le dim. 24/août/2014 10:18, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: SyntaxHilighting.dll

Message 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)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
MLD
Messages : 1103
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: SyntaxHilighting.dll

Message 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:
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: SyntaxHilighting.dll

Message 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.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: SyntaxHilighting.dll

Message 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 !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: SyntaxHilighting.dll

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre