Exemple #1
0
        /// <summary>
        /// 创建关系处理程序
        /// </summary>
        /// <param name="relative">关系</param>
        /// <param name="leftSelector">左选择器</param>
        /// <returns>关系处理程序</returns>
        private RelativeHandler CreateRelativeHandler(string relative, ICssSelector leftSelector)
        {
            if (relative == null)
            {
                return(element => leftSelector.IsEligible(element));
            }

            else if (Relative == ">")
            {
                return(element => leftSelector.IsEligible(element.Parent()));
            }

            else if (Relative == "")
            {
                return(element => element.Ancestors().Any(e => leftSelector.IsEligible(e)));
            }

            else if (Relative == "+")
            {
                return(element => leftSelector.IsEligible(element.PreviousElement()));
            }

            else if (Relative == "~")
            {
                return(element => element.SiblingsBeforeSelf().Any(e => leftSelector.IsEligible(e)));
            }

            throw new NotSupportedException("不支持的关系运算符");
        }
Exemple #2
0
 public CssRuleSet(ICssSelector selector, IList <CssDeclaration> normalDeclarations, IList <CssDeclaration> importantDeclarations
                   )
 {
     this.selector              = selector;
     this.normalDeclarations    = normalDeclarations;
     this.importantDeclarations = importantDeclarations;
 }
Exemple #3
0
        /// <summary>
        /// 创建选择器
        /// </summary>
        /// <param name="expression">选择器表达式</param>
        /// <returns>选择器实例</returns>
        public static ICssSelector Create(string expression)
        {
            if (selectorCache.ContainsKey(expression))
            {
                return(selectorCache[expression]);
            }

            var match = casecadingSelectorRegex.Match(expression);

            if (!match.Success)
            {
                throw new FormatException();
            }


            ICssSelector selector = CssElementSelector.Create(match.Groups["leftSelector"].Value);

            foreach (var extraCapture in match.Groups["extra"].Captures.Cast <Capture>())
            {
                var relative      = extraCapture.FindCaptures(match.Groups["relative"]).Single().Value.Trim();
                var rightSelector = extraCapture.FindCaptures(match.Groups["rightSelector"]).Single().Value.Trim();

                selector = new CssCasecadingSelector(selector, relative, CssElementSelector.Create(rightSelector));
            }

            lock ( _cacheSync )
            {
                selectorCache[expression] = selector;
            }

            return(selector);
        }
        public static ICssElementMatcher BuildMatcher(this ICssSelector selector, IXmlNamespaceResolver namespaceResolver = null)
        {
            var builder = new CssElementMatcherBuilderVisitor(namespaceResolver);

            selector.Apply(builder);
            return(builder.Matcher);
        }
Exemple #5
0
            public Enumerator(ICssSelector selector, IEnumerator <T> enumerator)
            {
                coreSelector   = selector;
                coreEnumerator = enumerator;

                Trace.Write("Selector", string.Format(CultureInfo.InvariantCulture, "Begin Enumerate Search \"{0}\"", coreSelector.ToString()));
            }
Exemple #6
0
 /// <summary>
 /// Creates a new
 /// <see cref="CssRuleSet"/>
 /// from selector and raw list of declarations.
 /// </summary>
 /// <remarks>
 /// Creates a new
 /// <see cref="CssRuleSet"/>
 /// from selector and raw list of declarations.
 /// The declarations are split into normal and important under the hood.
 /// To construct the
 /// <see cref="CssRuleSet"/>
 /// instance from normal and important declarations, see
 /// <see cref="CssRuleSet(iText.StyledXmlParser.Css.Selector.ICssSelector, System.Collections.Generic.IList{E}, System.Collections.Generic.IList{E})
 ///     "/>
 /// </remarks>
 /// <param name="selector">the CSS selector</param>
 /// <param name="declarations">the CSS declarations</param>
 public CssRuleSet(ICssSelector selector, IList <CssDeclaration> declarations)
 {
     this.selector              = selector;
     this.normalDeclarations    = new List <CssDeclaration>();
     this.importantDeclarations = new List <CssDeclaration>();
     SplitDeclarationsIntoNormalAndImportant(declarations, normalDeclarations, importantDeclarations);
 }
Exemple #7
0
        /// <summary>
        /// 创建 jQuery 对象
        /// </summary>
        /// <param name="selector">选择器</param>
        /// <param name="scope">范畴限定</param>
        public jQuery(string selector, IHtmlContainer scope)
        {
            _selectorExpression = selector;
            _scope = scope;

            _selector = CssParser.Create(scope, selector);
            _elements = _selector.Filter(_scope.Descendants());
        }
        /// <summary>
        /// 创建现有 CSS 选择器的自动缓存包装
        /// </summary>
        /// <param name="selector">已有的 CSS 选择器</param>
        /// <returns>对已有选择器的自动缓存的包装</returns>
        public static ICssSelector CreateCacheableWrapper( ICssSelector selector )
        {
            var cacheable = selector as CssCacheableSelector;
              if ( cacheable == null )
            cacheable = new CacheableCssSelectorWrapper( selector );

              return cacheable;
        }
Exemple #9
0
        /// <summary>
        /// 使用选择器从元素集中筛选出符合选择器要求的元素
        /// </summary>
        /// <param name="source">源元素集</param>
        /// <param name="selector">选择器</param>
        /// <returns>筛选结果</returns>
        public static IEnumerable<IHtmlElement> FilterBy( this IEnumerable<IHtmlElement> source, ICssSelector selector )
        {
            if ( source == null )
            return null;

              if ( selector == null )
            return source;

              return source.Where( selector.IsEligible );
        }
        /// <summary>
        /// 创建 CSS 层叠选择器对象
        /// </summary>
        /// <param name="relativeSelector">关系选择器</param>
        /// <param name="lastSelector">附加的最后一个选择器</param>
        public CssCasecadingSelector( CssRelativeSelector relativeSelector, ICssSelector lastSelector )
        {
            if ( relativeSelector == null )
            throw new ArgumentNullException( "relativeSelector" );

              if ( lastSelector == null )
            throw new ArgumentNullException( "lastSelector" );

              RelativeSelector = relativeSelector;
              LastSelector = lastSelector;
        }
Exemple #11
0
        public static ICssSelector CreateCacheableWrapper(ICssSelector selector)
        {
            var cacheable = selector as CssCacheableSelector;

            if (cacheable == null)
            {
                cacheable = new CacheableCssSelectorWrapper(selector);
            }

            return(cacheable);
        }
Exemple #12
0
        protected override bool IsEligible(ICssSelector leftSelector, IHtmlElement element)
        {
            var restrict = leftSelector as ContainerRestrict;

            if (restrict != null)
            {
                return(restrict.RestrictContainer.Nodes().Contains(element));
            }

            return(leftSelector.IsEligibleBuffered(element.Parent()));
        }
Exemple #13
0
        /// <summary>
        /// 派生类重写此方法确定指定元素是否需要重写渲染规则
        /// </summary>
        /// <param name="element">要检测的元素</param>
        /// <returns>是否需要使用自定义渲染规则</returns>
        protected virtual bool IsEligible( IHtmlElement element )
        {
            if ( CssSelector == null )
            return false;

              if ( _selectorExpression == CssSelector )
            return _selectorCache.IsEligible( element );

              _selectorExpression = CssSelector;
              _selectorCache = CssParser.ParseSelector( CssSelector );

              return _selectorCache.IsEligible( element );
        }
        public IEnumerable <INativeElement> GetElementsWithQuerySelector(ICssSelector selector, DomContainer domContainer)
        {
            domContainer.RunScript(new ScriptLoader().GetSizzleInstallScript());

            var command = string.Format("window.Sizzle('{0}', {1})", selector.Selector(true), containerReference);

            var ffElements = GetElementArrayEnumerator(command);

            foreach (var ffElement in ffElements)
            {
                yield return(ffElement);
            }
        }
Exemple #15
0
        /// <summary>
        /// 使用选择器从元素集中筛选出符合选择器要求的元素
        /// </summary>
        /// <param name="selector">选择器</param>
        /// <param name="source">源元素集</param>
        /// <returns>筛选结果</returns>
        public static IEnumerable <IHtmlElement> Filter(this ICssSelector selector, IEnumerable <IHtmlElement> source)
        {
            if (selector == null)
            {
                throw new ArgumentNullException("selector");
            }

            if (source == null)
            {
                return(null);
            }

            return(source.Where(selector.IsEligible));
        }
Exemple #16
0
        /// <summary>
        /// 创建范畴限定选择器
        /// </summary>
        /// <param name="selector">选择器</param>
        /// <param name="scope">范畴限定,上溯时不超出此范畴</param>
        /// <returns>>带范畴限定的层叠选择器</returns>
        public static ICssSelector Create(ICssSelector selector, IHtmlContainer scope)
        {
            if (selector == null)
            {
                throw new ArgumentNullException("selector");
            }

            if (scope == null)
            {
                return(selector);
            }

            return(new CssCasecadingSelector(new CssScopeRestrictionSelector(scope), null, selector));
        }
Exemple #17
0
        protected override bool IsEligible(ICssSelector leftSelector, IHtmlElement element)
        {
            var restrict = leftSelector as ContainerRestrict;

            if (restrict != null)
            {
                return(element.IsDescendantOf(restrict.RestrictContainer));
            }


            var parant = element.Parent();

            //如果父级元素符合左选择器,或者父级元素符合本选择器。
            return(leftSelector.IsEligibleBuffered(parant) || this.IsEligibleBuffered(parant));
        }
Exemple #18
0
        /// <summary>
        /// 创建 CSS 层叠选择器对象
        /// </summary>
        /// <param name="relativeSelector">关系选择器</param>
        /// <param name="lastSelector">附加的最后一个选择器</param>
        public CssCasecadingSelector(CssRelativeSelector relativeSelector, ICssSelector lastSelector)
        {
            if (relativeSelector == null)
            {
                throw new ArgumentNullException("relativeSelector");
            }

            if (lastSelector == null)
            {
                throw new ArgumentNullException("lastSelector");
            }


            RelativeSelector = relativeSelector;
            LastSelector     = lastSelector;
        }
        public IEnumerable <INativeElement> GetElementsWithQuerySelector(ICssSelector selector, DomContainer domContainer)
        {
            var container = "document";

            if (_element != null)
            {
                var elementTag = new ElementTag(_element.TagName);
                if (elementTag.Equals(new ElementTag("frame")) || elementTag.Equals(new ElementTag("iframe")))
                {
                    var frameHierarchy = _element.GetAttributeValue("data-watinFrameHierarchy");
                    container = frameHierarchy + ".document";
                }
                else
                {
                    var document = _element.AsHtmlElement.document;
                    var result   = new Expando(document).GetValue <string>("___WATINFRAMEHIERARCHY");

                    container = "";
                    if (result != null)
                    {
                        container = result;
                    }

                    if (!string.IsNullOrEmpty(container))
                    {
                        container += ".";
                    }

                    container += _element.GetJavaScriptElementReference();
                }
            }
            else
            {
                //container = CreateArray();
            }

            domContainer.RunScript(new ScriptLoader().GetSizzleInstallScript());

            var code = string.Format("document.___WATINRESULT = Sizzle('{0}', {1});", selector.Selector(true), container);

            domContainer.RunScript(code);

            return(new JScriptElementArrayEnumerator((IEDocument)domContainer.NativeDocument, "___WATINRESULT"));
        }
Exemple #20
0
        /// <summary>
        /// 检查元素是否符合指定选择器要求,并缓存结果于元素当前文档版本
        /// </summary>
        /// <param name="selector">选择器</param>
        /// <param name="element">元素</param>
        /// <returns>是否符合选择器要求</returns>
        public static bool IsEligibleBuffered(this ICssSelector selector, IHtmlElement element)
        {
            if (selector == null)
            {
                throw new ArgumentNullException("selector");
            }

            if (element == null)
            {
                return(selector.IsEligible(element));
            }

            var cacheContainer = element.Document as IVersionCacheContainer;

            if (cacheContainer == null)
            {
                return(selector.IsEligible(element));
            }


            lock (cacheContainer.SyncRoot)
            {
                var cache = cacheContainer.CurrenctVersionCache[selector] as Dictionary <IHtmlElement, bool>;

                if (cache != null)
                {
                    bool result;
                    if (cache.TryGetValue(element, out result))
                    {
                        return(result);
                    }
                }

                else
                {
                    cacheContainer.CurrenctVersionCache[selector] = cache = new Dictionary <IHtmlElement, bool>();
                }

                return(cache[element] = selector.IsEligible(element));
            }
        }
        public IEnumerable<INativeElement> GetElementsWithQuerySelector(ICssSelector selector, DomContainer domContainer)
        {
            var container = "document";
            if (_element != null)
            {
                var elementTag = new ElementTag(_element.TagName);
                if (elementTag.Equals(new ElementTag("frame")) || elementTag.Equals(new ElementTag("iframe")))
                {
                    var frameHierarchy = _element.GetAttributeValue("data-watinFrameHierarchy");
                    container = frameHierarchy + ".document";
                }
                else
                {
                    var document = _element.AsHtmlElement.document;
                    var result = new Expando(document).GetValue<string>("___WATINFRAMEHIERARCHY");

                    container = "";
                    if (result != null)
                        container = result;

                    if (!string.IsNullOrEmpty(container))
                        container += ".";

                    container += _element.GetJavaScriptElementReference();
                }
            }
            else
            {
                //container = CreateArray();
            }

            domContainer.RunScript(new ScriptLoader().GetSizzleInstallScript());

            var code = string.Format("document.___WATINRESULT = Sizzle('{0}', {1});", selector.Selector(true), container);
            domContainer.RunScript(code);

            return new JScriptElementArrayEnumerator((IEDocument) domContainer.NativeDocument, "___WATINRESULT");
        }
Exemple #22
0
        /// <summary>
        /// 创建层叠选择器
        /// </summary>
        /// <param name="leftSelector">左选择器</param>
        /// <param name="relative">关系选择符</param>
        /// <param name="rightSelector">右选择器</param>
        public CssCasecadingSelector(ICssSelector leftSelector, string relative, ICssSelector rightSelector)
        {
            if (rightSelector == null)
            {
                throw new ArgumentNullException("rightSelector");
            }

            if (leftSelector == null)
            {
                throw new ArgumentNullException("leftSelector");
            }

            _right = rightSelector;

            if (relative != null)
            {
                _relative = relative.Trim();
            }

            _left = leftSelector;

            _relativeHandler = CreateRelativeHandler(relative, _left);
        }
Exemple #23
0
        /// <summary>
        /// 创建层叠选择器实例
        /// </summary>
        /// <param name="leftSelector">左选择器</param>
        /// <param name="combinator">结合符</param>
        /// <param name="rightSelector">右选择器</param>
        public static CssCasecadingSelector Create(ICssSelector leftSelector, char combinator, ICssSelector rightSelector)
        {
            if (leftSelector == null)
            {
                throw new ArgumentNullException("leftSelector");
            }

            if (rightSelector == null)
            {
                throw new ArgumentNullException("rightSelector");
            }


            var relativeSelctor    = CreateRelativeSelector(leftSelector, combinator);
            var casecadingSelector = rightSelector as CssCasecadingSelector;

            if (casecadingSelector != null)
            {
                return(Combine(relativeSelctor, casecadingSelector));
            }

            return(new CssCasecadingSelector(relativeSelctor, rightSelector));
        }
Exemple #24
0
        /// <summary>
        /// 创建层叠选择器
        /// </summary>
        /// <param name="relativeSelector">前置关系选择器</param>
        /// <param name="selector">右选择器</param>
        /// <returns></returns>
        public static ICssSelector Create(CssRelativeSelector relativeSelector, ICssSelector selector)
        {
            if (relativeSelector == null)
            {
                throw new ArgumentNullException("relativeSelector");
            }

            if (selector == null)
            {
                throw new ArgumentNullException("selector");
            }


            var elementSelector = selector as CssElementSelector;

            if (elementSelector != null)
            {
                return(new CssCasecadingSelector(relativeSelector, elementSelector));
            }

            var casecadingSelector = selector as CssCasecadingSelector;

            if (casecadingSelector != null)
            {
                return(Combine(relativeSelector, casecadingSelector));
            }

            var multipleSelector = selector as CssMultipleSelector;

            if (multipleSelector != null)
            {
                return(CssMultipleSelector.Combine(relativeSelector, multipleSelector));
            }


            throw new NotSupportedException();
        }
Exemple #25
0
        /// <summary>
        /// 创建关系选择器
        /// </summary>
        /// <param name="leftSelector">左选择器</param>
        /// <param name="combanitor">关系结合符</param>
        /// <returns>关系选择器</returns>
        private static CssRelativeSelector CreateRelativeSelector(ICssSelector leftSelector, char combanitor)
        {
            if (combanitor == '>')
            {
                return(new CssParentRelativeSelector(leftSelector));
            }

            else if (combanitor == ' ')
            {
                return(new CssAncetorRelativeSelector(leftSelector));
            }

            else if (combanitor == '+')
            {
                return(new CssPreviousRelativeSelector(leftSelector));
            }

            else if (combanitor == '~')
            {
                return(new CssSiblingsRelativeSelector(leftSelector));
            }

            throw new NotSupportedException("不支持的关系运算符");
        }
Exemple #26
0
        protected override bool IsEligible( ICssSelector leftSelector, IHtmlElement element )
        {
            var restrict = leftSelector as ContainerRestrict;
              if ( restrict != null )
            return restrict.RestrictContainer.Nodes().Contains( element );

              return leftSelector.IsEligibleBuffered( element.Parent() );
        }
        private IEnumerable <XElement> Match(XDocument xdoc, ICssSelector selector)
        {
            var matcher = selector.BuildMatcher(_namespaceManager);

            return(xdoc.Descendants().Where(e => matcher.Matches(new XElementInfo(e))));
        }
        /// <summary>
        /// 创建层叠选择器
        /// </summary>
        /// <param name="relativeSelector">前置关系选择器</param>
        /// <param name="selector">右选择器</param>
        /// <returns></returns>
        public static ICssSelector Create( CssRelativeSelector relativeSelector, ICssSelector selector )
        {
            if ( relativeSelector == null )
            throw new ArgumentNullException( "relativeSelector" );

              if ( selector == null )
            throw new ArgumentNullException( "selector" );

              var elementSelector = selector as CssElementSelector;
              if ( elementSelector != null )
            return new CssCasecadingSelector( relativeSelector, elementSelector );

              var casecadingSelector = selector as CssCasecadingSelector;
              if ( casecadingSelector != null )
            return Combine( relativeSelector, casecadingSelector );

              var multipleSelector = selector as CssMultipleSelector;
              if ( multipleSelector != null )
            return CssMultipleSelector.Combine( relativeSelector, multipleSelector );

              throw new NotSupportedException();
        }
Exemple #29
0
 public IEnumerable <INativeElement> GetElementsWithQuerySelector(ICssSelector selector, DomContainer domContainer)
 {
     return(FindElements(By.CssSelector(selector.Selector(false))));
 }
Exemple #30
0
        /// <summary>
        /// 使用选择器从元素集中筛选出符合选择器要求的元素
        /// </summary>
        /// <param name="source">源元素集</param>
        /// <param name="selector">选择器</param>
        /// <returns>筛选结果</returns>
        public static IEnumerable <IHtmlElement> FilterBy(this IEnumerable <IHtmlElement> source, ICssSelector selector)
        {
            if (source == null)
            {
                return(null);
            }

            if (selector == null)
            {
                return(source);
            }

            return(source.Where(selector.IsEligible));
        }
Exemple #31
0
 /// <summary>
 /// 使用选择器从元素集中筛选出符合选择器要求的元素
 /// </summary>
 /// <param name="selector">选择器</param>
 /// <param name="source">源元素集</param>
 /// <returns>筛选结果</returns>
 public static IEnumerable <IHtmlElement> Filter(this ICssSelector selector, IEnumerable <IHtmlElement> source)
 {
     return(source.Where(e => selector.IsEligible(e)));
 }
 internal CssPseudoClassNotSelectorItem(ICssSelector argumentsSelector)
     : base(CommonCssConstants.NOT, argumentsSelector.ToString())
 {
     this.argumentsSelector = argumentsSelector;
 }
Exemple #33
0
        protected override bool IsEligible( ICssSelector leftSelector, IHtmlElement element )
        {
            var restrict = leftSelector as ContainerRestrict;
              if ( restrict != null )
            return element.IsDescendantOf( restrict.RestrictContainer );

              var parant = element.Parent();

              //如果父级元素符合左选择器,或者父级元素符合本选择器。
              return leftSelector.IsEligibleBuffered( parant ) || this.IsEligibleBuffered( parant );
        }
 /// <summary>
 /// Creates a new
 /// <see cref="CssPageMarginBoxSelector"/>
 /// instance.
 /// </summary>
 /// <param name="pageMarginBoxName">the page margin box name</param>
 /// <param name="pageSelector">the page selector</param>
 public CssPageMarginBoxSelector(String pageMarginBoxName, ICssSelector pageSelector)
 {
     this.pageMarginBoxName = pageMarginBoxName;
     this.pageSelector      = pageSelector;
 }
Exemple #35
0
 /// <summary>
 /// 检查元素是否符合选择器
 /// </summary>
 /// <param name="leftSelector">左选择器</param>
 /// <param name="element">要检验的元素</param>
 /// <returns>是否符合选择器</returns>
 protected abstract bool IsEligible( ICssSelector leftSelector, IHtmlElement element );
 public CacheableCssSelectorWrapper( ICssSelector selector )
 {
     _selector = selector;
 }
        public IEnumerable <Element> FindElementsUsingQuerySelector(ICssSelector selector)
        {
            var nativeElementCollection2 = (INativeElementCollection2)GetNativeElementCollection();

            return(WrapMatchingElements(nativeElementCollection2.GetElementsWithQuerySelector(selector, domContainer)));
        }
        /// <summary>
        /// 创建层叠选择器实例
        /// </summary>
        /// <param name="leftSelector">左选择器</param>
        /// <param name="combinator">结合符</param>
        /// <param name="rightSelector">右选择器</param>
        public static CssCasecadingSelector Create( ICssSelector leftSelector, char combinator, ICssSelector rightSelector )
        {
            if ( leftSelector == null )
            throw new ArgumentNullException( "leftSelector" );

              if ( rightSelector == null )
            throw new ArgumentNullException( "rightSelector" );

              var relativeSelctor = CreateRelativeSelector( leftSelector, combinator );
              var casecadingSelector = rightSelector as CssCasecadingSelector;

              if ( casecadingSelector != null )
            return Combine( relativeSelctor, casecadingSelector );

              return new CssCasecadingSelector( relativeSelctor, rightSelector );
        }
Exemple #39
0
 public CssParentRelativeSelector( ICssSelector leftSelector )
     : base(leftSelector)
 {
 }
Exemple #40
0
 /// <summary>
 /// Creates a new
 /// <see cref="CssNonStandardRuleSet"/>
 /// instance.
 /// </summary>
 /// <param name="selector">the selector</param>
 /// <param name="declarations">the declarations</param>
 public CssNonStandardRuleSet(ICssSelector selector, IList <CssDeclaration> declarations)
     : base(selector, declarations)
 {
 }
 public IEnumerable<INativeElement> GetElementsWithQuerySelector(ICssSelector selector, WatiN.Core.DomContainer domContainer)
 {
     throw new NotImplementedException();
 }
 public IEnumerable<INativeElement> GetElementsWithQuerySelector(ICssSelector selector, DomContainer domContainer)
 {
     return FindElements(By.CssSelector(selector.Selector(false)));
 }
Exemple #43
0
 public CacheableCssSelectorWrapper(ICssSelector selector)
 {
     _selector = selector;
 }
Exemple #44
0
        protected override bool IsEligible( ICssSelector leftSelector, IHtmlElement element )
        {
            var previous = element.PreviousElement();

              return leftSelector.IsEligibleBuffered( previous ) || this.IsEligibleBuffered( previous );
        }
 public virtual void DefaultVisit(ICssSelector selector)
 {
 }
Exemple #46
0
 public CssSiblingsRelativeSelector( ICssSelector leftSelector )
     : base(leftSelector)
 {
 }
Exemple #47
0
 public CssAncetorRelativeSelector( ICssSelector leftSelector )
     : base(leftSelector)
 {
 }
Exemple #48
0
 protected override bool IsEligible( ICssSelector leftSelector, IHtmlElement element )
 {
     return leftSelector.IsEligibleBuffered( element.PreviousElement() );
 }
Exemple #49
0
 public CssPreviousRelativeSelector( ICssSelector leftSelector )
     : base(leftSelector)
 {
 }
Exemple #50
0
 /// <summary>
 /// 创建 CssRelativeSelector 对象
 /// </summary>
 /// <param name="leftSelector"></param>
 protected CssRelativeSelector( ICssSelector leftSelector )
 {
     LeftSelector = leftSelector;
 }
        public IEnumerable<INativeElement> GetElementsWithQuerySelector(ICssSelector selector, DomContainer domContainer)
        {
            domContainer.RunScript(new ScriptLoader().GetSizzleInstallScript());

            var command = string.Format("window.Sizzle('{0}', {1})", selector.Selector(true), containerReference);

            var ffElements = GetElementArrayEnumerator(command);
            foreach (var ffElement in ffElements)
            {
                yield return ffElement;
            }
        }
        /// <summary>
        /// 创建关系选择器
        /// </summary>
        /// <param name="leftSelector">左选择器</param>
        /// <param name="combanitor">关系结合符</param>
        /// <returns>关系选择器</returns>
        private static CssRelativeSelector CreateRelativeSelector( ICssSelector leftSelector, char combanitor )
        {
            if ( combanitor == '>' )
            return new CssParentRelativeSelector( leftSelector );

              else if ( combanitor == ' ' )
            return new CssAncetorRelativeSelector( leftSelector );

              else if ( combanitor == '+' )
            return new CssPreviousRelativeSelector( leftSelector );

              else if ( combanitor == '~' )
            return new CssSiblingsRelativeSelector( leftSelector );

              throw new NotSupportedException( "不支持的关系运算符" );
        }