diff --git a/lib/OpenLayers/Format/SLD/v1.js b/lib/OpenLayers/Format/SLD/v1.js index 374be28ea3..46a03374ec 100644 --- a/lib/OpenLayers/Format/SLD/v1.js +++ b/lib/OpenLayers/Format/SLD/v1.js @@ -425,7 +425,9 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, { "stroke-width": "strokeWidth", "stroke-linecap": "strokeLinecap", "fill": "fillColor", - "fill-opacity": "fillOpacity" + "fill-opacity": "fillOpacity", + "font-family": "fontFamily", + "font-size": "fontSize" }, /** @@ -732,6 +734,68 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, { value: obj.symbolizer[obj.key] }); }, + "TextSymbolizer": function(symbolizer) { + var node = this.createElementNSPlus("TextSymbolizer"); + // add in optional Label + if(symbolizer.label != null) { + this.writeNode(node, "Label", symbolizer.label); + } + // add in optional Font + if(symbolizer.fontFamily != null || + symbolizer.fontSize != null) { + this.writeNode(node, "Font", symbolizer); + } + // add in optional Fill + if(symbolizer.fillColor != null || + symbolizer.fillOpacity != null) { + this.writeNode(node, "Fill", symbolizer); + } + return node; + }, + "Font": function(symbolizer) { + var node = this.createElementNSPlus("Font"); + // add in CssParameters + if(symbolizer.fontFamily) { + this.writeNode( + node, "CssParameter", + {symbolizer: symbolizer, key: "fontFamily"} + ); + } + if(symbolizer.fontSize) { + this.writeNode( + node, "CssParameter", + {symbolizer: symbolizer, key: "fontSize"} + ); + } + return node; + }, + "Label": function(label) { + // only the simplest of ogc:expression handled + // {label: "some text and a ${propertyName}"} + var node = this.createElementNSPlus("Label"); + var tokens = label.split("${"); + node.appendChild(this.createTextNode(tokens[0])); + var item, last; + for(var i=1; i 0) { + this.writeNode( + node, "ogc:PropertyName", + {property: item.substring(0, last)} + ); + node.appendChild( + this.createTextNode(item.substring(++last)) + ); + } else { + // no ending }, so this is a literal ${ + node.appendChild( + this.createTextNode("${" + item) + ); + } + } + return node; + }, "PolygonSymbolizer": function(symbolizer) { var node = this.createElementNSPlus("PolygonSymbolizer"); this.writeNode(node, "Fill", symbolizer); diff --git a/lib/OpenLayers/Style.js b/lib/OpenLayers/Style.js index 3cf008e0c4..bc7dd45346 100644 --- a/lib/OpenLayers/Style.js +++ b/lib/OpenLayers/Style.js @@ -353,4 +353,4 @@ OpenLayers.Style.createLiteral = function(value, context, feature) { * {Array} prefixes of the sld symbolizers. These are the * same as the main geometry types */ -OpenLayers.Style.SYMBOLIZER_PREFIXES = ['Point', 'Line', 'Polygon']; +OpenLayers.Style.SYMBOLIZER_PREFIXES = ['Point', 'Line', 'Polygon', 'Text']; diff --git a/tests/Format/SLD/v1_0_0.html b/tests/Format/SLD/v1_0_0.html index f98f8f86f7..b7725af483 100644 --- a/tests/Format/SLD/v1_0_0.html +++ b/tests/Format/SLD/v1_0_0.html @@ -150,6 +150,42 @@ } + function test_writeTextSymbolizer(t) { + t.plan(1); + var parser = new OpenLayers.Format.SLD.v1_0_0(); + var symbolizer = { + "Text": { + "label": "This is the ${city} in ${state}.", + "fontFamily": "Arial", + "fontSize": 10, + "fillColor": "blue" + } + }; + var node = parser.writers["sld"]["TextSymbolizer"].apply( + parser, [symbolizer["Text"]] + ); + + var expected = + '' + + '' + + '' + + 'Arial' + + '10' + + '' + + '' + + 'blue' + + '' + + ''; + + t.xml_eq(node, expected, "TextSymbolizer correctly written"); + + }