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