syntax-highlighting avalonedit

syntax highlighting - ¿Cómo creo un archivo de sintaxis AvalonEdit(.xshd) y lo inserto en mi ensamblaje?



syntax-highlighting (4)

Estoy tratando de definir algunas reglas de resaltado personalizadas para AvalonEdit. No parece haber ninguna documentación para esto, hay alguna documentación sobre el formato del archivo , pero nada sobre cómo cargar y usar la definición una vez que la haya creado.

La página wiki " Sintaxis destacando " (para el antiguo WinForms TextEditor) documenta cómo cargar definiciones de resaltado de un archivo .xshd en el disco, pero prefiero incrustarlo como un recurso, de la misma manera que AvalonEdit lo hace con sus definiciones integradas. .

He mirado el código en el proyecto ICSharpCode.AvalonEdit que carga sus resaltadores incorporados, pero el código real de "carga del recurso" se realiza en DefaultHighlightingManager.LoadHighlighting, que es privado, y que, para hacer las cosas más extrañas, Aparentemente solo se llama en versiones de lanzamiento.

Puedo seguir buscando a tientas, copiar / pegar parte del código de los métodos privados, y tratar de improvisar algo que podría o no funcionar, pero vale la pena preguntar: ¿cuál es la forma estándar de hacerlo? ¿Existe una forma recomendada para que el código de terceros cargue una definición de resaltado de un recurso?

La respuesta de Daniel me dio un buen comienzo, pero debe incluir el nombre del espacio de nombres en la cadena que pasa a GetManifestResourceStream; si no lo hace, obtendrá una NullReferenceException (porque devuelve una secuencia nula).

Terminé agregando una clase estática llamada ResourceLoader a la misma carpeta de proyecto que el archivo .xshd, con este método:

public static IHighlightingDefinition LoadHighlightingDefinition( string resourceName) { var type = typeof(ResourceLoader); var fullName = type.Namespace + "." + resourceName; using (var stream = type.Assembly.GetManifestResourceStream(fullName)) using (var reader = new XmlTextReader(stream)) return HighlightingLoader.Load(reader, HighlightingManager.Instance); }

Entonces solo puedo llamar a ResourceLoader.LoadHighlightingDefinition("Name.xshd") .

Para cualquier persona que lo siga en casa, el archivo .xshd debe tener su Acción de creación configurada en Recurso incrustado.


Cuando usé GetManifestResourceStream para un archivo xshd, obtuve el valor nulo. Utilicé StreamReader en su lugar:

using (StreamReader s = new StreamReader(@"C:/Users/Smadar.Tsdaka/Documents/ServoStudio/Scripts/ServoStudioSyntax.xshd")) { using (XmlTextReader reader = new XmlTextReader(s)) { scriptBody.SyntaxHighlighting = ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load( reader, HighlightingManager.Instance); } }


Para lo que vale, si estás usando F #, este es un fragmento de código que funciona para registrar el archivo xshd.

let registerHighlighting() = try // Load our custom highlighting definition match System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("GSLhighlighting.xshd") with | null -> failwithf "ERROR: could not find embedded resource" | s -> use reader = new XmlTextReader(s) let gslHighlighting = ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(reader, HighlightingManager.Instance) // and register it in the HighlightingManager HighlightingManager.Instance.RegisterHighlighting("GSL", [| ".gsl" |], gslHighlighting) editor.SyntaxHighlighting <- gslHighlighting with _ as exn -> printfn "ERROR: %s" exn.Message


Personalmente, prefiero la forma en que Darren registra su definición de resaltado con RegisterHighlighting , luego puede usarla en su XAML como en otras definiciones integradas.

DO#

public partial class App : Application { public App() { using (var stream = new System.IO.MemoryStream(WpfApp15.Properties.Resources.sql)) { using (var reader = new System.Xml.XmlTextReader(stream)) { ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance.RegisterHighlighting("SQL", new string[0], ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader.Load(reader, ICSharpCode.AvalonEdit.Highlighting.HighlightingManager.Instance)); } } } }

XAML

<avalon:TextEditor SyntaxHighlighting="SQL"/>


Puede usar los métodos estáticos en la clase ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader para cargar archivos .xshd. Por ejemplo:

using (Stream s = myAssembly.GetManifestResourceStream("MyHighlighting.xshd")) { using (XmlTextReader reader = new XmlTextReader(s)) { textEditor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance); } }

El código de carga en AvalonEdit en sí mismo es extraño porque carga con entusiasmo los xshds en las versiones de depuración (para que los errores en ellos se noten de inmediato), pero los carga con demora en las versiones de lanzamiento.