/// <summary>
 /// Creates the document query node.
 /// </summary>
 /// <param name="documentTree">tree with document descendants</param>
 /// <returns>new instance of document query node</returns>
 private static DocumentQueryNode CreateDocumentQueryNode(CommonTree documentTree)
 {
     return(new DocumentQueryNode(
                string.Join(string.Empty, documentTree.GrandChildren(T(CssParser.DOCUMENT_MATCHNAME)).Select(_ => _.Text)),
                documentTree.Children(T(CssParser.DOCUMENT_SYMBOL)).FirstChildText(),
                documentTree.GrandChildren(T(CssParser.RULESETS)).Select(CreateRulesetNode).ToSafeReadOnlyCollection()));
 }
        /// <summary>Creates the page node.</summary>
        /// <param name="pageTree">The list of page tree.</param>
        /// <returns>The list of page nodes.</returns>
        private static PageNode CreatePageNode(CommonTree pageTree)
        {
            if (pageTree == null)
            {
                return(null);
            }

            return(new PageNode(
                       string.Join(string.Empty, pageTree.GrandChildren(T(CssParser.PSEUDO_PAGE)).Select(pseudo => pseudo.Text)),
                       CreateDeclarationNodes(pageTree.GrandChildren(T(CssParser.DECLARATIONS))).ToSafeReadOnlyCollection()));
        }
        /// <summary>Creates the media nodes.</summary>
        /// <param name="mediaTree">The list of media tree.</param>
        /// <returns>The list of media nodes.</returns>
        private static MediaNode CreateMediaNode(CommonTree mediaTree)
        {
            if (mediaTree == null)
            {
                return(null);
            }

            return(new MediaNode(
                       mediaTree.GrandChildren(T(CssParser.MEDIA_QUERY_LIST)).Select(CreateMediaQueryNode).ToSafeReadOnlyCollection(),
                       mediaTree.GrandChildren(T(CssParser.RULESETS)).Select(CreateRulesetNode).ToSafeReadOnlyCollection(),
                       mediaTree.GrandChildren(T(CssParser.PAGE)).Select(CreatePageNode).ToSafeReadOnlyCollection()));
        }
        /// <summary>Creates the ruleset nodes.</summary>
        /// <param name="rulesetTree">The list of rulesets.</param>
        /// <returns>The list of ruleset nodes.</returns>
        private static RulesetNode CreateRulesetNode(CommonTree rulesetTree)
        {
            if (rulesetTree == null)
            {
                return(null);
            }

            return(new RulesetNode(
                       CreateSelectorsGroupNode(rulesetTree.GrandChildren(T(CssParser.SELECTORS_GROUP))),
                       CreateDeclarationNodes(rulesetTree.GrandChildren(T(CssParser.DECLARATIONS))).ToSafeReadOnlyCollection(),
                       CreateImportantCommentNodes(rulesetTree)));
        }
 /// <summary>Creates the pseudo node.</summary>
 /// <param name="pseudoTree">The pseudo tree.</param>
 /// <returns>The pseudo node.</returns>
 private static PseudoNode CreatePseudoNode(CommonTree pseudoTree)
 {
     return(pseudoTree == null ? null : new PseudoNode(
                pseudoTree.GrandChildren(T(CssParser.COLONS)).Count(),
                pseudoTree.Children(T(CssParser.PSEUDONAME)).FirstChildText(),
                CreateFunctionalPseudoNode(pseudoTree.Children(T(CssParser.FUNCTIONAL_PSEUDO)).FirstOrDefault())));
 }
 /// <summary>Creates the simple selector.</summary>
 /// <param name="simpleSelectorSequenceTree">The simple selector.</param>
 /// <returns>The simple selector node.</returns>
 private static SimpleSelectorSequenceNode CreateSimpleSelectorSequenceNode(CommonTree simpleSelectorSequenceTree)
 {
     return(simpleSelectorSequenceTree == null ? null : new SimpleSelectorSequenceNode(
                CreateTypeSelectorNode(simpleSelectorSequenceTree.Children(T(CssParser.TYPE_SELECTOR)).FirstOrDefault()),
                CreateUniversalSelectorNode(simpleSelectorSequenceTree.Children(T(CssParser.UNIVERSAL)).FirstOrDefault()),
                GetWhitespaceCount(simpleSelectorSequenceTree) > 0 ? CssConstants.SingleSpace.ToString() : null,
                CreateHashClassAttribPseudoNegationNodes(simpleSelectorSequenceTree.GrandChildren(T(CssParser.HASHCLASSATNAMEATTRIBPSEUDONEGATIONNODES))).ToSafeReadOnlyCollection()));
 }
 /// <summary>Creates the key frame node.</summary>
 /// <param name="styleSheetChild">The style sheet child.</param>
 /// <returns>The key frame node.</returns>
 private static KeyFramesNode CreateKeyFramesNode(CommonTree styleSheetChild)
 {
     return(new KeyFramesNode(
                styleSheetChild.Children(T(CssParser.KEYFRAMES_SYMBOL)).FirstChildText(),
                styleSheetChild.Children(T(CssParser.IDENTBASEDVALUE)).FirstChildText(),
                StringOrUriBasedValue(styleSheetChild.Children(T(CssParser.STRINGBASEDVALUE)).FirstChildText()),
                styleSheetChild.GrandChildren(T(CssParser.KEYFRAMES_BLOCKS)).Select(CreateKeyFramesBlockNode).ToSafeReadOnlyCollection()));
 }
 /// <summary>Creates the media query node.</summary>
 /// <param name="mediaQueryTree">The media query tree.</param>
 /// <returns>The media query node.</returns>
 private static MediaQueryNode CreateMediaQueryNode(CommonTree mediaQueryTree)
 {
     return(new MediaQueryNode(
                mediaQueryTree.Children(T(CssParser.ONLY_TEXT)).FirstChildText(),
                mediaQueryTree.Children(T(CssParser.NOT_TEXT)).FirstChildText(),
                mediaQueryTree.Children(T(CssParser.MEDIA_TYPE)).FirstChildText(),
                mediaQueryTree.GrandChildren(T(CssParser.MEDIA_EXPRESSIONS)).Select(CreateMediaExpressionNode).ToSafeReadOnlyCollection()));
 }
        /// <summary>Creates the expression node</summary>
        /// <param name="exprTree">The expression tree.</param>
        /// <returns>The expression node.</returns>
        private static ExprNode CreateExpressionNode(CommonTree exprTree)
        {
            if (exprTree == null)
            {
                return(null);
            }

            return(new ExprNode(
                       CreateTermNode(exprTree.Children(T(CssParser.TERM)).FirstOrDefault()),
                       CreateTermWithOperatorsNode(exprTree.GrandChildren(T(CssParser.TERMWITHOPERATORS))).ToSafeReadOnlyCollection(),
                       CreateImportantCommentNodes(exprTree)));
        }
        /// <summary>Creates the namespace nodes.</summary>
        /// <param name="styleSheetTree">The styleSheet tree.</param>
        /// <returns>The list of namespace nodes.</returns>
        private static ReadOnlyCollection <NamespaceNode> CreateNamespaceNodes(CommonTree styleSheetTree)
        {
            if (styleSheetTree == null)
            {
                return(Enumerable.Empty <NamespaceNode>().ToSafeReadOnlyCollection());
            }

            return(styleSheetTree
                   .GrandChildren(T(CssParser.NAMESPACES))
                   .Select(ns =>
            {
                var value = StringOrUriBasedValue(ns.Children(T(CssParser.STRINGBASEDVALUE)).FirstChildText());
                if (string.IsNullOrWhiteSpace(value))
                {
                    value = StringOrUriBasedValue(ns.Children(T(CssParser.URIBASEDVALUE)).FirstChildText());
                }

                return new NamespaceNode(ns.Children(T(CssParser.NAMESPACE_PREFIX)).FirstChildText(), value);
            }).ToSafeReadOnlyCollection());
        }
        /// <summary>Gets the import nodes.</summary>
        /// <param name="styleSheetTree">The styleSheet common tree.</param>
        /// <returns>The import nodes.</returns>
        private static ReadOnlyCollection <ImportNode> CreateImportNodes(CommonTree styleSheetTree)
        {
            if (styleSheetTree == null)
            {
                return(Enumerable.Empty <ImportNode>().ToSafeReadOnlyCollection());
            }

            return(styleSheetTree
                   .GrandChildren(T(CssParser.IMPORTS))
                   .Select(import =>
            {
                var importChild = import.Children().FirstOrDefault();
                if (importChild != null)
                {
                    var allowedImportData = AllowedImportData.None;
                    string importValue = null;
                    if (importChild.Text == T(CssParser.STRINGBASEDVALUE))
                    {
                        allowedImportData = AllowedImportData.String;
                        importValue = StringOrUriBasedValue(importChild.FirstChildText());
                    }
                    else if (importChild.Text == T(CssParser.URIBASEDVALUE))
                    {
                        allowedImportData = AllowedImportData.Uri;
                        importValue = StringOrUriBasedValue(importChild.FirstChildText());
                    }

                    return new ImportNode(
                        allowedImportData,
                        importValue,
                        import.GrandChildren(T(CssParser.MEDIA_QUERY_LIST)).Select(CreateMediaQueryNode).ToSafeReadOnlyCollection());
                }

                return null;
            }).ToSafeReadOnlyCollection());
        }
 /// <summary>Creates the key frames block node.</summary>
 /// <param name="keyFramesBlockTree">The key frames block tree.</param>
 /// <returns>The key frames block node.</returns>
 private static KeyFramesBlockNode CreateKeyFramesBlockNode(CommonTree keyFramesBlockTree)
 {
     return(new KeyFramesBlockNode(
                keyFramesBlockTree.GrandChildren(T(CssParser.KEYFRAMES_SELECTORS)).Select(keyFramesSelector => keyFramesSelector.FirstChildText()).ToSafeReadOnlyCollection(),
                CreateDeclarationNodes(keyFramesBlockTree.GrandChildren(T(CssParser.DECLARATIONS))).ToSafeReadOnlyCollection()));
 }