private static List <MatchedRule> MatchingRules(Dom.ElementData elem, Css.Stylesheet stylesheet) { return(stylesheet.Rules .Select(rule => MatchRule(elem, rule)) .Where(rule => rule != null) .ToList()); }
private static MatchedRule MatchRule(Dom.ElementData elem, Css.Rule rule) { var selector = rule.Selectors.FirstOrDefault(s => Matches(elem, s)); if (selector == null) { return(null); } return(new MatchedRule(selector.GetSpecificity(), rule)); }
private static bool Matches(Dom.ElementData elem, Css.Selector selector) { switch (selector) { case Css.SimpleSelector simpleSelector: return(MatchesSimpleSelector(elem, simpleSelector)); default: return(false); } }
private static Dictionary <string, Css.Value> GetSpecifiedValues(Dom.ElementData elem, Css.Stylesheet stylesheet) { var values = new Dictionary <string, Css.Value>(); var rules = MatchingRules(elem, stylesheet) .OrderBy(rule => rule.Specificity.Calc()) .Select(r => r.Rule); foreach (var rule in rules) { foreach (var declaration in rule.Declarations) { values[declaration.Name] = declaration.Value; } } return(values); }
private static bool MatchesSimpleSelector(Dom.ElementData elem, Css.SimpleSelector selector) { if (selector.TagName != "*" && selector.TagName != elem.TagName) { return(false); } if (selector.Id != "*" && selector.Id != elem.Id) { return(false); } var elemClasses = elem.Classes; if (selector.Classes.All(c => c != "*") && selector.Classes.Any(c => !elemClasses.Contains(c))) { return(false); } return(true); }