Глобальный рефакторинг пространств имён

This commit is contained in:
2025-10-02 13:29:30 +04:00
parent d23d81fb53
commit 2fa94851cb
3176 changed files with 27146 additions and 30584 deletions
@@ -0,0 +1,121 @@
using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json.Linq;
using Pf2e.Scrapper.Helpers;
using Pf2e.Scrapper.Importers;
using Pf2e.Scrapper.Processors.Definitions;
namespace Pf2e.Scrapper.SchemaBuilder;
internal abstract class AbstractSchemaBuildProcessor : IProcessor
{
/// <summary>
/// Связаный компендиум
/// </summary>
protected abstract AbstractCompendium Compendium { get; }
/// <inheritdoc cref="ProcessProgress"/>
protected abstract ProcessProgress Progress { get; }
/// <summary>
/// Определитель типов данных.
/// </summary>
protected abstract TypeResolver Resolver { get; }
/// <summary>
/// Путь к каталогу для сохранения вывода.
/// </summary>
protected abstract string SavePath { get; }
/// <summary>
/// Набор схем данных.
/// </summary>
protected Dictionary<string, SchemaNode> Schemas { get; } = [];
/// <summary>
/// Получить список названий элементов структуры данных на основе вводимого элемента.
/// </summary>
/// <param name="item">Вводимый элемент</param>
/// <returns>Коллекция названий элементов структуры данных/</returns>
protected abstract ICollection<string> GetSchemaNodes(AbstractCompendiumItem item);
/// <summary>
/// Построение схемы данных.
/// </summary>
public void Process()
{
Progress.Local.Reset(Compendium.Count());
foreach ((AbstractCompendiumItem reference, JObject json) in Compendium.Iterate())
{
Progress.Local.Start(reference.ToString());
foreach (string nodeName in GetSchemaNodes(reference))
{
if (!Schemas.TryGetValue(nodeName, out SchemaNode? node))
{
node = new() { Path = nodeName, Resolver = Resolver };
Schemas.Add(nodeName, node);
}
node.AddValue(json);
}
Progress.Local.End();
}
Progress.Local.Complete();
}
/// <summary>
/// Сохранение постренных схем данных.
/// </summary>
public void Save()
{
string targetDir = SavePath;
foreach (KeyValuePair<string, SchemaNode> kvp in Schemas)
{
SaveSchema(targetDir, kvp.Key, kvp.Value);
}
}
/// <summary>
/// Сохранение отдельной схемы данных.
/// </summary>
/// <param name="dir">Целевой каталог.</param>
/// <param name="name">Название схемы.</param>
/// <param name="schema">Сохраняемая схема.</param>
protected void SaveSchema(string dir, string name, SchemaNode schema)
{
char[] invalids = Path.GetInvalidFileNameChars();
string fileName = string.Join(
"_",
schema.Path.Split(invalids, StringSplitOptions.RemoveEmptyEntries)
)
.TrimEnd('.');
string path = Path.Combine(dir, fileName + ".yaml");
string? dirPath = Path.GetDirectoryName(path);
if (dirPath is not null && !Directory.Exists(dirPath))
{
Directory.CreateDirectory(dirPath);
}
using StreamWriter writer = new(path);
schema.Beautify();
writer.WriteLine(
SchemaNode.FormatYaml(
new Dictionary<string, string>()
{
["name"] = name,
["values"] = schema.Values.ToString(),
},
schema.Types[0].GetYamlData()
)
);
}
}