diff --git a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumSchemaTypeResolver.cs b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumSchemaTypeResolver.cs index ced8c1e..14d08d3 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumSchemaTypeResolver.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/Compendium/CompendiumSchemaTypeResolver.cs @@ -39,10 +39,17 @@ namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium "Item.spell.system.heightening.levels.[value].damage", "Item.spell.system.overlays", "Item.spell.system.overlays.[value].system.damage", - "Item.spell.system.overlays.[value].system.heightening" + "Item.spell.system.overlays.[value].system.heightening", + "Item.spell.system.overlays.[value].system.heightening.[value]" ]; - public override AbstractSchemaType Resolve(SchemaNode node, JToken? value) + /// + /// Частное определение типа поля. + /// + /// Поле схемы данных, для которого создаётся тип. + /// Добавляемое значение. + /// Новый тип для схемы данных. `null`, что бы использовать значение по умолчанию + protected override AbstractSchemaType? CustomResolve(SchemaNode node, JToken? value) { if (CheckPath(node, DictionaryPaths)) { @@ -54,7 +61,7 @@ namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium return new FoundryRulesSchemaType(node); } - return base.Resolve(node, value); + return null; } } } diff --git a/Pf2eDataScrapper/SchemaBuilder/SchemaNode.cs b/Pf2eDataScrapper/SchemaBuilder/SchemaNode.cs index ba41f25..f628d17 100644 --- a/Pf2eDataScrapper/SchemaBuilder/SchemaNode.cs +++ b/Pf2eDataScrapper/SchemaBuilder/SchemaNode.cs @@ -103,8 +103,18 @@ namespace Pf2eDataScrapper.SchemaBuilder } var newType = Resolver.Resolve(this, value); - newType.AddValue(value); - Types.Add(newType); + + if (newType.IsCompatibleValue(value)) + { + Types.Add(newType); + newType.AddValue(value); + } + else + { + var fallbackType = Resolver.Resolve(this, value, true); + Types.Add(fallbackType); + fallbackType.AddValue(value); + } } /// diff --git a/Pf2eDataScrapper/SchemaBuilder/TypeResolver.cs b/Pf2eDataScrapper/SchemaBuilder/TypeResolver.cs index d80266b..4ed3eb5 100644 --- a/Pf2eDataScrapper/SchemaBuilder/TypeResolver.cs +++ b/Pf2eDataScrapper/SchemaBuilder/TypeResolver.cs @@ -58,23 +58,45 @@ namespace Pf2eDataScrapper.SchemaBuilder return value.Type; } + /// + /// Частное определение типа поля. + /// + /// Поле схемы данных, для которого создаётся тип. + /// Добавляемое значение. + /// Новый тип для схемы данных. `null`, что бы использовать значение по умолчанию + protected virtual AbstractSchemaType? CustomResolve(SchemaNode node, JToken? value) + { + return null; + } + /// /// Определение типа поля. /// /// Поле схемы данных, для которого создаётся тип. /// Добавляемое значение. + /// Добавляемое значение. /// Новый тип для схемы данных /// /// Возникает, если у `value` значение идентично `null` /// (такие значения должны обрабаотываться в `SchemaNode`). /// - public virtual AbstractSchemaType Resolve(SchemaNode node, JToken? value) + public AbstractSchemaType Resolve(SchemaNode node, JToken? value, bool disableResolve) { + if (!disableResolve) + { + var customType = this.CustomResolve(node, value); + + if (customType is not null) + { + return customType; + } + } + var type = TokenType(value); if (type == JTokenType.Null) { - throw new ArgumentNullException(); + throw new ArgumentNullException(nameof(value)); } return type switch @@ -85,5 +107,19 @@ namespace Pf2eDataScrapper.SchemaBuilder }; } + /// + /// Определение типа поля. + /// + /// Поле схемы данных, для которого создаётся тип. + /// Добавляемое значение. + /// Новый тип для схемы данных + /// + /// Возникает, если у `value` значение идентично `null` + /// (такие значения должны обрабаотываться в `SchemaNode`). + /// + public AbstractSchemaType Resolve(SchemaNode node, JToken? value) + { + return this.Resolve(node, value, false); + } } } diff --git a/Pf2eDataScrapper/SchemaBuilder/Types/DictionarySchemaType.cs b/Pf2eDataScrapper/SchemaBuilder/Types/DictionarySchemaType.cs index 4a49d73..fb3e008 100644 --- a/Pf2eDataScrapper/SchemaBuilder/Types/DictionarySchemaType.cs +++ b/Pf2eDataScrapper/SchemaBuilder/Types/DictionarySchemaType.cs @@ -69,8 +69,8 @@ namespace Pf2eDataScrapper.SchemaBuilder.Types { return string.Join("\n" + Tab, [ base.ToString(), - "Key:" + Indent(KeyNode.ToString()), - "Value:" + Indent(ItemNode.ToString()) + "#key : " + Indent(KeyNode.ToString()), + "#value : " + Indent(ItemNode.ToString()) ]); } } diff --git a/Pf2eDataScrapper/SchemaBuilder/Types/StaticSchemaType.cs b/Pf2eDataScrapper/SchemaBuilder/Types/StaticSchemaType.cs index 4ad0fe7..d750709 100644 --- a/Pf2eDataScrapper/SchemaBuilder/Types/StaticSchemaType.cs +++ b/Pf2eDataScrapper/SchemaBuilder/Types/StaticSchemaType.cs @@ -94,7 +94,7 @@ namespace Pf2eDataScrapper.SchemaBuilder.Types result += $" ({count} different values)"; - if (count is > ElementLimit or <= 0) + if (count is > ElementLimit or <= 0 || (Type == JTokenType.String && Values.Any(s => s.ToString().Contains('\n')))) { return result.Trim(); }