Exemple #1
0
 private static List <MatchedRule> MatchingRules(Dom.ElementData elem, Css.Stylesheet stylesheet)
 {
     return(stylesheet.Rules
            .Select(rule => MatchRule(elem, rule))
            .Where(rule => rule != null)
            .ToList());
 }
Exemple #2
0
        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));
        }
Exemple #3
0
        private static bool Matches(Dom.ElementData elem, Css.Selector selector)
        {
            switch (selector)
            {
            case Css.SimpleSelector simpleSelector:
                return(MatchesSimpleSelector(elem, simpleSelector));

            default:
                return(false);
            }
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }