IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[VB.Net] Comment implémenter une coloration syntaxique ?


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut [VB.Net] Comment implémenter une coloration syntaxique ?
    bonjour, je suis en train de developper une application qui genere du pdf a partir de modele en XML. pour faciliter la creation de ces modeles ( qui sont facilement tres long : jusqu'a 850 lignes pour une seule page en PDF ... ), je suis en train de creer un petit assistant en VB.NET. pour y voir un peu plus clair, je voudrais realiser une coloration syntaxique basique, genre avec trois couleurs pour : mot cle, attribut, valeur de l'attribut.

    je suis parti sur une fonction utilisant des expressions reguliere, dans une rich textbox, ca donne ca : (ou area est ma richtextbox )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    Private Sub coloration()
            Dim save As Integer = area.SelectionStart
            Dim r, r2 As Regex
            Dim m, m2 As Match
            r = New Regex("< *([a-zA-z]*).*>")
            m = r.Match(area.Text)
     
            While m.Success
                area.Select(m.Groups(1).Index, m.Groups(1).Length)
                area.SelectionColor = Color.Aquamarine
                r2 = New Regex("([a-zA-Z]*) *=""([a-zA-Z]*)""")
                m2 = r2.Match(m.Value)
                While m2.Success
                    area.Select(m.Index + m2.Groups(1).Index, m2.Groups(1).Length)
                    area.SelectionColor = Color.Red
                    area.Select(m.Index + m2.Groups(2).Index, m2.Groups(2).Length)
                    area.SelectionColor = Color.Blue
                    m2 = m2.NextMatch
     
                End While
     
                m = m.NextMatch
            End While
            area.SelectionStart = save
        End Sub
    rien de bien complique, et ca fonctionne. les expressions regex on l'air correcte, dans la mesure ou il ne parcourt le fichier qu'une seule fois. le seul hic, c'est que c'est tres lent. Sur mon exemple de 850 lignes, il mets pratiquement 10 secondes !! alors qu'avec notepad++ c'est instantané... je n'en demande pas temps, mais j'aimerais savoir si vous connaissiez un algo vraiment rapide pour faire ca. voila, merci beaucoup !!

  2. #2
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    vous êtes pas obligé de vous coltiner à lire tout le code !! c'est pour les curieux. ma question c'est vraiment simplement de savoir si vous connaissez un algo de coloration syntaxique rapide !

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    c'est possible de colorer uniquement les lignes que l'on modifie ? ce serai nettement plus rapide si c'est uniquement le texte en cours d'édition que l'on colore

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    j'y ai pense, le probleme, c'est que quand j'ouvre un document, il devrait le colorer tres vite. en tout cas, c'est ce que font tous les editeurs avec coloration syntaxique

  5. #5
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Bonjour
    La remarque de smyley est très pertinente. Je crois que tu devrais la considerer de très près. Je m'explique, la façon dont tu poses ton souci ne ma paraît pas evident, car normalement tu as trois cas de figure à gérer :
    • 1. lecture du fichier pour editer le document dans une richtextbox
      2. manipulation de la coloriation syntaxique dans le richtextbox pendant une utilisation
      3. sauvegarde du document dans un fichier avec les balises syntaxiques

    Lequel de ses trois points concerne ton post :
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    ben les trois, c'est ca le probleme. la coloration syntaxique intervient dans les 2 premiers points.

  7. #7
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par jobherzt
    ben les trois, c'est ca le probleme. la coloration syntaxique intervient dans les 2 premiers points.
    Ben pas tout à fait pareirl entre le 1 et le 2
    ce sont 2 traitements à opérer differemment
    seul le 1 nécesite une interprétation des balises pour le rendu à l'affichage
    mais pour le 2 , tu peux très bien automatiser la tache en evitant de faire saisir des balises par l'utilisateur, il doit pouvoir selctionner une chaine et appuyer sur un bouton (gras, souligné, couleur etc..) qui utilisera les constantes FontStyle et Color comme un wordpad ...
    Donc de mon point de vue je pensais que l'interprétation de balise ne surviendrait qu'au chargement du fichier
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  8. #8
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    desole, je crois que mon explication n'as pas du etre tres claire : je ne veux pa utiliser de balises pour mettre en forme du texte, mais faire une sorte d'editeur xml specifique a mon programme qui mette d'une certaine couleur les mots entre balise pour qu'on les distingue. c'est bien ce qu'on appelle la coloration syntaxique, non ? en gros, un truc qui fait que quand dans le texte il y aura :

    <table border="1.0"> par exempl, il mettra table en rouge, border en bleu et 1.0 en vert par exemple tojours.

    jette un coup d'oeil a mon code : en gros, j'utilise des expressions rationelles pour reperer les blocs de la forme <......>, et je les colorie. mais c'est un peu ment, alors que je partais du principe que les expressiosn rationelles serait forcement plus optimisé que tout ce que je pourrais faire moi même....

  9. #9
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    ok
    effectivement j'étais à côté de la plaque excuses
    donc strategiquement cela est donc totalement independant du chargement et de la sauvegarde
    ce n'est qu'une gestion de l'affichage:
    1. chargement du MonRichTextbox.Text
    2. en cours de saisie utilisateur
    Le n°2 demandera un traitement très particulier je pense en fonction des évènements clavier (accompagné peutêtre d'une saisie semi-automatique des blocs <...>)
    Reste donc le n°1 :
    1. Lire directement le format xml
    2. Boucler Node par Node (tu es ainsi directement sur une balise sans la rechercher)
    * ecrire la balise, recuperer le texte de la balise en le coloriant
    * ecrire le texte compris entre les balises <> et </>
    J'ai pas plus concret pour l'instant je suis en train de developper autre chose mais si une difficulté d'implementation survient disle
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  10. #10
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    merci, c'est une bonne idee, le seul hic ( decidemment, je suis ch... ), c'est que j'utilise un langage qui ressemble a du xml mais qui n'en est pas vraiment. ce que je manipule, c'est donc du texte pur, je ne peux pas naviguer par node.....

  11. #11
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par jobherzt
    merci, c'est une bonne idee, le seul hic ( decidemment, je suis ch... ), c'est que j'utilise un langage qui ressemble a du xml mais qui n'en est pas vraiment. ce que je manipule, c'est donc du texte pur, je ne peux pas naviguer par node.....
    Hmmm... es-tu sûr de ne pas pouvoir transformer ces fichiers en xml (juste en ajoutant des balises fermantes par exemple) ; pas vraiment besoin de schema
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 105
    Points : 134
    Points
    134
    Par défaut
    Les expressions régulières ne sont pas toujours la méthode idéale. Elles permettent surtout de faire des recherches complexes avec un langage bien défini qui permet de gommer l'aspect technique de l'analyse.

    Dans ton cas, elles me paraissent justifiée, mais tu sembles dire qu'elles sont trop lentes. As-tu essayé de créer un pattern qui analyserait tes balises d'une seule traite, au lieu de faire cela en deux fois avec des boucles imbriquées ?

    En faisant quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @"< *(?<name>[a-zA-z]+) +((?<param>[a-zA-Z]+) *=""(?<value>[a-zA-Z]+)"" *)*>"
    (de tête donc fautes probables ), qui te permet de récupérer directement pour chaque match les éléments dans la collection Groups.

    Peut-être est-ce plus rapide, j'attends ta réponse.[/code]

  13. #13
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Oui +1 smikar , de mon point de vue certainement la meilleure piste
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  14. #14
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    j'y ai pense, sans savoir si cela amelirerait vraiment la vitesse. et puis mon probleme est que je peux avoir un nombre d'options ( bidule="truc" ) indéfini, meme si tu as l'air d'avoir prevu ca dans ton exemple. mais comment les recuperes t'on ensuite ? je ne savsi pas qu'on pouvait mettre un des parenthese capturantes dans un bloc qui se repete potentiellement. peux tu m'en dire un peu plus ?

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 105
    Points : 134
    Points
    134
    Par défaut
    Le fait qu'il puisse y avoir plusieurs arguments n'est pas un problème, tu les retrouves tous en itérant dans la collection Groups. Je ne peux pas te jurer que cela sera plus rapide, je n'ai jamais été confronté à ce problème, mais d'après moi cela évite des boucles imbriquées inutiles et le parsing du document est faire en une fois au lieu d'utiliser plusieurs regex successifs... A tenter.

  16. #16
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    merci, je vais essayer !! peux tu juste me donner le bout de code pour recuperer les params qui apparaissent plusieurs fois ?

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 105
    Points : 134
    Points
    134
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Match m = ...;
     
    foreach(Capture c in m.Groups["name"])
    {
    }
     
    foreach(Capture c in m.Groups["param"])
    {
    }
     
    // etc
    Ok ?

  18. #18
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    OK, je ne savais pas qu'il y avait un objet capture !! meric beaucoup. je vais voir si ca ameliore la vitesse, mais en tout cas c'est plus propre !

  19. #19
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Expression réguliere
    Bonjour a tous!
    J'ai un probleme tout a fait similaire mais avant tout, concrenant les expressions régulières, faudrait voir si des outils genre LEX/YAC ou ANTLR (que j'utilise en ce moment) pourrait pas aider : en gros c'est des générateurs de parser avec création d'arbre... il suffit ensuite en fct du type des noeuds créés de faire tel ou tel action.
    Mon problème à moi c'est que je crée un langage perso pour décrire des environnements et je veux me faire un éditeur de texte qui color mes scripts comme j'ai envie (simplement rouge pour les mots clés, vert pour les variable et blanc pour le reste (je suis sur fond noir) ) et le tout en C# voila... je poursuis ma lecture de vos remarques à tous
    Pour ANTL c'est vraiment top mais l'accès demande quelques jour (pour s'habituer bien, faut pas hésiter à lire le code générer et c'est assez moche)
    josh

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/12/2006, 20h51
  2. [VB.Net] Comment se déplacer dans une Base de données ?
    Par balabonov dans le forum Windows Forms
    Réponses: 7
    Dernier message: 08/08/2006, 21h44
  3. Réponses: 2
    Dernier message: 02/05/2006, 09h50
  4. [VB.NET] Comment peut-on sérialiser une Collection ?
    Par Jabbal'H dans le forum VB.NET
    Réponses: 6
    Dernier message: 09/03/2006, 21h24
  5. Réponses: 3
    Dernier message: 16/02/2006, 18h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo