using System.Text.RegularExpressions;
using Dpz.Core.Service.Mediator.Features.Article.Contracts;

namespace Dpz.Core.Service.Mediator.Features.Search.Queries;

/// <summary>
/// 对指定文本执行正则匹配并返回命中明细。
/// </summary>
public class ContentSearchEvent : IRequestHandler<ContentSearchRequest, List<SearchResult>>
{
    /// <summary>
    /// 按行扫描文本并收集匹配结果。
    /// </summary>
    public async ValueTask<List<SearchResult>> Handle(
        ContentSearchRequest request,
        CancellationToken cancellationToken
    )
    {
        var searchResults = new List<SearchResult>();
        if (string.IsNullOrWhiteSpace(request.Pattern) || string.IsNullOrWhiteSpace(request.Text))
        {
            return searchResults;
        }

        var regex = new Regex(request.Pattern, RegexOptions.IgnoreCase);
        using var textReader = new StringReader(request.Text);
        var currentLineNumber = 0;
        while (await textReader.ReadLineAsync(cancellationToken) is { } line)
        {
            var matches = regex.Matches(line);
            foreach (Match match in matches)
            {
                var result = new SearchResult
                {
                    LineNumber = currentLineNumber + 1,
                    StartIndex = match.Index,
                    EndIndex = match.Index + match.Length - 1,
                    MatchedText = match.Value,
                };
                searchResults.Add(result);
            }
            currentLineNumber++;
        }

        return searchResults;
    }
}
评论加载中...