CODEBUDDY.md
这是你进入项目时最先需要知道的信息。根据任务类型,跳转到对应章节。
| 你想做什么 | 入口文件/目录 |
|---|---|
| 添加新的输入法格式支持 | src/ImeWlConverter.Formats/{Format}/ → 创建 Importer + Exporter |
| 修改转换管道逻辑 | src/ImeWlConverter.Core/Pipeline/ConversionPipeline.cs |
| 修改 CLI 参数/行为 | src/ImeWlConverterCmd/CommandBuilder.cs |
| 修改编码生成(拼音/五笔等) | src/ImeWlConverter.Core/CodeGeneration/Generators/ |
| 修改过滤器 | src/ImeWlConverter.Core/Filters/ |
| 修改过滤配置 DTO | src/ImeWlConverter.Abstractions/Options/FilterConfig.cs |
| 修改 macOS GUI | src/ImeWlConverterMac/ViewModels/MainWindowViewModel.cs |
| 修改 Windows GUI | src/IME WL Converter Win/Forms/MainForm.cs |
| 添加/修改单元测试 | src/ImeWlConverterCoreTest/ |
| 修改 CI 流程 | .github/workflows/ci.yml |
| 发布新版本 | docs/RELEASING.md |
深蓝词库转换(IME WL Converter)是一个跨平台的输入法词库格式转换工具,支持 50+ 种输入法格式之间的相互转换。
make build # 构建所有项目
make test # 运行单元测试 (81个)
make integration-test # 运行集成测试 (28个,需先 make build-cmd)
make lint # 检查代码格式
make format # 自动格式化代码
make run-cmd # 运行 CLI 工具
make run-mac # 运行 macOS GUI
src/
├── ImeWlConverter.Abstractions/ # 接口层(零依赖)
├── ImeWlConverter.Core/ # 业务服务层(转换管道、编码生成、过滤、简繁转换)
├── ImeWlConverter.Formats/ # 格式实现层(86个文件,50+种格式)
├── ImeWlConverter.SourceGenerators/ # Source Generator(编译时格式注册)
├── ImeWlConverterCmd/ # CLI 入口
├── ImeWlConverterMac/ # macOS GUI (Avalonia 11.2.3)
├── IME WL Converter Win/ # Windows GUI (WinForms)
└── ImeWlConverterCoreTest/ # xUnit 单元测试
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ CLI │ │ WinForms │ │ macOS GUI │
│ CommandBuild│ │ MainForm │ │ ViewModel │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└────────────┬────┴──────────────────┘
▼
┌───────────────────────┐
│ IConversionPipeline │ (Abstractions 层接口)
└───────────┬───────────┘
▼
┌───────────────────────┐
│ ConversionPipeline │ (Core 层统一实现)
│ │
│ Import → Filter → │
│ ChineseConvert → │
│ WordRank → CodeGen → │
│ RemoveEmpty → Export │
└───────────────────────┘
设计原则:三端(CLI、WinForms、macOS GUI)共用同一个 ConversionPipeline 底层转换引擎,只在用户交互层不同。
CommandBuilder 解析参数构建 ConversionRequestMainForm 用户操作构建 ConversionRequestMainWindowViewModel 构建 ConversionRequestFilterConfig(Abstractions/Options/)、ConversionOptions、IProgress<ProgressInfo>以下按从外到内的顺序描述各层,你只需要读到与任务相关的层即可。
src/ImeWlConverterCmd/)| 文件 | 职责 |
|---|---|
Program.cs | 入口,旧参数格式检测,调用 CommandBuilder |
CommandBuilder.cs | System.CommandLine 定义所有 CLI 选项,构建 ConversionRequest,调用 ConversionPipeline |
src/ImeWlConverterMac/)| 文件 | 职责 |
|---|---|
App.axaml.cs | 应用入口,创建 DI 容器,注入 ViewModel |
ViewModels/MainWindowViewModel.cs | MVVM ViewModel,构建 ConversionRequest,调用 IConversionPipeline |
Views/FilterConfigWindow.axaml.cs | 过滤配置 UI,使用共享 FilterConfig DTO |
src/IME WL Converter Win/)| 文件 | 职责 |
|---|---|
Program.cs | 应用入口,创建 DI 容器 |
Forms/MainForm.cs | 主窗口,构建 ConversionRequest,调用 IConversionPipeline |
Forms/FilterConfigForm.cs | 过滤配置 UI,使用共享 FilterConfig DTO |
src/ImeWlConverter.Core/Pipeline/)| 文件 | 职责 |
|---|---|
ConversionPipeline.cs | 完整 7 步转换管道(Import→Filter→ChineseConvert→WordRank→CodeGen→RemoveEmpty→Export) |
FilterPipeline.cs | 过滤执行器(单条过滤 → 变换 → 批量过滤) |
ConversionPipeline 支持的能力:
MergeToOneFile 选项)src/ImeWlConverter.Formats/)每个格式拆分为独立的 Importer 和 Exporter,通过 [FormatPlugin] 属性标记,Source Generator 自动注册到 DI。
| 基类 | 用途 |
|---|---|
TextFormatImporter | 文本格式导入(逐行解析) |
TextFormatExporter | 文本格式导出(逐行生成) |
BinaryFormatImporter | 二进制格式导入 |
src/ImeWlConverter.Core/)| 目录 | 内容 |
|---|---|
CodeGeneration/Generators/ | 编码生成器(拼音、五笔86/98/新世纪、郑码、仓颉、注音、超音、二笔x4) |
Filters/ | IWordFilter / IWordTransform / IBatchFilter 实现(12 种) |
Helpers/ | 文件操作、编码检测、拼音字典、HTTP |
Language/ | 纯 .NET 简繁转换(基于 OpenCC 映射表) |
WordRank/ | 默认词频生成器 |
Resources/ | 嵌入式码表 + 简繁映射文件 |
src/ImeWlConverter.Abstractions/)纯接口和 DTO,零依赖。供所有层引用。
| 子目录 | 关键类型 |
|---|---|
Contracts/ | IFormatImporter, IFormatExporter, IConversionPipeline, ICodeGenerator, IWordFilter, IWordTransform, IBatchFilter |
Models/ | WordEntry (sealed record), WordCode, FormatMetadata, ProgressInfo |
Options/ | ConversionOptions, FilterConfig, FilterOptions, CodeGenerationOptions, ImportOptions, ExportOptions |
Results/ | Result<T>, ImportResult, ExportResult, ConversionRequest, ConversionResult |
Enums/ | CodeType, SortType, PinyinType, ChineseConversionMode |
# 1. 在 Formats 项目中创建目录和文件
mkdir src/ImeWlConverter.Formats/MyFormat/
// 2. 创建 Importer
[FormatPlugin("myf", "我的格式", 500)]
public sealed class MyFormatImporter : TextFormatImporter
{
protected override Encoding FileEncoding => new UTF8Encoding(false);
public override FormatMetadata Metadata { get; } = new("myf", "我的格式", 500, true, false);
protected override IEnumerable<WordEntry> ParseLine(string line) { /* 解析逻辑 */ }
}
// 3. 创建 Exporter
[FormatPlugin("myf", "我的格式", 500)]
public sealed class MyFormatExporter : TextFormatExporter
{
protected override Encoding FileEncoding => new UTF8Encoding(false);
public override FormatMetadata Metadata { get; } = new("myf", "我的格式", 500, false, true);
protected override string? FormatEntry(WordEntry entry) { /* 导出逻辑 */ }
}
Source Generator 会自动将带 [FormatPlugin] 的类注册到 DI 容器,无需手动注册。
过滤器位于 src/ImeWlConverter.Core/Filters/,实现接口:
public interface IWordFilter { bool ShouldKeep(WordEntry entry); }
public interface IWordTransform { WordEntry? Transform(WordEntry entry); }
public interface IBatchFilter { IReadOnlyList<WordEntry> Filter(IReadOnlyList<WordEntry> entries); }
FilterConfig(Abstractions/Options/FilterConfig.cs)定义了所有过滤选项,ConversionPipeline 内部的 BuildFilterPipeline() 方法将其转换为 FilterPipeline 实例。
CLI 通过 --filter 参数启用过滤:-f "len:2-10|rm:eng|rm:num"
编码生成器位于 src/ImeWlConverter.Core/CodeGeneration/Generators/,实现 ICodeGenerator 接口。通过 DI 注册,由 CodeGenerationService 根据 CodeType 选择对应生成器。
转换管道位于 src/ImeWlConverter.Core/Pipeline/ConversionPipeline.cs。7 步流程:
src/Directory.Build.props)Path.Combine())IConversionPipeline)三端使用相同的 DI 注册方式:
var services = new ServiceCollection();
services.AddAllFormats(); // Source Generator 生成的格式注册
services.AddImeWlConverterCore(); // 管道、编码生成器、简繁转换、词频生成器
var sp = services.BuildServiceProvider();
// 获取管道
var pipeline = sp.GetRequiredService<IConversionPipeline>();
项目处理多种字符编码(UTF-8、GBK、GB2312、Big5、Unicode)。.NET 10 已内置 CodePages 支持,但部分旧代码仍调用:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
src/ImeWlConverterCoreTest/tests/integration/xunit.runner.json 中 parallelizeTestCollections: false)[Fact(Skip = "...")] 标记按需运行的慢速测试GitHub Actions (.github/workflows/ci.yml):
| 决策 | 原因 |
|---|---|
| 三端统一使用 ConversionPipeline | 消除重复转换逻辑,保证行为一致 |
| FilterConfig 放在 Abstractions 层 | 三端共享过滤配置 DTO,避免各端重复定义 |
| ConversionPipeline 支持 Stream 输出 | GUI 需要先预览内容再决定是否保存 |
| CLI 用 FormatRegistrar 显式注册 | 消除反射,支持 AOT/Trimming |
| Source Generator 注册新格式 | 添加格式只需加 [FormatPlugin] 属性 |
| 测试串行执行 | 编码生成器有静态字典状态,并行会竞态 |
| sealed record 实体 | 不可变性保证,不会意外修改中间状态 |