Files

124 lines
4.1 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Pf2e.Scrapper.Importers.Implementations.Aonprd.Helpers;
/// <summary>
/// Класс-помощник, для обработки строкового ввода с Архивов Нефиса.
/// Реализует шаблон <c>Singleton</c>.
/// </summary>
public partial class StringHelper
{
/// <summary>
/// Конструктор класса <see cref="StringHelper"/>
/// </summary>
public StringHelper() { }
/// <summary>
/// Разбиение строки по нестабильным строковым разделителям (например, <c>", "</c>, <c>" or "</c> и т.д.).
/// </summary>
/// <param name="value">Исходная строка.</param>
/// <returns>Коллекция строк.</returns>
public List<string> RowSplit(string value)
{
return value
.Replace(", or", ",")
.Replace(" or ", ", ")
.Replace(";", ",")
.Split(", ")
.Where(s => !string.IsNullOrWhiteSpace(s))
.ToList();
}
/// <summary>
/// Разбор списка ссылок в исходной строке.
/// </summary>
/// <param name="input">Исходная строка.</param>
/// <returns>Структура, содеражащая информацию разбиении строки по ссылкам.</returns>
public MarkdownLinkSplit ParseMarkdownLinks(string input)
{
MarkdownLinkSplit result = new();
MatchCollection matches = LinkRegex().Matches(input);
foreach (Match match in matches)
{
result.Links.Add(
new()
{
Prefix = match.Groups[1].Value.Trim(),
Text = match.Groups[2].Value.Trim(),
Url = match.Groups[3].Value.Trim(),
}
);
}
result.Suffix = LinkRegex().Replace(input, "");
return result;
}
/// <summary>
/// Извлечение суффикса из описания источника.
/// </summary>
/// <param name="input">Исходная строка.</param>
/// <returns>Суффикс.</returns>
public string ResolveSourceSuffix(string input)
{
Match match = SourceSuffixRegex().Match(input);
return match.Captures.Count > 0 ? match.Groups[1].Value : "";
}
/// <summary>
/// Регулярное выражение для извлечения источника из строки с Markdown-ссылкой.
/// </summary>
/// <returns>Регулярное выражение.</returns>
[GeneratedRegex(@"^\[.*?\]\(.*?\)\s+(.*)$")]
public static partial Regex SourceSuffixRegex();
/// <summary>
/// Регулярное выражение для выявления Markdown-ссылок в строке.
/// </summary>
/// <returns>Регулярное выражение.</returns>
[GeneratedRegex(@"(.*?)\[(.*?)\]\((.*?)\)")]
public static partial Regex LinkRegex();
}
/// <summary>
/// Класс структуры, содеражащая информацию разбиении строки по ссылкам.
/// </summary>
public class MarkdownLinkSplit
{
/// <summary>
/// Список содержащихся ссылок.
/// </summary>
public List<MarkdownLink> Links { get; } = [];
/// <summary>
/// Завершающая часть ссылки.
/// </summary>
public string Suffix { get; set; } = "";
}
/// <summary>
/// Информация о ссылке в строке.
/// </summary>
public class MarkdownLink
{
/// <summary>
/// Данные, содержащиеся до ссылки.
/// </summary>
public string Prefix { get; init; } = "";
/// <summary>
/// Текст ссылки.
/// </summary>
public string Text { get; init; } = "";
/// <summary>
/// URL ссылки.
/// </summary>
public string Url { get; init; } = "";
}