Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ imewlconverter -i <输入格式> -o <输出格式> -O <输出文件> <输入文
|---------|------|-----------|:-------:|:-------:|
| `scel` | 搜狗拼音细胞词库 | .scel | ✅ | ✅ |
| `sgpy` | 搜狗拼音文本格式 | .txt | ✅ | ✅ |
| `sgpybin` | 搜狗拼音备份词库 | .bin | ✅ | ❌ |
| `sgpybin` | 搜狗拼音备份词库 | .bin | ✅ | ✅ |
| `qqpy` | QQ 拼音文本格式 | .txt | ✅ | ✅ |
| `qpyd` | QQ 拼音分类词库 | .qpyd | ✅ | ❌ |
| `qcel` | QQ 拼音细胞词库 | .qcel | ✅ | ❌ |
Expand Down Expand Up @@ -251,4 +251,4 @@ cd ../../tests/integration

## Star History

[![Star History Chart](https://api.star-history.com/svg?repos=studyzy/imewlconverter&type=Date)](https://star-history.com/#studyzy/imewlconverter&Date)
[![Star History Chart](https://api.star-history.com/svg?repos=studyzy/imewlconverter&type=Date)](https://star-history.com/#studyzy/imewlconverter&Date)
9 changes: 8 additions & 1 deletion src/IME WL Converter Win/Forms/MainForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ public partial class MainForm : Form
private int _convertedCount;

private string? _exportContent;
private byte[]? _exportData;

private CancellationTokenSource? _cts;

Expand Down Expand Up @@ -382,6 +383,7 @@ private async void btnConvert_Click(object? sender, EventArgs e)

richTextBox1.Clear();
_exportContent = null;
_exportData = null;
_cts = new CancellationTokenSource();
SetConvertingState(true);

Expand Down Expand Up @@ -426,6 +428,7 @@ private async void btnConvert_Click(object? sender, EventArgs e)
{
_convertedCount = result.Value.ExportedCount;
_exportContent = result.Value.ExportContent;
_exportData = result.Value.ExportData;
HandleConversionCompleted(result.Value);
}
else
Expand Down Expand Up @@ -552,7 +555,11 @@ private void HandleConversionCompleted(ConversionResult result)

if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
if (_exportContent != null)
if (_exportData != null)
{
File.WriteAllBytes(saveFileDialog1.FileName, _exportData);
}
else if (_exportContent != null)
{
File.WriteAllText(saveFileDialog1.FileName, _exportContent);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ public sealed record ConversionResult
/// <summary>Export content as string (for GUI display). Only populated when OutputStream is used.</summary>
public string? ExportContent { get; init; }

/// <summary>Export data for binary formats. Only populated when OutputStream is used.</summary>
public byte[]? ExportData { get; init; }

/// <summary>Accumulated error messages from individual file processing.</summary>
public string? ErrorMessages { get; init; }
}
36 changes: 27 additions & 9 deletions src/ImeWlConverter.Core/Pipeline/ConversionPipeline.cs
Original file line number Diff line number Diff line change
Expand Up @@ -141,20 +141,37 @@ e.Code is not null &&
progress?.Report(new ProgressInfo(exportedCount, exportedCount, $"正在导出 {exportedCount} 条词条..."));

string? exportContent = null;
byte[]? exportData = null;

if (request.OutputStream is not null)
{
// GUI mode: write to provided stream, capture content
await exporter.ExportAsync(entries, request.OutputStream, request.Options.Export, ct);
request.OutputStream.Position = 0;
using var reader = new StreamReader(request.OutputStream, exporter.OutputEncoding, leaveOpen: true);
exportContent = await reader.ReadToEndAsync(ct);
// GUI mode: write to provided stream and retain the exact output for saving.
var exportResult = await exporter.ExportAsync(entries, request.OutputStream, request.Options.Export, ct);
exportedCount = exportResult.EntryCount;
filteredCount = importedCount - exportedCount;
if (request.OutputStream.CanSeek && request.OutputStream.CanRead)
{
request.OutputStream.Position = 0;
if (exporter.Metadata.IsBinary)
{
using var copy = new MemoryStream();
await request.OutputStream.CopyToAsync(copy, ct);
exportData = copy.ToArray();
}
else
{
using var reader = new StreamReader(request.OutputStream, exporter.OutputEncoding, leaveOpen: true);
exportContent = await reader.ReadToEndAsync(ct);
}
}
}
else if (request.OutputPath is not null)
{
// CLI/file mode: write directly to file
using var outputStream = File.Create(request.OutputPath);
await exporter.ExportAsync(entries, outputStream, request.Options.Export, ct);
var exportResult = await exporter.ExportAsync(entries, outputStream, request.Options.Export, ct);
exportedCount = exportResult.EntryCount;
filteredCount = importedCount - exportedCount;
}

var errorStr = errors.Length > 0 ? errors.ToString() : null;
Expand All @@ -165,6 +182,7 @@ e.Code is not null &&
ExportedCount = exportedCount,
FilteredCount = filteredCount,
ExportContent = exportContent,
ExportData = exportData,
ErrorMessages = errorStr
});
}
Expand Down Expand Up @@ -212,11 +230,11 @@ private async Task<Result<ConversionResult>> ExecutePerFileAsync(

var outputFile = Path.Combine(
request.OutputDirectory ?? ".",
Path.GetFileNameWithoutExtension(file) + ".txt");
Path.GetFileNameWithoutExtension(file) + exporter.Metadata.FileExtension);
using var outStream = File.Create(outputFile);
await exporter.ExportAsync(fileEntries, outStream, request.Options.Export, ct);
var exportResult = await exporter.ExportAsync(fileEntries, outStream, request.Options.Export, ct);

totalConverted += fileEntries.Count;
totalConverted += exportResult.EntryCount;
progress?.Report(new ProgressInfo(i + 1, totalFiles, $"已导出: {outputFile}"));
}
catch (OperationCanceledException) { throw; }
Expand Down
Loading
Loading