# HG changeset patch # User IBBoard # Date 1314302749 -3600 # Node ID dee3dcb72acf6766cf35d77ed3921f6fec48532c # Parent cbe69734f48f2dbb825b7b13751905482ed80412# Parent 2c52f0235774c11f7b601bca6d6ae3a86206dc08 Re #355: Add XML export format that can be transformed with an XSL * Merge Clutch's XML/XSL API changes diff -r cbe69734f48f -r dee3dcb72acf API/Exporters/WarFoundryXMLWithXSLExporter.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/API/Exporters/WarFoundryXMLWithXSLExporter.cs Thu Aug 25 21:05:49 2011 +0100 @@ -0,0 +1,196 @@ +// 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 +{ + /// + /// Custom exporter that exports an army as an XML file with an XSLT applied + /// + 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; + + if (UnitEquipmentUtil.GetEquipmentAmount(uni, equip) == null) + { + armyEquipAmount = 0; + } + else + { + 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); + } + } +} diff -r cbe69734f48f -r dee3dcb72acf IBBoard.WarFoundry.API.csproj --- a/IBBoard.WarFoundry.API.csproj Sun Aug 14 00:58:02 2011 +0000 +++ b/IBBoard.WarFoundry.API.csproj Thu Aug 25 21:05:49 2011 +0100 @@ -1,4 +1,4 @@ - + Debug @@ -60,6 +60,7 @@ + false @@ -196,6 +197,14 @@ ICSharpCode.SharpZLib + + + PreserveNewest + + + PreserveNewest + + diff -r cbe69734f48f -r dee3dcb72acf xsl/default_html.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xsl/default_html.xsl Thu Aug 25 21:05:49 2011 +0100 @@ -0,0 +1,59 @@ + + + + + + + + <xsl:value-of select="/army/name"/> + + + +
+

+ - pts +

+ + + + + + + + + + + + + + + + + + + + +
+ + NotesPoints
+ + + + (), + + + (), + + + +
+
+
+ + +
+
\ No newline at end of file diff -r cbe69734f48f -r dee3dcb72acf xsl/unitcard.xsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xsl/unitcard.xsl Thu Aug 25 21:05:49 2011 +0100 @@ -0,0 +1,118 @@ + + + abcdefghijklmnopqrstuvwxyz + ABCDEFGHIJKLMNOPQRSTUVWXYZ + + + + + <xsl:value-of select="/army/name"/> - Created in WarFoundry + + + + + +
+ Name:
+ Points: of + +
+ + +
+ + + + +
+ : + + Models: + + Points: +
+ + + + + + + + + + + + + + + +
+ + + +
+ +
+ + + + + + + + + +
+ Equipment + + Abilities +
+
    + +
  • + () +
  • +
    +
+
+
    + +
  • + +
  • +
    +
+
+
+
+
+
+
+

Special Rules

+
    + +
  • + - +
  • +
    +
+
+ + +
+
\ No newline at end of file