我在運行我自己的自定義語言的應用程序中使用AvalonEdit。我想在Avalon Edit中加入恰當的語法高亮。通常這是通過手動定義xml文件中的高亮規則來完成的。以編程方式將語法高亮規則添加到AvalonEdit
但是,我不希望突出顯示規則在擴展語言時始終與語言語法不同步。所以我希望使用已經包含在我的coco/R解析器中的語法信息來自動生成這些規則。 那麼有沒有一種方法可以通過編程將語法高亮規則添加到Avalon Edit中?
由於
我在運行我自己的自定義語言的應用程序中使用AvalonEdit。我想在Avalon Edit中加入恰當的語法高亮。通常這是通過手動定義xml文件中的高亮規則來完成的。以編程方式將語法高亮規則添加到AvalonEdit
但是,我不希望突出顯示規則在擴展語言時始終與語言語法不同步。所以我希望使用已經包含在我的coco/R解析器中的語法信息來自動生成這些規則。 那麼有沒有一種方法可以通過編程將語法高亮規則添加到Avalon Edit中?
由於
可以使用對象模型中生成ICSharpCode.AvalonEdit.Highlighting.Xshd
在存儲器中.xshd文件(XshdSyntaxDefinition
等)。
要將其轉換爲IHighlightingDefinition
,請使用HighlightingLoader.Load()
方法。您也可以通過應用SaveXshdVisitor
將其保存到磁盤(用於調試目的)。
或者,您可以自己實施IHighlightingDefinition
並直接創建HighlightingRuleSet
實例。
以下代碼至少適用於我。
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;
}
}