126 lines
4.2 KiB
C#
126 lines
4.2 KiB
C#
using System.Text.RegularExpressions;
|
|
|
|
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Helpers;
|
|
|
|
/// <summary>
|
|
/// Класс-помощник, для обработки строкового ввода с Архивов Нефиса.
|
|
/// Реализует шаблон <c>Singleton</c>.
|
|
/// </summary>
|
|
internal partial class StringHelper
|
|
{
|
|
/// <summary>
|
|
/// Конструктор класса <see cref="StringHelper"/>
|
|
/// </summary>
|
|
private 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();
|
|
|
|
Match match = LinkRegex().Match(input);
|
|
if (match.Captures.Count > 0)
|
|
{
|
|
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 ResolveSource(string input)
|
|
{
|
|
Match match = SourceSuffixRegex().Match(input);
|
|
return match.Captures.Count > 0 ? match.Captures[0].Value : "";
|
|
}
|
|
|
|
/// <summary>
|
|
/// Экземпляр класса <see cref="StringHelper"/>.
|
|
/// </summary>
|
|
public static StringHelper Instance { get; } = new();
|
|
|
|
/// <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>
|
|
internal class MarkdownLinkSplit
|
|
{
|
|
/// <summary>
|
|
/// Список содержащихся ссылок.
|
|
/// </summary>
|
|
public List<MarkdownLink> Links { get; } = [];
|
|
|
|
/// <summary>
|
|
/// Завершающая часть ссылки.
|
|
/// </summary>
|
|
public string Suffix { get; set; } = "";
|
|
}
|
|
|
|
/// <summary>
|
|
/// Информация о ссылке в строке.
|
|
/// </summary>
|
|
internal class MarkdownLink
|
|
{
|
|
/// <summary>
|
|
/// Данные, содержащиеся до ссылки.
|
|
/// </summary>
|
|
public string Prefix { get; init; } = "";
|
|
|
|
/// <summary>
|
|
/// Текст ссылки.
|
|
/// </summary>
|
|
public string Text { get; init; } = "";
|
|
|
|
/// <summary>
|
|
/// URL ссылки.
|
|
/// </summary>
|
|
public string Url { get; init; } = "";
|
|
}
|