【问题标题】:AvalonEdit (C#) Custom attributes in XSHD filesAvalonEdit (C#) XSHD 文件中的自定义属性
【发布时间】:2012-06-30 10:17:19
【问题描述】:

我正在努力突出一种小型脚本语言(不是任何内置语言的派生语言),并且我为不同的语法关键字等设置了自定义 XML 文件。

我真的很想使用 AvalonEdit 中存在的 XSHD 系统来加载自定义关键字,但我需要在其中包含自定义属性。

所以基本上,在大量搜索源代码之后,我无法真正确定读取并指定关键字和规则集的文件。

这里有人知道我可以在哪里编辑所需的类来读取一些自定义属性并存储它们吗?

我在 AvalonEdit 中的所有 XSHD 和高亮显示内容都已关闭并正常工作,所以问题不是使用它,也就是说,更多的是在 XSHD 文件的关键字集合中使用自定义属性的问题。

例如:

<Keywords>
   <Word defaultValue="hello" requiresShader="shadertype1, shadertype2" someCustomAttr="value">wordname</word>
</Keyword>

所以,我需要为 XSHD 文件的解析器设置一些自定义属性,以加载这些自定义属性并将它们存储在我创建的自定义类中,该类处理一些对我尝试的内容至关重要的逻辑组件做。

我已经有一个可以工作的解析器来解析我所有的关键字及其属性的 XML 文件(但我将它写到 ScintillaNET,但后来发现 AvalonEdit,它与 WPF 等配合得更好)。

我将使用此信息编辑原始帖子,对于可能的错误信息,我深表歉意。

谢谢

【问题讨论】:

    标签: c# xaml avalonedit


    【解决方案1】:

    要加载 XSHD 文件,您需要导入以下库:

    using ICSharpCode.AvalonEdit;
    using ICSharpCode.AvalonEdit.Highlighting;
    using ICSharpCode.AvalonEdit.Highlighting.Xshd;    
    

    然后,无论您在何处创建文本编辑器(如果您在 XAML 中创建它,则省略第一行并仅引用 TextEditor),使用以下代码加载 def.xshd。

    // TextEditor is an AvalonEdit.TextEditor
    TextEditor edit = new TextEditor();
    XmlReader reader = XmlReader.Create("def.xshd");
    edit.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);
    

    一个很好的示例 xshd 文件,我用于工作中的一种语言是这样的:

    <SyntaxDefinition name="XAPL"
        xmlns="http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008">
    <Color name="Comment" foreground="Green" />
    <Color name="String" foreground="Pink" />
    <Color name="Xml" foreground="Orange" />
    <!-- This is the main ruleset. -->
    <RuleSet>
        <Span color="Comment" begin="//" />
        <Span color="Comment" multiline="true" 
           begin="/\*" end="\*/" />
    
    
        <Span color="String">
            <Begin>"</Begin>
            <End>"</End>
            <RuleSet>
                <!-- nested span for escape sequences -->
                <Span begin="\\" end="." />
            </RuleSet>
        </Span>
    
      <Span color="Xml" multiline="false">
        <Begin>spaz</Begin>
        <End>spaz</End>
      </Span>
    
    
        <Keywords fontWeight="bold" foreground="Blue">
            <Word>dealwith</Word>
            <Word>import</Word>
            <Word>end</Word>
            <Word>var</Word>
            <Word>default</Word>
            <Word>template</Word>
            <Word>sub</Word>
            <Word>category</Word>
            <Word>if</Word>
            <Word>otherwise</Word>
            <Word>and</Word>
            <Word>xor</Word>
            <Word>string</Word>
            <Word>int</Word>
            <Word>convert</Word>
            <Word>to</Word>
            <Word>escape</Word>
            <Word>native</Word>
            <Word>loop</Word>
            <Word>is</Word>
            <Word>to</Word>
            <Word>from</Word>
            <Word>by</Word>
        </Keywords>
    
        <!-- Digits -->
        <Rule foreground="DarkGray">
            \b0[xX][0-9a-fA-F]+  # hex number
        |    \b
            (    \d+(\.[0-9]+)?   #number with optional floating point
            |    \.[0-9]+         #or just starting with floating point
            )
            ([eE][+-]?[0-9]+)? # optional exponent
        </Rule>
    </RuleSet>
    </SyntaxDefinition>
    

    【讨论】:

    • 您好,谢谢!检查原始帖子以了解对问题的修改,因为我可能不清楚。
    • 啊,我明白你在说什么......这超出了我以前的工作范围。就我的想象而言,我会编写自己的类,该类派生自 HighlightingLoder 并覆盖 Load 函数。但这并不能真正让您摆脱困境。
    猜你喜欢
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多