c# - AvalonEdit: Cascading HighlightingColorizers
.net (1)
Quiero conectar en cascada el motor de aligeramiento de sintaxis de AvalonEdit. Tengo 2 HighlightingDefinitions
. El primero es la sintaxis principal. El segundo es un complejo lenguaje de marcado de preprocesador y multiplexación. Por esta razón, es demasiado complicado embeber la segunda gramática en la primera. La forma más fácil es presentar la primera sintaxis y luego cambiar las partes de línea afectadas (según la segunda sintaxis).
Así que instalé un nuevo HighlightingColorizer
con el segundo idioma y lo agregué a LineTransformers
. Pero el segundo idioma colorea el documento completo y no solo las partes de línea con las directivas de preprocesador: el código que no es preprocesador es negro.
A medida que depuré el ColorizeLine
-method del transformador de segunda línea, las líneas del código no resaltado (= sin código preprocesador) no se han coloreado, como se esperaba. Pero el color de las líneas es negro.
Entonces, ¿ HighlightingColorizer
restablece todo el resaltado anterior de todo el documento antes de que empiece a colorear?
¿O qué otra cosa podría ser el problema? ¿Cómo puedo conectar en cascada correctamente 2 HighlightingColorizers
?
El problema es que HighlightingColorizer
no almacena directamente una referencia al DocumentHighlighter
, sino que la almacena a través de TextView.Services
. Esto se hace para permitir adjuntar el mismo colorizador a varios editores, de modo que cada editor tenga su propio DocumentHighlighter
.
Cuando IHighlighter
un segundo colorizador, sobrescribe el IHighlighter
almacenado en el contenedor de servicio; y ambos colorantes terminan usando el nuevo resaltador.
Además, tenga en cuenta que la lógica ''copiar al portapapeles'' en HtmlClipboard
accede directamente al servicio IHighlighter
, no utiliza ningún colorizador. (Copiar texto en Word conserva únicamente el resaltado de sintaxis, no otras transformaciones, como los marcadores de plegado)
Hay esencialmente dos enfoques para resolver este problema:
No almacene el resaltador adicional como un servicio. Puede hacer esto creando su propia copia de la clase
HighlightingColorizer
y usar un campo en esa clase en lugar de acceder atextView.Services
. Este es un cambio sencillo, pero no se usarán resaltadores adicionales al copiar texto en el portapapeles.Cree una implementación de
IHighlighter
que combine losHighlightedLine
de variosDocumentHighlighter
s. Este es el enfoque que estamos utilizando para el resaltado semántico de C # en SharpDevelop 5, que funciona como un resaltador adicional que amplía el resaltado de C # basado en .xshd. Sin embargo, este enfoque es complejo (fusionarHighlightedLine
s no es trivial dado el orden y las restricciones de anidamiento en las secciones), y requiere un cambio de API a la interfazIHighlighter
para tratar con la notificación OnHighlightStateChanged (AvalonEdit 4.x usa un derivado clase anidada enHighlightingColorizer
para obtener acceso a esta devolución de llamada; AvalonEdit 5.0 usará un evento).