67 votes

AvalonEdit: Cascade HighlightingColorizers

Je veux cascade de la SyntaxHighlighting Moteur de AvalonEdit. J'ai 2 HighlightingDefinitions. Le premier est le principal de la syntaxe. Le second est un complexe multi-préprocesseur de balisage de langue. Pour cette raison, il est trop compliqué à jouer la deuxième grammaire que dans le premier. Le moyen le plus facile est de rendre la première syntaxe, et de changer la ligne concernée-pièces (basé sur la deuxième syntaxe) par la suite.

J'ai donc instancier un nouveau HighlightingColorizer avec la seconde langue et de l'ajouter à l' LineTransformers. Mais la deuxième langue colorie le document complet et pas seulement la lineparts avec le préprocesseur-directives: la non-préprocesseur-code est noir.

Comme je l'ai débogué l' ColorizeLine-méthode de la deuxième transformateur de ligne, les lignes de la non-code surligné (= pas de code preprocessor) n'ont pas été colorisée, comme prévu. Mais la couleur des lignes sont noires.

Le fait de l' HighlightingColorizer réinitialiser tous les précédents de mettre en évidence l'ensemble du document avant qu'il commence à colorer?

Ou quoi d'autre pourrait être le problème? Comment puis-je correctement cascade de 2 HighlightingColorizers?

6voto

Daniel Points 7960

Le problème est que l' HighlightingColorizer n'est pas directement stocker une référence à l' DocumentHighlighter, mais au lieu stocke via TextView.Services. Ceci est fait pour permettre d'attacher la même coloriseur à plusieurs éditeurs, de sorte que chaque éditeur a sa propre DocumentHighlighter.

Lorsque vous fixez une deuxième coloriseur, il remplace l' IHighlighter stockés dans le conteneur de service; et les deux colorizers fin vers le haut en utilisant le nouveau surligneur.

Notez également que le "copier dans le presse-papiers" la logique en HtmlClipboard permet d'accéder directement à l' IHighlighter de service, il n'utilise pas de colorizers. (la copie de texte Word conserve la coloration syntaxique uniquement, pas d'autres transformations comme la fois des marqueurs)

Il existe essentiellement deux approches pour résoudre ce problème:

  1. Ne pas stocker supplémentaires surligneur en tant que service. Vous pouvez le faire en créant votre propre copie de l' HighlightingColorizer classe, et l'utilisation d'un champ de la classe au lieu d'accéder textView.Services. C'est un changement facile, mais d'autres surligneurs ne sera pas utilisé lors de la copie de texte dans le presse-papiers.

  2. Créer un IHighlighter mise en œuvre qui combine l' HighlightedLines à partir de plusieurs DocumentHighlighters. C'est l'approche que nous utilisons pour le C# sémantique mettant en SharpDevelop 5, qui fonctionne comme un supplément de surligneur qui s'étend de l'existant .xshd à base de C# en évidence. Cependant, cette approche est complexe (fusion HighlightedLines est non négligeable compte tenu de la commande et de l'imbrication des contraintes sur les sections) et nécessite une API de changement à l' IHighlighter interface afin de traiter avec l' OnHighlightStateChanged de notification (AvalonEdit 4.x utilise une classe dérivée imbriquée dans HighlightingColorizer pour accéder à cette fonction de rappel; AvalonEdit 5.0 utiliser un événement).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X