Пример #1
0
        public void AddExtension(Selector selector, Extend extends, Env env)
        {
            foreach (var extending in extends.Exact)
            {
                Extender match = null;
                if ((match = Extensions.OfType<ExactExtender>().FirstOrDefault(e => e.BaseSelector.ToString().Trim() == extending.ToString().Trim())) == null)
                {
                    match = new ExactExtender(extending, extends);
                    Extensions.Add(match);
                }

                match.AddExtension(selector, env);
            }

            foreach (var extending in extends.Partial)
            {
                Extender match = null;
                if ((match = Extensions.OfType<PartialExtender>().FirstOrDefault(e => e.BaseSelector.ToString().Trim() == extending.ToString().Trim())) == null)
                {
                    match = new PartialExtender(extending, extends);
                    Extensions.Add(match);
                }

                match.AddExtension(selector, env);
            }
        }
Пример #2
0
        public List<Closure> Find(Env env, Selector selector, Ruleset self)
        {
            self = self ?? this;
            var rules = new List<Closure>();
            var key = selector.ToCSS(env);

            if (_lookups.ContainsKey(key))
                return _lookups[key];

            foreach (var rule in Rulesets().Where(rule => rule != self))
            {
                if (rule.Selectors && rule.Selectors.Any(selector.Match))
                {
                    if (selector.Elements.Count > 1)
                    {
                        var remainingSelectors = new Selector(new NodeList<Element>(selector.Elements.Skip(1)));
                        var closures = rule.Find(env, remainingSelectors, self);

                        foreach (var closure in closures)
                        {
                            closure.Context.Insert(0, rule);
                        }

                        rules.AddRange(closures);
                    }
                    else
                        rules.Add(new Closure { Ruleset = rule, Context = new List<Ruleset> { rule } });
                }
            }
            return _lookups[key] = rules;
        }
Пример #3
0
        public override void Accept(IVisitor visitor)
        {
            Selector = VisitAndReplace(Selector, visitor);

            foreach (var a in Arguments)
            {
                a.Value = VisitAndReplace(a.Value, visitor);
            }
        }
Пример #4
0
 public void AddExtension(Selector selector, Env env)
 {
     var path = new List<Selector>();
     path.Add(selector);
     foreach (var f in env.Frames.Skip(1))
     {
         var partialSelector = f.Selectors.FirstOrDefault();
         if (partialSelector != null)
         {
             path.Add(partialSelector);
         }
     }
     ExtendedBy.Add(new Selector(new[] { new Element(null, path.Select(p => p.ToCSS(env)).Reverse().JoinStrings("").Trim()) }));
 }
Пример #5
0
        public override Node Evaluate(Env env)
        {
            NodeList<Element> evaldElements = new NodeList<Element>();
            foreach (Element element in Elements)
            {
                if (element.NodeValue is Extend)
                {
                    if (env.MediaPath.Any())
                    {
                        env.MediaPath.Peek().AddExtension(this, (Extend)(((Extend)element.NodeValue).Evaluate(env)),env);
                    }
                    else //Global extend
                    {
                        env.AddExtension(this, (Extend)(((Extend)element.NodeValue).Evaluate(env)), env);
                    }
                }
                else
                {
                    evaldElements.Add(element.Evaluate(env) as Element);
                }
            }
            var evaluatedSelector = new Selector(evaldElements).ReducedFrom<Selector>(this);
            if (evaluatedSelector.Elements.All(e => e.NodeValue == null)) {
                return evaluatedSelector;
            }

            parser.Tokenizer.SetupInput(evaluatedSelector.ToCSS(env), "");

            var result = new NodeList<Selector>();
            Selector selector;
            while (selector = parsers.Selector(parser)) {
                selector.IsReference = IsReference;
                result.Add(selector.Evaluate(env) as Selector);

                if (!parser.Tokenizer.Match(',')) {
                    break;
                }
            }

            return result;
        }
Пример #6
0
        public override Node Evaluate(Env env)
        {
            var newExact = new List<Selector>();
            foreach (var e in Exact)
            {
                var childContext = env.CreateChildEnv();
                e.AppendCSS(childContext);
                var selector = new Selector(new []{new Element(e.Elements.First().Combinator,childContext.Output.ToString().Trim())});
                selector.IsReference = IsReference;
                newExact.Add(selector);
            }

            var newPartial = new List<Selector>();
            foreach (var e in Partial)
            {
                var childContext = env.CreateChildEnv();
                e.AppendCSS(childContext);
                var selector = new Selector(new[] { new Element(e.Elements.First().Combinator, childContext.Output.ToString().Trim()) });
                selector.IsReference = IsReference;
                newPartial.Add(selector);
            }

            return new Extend(newExact,newPartial) { IsReference = IsReference, Location = Location };
        }
Пример #7
0
        public void AddExtension(Selector selector, Env env)
        {
            var selectorPath = new List<IEnumerable<Selector>> {new [] {selector} };
            selectorPath.AddRange(env.Frames.Skip(1).Select(f => f.Selectors.Where(partialSelector => partialSelector != null)));

            ExtendedBy.Add(GenerateExtenderSelector(env, selectorPath));
        }
Пример #8
0
        private static bool _AnyMatch(NodeList<Selector> selectors, Selector other)
        {
            for (var i = 0; i < selectors.Count; i++)
            {
                if (selectors[i].Match(other))
                {
                    return true;
                }
            }

            return false;
        }
Пример #9
0
        public PartialExtender(Selector baseSelector, Extend extend) : base(baseSelector, extend)
        {

        }
Пример #10
0
 public Extender(Selector baseSelector)
 {
     BaseSelector = baseSelector;
     ExtendedBy = new List<Selector>();
     IsReference = baseSelector.IsReference;
 }
Пример #11
0
 public MixinCall(NodeList<Element> elements, List<NamedArgument> arguments)
 {
     Selector = new Selector(elements);
     Arguments = arguments;
 }
Пример #12
0
        public List<Closure> Find(Env env, Selector selector, Ruleset self)
        {
            self = self ?? this;
            var rules = new List<Closure>();
            var key = selector.ToCSS(env);

            if (_lookups.ContainsKey(key))
                return _lookups[key];

            for(var x = 0; x < Rulesets.Count; x++)
            {
                var rule = Rulesets[x];
                if (rule == self) continue;

                if(rule.Selectors && _AnyMatch(rule.Selectors, selector))
                {
                    if (selector.Elements.Count > 1)
                    {
                        var remainingSelectors = new Selector(new NodeList<Element>(selector.Elements.Skip(1)));
                        var closures = rule.Find(env, remainingSelectors, self);

                        for (var i = 0; i < closures.Count; i++)
                        {
                            var closure = closures[i];
                            closure.Context.Insert(0, rule);
                        }

                        rules.AddRange(closures);
                    }
                    else
                    {
                        rules.Add(new Closure { Ruleset = rule, Context = new List<Ruleset> { rule } });
                    }
                }
            }
            return _lookups[key] = rules;
        }
Пример #13
0
 public MixinCall(NodeList<Element> elements, List<NamedArgument> arguments, bool important)
 {
     Important = important;
     Selector = new Selector(elements);
     Arguments = arguments;
 }
Пример #14
0
        public ExactExtender(Selector baseSelector):base(baseSelector)
        {

        }
Пример #15
0
 public Extender(Selector baseSelector, Extend extend) : this(baseSelector)
 {
     Extend = extend;
 }
Пример #16
0
        public PartialExtender(Selector baseSelector):base(baseSelector)
        {

        }
Пример #17
0
 public Extender(Selector baseSelector)
 {
     BaseSelector = baseSelector;
     ExtendedBy = new List<Selector>();
 }
Пример #18
0
 public MixinCall(NodeList<Element> elements, NodeList<Expression> arguments)
 {
     Selector = new Selector(elements);
     Arguments = arguments;
 }
Пример #19
0
        public ExactExtender(Selector baseSelector) : this(baseSelector, null)
        {

        }
Пример #20
0
        public ExactExtender(Selector baseSelector, Extend extend) : base(baseSelector, extend)
        {

        }
Пример #21
0
        public PartialExtender(Selector baseSelector) : this(baseSelector, null)
        {

        }
Пример #22
0
 public bool Match(Selector other)
 {
     return
         other.Elements.Count <= Elements.Count &&
         Elements[0].Value == other.Elements[0].Value;
 }
Пример #23
0
 public bool Match(Selector other)
 {
     return
         (other.Elements.Count <= Elements.Count &&
          Elements[0].Value == other.Elements[0].Value);
 }