Пример #1
0
        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);
        }
Пример #2
0
        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;
                }
            }
        }
Пример #3
0
        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);
        }