changeset 497:cd367acd7c48

Re #419: Remove assumptions of a file-based install * Swap XSLTs to resources * Update XSL Exporter to use Streams, not files
author IBBoard <dev@ibboard.co.uk>
date Wed, 28 Nov 2012 20:24:36 +0000
parents 00d6cf940c3c
children 51123a620455
files API/Exporters/WarFoundryXMLWithXSLExporter.cs IBBoard.WarFoundry.API.csproj
diffstat 2 files changed, 206 insertions(+), 196 deletions(-) [+]
line wrap: on
line diff
--- a/API/Exporters/WarFoundryXMLWithXSLExporter.cs	Sat Sep 01 15:28:26 2012 +0100
+++ b/API/Exporters/WarFoundryXMLWithXSLExporter.cs	Wed Nov 28 20:24:36 2012 +0000
@@ -1,188 +1,198 @@
-// This file (WarFoundryXmlWithXslExporter.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2011 Dan Kulinski
-// 
-// The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license.
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
-using System.Xml;
-using System.Xml.Xsl;
-using System.Xml.XPath;
-using System.Xml.Schema;
-using IBBoard.Lang;
-using IBBoard.Xml;
-using IBBoard.WarFoundry.API.Objects;
-using IBBoard.WarFoundry.API.Util;
-
-namespace IBBoard.WarFoundry.API.Exporters
-{
-	/// <summary>
-	/// Custom exporter that exports an army as an XML file with an XSLT applied
-	/// </summary>
-    public class WarFoundryXmlWithXslExporter : IWarFoundryExporter
-	{
-        private static WarFoundryXmlWithXslExporter exporter;
-
-        // Return the default class associated with this exporter
-        public static WarFoundryXmlWithXslExporter GetDefault()
-        {
-            if (exporter == null)
-            {
-                exporter = new WarFoundryXmlWithXslExporter();
-            }
-
-            return exporter;
-        }
-
-        private WarFoundryXmlWithXslExporter()
-        {
-            // Hide constructor
-        }
-
-        // Write to file
-        public void ExportArmy(Army army, string path)
-        {
-            XmlDocument xmlDoc = BuildXml(army);
-            // Simple XML output settings
-            XmlWriterSettings xmlSettings = new XmlWriterSettings();
-            xmlSettings.Indent = true;
-            xmlSettings.IndentChars = "  ";
-
-            // Write XML to file
-            using (XmlWriter writer = XmlWriter.Create(path, xmlSettings))
-            {
-                xmlDoc.Save(writer);
-                writer.Flush();
-                writer.Close();
-            }
-        }
-
-        // Write to file with transform
-        public void ExportArmyWithTransform(Army army, string savePath, string xslPath)
-        {
-            XmlDocument xmlDoc = BuildXml(army);
-            XslCompiledTransform xslTransform = new XslCompiledTransform();
-
-            xslTransform.Load(xslPath);
-            XmlWriter writer = XmlWriter.Create(savePath, xslTransform.OutputSettings);
-            xslTransform.Transform(xmlDoc, writer);
-            writer.Flush();
-            writer.Close();
-        }
-        
-        // Build the XML document to save or transform
-        private XmlDocument BuildXml(Army army)
-        {
-            XmlDocument armyList = new XmlDocument();
-           
-            // Everything will be a child of the army element
-            XmlElement root = armyList.CreateElement("army");
-
-            // Basic army information
-            XmlElement armyRace = armyList.CreateElement("race");
-            armyRace.InnerText = army.Race.Name;
-            root.AppendChild(armyRace);
-
-            XmlElement armyName = armyList.CreateElement("name");
-            armyName.InnerText = army.Name;
-            root.AppendChild(armyName);
-
-            XmlElement armyAvailablePoints = armyList.CreateElement("pointsAvailable");
-            armyAvailablePoints.InnerText = army.MaxPoints.ToString();
-            root.AppendChild(armyAvailablePoints);
-
-            XmlElement armyUsedPoints = armyList.CreateElement("pointsUsed");
-            armyUsedPoints.InnerText = army.Points.ToString();
-            root.AppendChild(armyUsedPoints);
-
-            // Get Categories and interate through each
-            foreach(ArmyCategory cat in army.Categories)
-            {
-                if (cat.GetUnits().Length == 0)
-                    continue;
-                XmlElement armyCategory = armyList.CreateElement("category");
-                armyCategory.SetAttribute("type", cat.Name);
-                
-
-                // Get units and iterate through each
-                foreach(Unit uni in cat.GetUnits())
-                {
-                    XmlElement armyUnit = armyList.CreateElement("unit");
-                    armyUnit.SetAttribute("name", uni.UnitType.Name);
-
-                    foreach (Stat[] stat in uni.UnitStatsArraysWithName)
-                    {
-                        XmlElement armyStatLine = armyList.CreateElement("statLine");
-                        foreach (Stat singleStat in stat)
-                        {
-                            XmlElement armyStat = armyList.CreateElement("stat");
-                            armyStat.SetAttribute("name", singleStat.ParentSlotName);
-                            armyStat.SetAttribute("value", singleStat.SlotValueString);
-                            armyStatLine.AppendChild(armyStat);
-                        }
-                        armyUnit.AppendChild(armyStatLine);
-                    }
-                    armyUnit.SetAttribute("points", uni.Points.ToString());
-                    armyUnit.SetAttribute("models", uni.Size.ToString());
-
-                    foreach (UnitEquipmentItem equip in uni.GetEquipment())
-                    {
-                        XmlElement armyEquipmentItem = armyList.CreateElement("equipmentItem");
-                        armyEquipmentItem.SetAttribute("name", equip.Name);
-
-                        int armyEquipAmount = 0;
-						armyEquipAmount = (int)UnitEquipmentUtil.GetEquipmentAmount(uni, equip);
-                        
-                        if (UnitEquipmentUtil.GetEquipmentAmountIsRatio(uni, equip))
-                        {
-                            float fraction = (float)(armyEquipAmount / 100.0);
-                            armyEquipAmount = (int)(fraction * uni.Size);
-                        }
-
-                        armyEquipmentItem.SetAttribute("count", armyEquipAmount.ToString());
-                       
-                        armyUnit.AppendChild(armyEquipmentItem);
-                    }
-
-                    foreach (Ability abil in uni.Abilities)
-                    {
-                        XmlElement armyAbilityItem = armyList.CreateElement("abilityItem");
-
-                        armyAbilityItem.SetAttribute("name", abil.Name);
-                        armyAbilityItem.SetAttribute("description", abil.Description);
-
-                        armyUnit.AppendChild(armyAbilityItem);
-                    }
-
-                    armyCategory.AppendChild(armyUnit);
-                }
-                root.AppendChild(armyCategory);
-            }
-
-           
-           
-
-            // Append all Categories to the XML doc
-
-            // Append tree to document
-            armyList.AppendChild(root);
-
-            return armyList;
-        }
-        private string GetEquipmentAmountRatioTranslation(double amount, int number)
-        {
-            return Translation.GetTranslation("armyHtmlExportEquipAmountPercentage", "{0}% ({1})", amount, number);
-        }
-
-        private string GetEquipmentAmountNumberTranslation(int amount)
-        {
-            return Translation.GetTranslation("armyHtmlExportEquipAmountNumber", "{0}", amount);
-        }
-
-        private string GetEquipmentAmountAllTranslation(Unit unit)
-        {
-            return Translation.GetTranslation("armyHtmlExportEquipAmountAll", "all ({1})", 100, unit.Size);
-        }
-    }
-}
+// This file (WarFoundryXmlWithXslExporter.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2011 Dan Kulinski
+// 
+// The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Xml;
+using System.Xml.Xsl;
+using System.Xml.XPath;
+using System.Xml.Schema;
+using IBBoard.Lang;
+using IBBoard.Xml;
+using IBBoard.WarFoundry.API.Objects;
+using IBBoard.WarFoundry.API.Util;
+using System.Reflection;
+using IBBoard.IO;
+
+namespace IBBoard.WarFoundry.API.Exporters
+{
+	/// <summary>
+	/// Custom exporter that exports an army as an XML file with an XSLT applied
+	/// </summary>
+    public class WarFoundryXmlWithXslExporter : IWarFoundryExporter
+	{
+        private static WarFoundryXmlWithXslExporter exporter;
+
+        // Return the default class associated with this exporter
+        public static WarFoundryXmlWithXslExporter GetDefault()
+        {
+            if (exporter == null)
+            {
+                exporter = new WarFoundryXmlWithXslExporter();
+            }
+
+            return exporter;
+        }
+
+        private WarFoundryXmlWithXslExporter()
+        {
+            // Hide constructor
+        }
+
+		public NamedStream[] GetXsltStreams() {
+			Assembly assm = GetType().Assembly;
+			NamedStream[] streams = new NamedStream[2];
+			streams[0] = new NamedStream("Default Roster", assm.GetManifestResourceStream("IBBoard.WarFoundry.API.xsl.default_html.xsl"));
+			streams[1] =  new NamedStream("Unit Cards", assm.GetManifestResourceStream("IBBoard.WarFoundry.API.xsl.unitcard.xsl"));
+			return streams;
+		}
+
+        // Write to file
+        public void ExportArmy(Army army, string path)
+        {
+            XmlDocument xmlDoc = BuildXml(army);
+            // Simple XML output settings
+            XmlWriterSettings xmlSettings = new XmlWriterSettings();
+            xmlSettings.Indent = true;
+            xmlSettings.IndentChars = "  ";
+
+            // Write XML to file
+            using (XmlWriter writer = XmlWriter.Create(path, xmlSettings))
+            {
+                xmlDoc.Save(writer);
+                writer.Flush();
+                writer.Close();
+            }
+        }
+
+        // Write to file with transform
+        public void ExportArmyWithTransform(Army army, string savePath, Stream xslStream)
+        {
+            XmlDocument xmlDoc = BuildXml(army);
+            XslCompiledTransform xslTransform = new XslCompiledTransform();
+
+            xslTransform.Load(new XmlTextReader(xslStream));
+            XmlWriter writer = XmlWriter.Create(savePath, xslTransform.OutputSettings);
+            xslTransform.Transform(xmlDoc, writer);
+            writer.Flush();
+            writer.Close();
+        }
+        
+        // Build the XML document to save or transform
+        private XmlDocument BuildXml(Army army)
+        {
+            XmlDocument armyList = new XmlDocument();
+           
+            // Everything will be a child of the army element
+            XmlElement root = armyList.CreateElement("army");
+
+            // Basic army information
+            XmlElement armyRace = armyList.CreateElement("race");
+            armyRace.InnerText = army.Race.Name;
+            root.AppendChild(armyRace);
+
+            XmlElement armyName = armyList.CreateElement("name");
+            armyName.InnerText = army.Name;
+            root.AppendChild(armyName);
+
+            XmlElement armyAvailablePoints = armyList.CreateElement("pointsAvailable");
+            armyAvailablePoints.InnerText = army.MaxPoints.ToString();
+            root.AppendChild(armyAvailablePoints);
+
+            XmlElement armyUsedPoints = armyList.CreateElement("pointsUsed");
+            armyUsedPoints.InnerText = army.Points.ToString();
+            root.AppendChild(armyUsedPoints);
+
+            // Get Categories and interate through each
+            foreach(ArmyCategory cat in army.Categories)
+            {
+                if (cat.GetUnits().Length == 0)
+                    continue;
+                XmlElement armyCategory = armyList.CreateElement("category");
+                armyCategory.SetAttribute("type", cat.Name);
+                
+
+                // Get units and iterate through each
+                foreach(Unit uni in cat.GetUnits())
+                {
+                    XmlElement armyUnit = armyList.CreateElement("unit");
+                    armyUnit.SetAttribute("name", uni.UnitType.Name);
+
+                    foreach (Stat[] stat in uni.UnitStatsArraysWithName)
+                    {
+                        XmlElement armyStatLine = armyList.CreateElement("statLine");
+                        foreach (Stat singleStat in stat)
+                        {
+                            XmlElement armyStat = armyList.CreateElement("stat");
+                            armyStat.SetAttribute("name", singleStat.ParentSlotName);
+                            armyStat.SetAttribute("value", singleStat.SlotValueString);
+                            armyStatLine.AppendChild(armyStat);
+                        }
+                        armyUnit.AppendChild(armyStatLine);
+                    }
+                    armyUnit.SetAttribute("points", uni.Points.ToString());
+                    armyUnit.SetAttribute("models", uni.Size.ToString());
+
+                    foreach (UnitEquipmentItem equip in uni.GetEquipment())
+                    {
+                        XmlElement armyEquipmentItem = armyList.CreateElement("equipmentItem");
+                        armyEquipmentItem.SetAttribute("name", equip.Name);
+
+                        int armyEquipAmount = 0;
+						armyEquipAmount = (int)UnitEquipmentUtil.GetEquipmentAmount(uni, equip);
+                        
+                        if (UnitEquipmentUtil.GetEquipmentAmountIsRatio(uni, equip))
+                        {
+                            float fraction = (float)(armyEquipAmount / 100.0);
+                            armyEquipAmount = (int)(fraction * uni.Size);
+                        }
+
+                        armyEquipmentItem.SetAttribute("count", armyEquipAmount.ToString());
+                       
+                        armyUnit.AppendChild(armyEquipmentItem);
+                    }
+
+                    foreach (Ability abil in uni.Abilities)
+                    {
+                        XmlElement armyAbilityItem = armyList.CreateElement("abilityItem");
+
+                        armyAbilityItem.SetAttribute("name", abil.Name);
+                        armyAbilityItem.SetAttribute("description", abil.Description);
+
+                        armyUnit.AppendChild(armyAbilityItem);
+                    }
+
+                    armyCategory.AppendChild(armyUnit);
+                }
+                root.AppendChild(armyCategory);
+            }
+
+           
+           
+
+            // Append all Categories to the XML doc
+
+            // Append tree to document
+            armyList.AppendChild(root);
+
+            return armyList;
+        }
+        private string GetEquipmentAmountRatioTranslation(double amount, int number)
+        {
+            return Translation.GetTranslation("armyHtmlExportEquipAmountPercentage", "{0}% ({1})", amount, number);
+        }
+
+        private string GetEquipmentAmountNumberTranslation(int amount)
+        {
+            return Translation.GetTranslation("armyHtmlExportEquipAmountNumber", "{0}", amount);
+        }
+
+        private string GetEquipmentAmountAllTranslation(Unit unit)
+        {
+            return Translation.GetTranslation("armyHtmlExportEquipAmountAll", "all ({1})", 100, unit.Size);
+        }
+    }
+}
--- a/IBBoard.WarFoundry.API.csproj	Sat Sep 01 15:28:26 2012 +0100
+++ b/IBBoard.WarFoundry.API.csproj	Wed Nov 28 20:24:36 2012 +0000
@@ -180,14 +180,6 @@
       <Name>ICSharpCode.SharpZLib</Name>
     </ProjectReference>
   </ItemGroup>
-  <ItemGroup>
-    <Content Include="xsl\default_html.xsl">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="xsl\unitcard.xsl">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-  </ItemGroup>
   <ProjectExtensions>
     <MonoDevelop>
       <Properties>
@@ -232,5 +224,13 @@
     </EmbeddedResource>
     <EmbeddedResource Include="data\Empire.race" />
     <EmbeddedResource Include="data\SampleSystem.system" />
+    <EmbeddedResource Include="xsl\default_html.xsl">
+      <Gettext-ScanForTranslations>False</Gettext-ScanForTranslations>
+      <LogicalName>IBBoard.WarFoundry.API.xsl.default_html.xsl</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="xsl\unitcard.xsl">
+      <Gettext-ScanForTranslations>False</Gettext-ScanForTranslations>
+      <LogicalName>IBBoard.WarFoundry.API.xsl.unitcard.xsl</LogicalName>
+    </EmbeddedResource>
   </ItemGroup>
 </Project>
\ No newline at end of file