protected static NameElements ParseControlName(string name) { string temp = name.Replace("!", "\n!\n").Replace("^", "\n^\n").Replace("*", "\n*\n").Replace(":", "\n:\n").Replace("#", "\n#\n"); string[] parse = ParseRegEx(temp, "\n"); NameElements elements = new NameElements(); elements.name = parse[0]; for (int x = 1; x < parse.Length; x++) { switch (parse[x]) { case "!": elements.hidden = true; break; case "^": elements.blocksName = true; break; case "*": elements.enabled = false; break; case ":": elements.units = parse[x + 1]; break; case "#": elements.tooltip = parse[x + 1]; break; } } // Fix any craziness that may be going on in the name. elements.name = FixInvalidName(elements.name); return(elements); }
public IEnumerable <BsonElement> GetElements(BsonDocument document) { bool lowercaseName = (_options & EnumerateElementsOptions.LowercaseName) == EnumerateElementsOptions.LowercaseName; Stack <NameElements> nameElementsStack = new Stack <NameElements>(); string parentName = null; IEnumerator <BsonElement> elements = document.Elements.GetEnumerator(); while (true) { if (elements.MoveNext()) { BsonElement element = elements.Current; string name = element.Name; if (lowercaseName) { name = name.ToLowerInvariant(); } string elementName = parentName != null ? parentName + "." + name : name; switch (element.Value.BsonType) { case BsonType.Document: nameElementsStack.Push(new NameElements { Name = parentName, Elements = elements }); parentName = elementName; elements = ((BsonDocument)element.Value).Elements.GetEnumerator(); break; case BsonType.Array: case BsonType.Binary: case BsonType.Boolean: case BsonType.DateTime: case BsonType.Double: case BsonType.Int32: case BsonType.Int64: case BsonType.JavaScript: case BsonType.JavaScriptWithScope: //case BsonType.EndOfDocument: case BsonType.MaxKey: case BsonType.MinKey: case BsonType.Null: case BsonType.ObjectId: case BsonType.RegularExpression: case BsonType.String: case BsonType.Symbol: case BsonType.Timestamp: //case BsonType.Undefined: yield return(new BsonElement(elementName, element.Value)); break; } } else { if (nameElementsStack.Count == 0) { break; } NameElements nameElements = nameElementsStack.Pop(); parentName = nameElements.Name; elements = nameElements.Elements; } } }
protected static XmlNode ConvertNode(XmlNode node, XmlDocument prom, XmlNode rootNode) { int unknownCount = 0; XmlNode fieldsNode = node.SelectSingleNode("Fields"); XmlElement mainStructElement = prom.CreateElement("struct"); XmlNode nameNode = node.SelectSingleNode("Name"); //string structName = "Main"; string structName = tagType; if (nameNode != null) { structName = FixStructName(nameNode.InnerText); } XmlAttribute structNameAttribute = prom.CreateAttribute("name"); structNameAttribute.InnerText = structName; mainStructElement.Attributes.Append(structNameAttribute); NameCollection names = new NameCollection(); foreach (XmlNode fieldNode in fieldsNode.SelectNodes("Field")) { NameElements elements = ParseControlName(fieldNode.SelectSingleNode("Name").InnerText); // Create a node in the output XML doc based on the type. XmlAttribute typeAttribute = prom.CreateAttribute("type"); string fieldType = fieldNode.SelectSingleNode("Type").InnerText; // Ignore Terminator_X if (fieldType == "Terminator_X") { continue; } // TODO: Create a section based on these. Continue for now. if (fieldType == "Explanation") { continue; } // Fix up the field name string. fieldType = ConvertDataTypeString(fieldType); XmlElement valueElement = prom.CreateElement("value"); if (elements.name == "") { //unknownCount++; elements.name = "_unnamed" + unknownCount.ToString(); elements.name = "_unnamed"; //+ unknownCount.ToString(); } int uses = names.Add(elements.name); if (uses > 1) { elements.name += uses.ToString(); } typeAttribute.InnerText = fieldType; valueElement.Attributes.Append(typeAttribute); XmlAttribute nameAttribute = prom.CreateAttribute("name"); nameAttribute.InnerText = elements.name; valueElement.Attributes.Append(nameAttribute); if (elements.tooltip != null) { XmlElement tooltipElement = prom.CreateElement("tooltip"); tooltipElement.AppendChild(prom.CreateTextNode(SentenceCase(elements.tooltip))); valueElement.AppendChild(tooltipElement); } if (elements.blocksName) { XmlAttribute blockNameAttribute = prom.CreateAttribute("blockname"); blockNameAttribute.Value = "true"; valueElement.Attributes.Append(blockNameAttribute); } // Based on the type, we may need to append other elements. if (fieldType == "Block") { // Add the MaxElements tag. XmlNode blockNode = fieldNode.SelectSingleNode("Block"); string blockName = FixStructName(blockNode.SelectSingleNode("Name").InnerText); XmlAttribute blockNameAttribute = prom.CreateAttribute("struct"); blockNameAttribute.InnerText = blockName; valueElement.Attributes.Append(blockNameAttribute); string maxElements = blockNode.SelectSingleNode("MaxElements").InnerText; XmlAttribute maxElementsAttribute = prom.CreateAttribute("maxelements"); maxElementsAttribute.Value = maxElements; valueElement.Attributes.Append(maxElementsAttribute); // Create a new struct and add it to the current parent. XmlNode newStructNode = ConvertNode(blockNode, prom, rootNode); mainStructElement.AppendChild(newStructNode); } else if (fieldType == "TagReference") { string extensions = ""; XmlNodeList subFields = fieldNode.SelectNodes("Fields/*"); foreach (XmlNode subFieldNode in subFields) { extensions += subFieldNode.InnerText + "|"; } extensions = extensions.TrimEnd('|'); XmlAttribute extensionsAttribute = prom.CreateAttribute("extensions"); extensionsAttribute.Value = extensions; valueElement.Attributes.Append(extensionsAttribute); } else if (fieldType == "ShortBlockIndex") { XmlNode blockNameNode = fieldNode.SelectSingleNode("Block"); XmlAttribute blockNameAttribute = prom.CreateAttribute("block"); blockNameAttribute.Value = FixStructName(blockNameNode.InnerText); valueElement.Attributes.Append(blockNameAttribute); } else if (fieldType == "Enum") { XmlNodeList subFields = fieldNode.SelectNodes("Fields/*"); int index = 0; foreach (XmlNode subFieldNode in subFields) { NameElements tmpElements = ParseControlName(subFieldNode.InnerText); XmlElement itemElement = prom.CreateElement("item"); XmlAttribute itemValueAttribute = prom.CreateAttribute("value"); itemValueAttribute.InnerText = index.ToString(); index++; XmlAttribute itemNameAttribute = prom.CreateAttribute("name"); itemNameAttribute.InnerText = tmpElements.name; itemElement.Attributes.Append(itemValueAttribute); itemElement.Attributes.Append(itemNameAttribute); if (tmpElements.tooltip != null) { XmlElement tooltipElement = prom.CreateElement("tooltip"); tooltipElement.AppendChild(prom.CreateTextNode(SentenceCase(elements.tooltip))); itemElement.AppendChild(tooltipElement); } valueElement.AppendChild(itemElement); } } else if (fieldType == "String") { // Change the name, since String in c# is a bad choice. fieldType = "FixedLengthString"; typeAttribute.InnerText = fieldType; } else if ((fieldType == "ByteFlags") || (fieldType == "WordFlags") || (fieldType == "LongFlags")) { XmlAttribute flagsLengthAttribute = prom.CreateAttribute("length"); if (fieldType == "ByteFlags") { flagsLengthAttribute.InnerText = "1"; } if (fieldType == "WordFlags") { flagsLengthAttribute.InnerText = "2"; } if (fieldType == "LongFlags") { flagsLengthAttribute.InnerText = "4"; } valueElement.Attributes.Append(flagsLengthAttribute); // Manually override the name so that we can use the generic flags handler. fieldType = "Flags"; typeAttribute.InnerText = fieldType; XmlNodeList subFields = fieldNode.SelectNodes("Fields/*"); int index = 0; foreach (XmlNode subFieldNode in subFields) { NameElements tmpElements = ParseControlName(subFieldNode.InnerText); XmlElement bitElement = prom.CreateElement("bit"); XmlAttribute bitIndexAttribute = prom.CreateAttribute("index"); bitIndexAttribute.InnerText = index.ToString(); index++; XmlAttribute bitNameAttribute = prom.CreateAttribute("name"); bitNameAttribute.InnerText = tmpElements.name; bitElement.Attributes.Append(bitIndexAttribute); bitElement.Attributes.Append(bitNameAttribute); if (tmpElements.tooltip != null) { XmlElement tooltipElement = prom.CreateElement("tooltip"); tooltipElement.AppendChild(prom.CreateTextNode(SentenceCase(tmpElements.tooltip))); bitElement.AppendChild(tooltipElement); } valueElement.AppendChild(bitElement); } } else if ((fieldType == "Pad") || (fieldType == "Skip")) { string length = fieldNode.SelectSingleNode("Value").InnerText; XmlAttribute lengthAttribute = prom.CreateAttribute("length"); lengthAttribute.Value = length; valueElement.Attributes.Append(lengthAttribute); } else if (fieldType == "ArrayStart") { // TODO: Revisit Arrays. // Not sure how we're handling this stuff. // Just adding in a comment for now to show where they are. string fieldCount = fieldNode.SelectSingleNode("Array/FieldCount").InnerText; XmlComment comment = prom.CreateComment("Array field goes here: Length=" + fieldCount); valueElement.AppendChild(comment); } mainStructElement.AppendChild(valueElement); // Add to collection. FieldTypes.Add(fieldType); } return(mainStructElement); }