From 0a598f1255803c020b0470887d06db46866fd72e Mon Sep 17 00:00:00 2001 From: OnlyFart Date: Sun, 20 Oct 2024 11:22:47 +0300 Subject: [PATCH] StringTokenFormatter --- Core/Configs/Options.cs | 4 +-- Core/Core.csproj | 1 + Core/Logic/BookNameBuilder.cs | 31 +++++++---------- Core/Logic/Getters/AuthorTodayGetter.cs | 2 +- README.md | 44 ++++++++++++------------- 5 files changed, 37 insertions(+), 45 deletions(-) diff --git a/Core/Configs/Options.cs b/Core/Configs/Options.cs index 1589a91..8e41b0c 100644 --- a/Core/Configs/Options.cs +++ b/Core/Configs/Options.cs @@ -1,8 +1,6 @@ using System.Collections.Generic; using System.Linq; -using System.Runtime.InteropServices.JavaScript; using CommandLine; -using Core.Logic; using Core.Misc; namespace Core.Configs; @@ -71,7 +69,7 @@ public Options(IEnumerable url) { [Option("additional-types", Required = false, HelpText = "Типы дополнительных файлов. Допустимые значения: books, audio, images", Separator = ',')] public IEnumerable AdditionalTypes { get; set; } - [Option("book-name-pattern", Required = false, HelpText = "Шаблон имени файла. Допустимые значения: {author}, {title}, {seria}, {seria_number}", Default = "{" + BookNameBuilder.AUTHOR_PATTERN + "} - {" + BookNameBuilder.TITLE_PATTERN + "}")] + [Option("book-name-pattern", Required = false, HelpText = "Шаблон имени файла.", Default = "{Author.Name} - {Book.Title}")] public string BookNamePattern { get; set; } public bool HasAdditionalType(AdditionalTypeEnum type) => Additional && (AdditionalTypes == default || !AdditionalTypes.Any() || AdditionalTypes.Contains(type)); diff --git a/Core/Core.csproj b/Core/Core.csproj index b19cfcb..099ccb9 100644 --- a/Core/Core.csproj +++ b/Core/Core.csproj @@ -18,6 +18,7 @@ + diff --git a/Core/Logic/BookNameBuilder.cs b/Core/Logic/BookNameBuilder.cs index ac897a3..84cc56c 100644 --- a/Core/Logic/BookNameBuilder.cs +++ b/Core/Logic/BookNameBuilder.cs @@ -1,30 +1,23 @@ -using System.Collections.Generic; using Core.Extensions; using Core.Types.Book; +using StringTokenFormatter; namespace Core.Logic; public class BookNameBuilder { - public const string TITLE_PATTERN = "title"; - - public const string AUTHOR_PATTERN = "author"; - - public const string SERIA_PATTERN = "seria"; - - public const string SERIA_NUMBER_PATTERN = "seria_number"; - public static string Build(string pattern, Book book) { - var map = new Dictionary { - { TITLE_PATTERN, book.Title }, - { AUTHOR_PATTERN, book.Author.Name }, - { SERIA_PATTERN, book.Seria?.Name }, - { SERIA_NUMBER_PATTERN, book.Seria?.Number }, - }; - - foreach (var (key, value) in map) { - pattern = pattern.Replace("{" + key + "}", value.RemoveInvalidChars()); + var resolver = new InterpolatedStringResolver(StringTokenFormatterSettings.Default); + var combinedContainer = resolver + .Builder() + .AddPrefixedObject("Book", book) + .AddPrefixedObject("Author", book.Author) + .AddPrefixedSingle("Seria", "HasSeria", book.Seria is not null); + + if (book.Seria is not null) { + combinedContainer.AddPrefixedObject("Seria", book.Seria); } - return pattern.RemoveInvalidChars().Crop(100); + + return resolver.FromContainer(pattern, combinedContainer.CombinedResult()).RemoveInvalidChars(); } } \ No newline at end of file diff --git a/Core/Logic/Getters/AuthorTodayGetter.cs b/Core/Logic/Getters/AuthorTodayGetter.cs index c1b731d..0d20b50 100644 --- a/Core/Logic/Getters/AuthorTodayGetter.cs +++ b/Core/Logic/Getters/AuthorTodayGetter.cs @@ -148,7 +148,7 @@ private Seria GetSeria(AuthorTodayBookDetails book) { } return new Seria { - Name = book.SeriesTitle, + Name = book.SeriesTitle.Trim(), Number = book.SeriesWorkNumber.HasValue ? book.SeriesWorkNumber.ToString() : string.Empty, Url = SystemUrl.MakeRelativeUri($"/work/series/{book.SeriesId}") }; diff --git a/README.md b/README.md index f8fc225..f08c754 100644 --- a/README.md +++ b/README.md @@ -153,25 +153,25 @@ docker run --rm -p 8080:8080 onlyfart/elib2ebookweb ## Полный список опций -| Команда | Описание | -|----------------------|---------------------------------------------------------------------------------------------------------------------------| -| -u, --url | Обязательное. Ссылка на книгу | -| -f, --format | Обязательное. Формат для сохранения книги. Допустимые значения: epub, fb2, cbz, json, txt | -| -l, --login | Логин от системы | -| -p, --password | Пароль от системы | -| --proxy | Прокси в формате (http or socks4 or socks5)://host:port/ | -| -s, --save | Директория для сохранения книги | -| -c, --cover | Сохранить обложку книги в отдельный файл | -| -t, --timeout | (По-умолчанию: 120) Timeout для запросов в секундах | -| -d, --delay | (По-умолчанию: 0) Задержка между запросами в секундах | -| --no-image | Не загружать картинки | -| --temp | Директория для хранения временных файлов | -| --save-temp | Не удалять временную директорию | -| --start | Стартовый номер главы | -| --end | Конечный номер главы | -| --start-name | Стартовое имя главы | -| --end-name | Конечное имя главы | -| --no-chapters | Не загружать главы | -| --additional | Сохранить дополнительные файлы (оригинальные файлы книг, аудиоверсии и т.д.) | -| --additional-types | Типы дополнительных файлов. Допустимые значения: books, audio, images | -| --book-name-pattern | (По-умолчанию: {author} - {title}) Шаблон для имени файла. Допустимые значение {author}, {title}, {seria}, {seria_number} | +| Команда | Описание | +|----------------------|-------------------------------------------------------------------------------------------| +| -u, --url | Обязательное. Ссылка на книгу | +| -f, --format | Обязательное. Формат для сохранения книги. Допустимые значения: epub, fb2, cbz, json, txt | +| -l, --login | Логин от системы | +| -p, --password | Пароль от системы | +| --proxy | Прокси в формате (http or socks4 or socks5)://host:port/ | +| -s, --save | Директория для сохранения книги | +| -c, --cover | Сохранить обложку книги в отдельный файл | +| -t, --timeout | (По-умолчанию: 120) Timeout для запросов в секундах | +| -d, --delay | (По-умолчанию: 0) Задержка между запросами в секундах | +| --no-image | Не загружать картинки | +| --temp | Директория для хранения временных файлов | +| --save-temp | Не удалять временную директорию | +| --start | Стартовый номер главы | +| --end | Конечный номер главы | +| --start-name | Стартовое имя главы | +| --end-name | Конечное имя главы | +| --no-chapters | Не загружать главы | +| --additional | Сохранить дополнительные файлы (оригинальные файлы книг, аудиоверсии и т.д.) | +| --additional-types | Типы дополнительных файлов. Допустимые значения: books, audio, images | +| --book-name-pattern | (По-умолчанию: {Author.Name} - {Book.Title}) Шаблон для имени файла. |