public static void PopulateSheet(StyleSheet sheet, IEnumerable <Rule> rules, ResolvingOptions options = null)
        {
            options = options ?? new ResolvingOptions();
            var helper = new StyleSheetBuilderHelper();

            if (options.SortRules)
            {
                rules = rules.OrderBy(rule => rule.SelectorName);
            }
            foreach (var rule in rules)
            {
                helper.BeginRule(string.Empty, rule.LineNumber);
                StyleSheetBuilderHelper.BuildSelector(rule.Selector, helper);

                var propertyValues = rule.Properties.Values.ToList();
                if (options.SortProperties)
                {
                    propertyValues.Sort((p1, p2) => p1.Name.CompareTo(p2.Name));
                }
                foreach (var property in propertyValues)
                {
                    helper.builder.BeginProperty(property.Name);
                    AddValues(helper, property.Values);
                    helper.builder.EndProperty();
                }
                helper.EndRule();
            }
            helper.PopulateSheet(sheet);
        }
        public static StyleSheet ConvertToStyleSheet(IEnumerable <Rule> rules, Dictionary <string, Property> variables = null, ResolvingOptions options = null)
        {
            options   = options ?? new ResolvingOptions();
            variables = variables ?? new Dictionary <string, Property>();
            var helper = new StyleSheetBuilderHelper();

            if (options.SortRules)
            {
                rules = rules.OrderBy(rule => rule.SelectorName);
            }
            foreach (var rule in rules)
            {
                helper.BeginRule();
                StyleSheetBuilderHelper.BuildSelector(rule.Selector, helper);

                var propertyValues = rule.Properties.Values.ToList();
                if (options.SortProperties)
                {
                    propertyValues.Sort((p1, p2) => p1.Name.CompareTo(p2.Name));
                }
                foreach (var property in propertyValues)
                {
                    helper.builder.BeginProperty(property.Name);
                    // Try to resolve variable
                    var values = ResolveValues(property, variables, options);
                    AddValues(helper, values);
                    helper.builder.EndProperty();
                }
                helper.EndRule();
            }
            helper.PopulateSheet();
            return(helper.sheet);
        }
        private void Split(StyleComplexSelector complexSelector1, StyleComplexSelector complexSelector2)
        {
            var comment1 = s1Comments.Get(complexSelector1.rule);

            s1Builder.BeginRule(comment1);
            StyleSheetBuilderHelper.BuildSelector(complexSelector1, s1Builder);

            var comment2 = s2Comments.Get(complexSelector2.rule);

            s2Builder.BeginRule(comment2);
            StyleSheetBuilderHelper.BuildSelector(complexSelector2, s2Builder);

            commonBuilder.BeginRule(string.IsNullOrEmpty(comment1) ? comment2 : comment1);
            StyleSheetBuilderHelper.BuildSelector(complexSelector2, commonBuilder);

            // This is a common selector to both s1 and s2, for each properties determine what is common:
            var properties = new Dictionary <string, PropertyPair>();

            StyleSheetBuilderHelper.PopulateProperties(complexSelector1.rule.properties, properties, true);
            StyleSheetBuilderHelper.PopulateProperties(complexSelector2.rule.properties, properties, false);

            foreach (var propertyPair in properties.Values)
            {
                if (propertyPair.p1 != null)
                {
                    if (propertyPair.p2 != null)
                    {
                        // Extend needs to be in common, s1 and s2:
                        if (propertyPair.p1.name == ConverterUtils.k_Extend)
                        {
                            StyleSheetBuilderHelper.CopyProperty(s1Cache.sheet, s1Comments, propertyPair.p1, commonBuilder);
                            StyleSheetBuilderHelper.CopyProperty(s1Cache.sheet, s1Comments, propertyPair.p1, s1Builder);
                            StyleSheetBuilderHelper.CopyProperty(s2Cache.sheet, s2Comments, propertyPair.p2, s2Builder);
                        }
                        // Possibly common property
                        else if (CompareProperty(propertyPair.p1, propertyPair.p2))
                        {
                            StyleSheetBuilderHelper.CopyProperty(s1Cache.sheet, s1Comments, propertyPair.p1, commonBuilder);
                        }
                        else
                        {
                            StyleSheetBuilderHelper.CopyProperty(s1Cache.sheet, s1Comments, propertyPair.p1, s1Builder);
                            StyleSheetBuilderHelper.CopyProperty(s2Cache.sheet, s2Comments, propertyPair.p2, s2Builder);
                        }
                    }
                    else
                    {
                        // Only in s1: copy straight
                        StyleSheetBuilderHelper.CopyProperty(s1Cache.sheet, s1Comments, propertyPair.p1, s1Builder);
                    }
                }
                else
                {
                    // Only in s2: copy straight
                    StyleSheetBuilderHelper.CopyProperty(s2Cache.sheet, s2Comments, propertyPair.p2, s2Builder);
                }
            }

            s1Builder.EndRule();
            s2Builder.EndRule();
            commonBuilder.EndRule();
        }