Mercurial > repos > IBDev-IBBoard.WarFoundry.API
view API/Exporters/WarFoundryXMLWithXSLExporter.cs @ 398:9a49d34599fb xsl-output
Basic XSL output
author | Dan.Kulinski@dank-laptop.Global.Local |
---|---|
date | Sun, 14 Aug 2011 14:33:15 -0600 |
parents | |
children | 3a71f8af5bde |
line wrap: on
line source
// 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 } public void ExportArmy(Army army, string path) { 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("count", equip.CostMultiplier.ToString()); // Item Name XmlElement armyEquipmentName = armyList.CreateElement("name"); armyEquipmentName.InnerText = equip.Name; armyEquipmentItem.AppendChild(armyEquipmentName); // Item description XmlElement armyEquipmentDesc = armyList.CreateElement("desc"); double amount = UnitEquipmentUtil.GetEquipmentAmount(uni, equip); string amountString = ""; // TODO Change to report number, no string needed, add as attribute to armyEquipmentItem if (UnitEquipmentUtil.GetEquipmentAmountIsRatio(uni, equip)) { if (amount == 100) { amountString = GetEquipmentAmountAllTranslation(uni); } else { int number = UnitEquipmentUtil.GetEquipmentAmountTaken(uni, equip); amountString = GetEquipmentAmountRatioTranslation(amount, number); } } else { if (amount == -1) { amountString = GetEquipmentAmountAllTranslation(uni); } else { amountString = GetEquipmentAmountNumberTranslation((int)amount); } } armyEquipmentDesc.InnerText = Translation.GetTranslation("armyHtmlExportEquipAmountRatio","{0} for {1}", equip.Name, amountString); armyEquipmentItem.SetAttribute("count", amountString); armyEquipmentItem.AppendChild(armyEquipmentDesc); armyUnit.AppendChild(armyEquipmentItem); } foreach (Ability abil in uni.Abilities) { XmlElement armyAbilityItem = armyList.CreateElement("abilityItem"); XmlElement armyAbilityName = armyList.CreateElement("name"); armyAbilityName.InnerText = abil.Name; armyAbilityItem.AppendChild(armyAbilityName); XmlElement armyAbilityDesc = armyList.CreateElement("description"); armyAbilityDesc.InnerText = abil.Description; armyAbilityItem.AppendChild(armyAbilityDesc); armyUnit.AppendChild(armyAbilityItem); } armyCategory.AppendChild(armyUnit); } root.AppendChild(armyCategory); } // Append all Categories to the XML doc // Append tree to document armyList.AppendChild(root); // Simple XML output settings XmlWriterSettings xmlSettings = new XmlWriterSettings(); xmlSettings.Indent = true; xmlSettings.IndentChars = " "; // Write XML to file using (XmlWriter writer = XmlWriter.Create(path, xmlSettings)) { armyList.Save(writer); writer.Flush(); } } 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); } } }