private bool IsMatch(IQueryableNode node, AttributeRestriction elem) { string value; if (node.TryGetAttributeValue(elem.Name, this.Comparison, out value)) { switch (elem.Comparison) { case Selector.AttributeComparison.Contains: return !string.IsNullOrEmpty(elem.Value) && value.IndexOf(elem.Value, this.Comparison) >= 0; case Selector.AttributeComparison.EndsWith: return !string.IsNullOrEmpty(elem.Value) && value.EndsWith(elem.Value, this.Comparison); case Selector.AttributeComparison.Equals: return string.Compare(value, elem.Value ?? "", this.Comparison) == 0; case Selector.AttributeComparison.Exists: return true; case Selector.AttributeComparison.HyphenatedListStartsWith: return string.IsNullOrEmpty(elem.Value) || string.Compare(value, elem.Value, this.Comparison) == 0 || value.StartsWith(elem.Value + '-', this.Comparison); case Selector.AttributeComparison.NotEquals: return string.Compare(value, elem.Value ?? "", this.Comparison) != 0; case Selector.AttributeComparison.StartsWith: return !string.IsNullOrEmpty(elem.Value) && value.StartsWith(elem.Value, this.Comparison); case Selector.AttributeComparison.WhitespaceListContains: return !string.IsNullOrEmpty(elem.Value) && value.Split(' ').Contains(elem.Value, GetComparer(this.Comparison)); } } return false; }
public static AttributeRestriction Class(string className) { var result = new AttributeRestriction(); result.Name.LocalName = "class"; result.Comparison = AttributeComparison.WhitespaceListContains; result.Value = className; return result; }
public void Visit(AttributeRestriction selector) { if (string.IsNullOrEmpty(selector.Name.Namespace) && string.Compare(selector.Name.LocalName, "id", StringComparison.OrdinalIgnoreCase) == 0 && selector.Comparison == AttributeComparison.Equals) { _writer.Write('#'); _writer.Write(selector.Value); } else if (string.IsNullOrEmpty(selector.Name.Namespace) && string.Compare(selector.Name.LocalName, "class", StringComparison.OrdinalIgnoreCase) == 0 && selector.Comparison == AttributeComparison.WhitespaceListContains) { _writer.Write('.'); _writer.Write(selector.Value); } else { _writer.Write('['); if (!string.IsNullOrEmpty(selector.Name.Namespace)) { _writer.Write(selector.Name.Prefix ?? selector.Name.Namespace); _writer.Write('|'); } _writer.Write(selector.Name.LocalName); switch (selector.Comparison) { case AttributeComparison.Contains: _writer.Write("*="); break; case AttributeComparison.EndsWith: _writer.Write("$="); break; case AttributeComparison.Equals: _writer.Write('='); break; case AttributeComparison.HyphenatedListStartsWith: _writer.Write("|="); break; case AttributeComparison.StartsWith: _writer.Write("^="); break; case AttributeComparison.WhitespaceListContains: _writer.Write("~="); break; case AttributeComparison.NotEquals: _writer.Write("!="); break; default: // AttributeComparison.Exists: _writer.Write(']'); return; } _writer.Write('\"'); _writer.Write(selector.Value); _writer.Write("\"]"); } }
public static AttributeRestriction Id(string id) { var result = new AttributeRestriction(); result.Name.LocalName = "id"; result.Comparison = AttributeComparison.Equals; result.Value = id; result._idSpecificity = true; return result; }
public void Visit(AttributeRestriction selector) { this.Specificity += (selector.IdSpecificity ? (1 << 12) : (1 << 8)); }
public void Visit(AttributeRestriction selector) { _matches = _matches.Where(n => IsMatch(n, selector)); }