2026-06-28 01:43:01 +08:00
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
namespace BetterEN5.Services
|
|
|
|
|
{
|
|
|
|
|
public class InkService : IInkService
|
|
|
|
|
{
|
|
|
|
|
public async Task ExportInkAsync(string filePath)
|
|
|
|
|
{
|
|
|
|
|
await Task.Run(() =>
|
|
|
|
|
{
|
2026-06-28 09:51:56 +08:00
|
|
|
var board = GetENProperty("CurrentBoardApi");
|
2026-06-28 01:43:01 +08:00
|
|
|
if (board == null) return;
|
|
|
|
|
|
2026-06-28 09:51:56 +08:00
|
|
|
dynamic slides = board.Slides;
|
|
|
|
|
if (slides == null) return;
|
2026-06-28 01:43:01 +08:00
|
|
|
|
|
|
|
|
var inkData = new InkPackage();
|
|
|
|
|
foreach (var slide in slides)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var remarker = slide.GetType().GetMethod("GetRemarkProvider")?.Invoke(slide, null);
|
|
|
|
|
if (remarker != null)
|
|
|
|
|
{
|
|
|
|
|
var remarks = remarker.GetType().GetMethod("GetAllRemarks")?.Invoke(remarker, null);
|
|
|
|
|
if (remarks != null)
|
|
|
|
|
{
|
|
|
|
|
inkData.Slides.Add(new SlideInkData
|
|
|
|
|
{
|
|
|
|
|
SlideId = slide.Id,
|
|
|
|
|
Remarks = remarks
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch { }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var dir = Path.GetDirectoryName(filePath);
|
|
|
|
|
if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
|
|
|
|
|
Directory.CreateDirectory(dir);
|
|
|
|
|
|
|
|
|
|
var json = System.Text.Json.JsonSerializer.Serialize(inkData);
|
|
|
|
|
File.WriteAllText(filePath, json);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task ImportInkAsync(string filePath)
|
|
|
|
|
{
|
|
|
|
|
await Task.Run(() =>
|
|
|
|
|
{
|
|
|
|
|
if (!File.Exists(filePath)) return;
|
|
|
|
|
|
|
|
|
|
var json = File.ReadAllText(filePath);
|
|
|
|
|
var inkData = System.Text.Json.JsonSerializer.Deserialize<InkPackage>(json);
|
|
|
|
|
if (inkData == null) return;
|
|
|
|
|
|
2026-06-28 09:51:56 +08:00
|
|
|
var board = GetENProperty("CurrentBoardApi");
|
2026-06-28 01:43:01 +08:00
|
|
|
if (board == null) return;
|
|
|
|
|
|
|
|
|
|
foreach (var slideData in inkData.Slides)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var slide = board.GetType().GetMethod("FindSlideById")?.Invoke(board, new[] { slideData.SlideId });
|
|
|
|
|
if (slide == null) continue;
|
|
|
|
|
|
|
|
|
|
var remarker = slide.GetType().GetMethod("GetRemarkProvider")?.Invoke(slide, null);
|
|
|
|
|
if (remarker != null)
|
|
|
|
|
{
|
|
|
|
|
remarker.GetType().GetMethod("LoadRemarks")?.Invoke(remarker, new[] { slideData.Remarks });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch { }
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static dynamic? GetENProperty(string propertyName)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var enType = Type.GetType("Cvte.EasiNote.EN, Cvte.EasiUI", false);
|
|
|
|
|
if (enType == null)
|
|
|
|
|
{
|
|
|
|
|
var asm = typeof(Cvte.EasiNote.UIItem).Assembly;
|
|
|
|
|
enType = asm.GetType("Cvte.EasiNote.EN");
|
|
|
|
|
}
|
|
|
|
|
return enType?.GetProperty(propertyName)?.GetValue(null);
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class InkPackage
|
|
|
|
|
{
|
|
|
|
|
public List<SlideInkData> Slides { get; set; } = new();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class SlideInkData
|
|
|
|
|
{
|
|
|
|
|
public string SlideId { get; set; } = string.Empty;
|
|
|
|
|
public object Remarks { get; set; } = new();
|
|
|
|
|
}
|
|
|
|
|
}
|