using Dpz.Core.MessageQueue.Abstractions;
using Dpz.Core.Public.ViewModel.Messages;
namespace Dpz.Core.Service.Mediator.Features.Markdown.Commands;
/// <summary>
/// 处理 Markdown 编辑:提取图片地址并发布已删除图片的清理消息。
/// </summary>
public class EditMarkdownEvent(IMessagePublisher<RemoveImagesMessage> removeImageMessagePublisher)
: IRequestHandler<EditMarkdownRequest, List<string>>
{
private readonly HtmlParser _htmlParse = new();
/// <summary>
/// 对比新旧 Markdown,返回当前图片集合并清理失效图片。
/// </summary>
public async ValueTask<List<string>> Handle(
EditMarkdownRequest request,
CancellationToken cancellationToken
)
{
if (string.IsNullOrWhiteSpace(request.OriginalMarkdown))
{
return await GetImagesByMarkdownAsync(request.Markdown ?? string.Empty);
}
var originalImages = await GetImagesByMarkdownAsync(request.OriginalMarkdown);
var images = await GetImagesByMarkdownAsync(request.Markdown ?? string.Empty);
var missingImages = originalImages.Except(images).ToList();
await removeImageMessagePublisher.PublishBatchAsync(
missingImages.Select(x => new RemoveImagesMessage { ImageUrl = x }),
cancellationToken: cancellationToken
);
return images;
}
private async Task<List<string>> GetImagesByMarkdownAsync(string markdown)
{
var htmlContent = markdown.MarkdownToHtml();
var document = await _htmlParse.ParseDocumentAsync(htmlContent);
var imageElements = document.GetElementsByTagName("img");
return imageElements.GetElementsImageUrls();
}
}
评论加载中...