diff --git a/lib/carto/functions.js b/lib/carto/functions.js index 012f140..e16867a 100644 --- a/lib/carto/functions.js +++ b/lib/carto/functions.js @@ -12,6 +12,25 @@ tree.functions = { hsl: function (h, s, l) { return this.hsla(h, s, l, 1.0); }, + // Only require val + stop: function (val) { + if (arguments.length > 1) var color = arguments[1]; + if (arguments.length > 2) var mode = arguments[2]; + + return { + is: 'tag', + val: val, + color: color, + mode: mode, + toString: function(env) { + return '\n\t'; + + } + }; + }, hsla: function (h, s, l, a) { h = (number(h) % 360) / 360; s = number(s); l = number(l); a = number(a); diff --git a/lib/carto/tree/call.js b/lib/carto/tree/call.js index 380dfae..8e03b59 100644 --- a/lib/carto/tree/call.js +++ b/lib/carto/tree/call.js @@ -6,6 +6,7 @@ tree.Call = function Call(name, args, index) { this.name = name; this.args = args; + this.is = 'call'; this.index = index; }; tree.Call.prototype = { @@ -34,7 +35,7 @@ tree.Call.prototype = { } if (this.name in tree.functions) { // 1. - if (tree.functions[this.name].length === args.length) { + if (tree.functions[this.name].length < args.length) { return tree.functions[this.name].apply(tree.functions, args); } else { env.error({ diff --git a/lib/carto/tree/definition.js b/lib/carto/tree/definition.js index 3a443ab..05e11ba 100644 --- a/lib/carto/tree/definition.js +++ b/lib/carto/tree/definition.js @@ -111,6 +111,9 @@ tree.Definition.prototype.symbolizersToXML = function(env, symbolizers, zoom) { if (x && x.serialization && x.serialization === 'content') { selfclosing = false; tagcontent = attributes[key].eval(env).toXML(env, true); + } else if (x && x.serialization && x.serialization === 'tag') { + selfclosing = false; + tagcontent = attributes[key].eval(env).toXML(env, true); } else { xml += attributes[key].eval(env).toXML(env) + ' '; } diff --git a/lib/carto/tree/reference.js b/lib/carto/tree/reference.js index 55deadf..aeaa685 100644 --- a/lib/carto/tree/reference.js +++ b/lib/carto/tree/reference.js @@ -113,6 +113,12 @@ tree.Reference.validValue = function(env, selector, value) { } } return true; + } else if (tree.Reference.selector(selector).type == 'tags') { + if (!value.value) return false; + for (i = 0; i < value.value[0].value.length; i++) { + if (value.value[0].value[i].is !== 'tag') return false; + } + return true; } else { if (tree.Reference.selector(selector).validate) { var valid = false; diff --git a/lib/carto/tree/reference.json b/lib/carto/tree/reference.json index 449b705..cffc0b3 100644 --- a/lib/carto/tree/reference.json +++ b/lib/carto/tree/reference.json @@ -575,6 +575,28 @@ "gaussian", "lanczos" ] + }, + "colorizer-default-mode": { + "css": "raster-colorizer-default-mode", + "type": [ + "discrete", + "linear", + "exact" + ] + }, + "colorizer-default-color": { + "css": "raster-colorizer-default-color", + "type": "color" + }, + "colorizer-epsilon": { + "css": "raster-colorizer-epsilon", + "type": "float" + }, + "stop": { + "css": "raster-colorizer-stops", + "type": "tags", + "serialization": "tag", + "tagname": "tagname" } }, "point": { diff --git a/test/rendering/rastercolorizer.mss b/test/rendering/rastercolorizer.mss index d362363..988e12f 100644 --- a/test/rendering/rastercolorizer.mss +++ b/test/rendering/rastercolorizer.mss @@ -3,5 +3,8 @@ raster-colorizer-default-mode:discrete; raster-colorizer-default-color:#f00; raster-colorizer-epsilon:0.05; - raster-colorizer-stops:stop(5, #ff0, "linear"); + raster-colorizer-stops: + stop(5, #f00) + stop(10, #f40, linear) + stop(10, #f80); }