示例#1
0
 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));
 }
示例#6
0
 public void Visit(AttributeRestriction selector)
 {
   _matches = _matches.Where(n => IsMatch(n, selector));
 }