From 28d4c52c5c1cb17055704692cbbd8c89e5fcbb9b Mon Sep 17 00:00:00 2001 From: Ilya Kozhemyakin Date: Sat, 29 Mar 2025 18:20:50 +0400 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Pf2eDataScrapper/EnvSettings.cs | 27 ++++++++--- .../Importers/AbstractImporter.cs | 18 +++++--- Pf2eDataScrapper/Importers/GitLoader.cs | 32 ++++++++----- .../Compendium/CompendiumDocumentType.cs | 11 ++--- .../Compendium/CompendiumFolder.cs | 45 +++++++++++++++---- .../Compendium/CompendiumFolderCollection.cs | 17 +++---- .../Compendium/CompendiumSchemaBuilder.cs | 45 ++++++++++++++++--- .../Pf2eFoundry/CompendiumLoader.cs | 39 +++++++++++----- .../Pf2eFoundry/Pf2eFoundryImporter.cs | 35 +++++++++------ Pf2eDataScrapper/Program.cs | 4 +- .../SchemaBuilder/Types/AbstractSchemaType.cs | 3 +- 11 files changed, 192 insertions(+), 84 deletions(-) diff --git a/Pf2eDataScrapper/EnvSettings.cs b/Pf2eDataScrapper/EnvSettings.cs index 39b438c..d618c46 100644 --- a/Pf2eDataScrapper/EnvSettings.cs +++ b/Pf2eDataScrapper/EnvSettings.cs @@ -1,26 +1,39 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using dotenv.net; +using dotenv.net; using dotenv.net.Utilities; namespace Pf2eDataScrapper { - internal class EnvSettings + /// + /// Класс настроек. + /// + internal static class EnvSettings { + /// + /// Загрузка файла настроек `.env`. + /// public static void Load() { DotEnv.Load(); } + /// + /// Путь к папке с входными данными. + /// public static string DataDirPath => EnvReader.GetStringValue("DATA_DIR"); + /// + /// Папка в входными данными. + /// public static DirectoryInfo DataDir => new(DataDirPath); + /// + /// Путь к папке для сохранения результатов. + /// public static string OutputDirPath => EnvReader.GetStringValue("OUTPUT_DIR"); + /// + /// Папка для сохранения результатов. + /// public static string OutputDir => new(OutputDirPath); } diff --git a/Pf2eDataScrapper/Importers/AbstractImporter.cs b/Pf2eDataScrapper/Importers/AbstractImporter.cs index 6994c80..785cb51 100644 --- a/Pf2eDataScrapper/Importers/AbstractImporter.cs +++ b/Pf2eDataScrapper/Importers/AbstractImporter.cs @@ -1,11 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Pf2eDataScrapper.Importers +namespace Pf2eDataScrapper.Importers { + /// + /// Абстрактный класс импортёра + /// internal abstract class AbstractImporter { /// @@ -28,7 +25,14 @@ namespace Pf2eDataScrapper.Importers /// public string Dir => Path.Combine(EnvSettings.DataDirPath, Slug); + /// + /// Метод подготовки данных для импорта + /// public abstract void Prepare(); + + /// + /// Импорт данных + /// public abstract void Import(); } diff --git a/Pf2eDataScrapper/Importers/GitLoader.cs b/Pf2eDataScrapper/Importers/GitLoader.cs index 2643721..d4c3de8 100644 --- a/Pf2eDataScrapper/Importers/GitLoader.cs +++ b/Pf2eDataScrapper/Importers/GitLoader.cs @@ -1,20 +1,30 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Diagnostics; namespace Pf2eDataScrapper.Importers { - internal class GitLoader(string DataDirPath) + /// + /// Загрузчик данных из git-репозиториев + /// + /// + internal class GitLoader(string repositoryDirPath) { - public readonly string DataDirPath = DataDirPath; - public DirectoryInfo DataDir = new(DataDirPath); + /// + /// Путь к директории репозитория + /// + public readonly string RepositoryDirPath = repositoryDirPath; + /// + /// Директория репозитория + /// + public DirectoryInfo RepositoryDir = new(repositoryDirPath); + + /// + /// Обновление импортёра + /// + /// public void UpdateImporter(AbstractImporter importer) { - string gitPath = Path.Combine(DataDirPath, importer.Slug); + var gitPath = Path.Combine(RepositoryDirPath, importer.Slug); if (Directory.Exists(gitPath)) { @@ -38,7 +48,7 @@ namespace Pf2eDataScrapper.Importers StartInfo = new ProcessStartInfo() { FileName = "git", - WorkingDirectory = DataDirPath, + WorkingDirectory = RepositoryDirPath, Arguments = $"clone {importer.GitUrl} {importer.Slug}", } }; diff --git a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumDocumentType.cs b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumDocumentType.cs index b7f9b9b..ce2b9f5 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumDocumentType.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumDocumentType.cs @@ -1,11 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium +namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium { + /// + /// Тип документов компендиума. + /// internal enum CompendiumDocumentType { Actor, diff --git a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumFolder.cs b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumFolder.cs index 69e1e17..41b1b6b 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumFolder.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumFolder.cs @@ -1,32 +1,52 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Linq; namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium { + /// + /// Папка компендиума. + /// internal class CompendiumFolder { + /// + /// Идентификатор папки. + /// public readonly string Id; + /// + /// Название папки. + /// public readonly string Name; + /// + /// Путь к папке. + /// public readonly string? Path; + /// + /// Указатель, что папка содержится в других папках. + /// public readonly bool IsContained; + /// + /// Родительская папка. + /// public CompendiumFolder? Parent; + /// + /// Тип документов в папке. + /// public readonly CompendiumDocumentType Type; + /// + /// Конструктор папки компендиума из JSON-объекта. + /// + /// public CompendiumFolder(JObject json) { - if (json.ContainsKey("_id")) + if (json.TryGetValue("_id", out var id)) { // Вложенная папка через _folders.json - Id = json["_id"]!.ToString(); + Id = id!.ToString(); Name = json["name"]!.ToString(); Path = null; IsContained = true; @@ -43,6 +63,11 @@ namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium Type = (CompendiumDocumentType)Enum.Parse(typeof(CompendiumDocumentType), json["type"]!.ToString()); } + /// + /// Конструктор папки компендиума. + /// + /// Идентификатор папки. + /// Название папки. public CompendiumFolder(string id, string name) { Id = id; @@ -51,6 +76,10 @@ namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium IsContained = false; } + /// + /// Строковое представление данных о папки компендиума. + /// + /// Строковое представление данных о папки компендиума. public override string ToString() { return $"CompendiumFolder([Id={Id}][Type={Type}][Name={Name}][Path={Path}][Parent={Parent?.Name ?? "null"}])"; diff --git a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumFolderCollection.cs b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumFolderCollection.cs index fb15a4c..7eae065 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumFolderCollection.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumFolderCollection.cs @@ -1,14 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium +namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium { + /// + /// Коллекция папок компендиума + /// internal class CompendiumFolderCollection : List { - + /// + /// Получение папки по идентификатору + /// + /// Искомый идентификатор + /// Искомая папка public CompendiumFolder? GetById(string id) { return this.FirstOrDefault(x => x.Id == id); diff --git a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumSchemaBuilder.cs b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumSchemaBuilder.cs index 19c7723..48e906a 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumSchemaBuilder.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumSchemaBuilder.cs @@ -1,27 +1,46 @@ using Konsole; using Newtonsoft.Json.Linq; using Pf2eDataScrapper.SchemaBuilder; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium { + /// + /// Класс построения схемы компендиумов. + /// + /// Загрузчик данных. internal class CompendiumSchemaBuilder(CompendiumLoader loader) { + /// + /// Загрузчик данных. + /// public CompendiumLoader Loader = loader; + /// + /// Коллекция папок компендиума. + /// public CompendiumFolderCollection Collection = loader.Collection; + /// + /// Объект для определения типов полей в компендиумах PF2E. + /// public CompendiumSchemaTypeResolver Resolver = new(); + /// + /// Схемы данных по папкам. + /// public Dictionary PackSchemas = []; + /// + /// Схемы данных по типам. + /// public Dictionary TypeSchemas = []; - + /// + /// Получение набора схем, к которым относится проверяемый объект. + /// + /// Папка компендиума, в которой находится объект. + /// Указанный тип объекта. + /// protected List GetItemSchemas(CompendiumFolder folder, string? itemType) { if (!PackSchemas.ContainsKey(folder)) @@ -47,6 +66,9 @@ namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium return [PackSchemas[folder], TypeSchemas[key]]; } + /// + /// Построение схем данных. + /// public void BuildSchemas() { Console.WriteLine("Building schemas..."); @@ -90,6 +112,10 @@ namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium bar.Refresh(Loader.ItemCount, "Done!"); } + /// + /// Сохранение данных. + /// + /// Папка для сохранения. public void Save(string targetDir) { Console.WriteLine("Dumping schemas..."); @@ -127,6 +153,12 @@ namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium Console.WriteLine("Done!"); } + /// + /// Сохранение конкретной схемы. + /// + /// Корневая папка для сохранения этой категории схем. + /// Название сохраняемой схемы. + /// Сохраняемая схема. protected void SaveSchema(string dir, string name, SchemaNode schema) { var invalids = System.IO.Path.GetInvalidFileNameChars(); @@ -134,7 +166,6 @@ namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium var path = Path.Combine(dir, fileName + ".txt"); - var dirPath = Path.GetDirectoryName(path); if (!Directory.Exists(dirPath)) diff --git a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/CompendiumLoader.cs b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/CompendiumLoader.cs index 1a55870..bd48d00 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/CompendiumLoader.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/CompendiumLoader.cs @@ -1,22 +1,39 @@ -using System.Reflection.PortableExecutable; -using System.Text.RegularExpressions; -using Konsole; -using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Linq; using Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium; -using Pf2eDataScrapper.SchemaBuilder; namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry { - internal class CompendiumLoader(Pf2eFoundryImporter importer) + /// + /// Загрузчик данных компендиума + /// + /// Импортёр + internal class CompendiumLoader(Pf2EFoundryImporter importer) { - public readonly Pf2eFoundryImporter Importer = importer; + /// + /// Импортёр + /// + public readonly Pf2EFoundryImporter Importer = importer; + /// + /// Набор папок компендиума + /// public CompendiumFolderCollection Collection = []; + /// + /// Счётчик папок + /// private int _folderCount = 0; + /// + /// Общее количество элементов в компендиуме + /// public int ItemCount { get; protected set; } = 0; + /// + /// Обработка папок компендиума в поле `packFolders`. + /// + /// + /// protected void ProcessPackFolders(JArray folders, CompendiumFolder? parent) { foreach (var token in folders) @@ -53,6 +70,9 @@ namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry } } + /// + /// Подготовка набора папок компендиума + /// public void Prepare() { using var systemFile = new StreamReader(Path.Combine(Importer.Dir, "static", "system.json")); @@ -104,10 +124,5 @@ namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry Console.WriteLine($"Total items: {ItemCount}"); } - - public void Run() - { - this.Prepare(); - } } } diff --git a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Pf2eFoundryImporter.cs b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Pf2eFoundryImporter.cs index e165b03..04b68b6 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Pf2eFoundryImporter.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Pf2eFoundryImporter.cs @@ -1,43 +1,52 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry +namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry { - internal class Pf2eFoundryImporter : AbstractImporter + /// + /// Импортёр для модуля Pf2e FoundryVTT. + /// + internal class Pf2EFoundryImporter : AbstractImporter { /// - /// Отображаемое имя импортёра + /// Отображаемое имя импортёра. /// public override string Name => "Pf2e FoundryVTT module"; /// - /// Короткое имя импортёра + /// Короткое имя импортёра. /// public override string Slug => "pf2e"; /// - /// Ссылка на git-репозиторий для клонирования + /// Ссылка на git-репозиторий для клонирования. /// public override string GitUrl => "https://github.com/foundryvtt/pf2e.git"; + /// + /// Загрузчик данных компендиума. + /// public CompendiumLoader Loader { get; } - public Pf2eFoundryImporter() + /// + /// Конструктор импортёра. + /// + public Pf2EFoundryImporter() { Loader = new CompendiumLoader(this); } + /// + /// Метод подготовки данных для импорта. + /// public override void Prepare() { Loader.Prepare(); } + /// + /// Импорт данных. + /// public override void Import() { - Loader.Run(); + Loader.Prepare(); } } } diff --git a/Pf2eDataScrapper/Program.cs b/Pf2eDataScrapper/Program.cs index d913a59..a7b09d2 100644 --- a/Pf2eDataScrapper/Program.cs +++ b/Pf2eDataScrapper/Program.cs @@ -9,10 +9,10 @@ EnvSettings.Load(); Console.WriteLine("Hello, World!"); -//var loader = new GitLoader(EnvSettings.DataDirPath); +//var loader = new GitLoader(EnvSettings.RepositoryDirPath); -var importer = new Pf2eFoundryImporter(); +var importer = new Pf2EFoundryImporter(); //loader.UpdateImporter(importer); diff --git a/Pf2eDataScrapper/SchemaBuilder/Types/AbstractSchemaType.cs b/Pf2eDataScrapper/SchemaBuilder/Types/AbstractSchemaType.cs index 0834703..e5b6ea1 100644 --- a/Pf2eDataScrapper/SchemaBuilder/Types/AbstractSchemaType.cs +++ b/Pf2eDataScrapper/SchemaBuilder/Types/AbstractSchemaType.cs @@ -55,8 +55,7 @@ namespace Pf2eDataScrapper.SchemaBuilder.Types { return $"{GetTypeName()} {Parent.Path}"; } - - + /// /// Отступ для строкового представления. ///