public void Visit(NthChildSelector selector)
 {
   this.Specificity += (1 << 8);
 }
示例#2
0
 private bool CountMatches(NthChildSelector selector, int count)
 {
   var withOffset = count - selector.Offset;
   return (selector.Step == 0 ? withOffset == 0 : withOffset % selector.Step == 0);
 }
    public void Visit(NthChildSelector selector)
    {
      this.Visit((PseudoSelector)selector);

      _writer.Write('(');
      if (selector.Step == 2 && selector.Offset == 1)
      {
        _writer.Write(PseudoSelectorPrefix.NthChildOdd);
      }
      else if (selector.Step == 2 && selector.Offset == 0)
      {
        _writer.Write(PseudoSelectorPrefix.NthChildEven);
      }
      else
      {
        _writer.Write(selector.Step);
        _writer.Write('n');
        if (selector.Offset >= 0) _writer.Write('+');
        _writer.Write(selector.Offset);
      }
      _writer.Write(')');
    }
示例#4
0
 public void Visit(NthChildSelector selector)
 {
   switch (selector.Type)
   {
     case PseudoTypes.FunctionNthchild:
       _matches = _matches.Where(n => _engine.Parents(n).Any()
                                   && CountMatches(selector, _engine.PrecedingSiblings(n).Count() + 1));
       break;
     case PseudoTypes.FunctionNthlastchild:
       _matches = _matches.Where(n => _engine.Parents(n).Any()
                                   && CountMatches(selector, _engine.FollowingSiblings(n).Count() + 1));
       break;
     case PseudoTypes.FunctionNthLastOfType:
       _matches = _matches.Where(n => _engine.Parents(n).Any()
                                   && CountMatches(selector, _engine.FollowingSiblings(n).Count(m => IsMatch(n.Name, m.Name)) + 1));
       break;
     case PseudoTypes.FunctionNthOfType:
       _matches = _matches.Where(n => _engine.Parents(n).Any()
                                   && CountMatches(selector, _engine.PrecedingSiblings(n).Count(m => IsMatch(n.Name, m.Name)) + 1));
       break;
     default:
       NotSupported();
       break;
   }
 }
    private NthChildSelector GetChildSelector(PseudoTypes type)
    {
      var selector = new NthChildSelector(type);

      if (_attributeValue.Equals(PseudoSelectorPrefix.NthChildOdd, StringComparison.OrdinalIgnoreCase))
      {
        selector.Step = 2;
        selector.Offset = 1;
      }
      else if (_attributeValue.Equals(PseudoSelectorPrefix.NthChildEven, StringComparison.OrdinalIgnoreCase))
      {
        selector.Step = 2;
        selector.Offset = 0;
      }
      else if (!int.TryParse(_attributeValue, out selector.Offset))
      {
        var index = _attributeValue.IndexOf(PseudoSelectorPrefix.NthChildN, StringComparison.OrdinalIgnoreCase);

        if (_attributeValue.Length <= 0 || index == -1)
        {
          return selector;
        }

        var first = _attributeValue.Substring(0, index).Replace(" ", "");

        var second = "";

        if (_attributeValue.Length > index + 1)
        {
          second = _attributeValue.Substring(index + 1).Replace(" ", "");
        }

        if (first == string.Empty || (first.Length == 1 && first[0] == Specification.PlusSign))
        {
          selector.Step = 1;
        }
        else if (first.Length == 1 && first[0] == Specification.MinusSign)
        {
          selector.Step = -1;
        }
        else
        {
          int step;
          if (int.TryParse(first, out step))
          {
            selector.Step = step;
          }
        }

        if (second == string.Empty)
        {
          selector.Offset = 0;
        }
        else
        {
          int offset;
          if (int.TryParse(second, out offset))
          {
            selector.Offset = offset;
          }
        }
      }

      return selector;
    }