public void GenerateHtmlReport(string filename) { var stringWriter = new StringWriter(); // Put HtmlTextWriter in using block because it needs to call Dispose. using (var writer = new HtmlTextWriter(stringWriter)) { #region header writer.BeginDocument("Component Item Report", @" body { background-color: #E6E6FA } h1 { font-family: Arial, Helvetica, sans-serif; } table { background-color: #FFFFFF; } table tr td { font-family: Arial, Helvetica, sans-serif; font-size: small; line-height: normal; color: #000000; } table thead td { background-color: #BABDD6; font-weight: bold; Color: #000000; } td.right { text-align: right; }"); #endregion #region Cubes writer.RenderElement(HtmlTextWriterTag.H1, "Cubes"); writer.BeginTable("1", "3", "0", new[] { "Icon", "Name", "Type Id", "Sub Type Id", "Cube Size", "Accessible", "Size (W×H×D)", "Mass (Kg)", "Build Time (h:m:s)" }); foreach (var asset in CubeAssets) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); if (asset.TextureFile != null && File.Exists(asset.TextureFile)) { writer.AddAttribute(HtmlTextWriterAttribute.Src, "data:image/png;base64," + ImageTextureUtil.GetTextureToBase64(asset.TextureFile, 32, 32)); writer.AddAttribute(HtmlTextWriterAttribute.Width, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Height, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Alt, Path.GetFileNameWithoutExtension(asset.TextureFile)); writer.RenderBeginTag(HtmlTextWriterTag.Img); writer.RenderEndTag(); } writer.RenderEndTag(); // Td writer.RenderElement(HtmlTextWriterTag.Td, asset.FriendlyName); writer.RenderElement(HtmlTextWriterTag.Td, asset.TypeId); writer.RenderElement(HtmlTextWriterTag.Td, asset.SubtypeId); writer.RenderElement(HtmlTextWriterTag.Td, asset.CubeSize); writer.RenderElement(HtmlTextWriterTag.Td, new EnumToResouceConverter().Convert(asset.Accessible, typeof(string), null, CultureInfo.CurrentUICulture)); writer.RenderElement(HtmlTextWriterTag.Td, "{0}×{1}×{2}", asset.Size.Width, asset.Size.Height, asset.Size.Depth); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.00}", asset.Mass); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:hh\\:mm\\:ss\\.ff}", asset.Time); writer.RenderEndTag(); // Tr } writer.RenderEndTag(); // Table #endregion #region Components writer.RenderElement(HtmlTextWriterTag.H1, "Components"); writer.BeginTable("1", "3", "0", new[] { "Icon", "Name", "Type Id", "Sub Type Id", "Accessible", "Mass (Kg)", "Volume (L)", "Build Time (h:m:s)" }); foreach (var asset in ComponentAssets) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); if (asset.TextureFile != null && File.Exists(asset.TextureFile)) { writer.AddAttribute(HtmlTextWriterAttribute.Src, "data:image/png;base64," + ImageTextureUtil.GetTextureToBase64(asset.TextureFile, 32, 32)); writer.AddAttribute(HtmlTextWriterAttribute.Width, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Height, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Alt, Path.GetFileNameWithoutExtension(asset.TextureFile)); writer.RenderBeginTag(HtmlTextWriterTag.Img); writer.RenderEndTag(); } writer.RenderEndTag(); // Td writer.RenderElement(HtmlTextWriterTag.Td, asset.FriendlyName); writer.RenderElement(HtmlTextWriterTag.Td, asset.TypeId); writer.RenderElement(HtmlTextWriterTag.Td, asset.SubtypeId); writer.RenderElement(HtmlTextWriterTag.Td, new EnumToResouceConverter().Convert(asset.Accessible, typeof(string), null, CultureInfo.CurrentUICulture)); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.00}", asset.Mass); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.00}", asset.Volume); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:hh\\:mm\\:ss\\.ff}", asset.Time); writer.RenderEndTag(); // Tr } writer.RenderEndTag(); // Table #endregion #region Items writer.RenderElement(HtmlTextWriterTag.H1, "Items"); writer.BeginTable("1", "3", "0", new[] { "Icon", "Name", "Type Id", "Sub Type Id", "Accessible", "Mass (Kg)", "Volume (L)", "Build Time (h:m:s)" }); foreach (var asset in ItemAssets) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); if (asset.TextureFile != null && File.Exists(asset.TextureFile)) { writer.AddAttribute(HtmlTextWriterAttribute.Src, "data:image/png;base64," + ImageTextureUtil.GetTextureToBase64(asset.TextureFile, 32, 32)); writer.AddAttribute(HtmlTextWriterAttribute.Width, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Height, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Alt, Path.GetFileNameWithoutExtension(asset.TextureFile)); writer.RenderBeginTag(HtmlTextWriterTag.Img); writer.RenderEndTag(); } writer.RenderEndTag(); // Td writer.RenderElement(HtmlTextWriterTag.Td, asset.FriendlyName); writer.RenderElement(HtmlTextWriterTag.Td, asset.TypeId); writer.RenderElement(HtmlTextWriterTag.Td, asset.SubtypeId); writer.RenderElement(HtmlTextWriterTag.Td, new EnumToResouceConverter().Convert(asset.Accessible, typeof(string), null, CultureInfo.CurrentUICulture)); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.00}", asset.Mass); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.00}", asset.Volume); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:hh\\:mm\\:ss\\.ff}", asset.Time); writer.RenderEndTag(); // Tr } writer.RenderEndTag(); // Table #endregion #region Materials writer.RenderElement(HtmlTextWriterTag.H1, "Materials"); writer.BeginTable("1", "3", "0", new[] { "Texture", "Name", "Ore Name", "Rare", "Mined Ore Ratio" }); foreach (var asset in MaterialAssets) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); if (asset.TextureFile != null && File.Exists(asset.TextureFile)) { writer.AddAttribute(HtmlTextWriterAttribute.Src, "data:image/png;base64," + ImageTextureUtil.GetTextureToBase64(asset.TextureFile, 32, 32, true)); writer.AddAttribute(HtmlTextWriterAttribute.Width, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Height, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Alt, Path.GetFileNameWithoutExtension(asset.TextureFile)); writer.RenderBeginTag(HtmlTextWriterTag.Img); writer.RenderEndTag(); } writer.RenderEndTag(); // Td writer.RenderElement(HtmlTextWriterTag.Td, asset.Name); writer.RenderElement(HtmlTextWriterTag.Td, asset.OreName); writer.RenderElement(HtmlTextWriterTag.Td, new EnumToResouceConverter().Convert(asset.IsRare, typeof(string), null, CultureInfo.CurrentUICulture)); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.00}", asset.MineOreRatio); writer.RenderEndTag(); // Tr } writer.RenderEndTag(); // Table #endregion #region footer writer.EndDocument(); #endregion } // Write to disk. File.WriteAllText(filename, stringWriter.ToString()); }
internal string CreateHtmlReport() { var stringWriter = new StringWriter(); // Put HtmlTextWriter in using block because it needs to call Dispose. using (var writer = new HtmlTextWriter(stringWriter)) { #region header writer.BeginDocument(string.Format("Resource Report - {0}", _saveName), @" body { background-color: #F6F6FA } b { font-family: Arial, Helvetica, sans-serif; } p { font-family: Arial, Helvetica, sans-serif; } h1,h2,h3 { font-family: Arial, Helvetica, sans-serif; } table { background-color: #FFFFFF; } table tr td { font-family: Arial, Helvetica, sans-serif; font-size: small; line-height: normal; color: #000000; } table thead td { background-color: #BABDD6; font-weight: bold; Color: #000000; } td.right { text-align: right; }"); #endregion writer.RenderElement(HtmlTextWriterTag.H1, "Resource Report"); writer.RenderElement(HtmlTextWriterTag.P, "Save World: {0}", _saveName); writer.RenderElement(HtmlTextWriterTag.P, "Date: {0}", _generatedDate); #region In game resources writer.RenderElement(HtmlTextWriterTag.H2, "In game resources"); writer.RenderElement(HtmlTextWriterTag.P, "Everything is measured in its regressed state. Ie., how much ore was used/needed to build this item."); writer.RenderElement(HtmlTextWriterTag.H3, "Untouched Ore (Asteroids)"); writer.BeginTable("1", "3", "0", new[] { "Name", "Volume m³" }); foreach (var item in _untouchedOre) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderElement(HtmlTextWriterTag.Td, item.MaterialName); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Volume); writer.RenderEndTag(); // Tr } writer.EndTable(); writer.RenderElement(HtmlTextWriterTag.H3, "Unused Ore (Ore and Ingots, either floating or in containers)"); writer.BeginTable("1", "3", "0", new[] { "Name", "Mass Kg", "Volume L" }); foreach (var item in _unusedOre) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderElement(HtmlTextWriterTag.Td, item.FriendlyName); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Mass); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Volume); writer.RenderEndTag(); // Tr } writer.EndTable(); writer.RenderElement(HtmlTextWriterTag.H3, "Used Ore (in tools, items, components, cubes)"); writer.BeginTable("1", "3", "0", new[] { "Name", "Mass Kg", "Volume L" }); foreach (var item in _usedOre) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderElement(HtmlTextWriterTag.Td, item.FriendlyName); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Mass); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Volume); writer.RenderEndTag(); // Tr } writer.EndTable(); writer.RenderElement(HtmlTextWriterTag.H3, "Player Ore (Player inventories)"); writer.BeginTable("1", "3", "0", new[] { "Name", "Mass Kg", "Volume L" }); foreach (var item in _playerOre) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderElement(HtmlTextWriterTag.Td, item.FriendlyName); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Mass); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Volume); writer.RenderEndTag(); // Tr } writer.EndTable(); writer.RenderElement(HtmlTextWriterTag.H3, "NPC Ore (Controlled by NPC)"); writer.BeginTable("1", "3", "0", new[] { "Name", "Mass Kg", "Volume L" }); foreach (var item in _npcOre) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderElement(HtmlTextWriterTag.Td, item.FriendlyName); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Mass); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Volume); writer.RenderEndTag(); // Tr } writer.EndTable(); #endregion writer.RenderElement(HtmlTextWriterTag.Br); writer.RenderElement(HtmlTextWriterTag.Hr); #region In game assets writer.RenderElement(HtmlTextWriterTag.H2, "In game assets"); writer.RenderElement(HtmlTextWriterTag.P, "Counts of all current items in game Assets. These indicate actual time spent to construct, part construct or refine."); writer.RenderElement(HtmlTextWriterTag.H3, "All Cubes"); writer.BeginTable("1", "3", "0", new[] { "Icon", "Name", "Count", "Mass Kg", "Time" }); foreach (var item in _allCubes) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); if (item.TextureFile != null && File.Exists(item.TextureFile)) { writer.AddAttribute(HtmlTextWriterAttribute.Src, "data:image/png;base64," + ImageTextureUtil.GetTextureToBase64(item.TextureFile, 32, 32)); writer.AddAttribute(HtmlTextWriterAttribute.Width, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Height, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Alt, Path.GetFileNameWithoutExtension(item.TextureFile)); writer.RenderBeginTag(HtmlTextWriterTag.Img); writer.RenderEndTag(); } writer.RenderEndTag(); // Td writer.RenderElement(HtmlTextWriterTag.Td, item.FriendlyName); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0}", item.Count); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Mass); writer.RenderElement(HtmlTextWriterTag.Td, "{0}", item.Time); writer.RenderEndTag(); // Tr } writer.EndTable(); writer.RenderElement(HtmlTextWriterTag.H3, "All Components"); writer.BeginTable("1", "3", "0", new[] { "Icon", "Name", "Count", "Mass Kg", "Volume L", "Time" }); foreach (var item in _allComponents) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); if (item.TextureFile != null && File.Exists(item.TextureFile)) { writer.AddAttribute(HtmlTextWriterAttribute.Src, "data:image/png;base64," + ImageTextureUtil.GetTextureToBase64(item.TextureFile, 32, 32)); writer.AddAttribute(HtmlTextWriterAttribute.Width, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Height, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Alt, Path.GetFileNameWithoutExtension(item.TextureFile)); writer.RenderBeginTag(HtmlTextWriterTag.Img); writer.RenderEndTag(); } writer.RenderEndTag(); // Td writer.RenderElement(HtmlTextWriterTag.Td, item.FriendlyName); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0}", item.Count); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Mass); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Volume); writer.RenderElement(HtmlTextWriterTag.Td, "{0}", item.Time); writer.RenderEndTag(); // Tr } writer.EndTable(); writer.RenderElement(HtmlTextWriterTag.H3, "All Items"); writer.BeginTable("1", "3", "0", new[] { "Icon", "Name", "Count", "Mass Kg", "Volume L", "Time" }); foreach (var item in _allItems) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); if (item.TextureFile != null && File.Exists(item.TextureFile)) { writer.AddAttribute(HtmlTextWriterAttribute.Src, "data:image/png;base64," + ImageTextureUtil.GetTextureToBase64(item.TextureFile, 32, 32)); writer.AddAttribute(HtmlTextWriterAttribute.Width, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Height, "32"); writer.AddAttribute(HtmlTextWriterAttribute.Alt, Path.GetFileNameWithoutExtension(item.TextureFile)); writer.RenderBeginTag(HtmlTextWriterTag.Img); writer.RenderEndTag(); } writer.RenderEndTag(); // Td writer.RenderElement(HtmlTextWriterTag.Td, item.FriendlyName); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0}", item.Count); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Mass); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Volume); writer.RenderElement(HtmlTextWriterTag.Td, "{0}", item.Time); writer.RenderEndTag(); // Tr } writer.EndTable(); #endregion writer.RenderElement(HtmlTextWriterTag.Br); writer.RenderElement(HtmlTextWriterTag.Hr); writer.RenderElement(HtmlTextWriterTag.H2, "Resources breakdown"); #region Asteroid breakdown writer.RenderElement(HtmlTextWriterTag.H3, "Untouched Ores (Asteroids)"); writer.BeginTable("1", "3", "0", new[] { "Asteroid", "Position", "Ore name", "Volume m³" }); foreach (var asteroid in _untouchedOreByAsteroid) { var inx = 0; foreach (var item in asteroid.UntouchedOreList) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); if (inx == 0) { writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, asteroid.UntouchedOreList.Count.ToString(CultureInfo.InvariantCulture)); writer.RenderElement(HtmlTextWriterTag.Td, asteroid.Name); writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, asteroid.UntouchedOreList.Count.ToString(CultureInfo.InvariantCulture)); writer.RenderElement(HtmlTextWriterTag.Td, "{0},{1},{2}", asteroid.Position.X, asteroid.Position.Y, asteroid.Position.Z); } writer.RenderElement(HtmlTextWriterTag.Td, item.MaterialName); writer.AddAttribute(HtmlTextWriterAttribute.Class, "right"); writer.RenderElement(HtmlTextWriterTag.Td, "{0:#,##0.000}", item.Volume); writer.RenderEndTag(); // Tr inx++; } } writer.EndTable(); #endregion writer.RenderElement(HtmlTextWriterTag.Br); writer.RenderElement(HtmlTextWriterTag.Hr); #region Ship breakdown writer.BeginTable("1", "3", "0", new[] { "Ship", "EntityId", "Position", "Block Count" }); foreach (var ship in _allShips) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderElement(HtmlTextWriterTag.Td, ship.DisplayName); writer.RenderElement(HtmlTextWriterTag.Td, ship.EntityId); writer.RenderElement(HtmlTextWriterTag.Td, "{0},{1},{2}", ship.Position.X, ship.Position.Y, ship.Position.Z); writer.RenderElement(HtmlTextWriterTag.Td, ship.BlockCount); // TODO: more detail. writer.RenderEndTag(); // Tr } writer.EndTable(); #endregion writer.EndDocument(); } return stringWriter.ToString(); }