diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs
index 468b55f6..4408dec5 100644
--- a/SabreTools.Data.Extensions/MetadataExtensions.cs
+++ b/SabreTools.Data.Extensions/MetadataExtensions.cs
@@ -132,6 +132,8 @@ namespace SabreTools.Data.Extensions
cloneHeader.ForceNodump = selfHeader.ForceNodump;
cloneHeader.ForcePacking = selfHeader.ForcePacking;
cloneHeader.ForceZipping = selfHeader.ForceZipping;
+ cloneHeader.HeaderRow = selfHeader.HeaderRow;
+ cloneHeader.HeaderSkipper = selfHeader.HeaderSkipper;
cloneHeader.Homepage = selfHeader.Homepage;
cloneHeader.Id = selfHeader.Id;
cloneHeader.LockBiosMode = selfHeader.LockBiosMode;
diff --git a/SabreTools.Data.Models/Metadata/Header.cs b/SabreTools.Data.Models/Metadata/Header.cs
index c0b9c140..c0ef648a 100644
--- a/SabreTools.Data.Models/Metadata/Header.cs
+++ b/SabreTools.Data.Models/Metadata/Header.cs
@@ -44,6 +44,10 @@ namespace SabreTools.Data.Models.Metadata
/// (yes|no) "yes"
public bool? ForceZipping { get; set; }
+ public string[]? HeaderRow { get; set; }
+
+ public string? HeaderSkipper { get; set; }
+
public string? Homepage { get; set; }
public string? Id { get; set; }
@@ -100,9 +104,6 @@ namespace SabreTools.Data.Models.Metadata
[NoFilter]
public const string CanOpenKey = "canOpen";
- /// string, string[]
- public const string HeaderKey = "header";
-
/// TODO: This needs an internal model OR mapping to fields
/// Search
[NoFilter]
diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
index 7596bf62..32af8243 100644
--- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
+++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs
@@ -215,7 +215,8 @@ namespace SabreTools.Metadata.DatFiles.Test
ForceNodump = Data.Models.Metadata.NodumpFlag.Required,
ForcePacking = Data.Models.Metadata.PackingFlag.Zip,
ForceZipping = true,
- [Data.Models.Metadata.Header.HeaderKey] = "header",
+ HeaderRow = ["header"],
+ HeaderSkipper = "header",
Homepage = "homepage",
Id = "id",
[Data.Models.Metadata.Header.ImagesKey] = images,
@@ -1022,7 +1023,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.Equal(Data.Models.Metadata.NodumpFlag.Required, datHeader.ForceNodump);
Assert.Equal(Data.Models.Metadata.PackingFlag.Zip, datHeader.ForcePacking);
Assert.True(datHeader.ForceZipping);
- Assert.Equal("header", datHeader.ReadString(Data.Models.Metadata.Header.HeaderKey));
+ Assert.Equal("header", datHeader.HeaderSkipper);
Assert.Equal("homepage", datHeader.Homepage);
Assert.Equal("id", datHeader.Id);
Assert.NotNull(datHeader.ReadString(Data.Models.Metadata.Header.ImagesKey));
diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
index 4835d4c8..a8c224ef 100644
--- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
+++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs
@@ -367,7 +367,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.Equal(Data.Models.Metadata.NodumpFlag.Required, header.ForceNodump);
Assert.Equal(Data.Models.Metadata.PackingFlag.Zip, header.ForcePacking);
Assert.True(header.ForceZipping);
- Assert.Equal("header", header.ReadString(Data.Models.Metadata.Header.HeaderKey));
+ Assert.Equal("header", header.HeaderSkipper);
Assert.Equal("homepage", header.Homepage);
Assert.Equal("id", header.Id);
Assert.NotNull(header.Read(Data.Models.Metadata.Header.ImagesKey));
@@ -395,6 +395,11 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.Equal("type", header.Type);
Assert.Equal("url", header.Url);
Assert.Equal("version", header.Version);
+
+ string[]? headerRowTitles = header.HeaderRow;
+ Assert.NotNull(headerRowTitles);
+ string? headerRowTitle = Assert.Single(headerRowTitles);
+ Assert.Equal("header", headerRowTitle);
}
private static void ValidateMetadataMachine(Data.Models.Metadata.Machine machine)
diff --git a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs
index d47b7517..9bf8ef40 100644
--- a/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs
+++ b/SabreTools.Metadata.DatFiles/DatFile.FromMetadata.cs
@@ -120,8 +120,8 @@ namespace SabreTools.Metadata.DatFiles
Header.ForcePacking = header.ForcePacking;
if (Header.ForceZipping is null)
Header.ForceZipping = header.ForceZipping;
- if (Header.ReadString(Data.Models.Metadata.Header.HeaderKey) is null)
- Header.Write(Data.Models.Metadata.Header.HeaderKey, header.ReadString(Data.Models.Metadata.Header.HeaderKey));
+ if (Header.HeaderSkipper is null)
+ Header.HeaderSkipper = header.HeaderSkipper;
if (Header.Homepage is null)
Header.Homepage = header.Homepage;
if (Header.Id is null)
diff --git a/SabreTools.Metadata.DatFiles/DatHeader.cs b/SabreTools.Metadata.DatFiles/DatHeader.cs
index 0d5c4704..4f58cafb 100644
--- a/SabreTools.Metadata.DatFiles/DatHeader.cs
+++ b/SabreTools.Metadata.DatFiles/DatHeader.cs
@@ -127,6 +127,18 @@ namespace SabreTools.Metadata.DatFiles
set => _internal.ForceZipping = value;
}
+ public string[]? HeaderRow
+ {
+ get => _internal.HeaderRow;
+ set => _internal.HeaderRow = value;
+ }
+
+ public string? HeaderSkipper
+ {
+ get => _internal.HeaderSkipper;
+ set => _internal.HeaderSkipper = value;
+ }
+
public string? Homepage
{
get => _internal.Homepage;
diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs
index 26511e95..1d58d463 100644
--- a/SabreTools.Metadata.Filter/FilterObject.cs
+++ b/SabreTools.Metadata.Filter/FilterObject.cs
@@ -813,6 +813,10 @@ namespace SabreTools.Metadata.Filter
case Header item when fieldName == "forcezipping":
checkValue = item.ForceZipping.FromYesNo();
return true;
+ // Header.HeaderRow is intentionally skipped
+ case Header item when fieldName == "header" || fieldName == "headerskipper" || fieldName == "skipper":
+ checkValue = item.HeaderSkipper;
+ return true;
case Header item when fieldName == "homepage":
checkValue = item.Homepage;
return true;
diff --git a/SabreTools.Metadata/DictionaryBaseExtensions.cs b/SabreTools.Metadata/DictionaryBaseExtensions.cs
index ccf77fa3..5dff9136 100644
--- a/SabreTools.Metadata/DictionaryBaseExtensions.cs
+++ b/SabreTools.Metadata/DictionaryBaseExtensions.cs
@@ -204,6 +204,8 @@ namespace SabreTools.Metadata
return false;
if (selfHeader.ForceZipping != otherHeader.ForceZipping)
return false;
+ if (selfHeader.HeaderSkipper != otherHeader.HeaderSkipper)
+ return false;
if (selfHeader.Homepage != otherHeader.Homepage)
return false;
if (selfHeader.Id != otherHeader.Id)
diff --git a/SabreTools.Serialization.CrossModel/AttractMode.Deserializer.cs b/SabreTools.Serialization.CrossModel/AttractMode.Deserializer.cs
index c944385a..83db08db 100644
--- a/SabreTools.Serialization.CrossModel/AttractMode.Deserializer.cs
+++ b/SabreTools.Serialization.CrossModel/AttractMode.Deserializer.cs
@@ -33,7 +33,7 @@ namespace SabreTools.Serialization.CrossModel
{
var metadataFile = new MetadataFile
{
- Header = item.ReadStringArray(Data.Models.Metadata.Header.HeaderKey),
+ Header = item.HeaderRow,
};
return metadataFile;
}
diff --git a/SabreTools.Serialization.CrossModel/AttractMode.Serializer.cs b/SabreTools.Serialization.CrossModel/AttractMode.Serializer.cs
index d6552156..db50c734 100644
--- a/SabreTools.Serialization.CrossModel/AttractMode.Serializer.cs
+++ b/SabreTools.Serialization.CrossModel/AttractMode.Serializer.cs
@@ -32,7 +32,7 @@ namespace SabreTools.Serialization.CrossModel
{
var header = new Data.Models.Metadata.Header
{
- [Data.Models.Metadata.Header.HeaderKey] = item.Header,
+ HeaderRow = item.Header,
};
return header;
}
diff --git a/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs b/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs
index baad81f6..f4f87052 100644
--- a/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs
+++ b/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs
@@ -53,7 +53,7 @@ namespace SabreTools.Serialization.CrossModel
Homepage = item.Homepage,
Url = item.Url,
Comment = item.Comment,
- Header = item.ReadString(Data.Models.Metadata.Header.HeaderKey),
+ Header = item.HeaderSkipper,
Type = item.Type,
ForceMerging = item.ForceMerging,
ForceZipping = item.ForceZipping,
diff --git a/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs b/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs
index e86a4523..ba6663f2 100644
--- a/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs
+++ b/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs
@@ -45,7 +45,7 @@ namespace SabreTools.Serialization.CrossModel
Homepage = item.Homepage,
Url = item.Url,
Comment = item.Comment,
- [Data.Models.Metadata.Header.HeaderKey] = item.Header,
+ HeaderSkipper = item.Header,
Type = item.Type,
ForceMerging = item.ForceMerging,
ForceZipping = item.ForceZipping,
diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs
index bd08976b..7bf85575 100644
--- a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs
+++ b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs
@@ -56,16 +56,14 @@ namespace SabreTools.Serialization.CrossModel
Type = item.Type,
};
- string? headerVal = item.ReadString(Data.Models.Metadata.Header.HeaderKey);
-
- if (headerVal is not null
+ if (item.HeaderSkipper is not null
|| item.ForceMerging is not Data.Models.Metadata.MergingFlag.None
|| item.ForceNodump is not Data.Models.Metadata.NodumpFlag.None
|| item.ForcePacking is not Data.Models.Metadata.PackingFlag.None)
{
header.ClrMamePro = new Data.Models.Logiqx.ClrMamePro();
- if (headerVal is not null)
- header.ClrMamePro.Header = headerVal;
+ if (item.HeaderSkipper is not null)
+ header.ClrMamePro.Header = item.HeaderSkipper;
if (item.ForceMerging is not Data.Models.Metadata.MergingFlag.None)
header.ClrMamePro.ForceMerging = item.ForceMerging;
if (item.ForceNodump is not Data.Models.Metadata.NodumpFlag.None)
diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs
index 171d0ad3..97ce3a76 100644
--- a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs
+++ b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs
@@ -70,7 +70,7 @@ namespace SabreTools.Serialization.CrossModel
if (item.ClrMamePro is not null)
{
- header[Data.Models.Metadata.Header.HeaderKey] = item.ClrMamePro.Header;
+ header.HeaderSkipper = item.ClrMamePro.Header;
header.ForceMerging = item.ClrMamePro.ForceMerging;
header.ForceNodump = item.ClrMamePro.ForceNodump;
header.ForcePacking = item.ClrMamePro.ForcePacking;
diff --git a/SabreTools.Serialization.CrossModel/SeparatedValue.Deserializer.cs b/SabreTools.Serialization.CrossModel/SeparatedValue.Deserializer.cs
index 1b339120..5a261aa7 100644
--- a/SabreTools.Serialization.CrossModel/SeparatedValue.Deserializer.cs
+++ b/SabreTools.Serialization.CrossModel/SeparatedValue.Deserializer.cs
@@ -33,7 +33,7 @@ namespace SabreTools.Serialization.CrossModel
{
var metadataFile = new MetadataFile
{
- Header = item.ReadStringArray(Data.Models.Metadata.Header.HeaderKey),
+ Header = item.HeaderRow,
};
return metadataFile;
}
diff --git a/SabreTools.Serialization.CrossModel/SeparatedValue.Serializer.cs b/SabreTools.Serialization.CrossModel/SeparatedValue.Serializer.cs
index bd8c1729..23e53f73 100644
--- a/SabreTools.Serialization.CrossModel/SeparatedValue.Serializer.cs
+++ b/SabreTools.Serialization.CrossModel/SeparatedValue.Serializer.cs
@@ -32,7 +32,7 @@ namespace SabreTools.Serialization.CrossModel
{
var header = new Data.Models.Metadata.Header
{
- [Data.Models.Metadata.Header.HeaderKey] = item.Header,
+ HeaderRow = item.Header,
};
if (item.Row is not null && item.Row.Length > 0)