Esempio n. 1
0
        /// <summary>
        ///  Evaluate Rules. Must only be run on a copy of the ruleset otherwise it will
        ///  overwrite defintions that might be required later..
        /// </summary>
        protected void EvaluateRules(Env env)
        {
            env.Frames.Push(this);

            for (var i = 0; i < Selectors.Count; i++)
            {
                var evaluatedSelector = Selectors[i].Evaluate(env);
                var expandedSelectors = evaluatedSelector as IEnumerable <Selector>;
                if (expandedSelectors != null)
                {
                    Selectors.RemoveAt(i);
                    Selectors.InsertRange(i, expandedSelectors);
                }
                else
                {
                    Selectors[i] = evaluatedSelector as Selector;
                }
            }

            int mediaBlocks = env.MediaBlocks.Count;

            NodeHelper.ExpandNodes <Import>(env, Rules);
            NodeHelper.ExpandNodes <MixinCall>(env, Rules);

            foreach (var r in Rules.OfType <Extend>().ToArray())
            {
                foreach (var s in this.Selectors)
                {
                    //If we're in a media block, then extenders can only apply to that media block
                    if (env.MediaPath.Any())
                    {
                        env.MediaPath.Peek().AddExtension(s, (Extend)r.Evaluate(env), env);
                    }
                    else //Global extend
                    {
                        env.AddExtension(s, (Extend)r.Evaluate(env), env);
                    }
                }
            }

            for (var i = 0; i < Rules.Count; i++)
            {
                Rules[i] = Rules[i].Evaluate(env);
            }

            // if media blocks are inside this ruleset we have to "catch" the bubbling and
            // make sure they get this rulesets selectors
            for (var j = mediaBlocks; j < env.MediaBlocks.Count; j++)
            {
                env.MediaBlocks[j].BubbleSelectors(Selectors);
            }

            env.Frames.Pop();
        }