ToB企服应用市场:ToB评测及商务社交产业平台
标题:
dotnet 利用 ColorCode 做代码着色器
[打印本页]
作者:
慢吞云雾缓吐愁
时间:
2025-1-23 11:16
标题:
dotnet 利用 ColorCode 做代码着色器
本文记录我利用 ColorCode 开源库简朴做一个代码着色器
开源库地点:
https://github.com/CommunityToolkit/ColorCode-Universal
我用的是 ColorCode.Core 版本,这个版本是无具体 UI 框架依赖的,于是我就在此基础上,同时做了 WPF 和 Avalonia 框架的版本。这两个框架在对 ColorCode 的利用上近乎毫无差异,大家可以在本文末尾找到本文所有代码的下载方法,下载本文的代码相识两个框架的差异
以下为 WPF 版本的效果图
以下为 Avalonia 版本的效果图
以下是具体的测试逻辑。由于 WPF 和 Avalonia 版本代码几乎没有差异,我这里就利用 WPF 为例子举行演示,完全的代码还请到本文末尾找到下载方法
以下是我编写的一段用来做测试的 C# 测试代码
var code = """
using System;
namespace NemficubehayWaybakiwerwhaw.Desktop;
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
""";
复制代码
咱接下来将对此代码举行着色
编写一个名为 TextEditorCodeColorizer 的范例,让此范例继续 CodeColorizerBase 范例。在此范例里面重写 Write 方法
class TextEditorCodeColorizer : CodeColorizerBase
{
protected override void Write(string parsedSourceCode, IList<Scope> scopes)
{
... // 忽略其他代码
}
复制代码
为了能够举行承载着色的代码,我这里利用了之前编写的简朴文本库。将其设置进入 TextEditorCodeColorizer 的构造函数,代码如下
class TextEditorCodeColorizer : CodeColorizerBase
{
public TextEditorCodeColorizer(TextEditor textEditor, StyleDictionary styles, ILanguageParser languageParser) : base(styles, languageParser)
{
_textEditor = textEditor;
}
private readonly TextEditor _textEditor;
}
复制代码
对于利用方来说,创建 TextEditorCodeColorizer 的代码如下
ILanguage language = Languages.CSharp;
var textEditorCodeColorizer = new TextEditorCodeColorizer(TextEditor, null, null);
复制代码
是的,构造函数的 StyleDictionary 和 ILanguageParser 都传空即可,这个库没有很好处理可空问题
再编写 FormatInlines 方法,让此方法作为接收输入方,代码如下
class TextEditorCodeColorizer : CodeColorizerBase
{
public void FormatInlines(string sourceCode, ILanguage language)
{
_textEditor.TextEditorCore.Remove(_textEditor.TextEditorCore.GetAllDocumentSelection());
languageParser.Parse(sourceCode, language, (parsedSourceCode, captures) => Write(parsedSourceCode, captures));
}
}
复制代码
具体的调用方法如下
ILanguage language = Languages.CSharp;
var textEditorCodeColorizer = new TextEditorCodeColorizer(TextEditor, null, null); textEditorCodeColorizer.FormatInlines(code, language);
复制代码
在 protected override void Write(string parsedSourceCode, IList scopes) 方法里面根据 Scope 决定利用什么颜色,代码如下
protected override void Write(string parsedSourceCode, IList<Scope> scopes)
{
SolidColorBrush colorBrush = Brushes.Black;
if (scopes.Count > 0)
{
var name = scopes[0].Name;
if (name == "Keyword")
{
colorBrush = Brushes.Blue;
}
else if (name == "String")
{
colorBrush = BrushCreator.CreateFromARGB(0xFFD69D7F);
}
else if (name == "Number")
{
colorBrush = BrushCreator.CreateFromARGB(0xFFADCDA8);
}
else
{
}
}
var runProperty = ((RunProperty) _textEditor.CurrentCaretRunProperty) with
{
Foreground = new ImmutableBrush(colorBrush)
};
_textEditor.AppendRun(new TextRun(parsedSourceCode, runProperty));
}
复制代码
以上的 BrushCreator 的实现如下
public static class BrushCreator
{
public static SolidColorBrush CreateFromARGB(uint argbHex)
{
byte a = (byte) ((argbHex & 0xFF000000) >> 24);
byte r = (byte) ((argbHex & 0x00FF0000) >> 16);
byte g = (byte) ((argbHex & 0x0000FF00) >> 8);
byte b = (byte) (argbHex & 0x000000FF);
var brush = new SolidColorBrush(Color.FromArgb(a, r, g, b));
return brush;
}
}
复制代码
在 Avalonia 版本里面,直接利用 Skia 作为绘制底层,利用 SKColor.Parse 举行转换颜色字符串,就不需要和 WPF 一样有额外的 BrushCreator 方法,代码如下
protected override void Write(string parsedSourceCode, IList<Scope> scopes)
{
SKColor color = SKColors.Black;
if (scopes.Count > 0)
{
var name = scopes[0].Name;
if (name == "Keyword")
{
color = SKColors.Blue;
}
else if(name == "String")
{
color = SKColor.Parse("D69D7F");
}
else if(name == "Number")
{
color = SKColor.Parse("ADCDA8");
}
else
{
}
}
_textEditor.AppendRun(new SkiaTextRun(parsedSourceCode, _textEditor.CurrentCaretRunProperty with
{
Foreground = color
}));
}
复制代码
本文代码放在
github
和
gitee
上,可以利用如下命令行拉取代码。我整个代码堆栈比较庞大,利用以下命令行可以举行部分拉取,拉取速率比较快
先创建一个空文件夹,接着利用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 5ba7a51c4f77e516eca886192fbbea4fe90d4a4f
复制代码
以上利用的是国内的 gitee 的源,如果 gitee 不能访问,请更换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源举行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 5ba7a51c4f77e516eca886192fbbea4fe90d4a4f
复制代码
获取代码之后,进入 AvaloniaIDemo/NemficubehayWaybakiwerwhaw 文件夹,即可获取到源代码
更多技术博客,请参阅
博客导航
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4