示例#1
0
        /// <summary>Returns a new TagCollection containing all nodes contained in a given XML node.</summary>
        /// <param name="node">The XML node whose children should be parsed.</param>
        /// <returns>A new TagCollection containing the results of calling Tag.Parse to construct child nodes from the XML node's children.</returns>
        public static TemplateElementCollection FromXml(XmlNode node, AimlLoader loader)
        {
            var tagList = new List <TemplateNode>();

            foreach (XmlNode node2 in node.ChildNodes)
            {
                switch (node2.NodeType)
                {
                case XmlNodeType.Whitespace:
                    tagList.Add(new TemplateText(" "));
                    break;

                case XmlNodeType.Text:
                    tagList.Add(new TemplateText(node2.InnerText));
                    break;

                case XmlNodeType.SignificantWhitespace:
                    tagList.Add(new TemplateText(node2.InnerText, false));
                    break;

                case XmlNodeType.Element:
                    tagList.Add(loader.ParseElement(node2));
                    break;
                }
            }
            return(new TemplateElementCollection(tagList.ToArray()));
        }
示例#2
0
            public static Test FromXml(XmlNode node, AimlLoader loader)
            {
                // Search for XML attributes.
                XmlAttribute attribute;

                TemplateElementCollection?expected = null;
                List <TemplateNode>       children = new List <TemplateNode>();

                attribute = node.Attributes["name"];
                if (attribute == null)
                {
                    throw new AimlException("<test> tag must have a 'name' attribute.");
                }
                var name = attribute.Value;

                attribute = node.Attributes["expected"];
                if (attribute != null)
                {
                    expected = new TemplateElementCollection(attribute.Value);
                }

                // Search for properties in elements.
                foreach (XmlNode node2 in node.ChildNodes)
                {
                    if (node2.NodeType == XmlNodeType.Whitespace)
                    {
                        children.Add(new TemplateText(" "));
                    }
                    else if (node2.NodeType == XmlNodeType.Text || node2.NodeType == XmlNodeType.SignificantWhitespace)
                    {
                        children.Add(new TemplateText(node2.InnerText));
                    }
                    else if (node2.NodeType == XmlNodeType.Element)
                    {
                        if (node2.Name.Equals("name", StringComparison.InvariantCultureIgnoreCase))
                        {
                            throw new AimlException("<test> name may not be specified in a subtag.");
                        }
                        else if (node2.Name.Equals("expected", StringComparison.InvariantCultureIgnoreCase))
                        {
                            expected = TemplateElementCollection.FromXml(node2, loader);
                        }
                        else
                        {
                            children.Add(loader.ParseElement(node2));
                        }
                    }
                }

                if (expected == null)
                {
                    throw new AimlException("<test> tag must have an 'expected' property.");
                }

                return(new Test(name, expected, new TemplateElementCollection(children.ToArray())));
            }
示例#3
0
            public static Map FromXml(XmlNode node, AimlLoader loader)
            {
                // Search for XML attributes.
                XmlAttribute attribute;

                TemplateElementCollection name     = null;
                List <TemplateNode>       children = new List <TemplateNode>();

                attribute = node.Attributes["name"];
                if (attribute != null)
                {
                    name = new TemplateElementCollection(attribute.Value);
                }

                // Search for properties in elements.
                foreach (XmlNode node2 in node.ChildNodes)
                {
                    if (node2.NodeType == XmlNodeType.Whitespace)
                    {
                        children.Add(new TemplateText(" "));
                    }
                    else if (node2.NodeType == XmlNodeType.Text || node2.NodeType == XmlNodeType.SignificantWhitespace)
                    {
                        children.Add(new TemplateText(node2.InnerText));
                    }
                    else if (node2.NodeType == XmlNodeType.Element)
                    {
                        if (node2.Name.Equals("name", StringComparison.InvariantCultureIgnoreCase))
                        {
                            name = TemplateElementCollection.FromXml(node2, loader);
                        }
                        else
                        {
                            children.Add(loader.ParseElement(node2));
                        }
                    }
                }

                if (name == null)
                {
                    throw new AimlException("map tag is missing a name property.");
                }

                return(new Map(name, new TemplateElementCollection(children.ToArray())));
            }
示例#4
0
                public static TemplateNode.Condition.li Parse(XmlNode node, AimlLoader loader)
                {
                    // Search for XML attributes.
                    XmlAttribute attribute;

                    TemplateElementCollection name  = null;
                    TemplateElementCollection value = null;
                    bool localVar = false;
                    List <TemplateNode> children = new List <TemplateNode>();

                    attribute = node.Attributes["name"];
                    if (attribute != null)
                    {
                        name = new TemplateElementCollection(attribute.Value);
                    }
                    attribute = node.Attributes["var"];
                    if (attribute != null)
                    {
                        name     = new TemplateElementCollection(attribute.Value);
                        localVar = true;
                    }
                    attribute = node.Attributes["value"];
                    if (attribute != null)
                    {
                        value = new TemplateElementCollection(attribute.Value);
                    }

                    // Search for properties in elements.
                    foreach (XmlNode node2 in node.ChildNodes)
                    {
                        if (node2.NodeType == XmlNodeType.Whitespace)
                        {
                            children.Add(new TemplateText(" "));
                        }
                        else if (node2.NodeType == XmlNodeType.Text || node2.NodeType == XmlNodeType.SignificantWhitespace)
                        {
                            children.Add(new TemplateText(node2.InnerText));
                        }
                        else if (node2.NodeType == XmlNodeType.Element)
                        {
                            if (node2.Name.Equals("name", StringComparison.InvariantCultureIgnoreCase))
                            {
                                name     = TemplateElementCollection.FromXml(node2, loader);
                                localVar = false;
                            }
                            else if (node2.Name.Equals("var", StringComparison.InvariantCultureIgnoreCase))
                            {
                                name     = TemplateElementCollection.FromXml(node2, loader);
                                localVar = true;
                            }
                            else if (node2.Name.Equals("value", StringComparison.InvariantCultureIgnoreCase))
                            {
                                value = TemplateElementCollection.FromXml(node2, loader);
                            }
                            else
                            {
                                children.Add(loader.ParseElement(node2));
                            }
                        }
                    }

                    return(new li(name, localVar, value, new TemplateElementCollection(children.ToArray())));
                }
示例#5
0
            public static Condition FromXml(XmlNode node, AimlLoader loader)
            {
                // Search for XML attributes.
                XmlAttribute attribute;

                TemplateElementCollection?name  = null;
                TemplateElementCollection?value = null;
                bool localVar = false;
                List <TemplateNode> children = new List <TemplateNode>();
                List <li>           items    = new List <li>();

                attribute = node.Attributes["name"];
                if (attribute != null)
                {
                    name = new TemplateElementCollection(attribute.Value);
                }
                attribute = node.Attributes["var"];
                if (attribute != null)
                {
                    name     = new TemplateElementCollection(attribute.Value);
                    localVar = true;
                }
                attribute = node.Attributes["value"];
                if (attribute != null)
                {
                    value = new TemplateElementCollection(attribute.Value);
                }

                // Search for properties in elements.
                foreach (XmlNode node2 in node.ChildNodes)
                {
                    if (node2.NodeType == XmlNodeType.Whitespace)
                    {
                        children.Add(new TemplateText(" "));
                    }
                    else if (node2.NodeType == XmlNodeType.Text || node2.NodeType == XmlNodeType.SignificantWhitespace)
                    {
                        children.Add(new TemplateText(node2.InnerText));
                    }
                    else if (node2.NodeType == XmlNodeType.Element)
                    {
                        if (node2.Name.Equals("name", StringComparison.InvariantCultureIgnoreCase))
                        {
                            name     = TemplateElementCollection.FromXml(node2, loader);
                            localVar = false;
                        }
                        else if (node2.Name.Equals("var", StringComparison.InvariantCultureIgnoreCase))
                        {
                            name     = TemplateElementCollection.FromXml(node2, loader);
                            localVar = true;
                        }
                        else if (node2.Name.Equals("value", StringComparison.InvariantCultureIgnoreCase))
                        {
                            value = TemplateElementCollection.FromXml(node2, loader);
                        }
                        else if (node2.Name.Equals("li", StringComparison.InvariantCultureIgnoreCase))
                        {
                            items.Add(li.Parse(node2, loader));
                        }
                        else
                        {
                            children.Add(loader.ParseElement(node2));
                        }
                    }
                }

                if (items.Count == 0)
                {
                    if (name == null || value == null)
                    {
                        throw new AimlException("<condition> tag is missing attributes or <li> tags.");
                    }
                    return(new Condition(name, localVar, value, new TemplateElementCollection(children.ToArray())));
                }

                if (items.Any(i => i.Value == null))
                {
                    bool infiniteLoop = true;
                    foreach (var item in items)
                    {
                        if (item.Children == null || !item.Children.Loop)
                        {
                            infiniteLoop = false;
                            break;
                        }
                    }
                    if (infiniteLoop)
                    {
                        throw new AimlException("Infinite loop: every <li> has a loop (and there is a default <li>).");
                    }
                }

                return(new Condition(name, localVar, items.ToArray()));
            }