public void Visit(NthChildSelector selector) { this.Specificity += (1 << 8); }
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(')'); }
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; }