bool ICssPseudoClassSelector.IsEligible(IHtmlElement element) { if (element == null) { throw new ArgumentNullException("element"); } List <IHtmlElement> siblings; if (ofType) { siblings = element.Siblings(element.Name).ToList(); } else { siblings = element.Siblings().ToList(); } if (last) { siblings.Reverse(); } return(Check(siblings.IndexOf(element))); }
private static string CreateIdentity(IHtmlElement element, bool ancestorsCreate) { string parentId; var parentElement = element.Parent(); if (parentElement != null) { parentId = Identity(parentElement); if (parentId == null) { if (ancestorsCreate) { parentId = Identity(parentElement, true, true); } else { parentId = CreateIdentity(parentElement, false); } } } else { if (element.Container is IHtmlDocument) { parentId = null; } else { throw new InvalidOperationException(); } } var name = GetElementName(element); var builder = new StringBuilder(); if (!string.IsNullOrEmpty(parentId)) { builder.AppendFormat("{0}_", parentId); } builder.Append(name); if (element.Siblings().Where(e => GetElementName(e).EqualsIgnoreCase(GetElementName(element))).IsSingle()) { return(builder.ToString()); } var index = element.SiblingsBeforeSelf().Count(e => GetElementName(e).EqualsIgnoreCase(GetElementName(element))); builder.Append(index + 1); var identity = builder.ToString(); return(EnsureUniqueness(identity, element.Document)); }
bool ICssPseudoClassSelector.IsEligible(IHtmlElement element) { if (element == null) { throw new ArgumentNullException("element"); } switch (_name) { case "only-child": return(element.Siblings().Count() == 1); case "only-of-type": return(element.Siblings(element.Name).Count() == 1); case "empty": return(element.Elements().Count() == 0); default: throw new InvalidOperationException(); } }
bool ICssPseudoClassSelector.IsEligible(IHtmlElement element) { if (element == null) { throw new ArgumentNullException("element"); } switch (_name) { case "only-child": return(element.Siblings().Count() == 1); case "only-of-type": return(element.Siblings(element.Name).Count() == 1); case "empty": return(element.Nodes().Count(n => n is IHtmlElement || n is IHtmlTextNode) == 0);//只有元素和文本节点视为有内容 http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#empty-pseudo default: throw new InvalidOperationException(); } }
/// <summary> /// 获取在兄弟元素中,自己的顺序位置 /// </summary> /// <param name="element">要获取序号的元素</param> /// <returns>顺序位置</returns> public static int ElementsIndexOfSelf(this IHtmlElement element) { var siblings = element.Siblings(); return(siblings.ToList().IndexOf(element)); }
private static string CreateIdentity( IHtmlElement element, bool ancestorsCreate ) { string parentId; var parentElement = element.Parent(); if ( parentElement != null ) { parentId = Identity( parentElement ); if ( parentId == null ) { if ( ancestorsCreate ) parentId = Identity( parentElement, true, true ); else parentId = CreateIdentity( parentElement, false ); } } else { if ( element.Container is IHtmlDocument ) parentId = null; else throw new InvalidOperationException(); } var name = GetElementName( element ); var builder = new StringBuilder(); if ( !string.IsNullOrEmpty( parentId ) ) builder.AppendFormat( "{0}_", parentId ); builder.Append( name ); string identity; if ( element.Siblings().Where( e => GetElementName( e ).EqualsIgnoreCase( GetElementName( element ) ) ).IsSingle() ) identity = builder.ToString(); var index = element.SiblingsBeforeSelf().Count( e => GetElementName( e ).EqualsIgnoreCase( GetElementName( element ) ) ); builder.Append( index + 1 ); identity = builder.ToString(); return EnsureUniqueness( identity, element.Document ); }
bool ICssPseudoClassSelector.IsEligible( IHtmlElement element ) { if ( element == null ) throw new ArgumentNullException( "element" ); switch ( _name ) { case "only-child": return element.Siblings().Count() == 1; case "only-of-type": return element.Siblings( element.Name ).Count() == 1; case "empty": return element.Nodes().Count( n => n is IHtmlElement || n is IHtmlTextNode ) == 0;//只有元素和文本节点视为有内容 http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#empty-pseudo default: throw new InvalidOperationException(); } }
bool ICssPseudoClassSelector.IsEligible( IHtmlElement element ) { if ( element == null ) throw new ArgumentNullException( "element" ); List<IHtmlElement> siblings; if ( ofType ) siblings = element.Siblings( element.Name ).ToList(); else siblings = element.Siblings().ToList(); if ( last ) siblings.Reverse(); return Check( siblings.IndexOf( element ) ); }