diff --git a/SabreTools.Library/DatFiles/Listxml.cs b/SabreTools.Library/DatFiles/Listxml.cs index dd83c0d2..8f702330 100644 --- a/SabreTools.Library/DatFiles/Listxml.cs +++ b/SabreTools.Library/DatFiles/Listxml.cs @@ -995,16 +995,7 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("mame"); xtw.WriteAttributeString("build", Header.Name); - switch (Header.Debug) - { - case true: - xtw.WriteAttributeString("debug", "yes"); - break; - case false: - xtw.WriteAttributeString("debug", "no"); - break; - } - + xtw.WriteOptionalAttributeString("debug", Header.Debug.FromYesNo()); xtw.WriteOptionalAttributeString("mameconfig", Header.MameConfig); xtw.Flush(); diff --git a/SabreTools.Library/DatFiles/Logiqx.cs b/SabreTools.Library/DatFiles/Logiqx.cs index 93536fa4..fb18c0f3 100644 --- a/SabreTools.Library/DatFiles/Logiqx.cs +++ b/SabreTools.Library/DatFiles/Logiqx.cs @@ -761,39 +761,23 @@ namespace SabreTools.Library.DatFiles xtw.WriteDocType("datafile", "-//Logiqx//DTD ROM Management Datafile//EN", "http://www.logiqx.com/Dats/datafile.dtd", null); xtw.WriteStartElement("datafile"); - xtw.WriteOptionalAttributeString("build", Header.Build); - switch (Header.Debug) - { - case true: - xtw.WriteAttributeString("debug", "yes"); - break; - case false: - xtw.WriteAttributeString("debug", "no"); - break; - } + xtw.WriteOptionalAttributeString("debug", Header.Debug.FromYesNo()); xtw.WriteStartElement("header"); - xtw.WriteElementString("name", Header.Name); - xtw.WriteElementString("description", Header.Description); - if (!string.IsNullOrWhiteSpace(Header.RootDir)) - xtw.WriteElementString("rootdir", Header.RootDir); - if (!string.IsNullOrWhiteSpace(Header.Category)) - xtw.WriteElementString("category", Header.Category); - xtw.WriteElementString("version", Header.Version); - if (!string.IsNullOrWhiteSpace(Header.Date)) - xtw.WriteElementString("date", Header.Date); - xtw.WriteElementString("author", Header.Author); - if (!string.IsNullOrWhiteSpace(Header.Email)) - xtw.WriteElementString("email", Header.Email); - if (!string.IsNullOrWhiteSpace(Header.Homepage)) - xtw.WriteElementString("homepage", Header.Homepage); - if (!string.IsNullOrWhiteSpace(Header.Url)) - xtw.WriteElementString("url", Header.Url); - if (!string.IsNullOrWhiteSpace(Header.Comment)) - xtw.WriteElementString("comment", Header.Comment); - if (!string.IsNullOrWhiteSpace(Header.Type)) - xtw.WriteElementString("type", Header.Type); + + xtw.WriteFullElementString("name", Header.Name); + xtw.WriteFullElementString("description", Header.Description); + xtw.WriteOptionalElementString("rootdir", Header.RootDir); + xtw.WriteOptionalElementString("category", Header.Category); + xtw.WriteFullElementString("version", Header.Version); + xtw.WriteOptionalElementString("date", Header.Date); + xtw.WriteFullElementString("author", Header.Author); + xtw.WriteOptionalElementString("email", Header.Email); + xtw.WriteOptionalElementString("homepage", Header.Homepage); + xtw.WriteOptionalElementString("url", Header.Url); + xtw.WriteOptionalElementString("comment", Header.Comment); + xtw.WriteOptionalElementString("type", Header.Type); if (Header.ForcePacking != PackingFlag.None || Header.ForceMerging != MergingFlag.None @@ -979,21 +963,21 @@ namespace SabreTools.Library.DatFiles { xtw.WriteStartElement("trurip"); - xtw.WriteOptionalAttributeString("titleid", datItem.Machine.TitleID); - xtw.WriteOptionalAttributeString("publisher", datItem.Machine.Publisher); - xtw.WriteOptionalAttributeString("developer", datItem.Machine.Developer); - xtw.WriteOptionalAttributeString("year", datItem.Machine.Year); - xtw.WriteOptionalAttributeString("genre", datItem.Machine.Genre); - xtw.WriteOptionalAttributeString("subgenre", datItem.Machine.Subgenre); - xtw.WriteOptionalAttributeString("ratings", datItem.Machine.Ratings); - xtw.WriteOptionalAttributeString("score", datItem.Machine.Score); - xtw.WriteOptionalAttributeString("players", datItem.Machine.Players); - xtw.WriteOptionalAttributeString("enabled", datItem.Machine.Enabled); - xtw.WriteOptionalAttributeString("titleid", datItem.Machine.TitleID); - xtw.WriteOptionalAttributeString("crc", datItem.Machine.HasCrc.FromYesNo()); - xtw.WriteOptionalAttributeString("source", datItem.Machine.SourceFile); - xtw.WriteOptionalAttributeString("cloneof", datItem.Machine.CloneOf); - xtw.WriteOptionalAttributeString("relatedto", datItem.Machine.RelatedTo); + xtw.WriteOptionalElementString("titleid", datItem.Machine.TitleID); + xtw.WriteOptionalElementString("publisher", datItem.Machine.Publisher); + xtw.WriteOptionalElementString("developer", datItem.Machine.Developer); + xtw.WriteOptionalElementString("year", datItem.Machine.Year); + xtw.WriteOptionalElementString("genre", datItem.Machine.Genre); + xtw.WriteOptionalElementString("subgenre", datItem.Machine.Subgenre); + xtw.WriteOptionalElementString("ratings", datItem.Machine.Ratings); + xtw.WriteOptionalElementString("score", datItem.Machine.Score); + xtw.WriteOptionalElementString("players", datItem.Machine.Players); + xtw.WriteOptionalElementString("enabled", datItem.Machine.Enabled); + xtw.WriteOptionalElementString("titleid", datItem.Machine.TitleID); + xtw.WriteOptionalElementString("crc", datItem.Machine.HasCrc.FromYesNo()); + xtw.WriteOptionalElementString("source", datItem.Machine.SourceFile); + xtw.WriteOptionalElementString("cloneof", datItem.Machine.CloneOf); + xtw.WriteOptionalElementString("relatedto", datItem.Machine.RelatedTo); // End trurip xtw.WriteEndElement(); @@ -1100,8 +1084,7 @@ namespace SabreTools.Library.DatFiles var rom = datItem as Rom; xtw.WriteStartElement("rom"); xtw.WriteAttributeString("name", rom.Name); - if (rom.Size != -1) - xtw.WriteAttributeString("size", rom.Size.ToString()); + if (rom.Size != -1) xtw.WriteAttributeString("size", rom.Size.ToString()); xtw.WriteOptionalAttributeString("crc", rom.CRC.ToLowerInvariant()); xtw.WriteOptionalAttributeString("md5", rom.MD5.ToLowerInvariant()); #if NET_FRAMEWORK diff --git a/SabreTools.Library/DatFiles/OfflineList.cs b/SabreTools.Library/DatFiles/OfflineList.cs index 39953bb5..207b2afa 100644 --- a/SabreTools.Library/DatFiles/OfflineList.cs +++ b/SabreTools.Library/DatFiles/OfflineList.cs @@ -773,11 +773,11 @@ namespace SabreTools.Library.DatFiles xtw.WriteAttributeString("noNamespaceSchemaLocation", "xsi", "datas.xsd"); xtw.WriteStartElement("configuration"); - xtw.WriteElementString("datName", Header.Name); + xtw.WriteFullElementString("datName", Header.Name); xtw.WriteElementString("datVersion", Items.TotalCount.ToString()); - xtw.WriteElementString("system", Header.System ?? string.Empty); - xtw.WriteElementString("screenshotsWidth", Header.ScreenshotsWidth ?? string.Empty); - xtw.WriteElementString("screenshotsHeight", Header.ScreenshotsHeight ?? string.Empty); + xtw.WriteFullElementString("system", Header.System); + xtw.WriteFullElementString("screenshotsWidth", Header.ScreenshotsWidth); + xtw.WriteFullElementString("screenshotsHeight", Header.ScreenshotsHeight); if (Header.Infos != null) { @@ -810,14 +810,14 @@ namespace SabreTools.Library.DatFiles } xtw.WriteStartElement("newDat"); - xtw.WriteElementString("datVersionURL", Header.Url); + xtw.WriteFullElementString("datVersionURL", Header.Url); xtw.WriteStartElement("datUrl"); xtw.WriteAttributeString("fileName", $"{Header.FileName}.zip"); xtw.WriteString(Header.Url); xtw.WriteEndElement(); - xtw.WriteElementString("imURL", Header.Url); + xtw.WriteFullElementString("imURL", Header.Url); // End newDat xtw.WriteEndElement(); @@ -863,7 +863,7 @@ namespace SabreTools.Library.DatFiles // End search xtw.WriteEndElement(); - xtw.WriteElementString("romTitle", Header.RomTitle ?? "%u - %n"); + xtw.WriteFullElementString("romTitle", Header.RomTitle ?? "%u - %n"); // End configuration xtw.WriteEndElement(); @@ -903,16 +903,16 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("game"); xtw.WriteElementString("imageNumber", "1"); xtw.WriteElementString("releaseNumber", "1"); - xtw.WriteElementString("title", datItem.Name ?? string.Empty); + xtw.WriteFullElementString("title", datItem.Name); xtw.WriteElementString("saveType", "None"); if (datItem.ItemType == ItemType.Rom) { var rom = datItem as Rom; - xtw.WriteElementString("romSize", rom.Size.ToString() ?? string.Empty); + xtw.WriteFullElementString("romSize", rom.Size.ToString()); } - xtw.WriteElementString("publisher", datItem.Machine.Publisher ?? string.Empty); + xtw.WriteFullElementString("publisher", datItem.Machine.Publisher); xtw.WriteElementString("location", "0"); xtw.WriteElementString("sourceRom", "None"); xtw.WriteElementString("language", "0"); @@ -973,8 +973,8 @@ namespace SabreTools.Library.DatFiles xtw.WriteElementString("im1CRC", "00000000"); xtw.WriteElementString("im2CRC", "00000000"); - xtw.WriteElementString("comment", datItem.Machine.Comment ?? string.Empty); - xtw.WriteElementString("duplicateID", datItem.Machine.CloneOf ?? string.Empty); + xtw.WriteFullElementString("comment", datItem.Machine.Comment); + xtw.WriteFullElementString("duplicateID", datItem.Machine.CloneOf); // End game xtw.WriteEndElement(); diff --git a/SabreTools.Library/DatFiles/OpenMSX.cs b/SabreTools.Library/DatFiles/OpenMSX.cs index 0859268e..6c5e007c 100644 --- a/SabreTools.Library/DatFiles/OpenMSX.cs +++ b/SabreTools.Library/DatFiles/OpenMSX.cs @@ -660,12 +660,12 @@ namespace SabreTools.Library.DatFiles // Build the state xtw.WriteStartElement("software"); - xtw.WriteElementString("title", datItem.Machine.Name); - xtw.WriteElementString("genmsxid", datItem.Machine.GenMSXID); - xtw.WriteElementString("system", datItem.Machine.System); - xtw.WriteElementString("company", datItem.Machine.Manufacturer); - xtw.WriteElementString("year", datItem.Machine.Year); - xtw.WriteElementString("country", datItem.Machine.Country); + xtw.WriteFullElementString("title", datItem.Machine.Name); + xtw.WriteFullElementString("genmsxid", datItem.Machine.GenMSXID); + xtw.WriteFullElementString("system", datItem.Machine.System); + xtw.WriteFullElementString("company", datItem.Machine.Manufacturer); + xtw.WriteFullElementString("year", datItem.Machine.Year); + xtw.WriteFullElementString("country", datItem.Machine.Country); xtw.Flush(); } @@ -740,35 +740,27 @@ namespace SabreTools.Library.DatFiles case OpenMSXSubType.Rom: case OpenMSXSubType.NULL: xtw.WriteStartElement("rom"); - xtw.WriteElementString("hash", rom.SHA1.ToLowerInvariant()); - if (!string.IsNullOrWhiteSpace(rom.Offset)) - xtw.WriteElementString("start", rom.Offset); - if (!string.IsNullOrWhiteSpace(rom.OpenMSXType)) - xtw.WriteElementString("type", rom.OpenMSXType); - if (!string.IsNullOrWhiteSpace(rom.Remark)) - xtw.WriteElementString("remark", rom.Remark); + xtw.WriteFullElementString("hash", rom.SHA1.ToLowerInvariant()); + xtw.WriteOptionalElementString("start", rom.Offset); + xtw.WriteOptionalElementString("type", rom.OpenMSXType); + xtw.WriteOptionalElementString("remark", rom.Remark); xtw.WriteEndElement(); break; case OpenMSXSubType.MegaRom: xtw.WriteStartElement("megarom"); - xtw.WriteElementString("hash", rom.SHA1.ToLowerInvariant()); - if (!string.IsNullOrWhiteSpace(rom.Offset)) - xtw.WriteElementString("start", rom.Offset); - if (!string.IsNullOrWhiteSpace(rom.OpenMSXType)) - xtw.WriteElementString("type", rom.OpenMSXType); - if (!string.IsNullOrWhiteSpace(rom.Remark)) - xtw.WriteElementString("remark", rom.Remark); + xtw.WriteFullElementString("hash", rom.SHA1.ToLowerInvariant()); + xtw.WriteOptionalElementString("start", rom.Offset); + xtw.WriteOptionalElementString("type", rom.OpenMSXType); + xtw.WriteOptionalElementString("remark", rom.Remark); xtw.WriteEndElement(); break; case OpenMSXSubType.SCCPlusCart: xtw.WriteStartElement("sccpluscart"); - if (!string.IsNullOrWhiteSpace(rom.Boot)) - xtw.WriteElementString("boot", rom.Boot); - xtw.WriteElementString("hash", rom.SHA1.ToLowerInvariant()); - if (!string.IsNullOrWhiteSpace(rom.Remark)) - xtw.WriteElementString("remark", rom.Remark); + xtw.WriteOptionalElementString("boot", rom.Boot); + xtw.WriteFullElementString("hash", rom.SHA1.ToLowerInvariant()); + xtw.WriteOptionalElementString("remark", rom.Remark); xtw.WriteEndElement(); break; } diff --git a/SabreTools.Library/DatFiles/SabreDat.cs b/SabreTools.Library/DatFiles/SabreDat.cs index 06bf3d97..cebbca8a 100644 --- a/SabreTools.Library/DatFiles/SabreDat.cs +++ b/SabreTools.Library/DatFiles/SabreDat.cs @@ -663,18 +663,14 @@ namespace SabreTools.Library.DatFiles xtw.WriteStartElement("header"); - xtw.WriteElementString("name", Header.Name); - xtw.WriteElementString("description", Header.Description); - if (!string.IsNullOrWhiteSpace(Header.RootDir)) - xtw.WriteElementString("rootdir", Header.RootDir); - if (!string.IsNullOrWhiteSpace(Header.Category)) - xtw.WriteElementString("category", Header.Category); - xtw.WriteElementString("version", Header.Version); - if (!string.IsNullOrWhiteSpace(Header.Date)) - xtw.WriteElementString("date", Header.Date); - xtw.WriteElementString("author", Header.Author); - if (!string.IsNullOrWhiteSpace(Header.Comment)) - xtw.WriteElementString("comment", Header.Comment); + xtw.WriteFullElementString("name", Header.Name); + xtw.WriteFullElementString("description", Header.Description); + xtw.WriteOptionalElementString("rootdir", Header.RootDir); + xtw.WriteOptionalElementString("category", Header.Category); + xtw.WriteFullElementString("version", Header.Version); + xtw.WriteOptionalElementString("date", Header.Date); + xtw.WriteFullElementString("author", Header.Author); + xtw.WriteOptionalElementString("comment", Header.Comment); if (!string.IsNullOrWhiteSpace(Header.Type) || Header.ForcePacking != PackingFlag.None || Header.ForceMerging != MergingFlag.None diff --git a/SabreTools.Library/DatFiles/SoftwareList.cs b/SabreTools.Library/DatFiles/SoftwareList.cs index 628b983b..3db0d920 100644 --- a/SabreTools.Library/DatFiles/SoftwareList.cs +++ b/SabreTools.Library/DatFiles/SoftwareList.cs @@ -820,10 +820,10 @@ namespace SabreTools.Library.DatFiles break; } - xtw.WriteOptionalAttributeString("description", datItem.Machine.Description); - xtw.WriteOptionalAttributeString("year", datItem.Machine.Year); - xtw.WriteOptionalAttributeString("publisher", datItem.Machine.Publisher); - xtw.WriteOptionalAttributeString("category", datItem.Machine.Category); + xtw.WriteOptionalElementString("description", datItem.Machine.Description); + xtw.WriteOptionalElementString("year", datItem.Machine.Year); + xtw.WriteOptionalElementString("publisher", datItem.Machine.Publisher); + xtw.WriteOptionalElementString("category", datItem.Machine.Category); if (datItem.Machine.Infos != null && datItem.Machine.Infos.Count > 0) { diff --git a/SabreTools.Library/IO/XmlTextWriterExtensions.cs b/SabreTools.Library/IO/XmlTextWriterExtensions.cs index e053f259..cf9b4b62 100644 --- a/SabreTools.Library/IO/XmlTextWriterExtensions.cs +++ b/SabreTools.Library/IO/XmlTextWriterExtensions.cs @@ -7,6 +7,21 @@ namespace SabreTools.Library.IO /// public static class XmlTextWriterExtensions { + // TODO: Rename Full to Required, add one for attributes + + /// + /// Force writing separate open and start tags, even for empty elements + /// + /// XmlTextWriter to write out with + /// Name of the element + /// Value to write in the element + public static void WriteFullElementString(this XmlTextWriter writer, string localName, string value) + { + writer.WriteStartElement(localName); + writer.WriteRaw(value ?? string.Empty); + writer.WriteFullEndElement(); + } + /// /// Write an attribute, if the value is not null or empty /// @@ -20,16 +35,15 @@ namespace SabreTools.Library.IO } /// - /// Force writing separate open and start tags, even for empty elements + /// Write an element, if the value is not null or empty /// /// XmlTextWriter to write out with /// Name of the element /// Value to write in the element - public static void WriteFullElementString(this XmlTextWriter writer, string localName, string value) + public static void WriteOptionalElementString(this XmlTextWriter writer, string localName, string value) { - writer.WriteStartElement(localName); - writer.WriteRaw(value); - writer.WriteFullEndElement(); + if (string.IsNullOrEmpty(value)) + writer.WriteElementString(localName, value); } } } diff --git a/SabreTools.Library/Tools/Converters.cs b/SabreTools.Library/Tools/Converters.cs index 46056d78..efeea887 100644 --- a/SabreTools.Library/Tools/Converters.cs +++ b/SabreTools.Library/Tools/Converters.cs @@ -910,6 +910,8 @@ namespace SabreTools.Library.Tools #endif } + // TODO: Write From variants for all above + /// /// Get string value from input bool? ///