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

            if (string.IsNullOrEmpty(selector))
            {
                return(source);
            }

            return(FilterBy(source, CssParser.ParseSelector(selector)));
        }
コード例 #2
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));
        }
コード例 #3
0
        /// <summary>
        /// 创建层叠选择器
        /// </summary>
        /// <param name="elements">作为范畴限定的元素集</param>
        /// <param name="expression">选择器表达式</param>
        /// <returns>层叠选择器</returns>
        public static ISelector Create(IEnumerable <IHtmlElement> elements, string expression)
        {
            if (elements == null)
            {
                throw new ArgumentNullException("elements");
            }

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

            var selector = CssParser.ParseSelector(expression);

            if (elements.IsNullOrEmpty())
            {
                return(selector);
            }

            var relativeSelector = new CssAncetorRelativeSelector(new CssElementsRestrictionSelector(elements));

            return(Create(relativeSelector, selector));
        }
コード例 #4
0
ファイル: CssParser.cs プロジェクト: qaz734913414/Topawes
        /// <summary>
        /// 创建带范畴限定的选择器
        /// </summary>
        /// <param name="expression">选择器表达式</param>
        /// <param name="scope">范畴限定,上溯时不超出此范畴</param>
        /// <returns>带范畴限定的层叠选择器</returns>
        public static ISelector Create(IHtmlContainer scope, string expression)
        {
            if (scope == null)
            {
                throw new ArgumentNullException("scope");
            }

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

            return(CssCasecadingSelector.Create(new CssAncetorRelativeSelector(new ContainerRestrict(scope)), CssParser.ParseSelector(expression)));
        }
コード例 #5
0
 /// <summary>
 /// 获取符合条件的子代元素
 /// </summary>
 /// <param name="container">要获取子代元素的容器对象</param>
 /// <param name="selector">用于筛选子代元素的选择器</param>
 /// <returns>符合选择器的容器的所有子代元素</returns>
 /// <remarks>与Find方法不同的是,Descendants方法的选择器会无限上溯,即当判断父代约束时,会无限上溯到文档根。而Find方法只会上溯到自身的子节点</remarks>
 public static IEnumerable <IHtmlElement> Descendants(this IHtmlContainer container, string selector)
 {
     return(CssParser.ParseSelector(selector).Filter(Descendants(container)));
 }