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();
}