Глобальный рефакторинг пространств имён
This commit is contained in:
@@ -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()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user