Exemple #1
0
        public override Node Evaluate(Env env)
        {
            env.Rule = this;

            var rule = new Rule(Name, Value.Evaluate(env)) {Index = Index};

            env.Rule = null;

            return rule;
        }
Exemple #2
0
        public override Node Evaluate(Env env)
        {
            env.Rule = this;

            if (Value == null)
            {
                throw new ParsingException("No value found for rule " + Name, Index);
            }

            var rule = new Rule(Name, Value.Evaluate(env)) {Index = Index};

            env.Rule = null;

            return rule;
        }
Exemple #3
0
        public override Node Evaluate(Env env)
        {
            env.Rule = this;

            if (Value == null)
            {
                throw new ParsingException("No value found for rule " + Name, Location);
            }

            var rule = new Rule(Name, Value.Evaluate(env)).ReducedFrom<Rule>(this);
            rule.IsSemiColonRequired = this.IsSemiColonRequired;
            rule.PostNameComments = this.PostNameComments;

            env.Rule = null;

            return rule;
        }
Exemple #4
0
        private Rule MakeRuleImportant(Rule rule)
        {
            var valueNode = rule.Value;
            var value = valueNode as Value;
            value = value != null
                        ? new Value(value.Values, "!important").ReducedFrom<Value>(value)
                        : new Value(new NodeList {valueNode}, "!important");

            var importantRule = new Rule(rule.Name, value).ReducedFrom<Rule>(rule);
            return importantRule;
        }
Exemple #5
0
            public Rule ReverseRule(Rule rule)
            {
                rule.Accept(this);

                // we have the values.. now we can reverse it
                string content = _textContent.ToString();
                string important = "";

                var value = rule.Value as Value;
                if (value != null)
                {
                    important = value.Important;
                }

                bool valueChanged = false;

                if (_nodeContent.Count > 1)
                {
                    if (_nodeContent.Count == 4)
                    {
                        Node tmp = _nodeContent[1];
                        _nodeContent[1] = _nodeContent[3];
                        _nodeContent[3] = tmp;
                        return new Rule(rule.Name, new Expression(_nodeContent)).ReducedFrom<Rule>(rule);
                    }
                }
                else
                {
                    if (content == "left")
                    {
                        content = ("right " + important).TrimEnd();
                        valueChanged = true;
                    }
                    else if (content == "right")
                    {
                        content = ("left " + important).TrimEnd();
                        valueChanged = true;
                    }
                    else
                    {
                        string[] items = content.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        if (items.Length == 4)
                        {
                            string temp = items[1];
                            items[1] = items[3];
                            items[3] = temp;
                            content = String.Join(" ", items);
                            valueChanged = true;
                        }
                    }

                    if (valueChanged)
                    {
                        return new Rule(rule.Name, new TextNode(content)).ReducedFrom<Rule>(rule);
                    }
                }

                return rule;
            }
Exemple #6
0
        public override Node Evaluate(Env env)
        {
            var found    = false;
            var closures = env.FindRulesets(Selector);

            if (closures == null)
            {
                throw new ParsingException(Selector.ToCSS(env).Trim() + " is undefined", Location);
            }

            env.Rule = this;

            var rules = new NodeList();

            if (PreComments)
            {
                rules.AddRange(PreComments);
            }

            foreach (var closure in closures)
            {
                var ruleset = closure.Ruleset;

                var matchType = ruleset.MatchArguments(Arguments, env);

                if (matchType == MixinMatch.ArgumentMismatch)
                {
                    continue;
                }

                found = true;

                if (matchType == MixinMatch.GuardFail)
                {
                    continue;
                }

                if (ruleset is MixinDefinition)
                {
                    try
                    {
                        var mixin = ruleset as MixinDefinition;
                        rules.AddRange(mixin.Evaluate(Arguments, env, closure.Context).Rules);
                    }
                    catch (ParsingException e)
                    {
                        throw new ParsingException(e.Message, e.Location, Location);
                    }
                }
                else
                {
                    if (ruleset.Rules != null)
                    {
                        var nodes = new NodeList(ruleset.Rules);
                        NodeHelper.ExpandNodes <MixinCall>(env, nodes);

                        rules.AddRange(nodes);
                    }
                }
            }
            if (PostComments)
            {
                rules.AddRange(PostComments);
            }

            env.Rule = null;

            if (!found)
            {
                var message = String.Format("No matching definition was found for `{0}({1})`",
                                            Selector.ToCSS(env).Trim(),
                                            Arguments.Select(a => a.Value.ToCSS(env)).JoinStrings(env.Compress ? "," : ", "));
                throw new ParsingException(message, Location);
            }

            if (Important)
            {
                var importantRules = new NodeList();

                foreach (Node node in rules)
                {
                    Rule r = node as Rule;
                    if (r != null)
                    {
                        var valueNode = r.Value;
                        var value     = valueNode as Value;
                        value = value != null
                                    ? new Value(value.Values, "!important").ReducedFrom <Value>(value)
                                    : new Value(new NodeList {
                            valueNode
                        }, "!important");

                        importantRules.Add((new Rule(r.Name, value)).ReducedFrom <Rule>(r));
                    }
                    else
                    {
                        importantRules.Add(node);
                    }
                }

                return(importantRules);
            }

            return(rules);
        }
    private static void CreateSymbolizers(Rule rule, Dictionary<string, Dictionary<string, CartoRule>> symbolizers, Env env, ICartoTranslator cartoTranslator)
    {
      // Sort symbolizers by the index of their first property definition
      List<KeyValuePair<string, int>> symOrder = new List<KeyValuePair<string, int>>();
      List<int> indexes = new List<int>();

      foreach (string key in symbolizers.Keys)
      {
        int minIdx = int.MaxValue;

        var props = symbolizers[key];
        foreach (var prop in props)
        {
          int index = props[prop.Key].Index;
          if (index < minIdx)
            minIdx = index;
        }

        symOrder.Add(new KeyValuePair<string, int>(key, minIdx));
      }

      // Get a simple list of the symbolizers, in order
      symOrder.Sort(delegate (KeyValuePair<string, int> a, KeyValuePair<string, int> b) { return a.Value.CompareTo(b.Value); });

      foreach (KeyValuePair<string, int> kv in symOrder)
      {
        var attributes = symbolizers[kv.Key];
        var symbolizer = kv.Key.Split('/')[1];

        // Skip the magical * symbolizer which is used for universal properties
        // which are bubbled up to Style elements intead of Symbolizer elements.
        if (symbolizer == "*")
          continue;

        // Check if we have all required properties

        string[] properties = attributes.Keys.ToArray();
        string[] values = new string[properties.Length];

        string missingProperty = null;
        bool succ = cartoTranslator.HasRequiredProperties(symbolizer, properties, ref missingProperty);

        if (!succ)
        {
          NodeLocation loc = attributes[missingProperty].Location;
          throw new Exception(string.Format("A required property '{0}' is missing. Location: Index = {1} ; Source = {2}", missingProperty, loc.Index, loc.Source));
        }

        int i = 0;
        foreach (string propName in attributes.Keys)
        {
          CartoRule cartoRule = attributes[propName];
          values[i] = cartoRule.Value.GetValueAsString(env);
          i++;
        }

        Symbolizer sym = cartoTranslator.ToSymbolizer(symbolizer, properties, values);
        if (sym != null && sym.Enabled)
          rule.Symbolizers.Add(sym);
      }
    }
    /// <summary>
    /// Creates rules
    /// </summary>
    /// <param name="style"></param>
    /// <param name="def"></param>
    /// <param name="env"></param>
    /// <param name="existingFilters"></param>
    /// <param name="cartoTranslator"></param>
    private static void CreateRules(FeatureTypeStyle style, CartoDefinition def, Env env, Dictionary<string, int> existingFilters, ICartoTranslator cartoTranslator)
    {
      string filter = def.Filters.ToString();

      if (!(existingFilters.ContainsKey(filter)))
        existingFilters[filter] = 0x7FFFFF;

      int available = 0x7FFFFF;
      ZoomStruct zooms = new ZoomStruct();
      zooms.Available = available;

      NodeList<CartoRule> rules = def.Rules;
      for (int i = 0; i < rules.Count; i++)
      {
        CartoRule cartoRule = rules[i];
        zooms.Rule = cartoRule.Zoom;

        if ((existingFilters[filter] & zooms.Rule) == 0)
          continue;

        while (((zooms.Current = zooms.Rule) & available) != 0)
        {
          Dictionary<string, Dictionary<string, CartoRule>> symbolizers = CollectSymbolizers(def, zooms, i, env, cartoTranslator);

          if (symbolizers != null && symbolizers.Count > 0)
          {
            if ((existingFilters[filter] & zooms.Current) == 0)
              continue;

            int zoom = existingFilters[filter] & zooms.Current;
            int startZoom = -1, endZoom = 0;
            for (int zi = 0; zi <= 22; zi++)
            {
              if ((zoom & (1 << zi)) != 0)
              {
                if (startZoom == -1)
                  startZoom = zi;
                endZoom = zi;
              }
            }

            Rule rule = new Rule();
            rule.Filter = ConvertUtility.ToFilter(def.Filters, cartoTranslator);
            rule.Name = cartoRule.Instance;

            if (startZoom > 0)
              rule.MaxScale = ConvertUtility.ToScaleDenominator(startZoom);
            if (endZoom > 0)
              rule.MinScale = ConvertUtility.ToScaleDenominator(endZoom + 1);

            CreateSymbolizers(rule, symbolizers, env, cartoTranslator);

            existingFilters[filter] &= ~zooms.Current;

            // Check whether the rule has at least one visible symbolizer
            if (rule.Symbolizers.Count > 0 && rule.Symbolizers.Any(s => s.Enabled == true))
              style.Rules.Add(rule);
          }
        }
      }

      //style.Rules.Sort(new RuleComparer());
    }