Ejemplo n.º 1
0
        /// <summary>
        /// 发现容器中所有可能是控件的元素并包装成控件返回
        /// </summary>
        /// <param name="form">控件所属的表单</param>
        /// <param name="container">要搜索的容器</param>
        /// <returns>找到的控件</returns>
        protected virtual IEnumerable <IFormControl> DiscoveryControls(HtmlForm form, IHtmlContainer container)
        {
            //UNDONE 没有检查 name 是否包含特殊字符

            foreach (var element in container.Elements())
            {
                if (inputTextSelector.IsEligible(element))
                {
                    yield return(new HtmlInputText(form, element));
                }

                else if (textareaSelector.IsEligible(element))
                {
                    yield return(new HtmlTextArea(form, element));
                }

                else if (selectControlSelector.IsEligible(element))
                {
                    yield return(new HtmlSelect(form, element));
                }

                else
                {
                    foreach (var control in DiscoveryControls(form, element))
                    {
                        yield return(control);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 检查元素是否符合指定选择器要求,并缓存结果于元素当前文档版本
        /// </summary>
        /// <param name="selector">选择器</param>
        /// <param name="element">元素</param>
        /// <returns>是否符合选择器要求</returns>
        public static bool IsEligibleBuffered(this ISelector 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));
            }
        }
Ejemplo n.º 3
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 );
        }
Ejemplo n.º 4
0
 protected override bool IsEligibleCore(IHtmlElement element)
 {
     return(_selector.IsEligible(element));
 }