/// <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); } } } }
/// <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)); } }
/// <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 ); }
protected override bool IsEligibleCore(IHtmlElement element) { return(_selector.IsEligible(element)); }