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; } }
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); }