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)));
            }
Esempio n. 2
0
        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();
                }
            }
Esempio n. 5
0
        /// <summary>
        /// 获取在兄弟元素中,自己的顺序位置
        /// </summary>
        /// <param name="element">要获取序号的元素</param>
        /// <returns>顺序位置</returns>
        public static int ElementsIndexOfSelf(this IHtmlElement element)
        {
            var siblings = element.Siblings();

            return(siblings.ToList().IndexOf(element));
        }
Esempio n. 6
0
        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 ) );
      }