public static string ResolveReference(string valueString, Doc doc) { if (valueString.StartsWith("{") && valueString.EndsWith("}")) { string[] parts = valueString.Substring(1, valueString.Length - 2).Split(' '); if (parts.Length < 2) { return(valueString); } else { // Find the element with the given key in the doc's definitions Models.String refValue = doc.Definitions.Find(def => def.Key == parts[1] && def is Models.String) as Models.String; if (refValue != null) { if (refValue.Language == Language.Coptic && refValue.Font != null) { // Coptic text needs to be interpreted before it can be displayed var font = CopticFont.Fonts.Find(f => f.Name.ToLower() == refValue.Font.ToLower()); return(ConvertFont(refValue.Value, font, CopticFont.CopticUnicode)); } else { return(refValue.Value); } } else { return(valueString); } } } else { return(valueString); } }
public static Doc ParseDocXml(string xmlText) { var xml = XDocument.Parse(xmlText); // The actual content can't be deserialized, so it needs to be manually parsed Doc doc = new Doc() { Name = xml.Root.Element("Name")?.Value, Uuid = xml.Root.Element("Uuid")?.Value, }; var defsElem = xml.Root.Element("Definitions"); if (defsElem != null) { foreach (XElement defElem in defsElem?.Elements()) { if (defElem.Name == nameof(Script)) { var script = new Script() { LuaScript = defElem.Value, Key = defElem.Attribute("Key")?.Value }; doc.Definitions.Add(script); } else if (defElem.Name == nameof(Variable)) { var variable = new Variable() { Label = defElem.Attribute("Label")?.Value, DefaultValue = defElem.Attribute("DefaultValue")?.Value, Configurable = Boolean.Parse(defElem.Attribute("Configurable")?.Value), Key = defElem.Attribute("Key")?.Value }; doc.Definitions.Add(variable); } else if (defElem.Name == nameof(Models.String)) { var _string = new Models.String() { Value = defElem.Value, Font = defElem.Attribute("Font")?.Value, Language = (Language)Enum.Parse(typeof(Language), defElem.Attribute("Language")?.Value ?? "Default"), Key = defElem.Attribute("Key")?.Value }; doc.Definitions.Add(_string); } } } foreach (XElement transElem in xml.Root.Element("Translations").Elements()) { Translation translation = new Translation() { Font = transElem.Attribute("Font")?.Value, Language = (Language)Enum.Parse(typeof(Language), transElem.Attribute("Language")?.Value), }; translation.Content = ParseContentParts(transElem.Elements(), translation, doc); doc.Translations.Add(translation); } return(doc); }