Exemple #1
0
        public NodeTree(Node node)
        {
            if (node == null)
            {
                // need a root to start from...
                throw new ArgumentNullException();
            }

            Root = node;
            Current = Root;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="selector"></param>
        /// <param name="parent"></param>
        /// <param name="prevSibling"></param>
        /// <returns></returns>
        private Node BuildTree(string selector, Node parent = null, Node prevSibling = null)
        {
            var tokens = _tokenizer.Parse(selector);
            Node root = null;
            Node prev = null;

            for (var i = 0; i < tokens.Count; i++)
            {
                var node = CreateNode(tokens);

                if (i == 0)
                {
                    root = node;
                }

                if (prev != null)
                {
                    prev.NextSibling = node;
                    node.PreviousSibling = prev;
                }

                if (parent != null)
                {
                    parent.Children.Add(node);
                    node.Parent = parent;
                }

                if (prevSibling != null)
                {
                    prevSibling.NextSibling = node;
                    node.PreviousSibling = prevSibling;
                }

                if (!string.IsNullOrEmpty(tokens.ChildSelector))
                {
                    BuildTree(tokens.ChildSelector, node);
                }

                // dont want to add a sibling if we dont have to... '*' siblings take precedence over '+' siblings
                if (!string.IsNullOrEmpty(tokens.NextSiblingSelector) && i == tokens.Count - 1)
                {
                    BuildTree(tokens.NextSiblingSelector, prevSibling: node);
                }

                prev = node;
            }

            return root;
        }
Exemple #3
0
 private static Node GetTagNodeWithPrevSibling(Node sibling)
 {
     return new TagNode(_tagName)
         {
             PreviousSibling = sibling
         };
 }
Exemple #4
0
 private static Node GetTagNodeWithParent(Node parent)
 {
     return new TagNode(_tagName)
         {
             Parent = parent
         };
 }
Exemple #5
0
 private static Node GetTagNodeWithNextSibling(Node sibling)
 {
     return new TagNode(_tagName)
         {
             NextSibling = sibling
         };
 }
Exemple #6
0
 private static Node GetTagNodeWithChildren(Node first, Node last)
 {
     return new TagNode(_tagName)
     {
         Children = new List<Node> { first, last }
     };
 }