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; }
private static Node GetTagNodeWithPrevSibling(Node sibling) { return new TagNode(_tagName) { PreviousSibling = sibling }; }
private static Node GetTagNodeWithParent(Node parent) { return new TagNode(_tagName) { Parent = parent }; }
private static Node GetTagNodeWithNextSibling(Node sibling) { return new TagNode(_tagName) { NextSibling = sibling }; }
private static Node GetTagNodeWithChildren(Node first, Node last) { return new TagNode(_tagName) { Children = new List<Node> { first, last } }; }