Como faço para criar um ficheiro de sintaxe AvalonEdit (.e incorporá-lo na minha Assembleia?

Estou a tentar definir algumas regras de realce personalizadas para o AvalonEdit. Não parece haver qualquer documentação para isso -- existe alguma documentação no formato de Arquivo , mas nada sobre como realmente carregar e usar a definição uma vez que você a criou.

a página wiki" realce de sintaxe " (para o antigo editor de texto WinForms) documenta como carregar as definições de realce a partir de A.arquivo xshd no disco, mas eu prefiro incorporá-lo como um recurso, da mesma forma AvalonEdit faz com suas definições embutidas.

Vi o código no código ICSharpCode.AvalonEdit project que carrega os seus marcadores embutidos, mas o código "carga do recurso" é feito no Defaulthlightingmanager.LoadHighlighting, que é privado -- e que, para tornar as coisas mais estranhas, aparentemente só é chamado em builds de lançamento.

Posso continuar a andar às voltas, copiar / colar alguns dos códigos dos métodos privados, e tentar arranjar algo que possa ou não ser um código. pode não funcionar, mas parece que vale a pena perguntar: Qual é a maneira padrão de fazer isto? existe uma forma recomendada para o código de terceiros carregar uma definição de realce a partir de um recurso?


a resposta do Daniel deu-me um bom começo, mas precisa de incluir o nome do espaço de nomes no texto que passa para obter o Manifestresourcestream -- se não o fizer, obterá uma isenção de referência completa (porque devolve um fluxo nulo).

Acabei por adicionar uma classe estática chamada ResourceLoader para a mesma pasta do projeto .ficheiro xshd, com 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);
}
Então posso ligar.

para qualquer um que nos Siga em casa, o .o ficheiro xshd precisa de ter a sua acção de Compilação definida no recurso incorporado.

Author: Community, 2011-02-20

4 answers

Pode usar os métodos estáticos da classe ICSharpCode.AvalonEdit.Highlighting.Xshd.HighlightingLoader para carregar .ficheiros xshd. Por exemplo:

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

O código de carregamento no AvalonEdit em si é estranho porque ele carrega ansiosamente os xshds em compilações de depuração (de modo que os erros neles são notados imediatamente), mas atrasa-os em compilações de lançamento.

 23
Author: Daniel, 2014-04-19 13:51:44
Para que conste, se estiver a usar o f#, este é um excerto de código que funciona para registar o ficheiro 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
 3
Author: Darren, 2018-09-22 10:16:45
Pessoalmente, prefiro a forma do Darren registar a tua definição de realce usando {[[2]}, depois podes usá-la no teu XAML como outras definições incorporadas.

C#

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"/>
 2
Author: Masood Lapeh, 2018-09-22 05:55:11
Quando usei o GetManifestResourceStream para um ficheiro xshd, fiquei nulo. Eu usei StreamReader em vez disso:
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);
            }
        }
 2
Author: Smadar, 2018-09-22 17:31:34