我在运行我自己的定制语言的应用程序中使用 AvalonEdit。我想在 Avalon Edit 中加入适当的语法高亮。通常这是通过在 xml 文件中手动定义突出显示规则来完成的。
但是,我不希望每当我扩展语言时突出显示规则总是与语言语法不同步。所以我希望使用我的 coco/R 解析器中已经包含的语法信息来自动生成这些规则。那么有没有办法以编程方式向 Avalon Edit 添加语法高亮规则?
谢谢
我在运行我自己的定制语言的应用程序中使用 AvalonEdit。我想在 Avalon Edit 中加入适当的语法高亮。通常这是通过在 xml 文件中手动定义突出显示规则来完成的。
但是,我不希望每当我扩展语言时突出显示规则总是与语言语法不同步。所以我希望使用我的 coco/R 解析器中已经包含的语法信息来自动生成这些规则。那么有没有办法以编程方式向 Avalon Edit 添加语法高亮规则?
谢谢
下面的代码至少对我有用。
Assembly assembly = Assembly.GetExecutingAssembly();
using (Stream s = assembly.GetManifestResourceStream("Your.xshd"))
{
using (XmlTextReader reader = new XmlTextReader(s))
{
//Load default Syntax Highlighting
InternalEditor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);
// Dynamic syntax highlighting for your own purpose
var rules = InternalEditor.SyntaxHighlighting.MainRuleSet.Rules;
_HighlightingRule = new HighlightingRule();
_HighlightingRule.Color = new HighlightingColor()
{
Foreground = new CustomizedBrush(SomeColor)
};
String[] wordList = PseudoGetKeywords(); // Your own logic
String regex = String.Format(@"\b({0})\w*\b", String.Join("|", wordList));
_HighlightingRule.Regex = new Regex(regex);
rules.Add(_HighlightingRule);
}
}
internal sealed class CustomizedBrush : HighlightingBrush
{
private readonly SolidColorBrush brush;
public CustomizedBrush(Color color)
{
brush = CreateFrozenBrush(color);
}
public CustomizedBrush(System.Drawing.Color c)
{
var c2 = System.Windows.Media.Color.FromArgb(c.A, c.R, c.G, c.B);
brush = CreateFrozenBrush(c2);
}
public override Brush GetBrush(ITextRunConstructionContext context)
{
return brush;
}
public override string ToString()
{
return brush.ToString();
}
private static SolidColorBrush CreateFrozenBrush(Color color)
{
SolidColorBrush brush = new SolidColorBrush(color);
brush.Freeze();
return brush;
}
}
ICSharpCode.AvalonEdit.Highlighting.Xshd
您可以使用(XshdSyntaxDefinition
等)中的对象模型在内存中生成 .xshd 文件。
要将其转换为IHighlightingDefinition
,请使用该HighlightingLoader.Load()
方法。您还可以通过应用SaveXshdVisitor
.
或者,您可以IHighlightingDefinition
自己实现并直接创建HighlightingRuleSet
实例。