Exemplo n.º 1
0
 public void Visit(PseudoFunction selector)
 {
   switch (selector.Type)
   {
     case PseudoTypes.FunctionNot:
       var visitor = new MatchVisitor(new HtmlQueryEngine());
       var sel = selector.Body as ISelector;
       _matches = _matches.Where(n =>
       {
         visitor.Initialize(n);
         sel.Visit(visitor);
         return !visitor.IsMatch();
       });
       break;
     case PseudoTypes.FunctionContains:
     case PseudoTypes.FunctionDir:
     default:
       NotSupported();
       break;
   }
 }
Exemplo n.º 2
0
    public static IEnumerable<Property> ApplicableProperties(this IEnumerable<StyleRule> rules, IQueryableNode node, IQueryEngine engine, StringComparison comparison, GlobalStyleContext settings)
    {
      var visitor = new MatchVisitor(engine);
      visitor.Comparison = comparison;
      var terms = new Dictionary<string, TermSpecificity>();
      TermSpecificity existing;
      int specificity = 0;
      int propSpecificity;

      foreach (var style in rules)
      {
        if (style.Selector != null)
        {
          visitor.Initialize(node);
          style.Selector.Visit(visitor);
        }
        if (style.Selector == null || visitor.IsMatch())
        {
          specificity = style.Selector == null ? 0 : (visitor.MatchSpecificity > 0 ? visitor.MatchSpecificity : style.Selector.GetSpecificity());
          foreach (var prop in style.Declarations.SelectMany(p => p.Expand(settings.LeftToRight)))
          {
            propSpecificity = specificity + (prop.Important ? (1 << 20) : 0);
            if (terms.TryGetValue(prop.Name, out existing))
            {
              if (propSpecificity >= existing.Specificity)
              {
                existing.Property = prop;
              }
            }
            else
            {
              terms[prop.Name] = new TermSpecificity() { Property = prop, Specificity = propSpecificity };
            }
          }
        }
      }

      return terms.Values.Select(v => v.Property);
    }